Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Веб-программирование > DHTML, JavaScript, VBScript
Перезагрузить страницу Логически сложный калькулятор на javascript+php
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
imported_mus imported_mus вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.05.2005
По умолчанию Логически сложный калькулятор на javascript+php - 01.05.2005, 23:20

Господа. Есть задача написать калькулятор, который бы подсчитывал сумму всех выбранных чекбоксов (под чекбоксами понимать товары). В инет-магазине, который я пишу на JS, существует такой вид товара, как комплект, тоесть несколько товаров в одном. При добавлении такого комплекта через админ панель админ по нажатию на кнопку подсчитать должен получить сумму данного комплекта, складываемую из выбранных чекбоксов и полей кол-во рядом с ними. Тоесть у нас может быть три штуки одного товара в комплекте.

Так вот, как сделать такое - черт знает...

Загвоздка заключается в следующем. Именем чекбокса является массив good[$tovar['ID']] (иначе товар добавить в комплект сложно).
Именем кол-ва является массив Quantity[$tovar['ID']]
Товары н астранице генерируются динамически, мы заранее не знаем, сколько у нас их выведется, все зависит от кол-ва товара в БД.
Теперь такая загвоздка. Нам нужно, как я понял, циклом пробежаться по существующим товарам и проверить на чекед (выбранность чекбоска) каждый товар, после чего, в случае, если данный товар выбран, умножить цену этого товара (а цена товара это значение чекбокса) на кол-во товара, после чего продолжить перебор массива. Полученную сумму записать в некую переменную и полю цена приравнять это значение. НО...
Как мы определим кол-во итераций? Кол-вом товаров? Логично, однако если у нас нет, самый легкий пример, первого ИД в базе? Тоесть первый товар с ИД=2, потому как первый удалили...
При подсчете получится, что последний элемент не проверится. Можно сделать ещё интереснее. В аргументе вызова функции указать минимальный ИД товара хранящийся в БД и максимальный ИД товара. Тогда мы можем запустить цикл с 2 до 11 и четко пересчитаем кол-во всех товаров. НО...
Тут я ещё вопрос задам, если мы обратимся к несуществующему элементу на странице (тоесть пробегаю по полям чекбоксов, обратился несуществующему, так как скажем от второго до 11 элемента один товар, пусть будет пятый, удалили) не выдаст ли он ошибку при этом? И ещё, а если у нас в магазине решили удалить все товары (пусть будет 10 000), но оставить первый товар как реликвию, с ИД=1, скажем, то при итерациях цикла от минимального ИД до максимального ИД мы сделаем 10 000 лишних шагов, тем самым оставляя в глубоком дауне клиентскую машину =(

Как быть? Мне нужно пробежаться циклом лишь по существующим полям на странице...
А как это сделать, я думаю, знаете только ВЫ!
Спасибо за внимание, жду ответов! =)
Ответить с цитированием
  (#2 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 02.05.2005, 02:08

Покажи примерный код своей страницы, а то слишком абстрактные рассуждения. По поводу подсчёта стоимости могу сказать, что лучше это делать динамически, т.е. у каждой галки делать onclick="..." и прибавлять/вычитать в обработчике стоимость соответствующего товара.
Ответить с цитированием
  (#3 (permalink)) Старый
imported_mus imported_mus вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.05.2005
По умолчанию 02.05.2005, 02:47

Ваш вариант, michael, уже был мною затронут. Он у меня был первый, но как-бы менее предпочтительный, хотя если покатит с вашей помощью, на предпочтительность внимания обращать не буду.

У чекбокса сделать вызов функции pricing по событию onClick и передать в аргументе имя данного чекбокса, цену и кол-во. Функция будет выглядеть так:

Код:
function pricing(name, price, quantity) {
if(document.form1.elements[name].checked == true)
{
price = Number(price)
quantity = Number(document.form1.elements[quantity].value)
document.form1.calcprice.value = Number(document.form1.calcprice.value)+(price*quantity);
}
else
{
price = Number(price)
quantity = Number(document.form1.elements[quantity].value)
document.form1.calcprice.value = Number(document.form1.calcprice.value)-(price*quantity);
}
};
А теперь при изменении поля кол-во товара (onChange) вызываем функцию pricing2, передавая те же аргументы, выглядит она так:

Код:
function pricing(name, price, quantity) {
if(document.form1.elements[name].checked == true)
{
price = Number(price)
quantity = Number(document.form1.elements[quantity].value)
document.form1.calcprice.value = (price*quantity);
}
else
{
price = Number(price)
quantity = Number(document.form1.elements[quantity].value)
document.form1.calcprice.value = (price*quantity);
}
};
Но обе функции работатют некорректно...
Когда я ставлю галку в поле товар у нас значение становится ранвым цене товара (к примеру, 10 руб), когда делаю кол-во товара = 3, скажем, цена у нас становится 30 руб. Но когда снимаю галку с товара, цена остается равная 20 (десятку вычел и все, а далее - куй, ведь поле кол-во не изменилось же)..

А теперь то, как генерируются у меня чекбоксы, я не хотел выкладывать код, не прочитав правила форума побоялся это делать, некоторые форумы это не особо жалуют...

Так вот:

Код:
echo "[*]<input type="checkbox" $checked name="good[".$tovar['ID']."]" value="".$tovar['Price'].""">".$tovar['Name']."<input type="text" name="Quantity[".$tovar['ID']."]" size="3" value="$Quantity">штукn";
Это вывод полей. Переменная $cheked - не обращайте внимания, данная форма добавления товара является и формой редактирования+удаления оного.
имя - это массив, как я уже говорил, good[".$tovar['ID']."]
кол-во - это тоже массив, Quantity[".$tovar['ID']."]
Значение чекбокса - это цена товара.
Этот вывод происходит в цикле - привожу пример:
Код:
while($tovar = mysql_fetch_array($query_goods))
        {
                    // тот echo
         }
Так что вот так....
Ответить с цитированием
  (#4 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 02.05.2005, 04:12

Вот небольшой пример:
Код:
<html><body>
<form name="form1">
<table border="0" cellpadding="3" cellspacing="0">
<tr><td>1.</td><td><input type="checkbox" checked name="good[3541]" value="10" onclick="calcCost()"></td><td>Шлёпанцы</td><td><input type="text" name="Quantity[3541]" size="3" value="1" onpropertychange="calcCost()">штук</td></tr>
<tr><td>2.</td><td><input type="checkbox" name="good[1234]" value="55" onclick="calcCost()"></td><td>Коврикрезиновый</td><td><input type="text" name="Quantity[1234]" size="3" value="1" onpropertychange="calcCost()">штук</td></tr>
<tr><td>3.</td><td><input type="checkbox" checked name="good[9876]" value="18" onclick="calcCost()"></td><td>Кружкафаянсовая</td><td><input type="text" name="Quantity[9876]" size="3" value="3" onpropertychange="calcCost()">штук</td></tr>
<tr><td colspan="3">Общая стоимость:</td><td>0 рублей</td></tr>
</table>
</form>

<script>
var cost = document.getElementById("cost");

function getSummary() {
    var e = document.form1.elements;
    var totalCost = 0;
    var re = /[(.+)]/;
    for (var i = 0; i < e.length; i++) {
        if (e[i].type == "checkbox" && e[i].checked) {
            var result = e[i].name.match(re);
            var id = result[1];
            var c = parseInt(document.form1["Quantity["+id+"]"].value) * parseInt(e[i].value);
            if (!isNaN(c)) totalCost += c;
        }
    }
    return totalCost;
}

function calcCost() {
    cost.innerHTML = getSummary();
}

calcCost();
</script>
</body></html>
Ответить с цитированием
  (#5 (permalink)) Старый
imported_mus imported_mus вне форума
Member
 
Сообщений: 13
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.05.2005
По умолчанию 02.05.2005, 16:26

ВОТ НА ЭТОМ ФОРУМЕ ИСТИННЫЕ СПЕЦЫ!!!
Спасибо, михаель! Все прекрасно пашет. Щас сяду изучать этот фрагмент кода!
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшой сложный запросик zener SQL 0 26.11.2011 18:08
Подозреваю что тут сложный код( язык С RaFa_ Вопросы начинающих программистов 3 22.10.2011 02:21
Сложный вопрос по звуковой части компьютера. froddo88 Звук 1 20.09.2011 03:54
Сложный вопрос Vodynoy Любые вопросы от новичков 10 12.05.2011 15:57
Крестики нолики (сложный пример) nbyte7 Prolog 0 23.09.2010 21:12
Сложный отчет в access как реализовать Meteorage Visual Basic 2 05.08.2010 17:49
Сложный выбор между видеоадаптерами (видюхами) Hekz Видеокарты 6 29.04.2010 16:26
Как сделать сложный поиск odinokayahelp Delphi 8 01.12.2009 17:25
Как создать сложный терм pivomer Prolog 1 22.04.2008 00:10
сложный критерий отбора в функции Алек_Л Visual Basic 6 27.07.2006 18:16
Сложный запрос SQL как его изменить ГС ТОФ Delphi 2 19.09.2005 08:45



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов