Калькулятор услуг
Здравствуйте!
Нужна помощь с калькулятором. Задача у меня такая: Пытаюсь собрать калькулятор, не могу придумать алгоритм. Цена зависит от таких факторов - размер, тип, упаковка, рамка. Все это уже предусмотренно, и конкретные размеры, тип, пользователю предоставляется только выбор. 1. Начинает пользователь с главного, размер, пусть будет три размера 10*10, 20*20 и 30*30. 2. После выбирает тип, пусть будет тип 1, тип 2 и тип3 Цена зависит от размера т.е. если размер 10*10 и тип1 или тип2 или тип3, то цена 100, если размер 20*20 и тип1 или тип2 или тип3 - цена 200, если размер 30*30 и тип1 или тип 2, или тип3 цена 300. 3. Выбирает рамку, она зависит от размера, если размер 10*10 цена 100, если размер 20*20 цена 200, если 30 на 30 цена 300. Если рамка не нужна, то нечего не складывается. 4. Выбор упаковки, аналогично с рамкой, зависит от размера, 10*10 цена 100, если размер 20*20 цена 200, если 30 на 30 цена 300. Если упаковка не нужна, то нечего не складывается. Т.е. есть 4 пункта, все 4 надо выбрать (кроме последних двух, они не обязательны, но если выбираются, то нужно добавлять к основной сумме). Есть такая форма <form method="POST" action="send.php" id="order"> <label>Размер: </label> <select name="size"> <option></option> </select><br /> <label>Тип: </label> <select name="type"> <option></option> </select><br /> <label>рамка: </label> <select name="ramka"> <option></option> </select><br /> <label>упаковка: </label> <select name="upakovka"> <option></option> </select><br /> <label id="price">Цена: </label><br /> <input type="submit" value="Заказать"> </form> Проверка на заполненность и вычисление цены в зависимости от размера и типа. $("#order").validate({ rules: { size: { required: true }, type: { required: true } ramka: { required: true }, upakovka: { required: true } }, messages: { size: { required: "Не выбран размер." }, type: { required: "Не выбран тип." } ramka: { required: "Не выбрана рамка." }, upakovka: { required: "Не выбрана упаковка." } } }); var sizes = [{ id: 1, value: "А6" }, { id: 2, value: "А5" }, { id: 3, value: "А4" }]; var types = [{ id: 1, value: "Тип 1" }, { id: 2, value: "Тип 2" }, { id: 3, value: "Тип 3" },]; var prices = [ { id: 1, sizeId: 3 && 2 && 1, typeId: 1, value: 0 }, { id: 2, sizeId: 1, typeId: 2, value: 150 }, { id: 3, sizeId: 1, typeId: 3, value: 200 }, { id: 4, sizeId: 2, typeId: 2, value: 250 }, { id: 5, sizeId: 2, typeId: 3, value: 300 }, { id: 6, sizeId: 3, typeId: 2, value: 350 }, { id: 7, sizeId: 3, typeId: 3, value: 400 }, ]; var sizeEl = $("#order")[0]["size"], typeEl = $("#order")[0]["type"]; for (var i = 0; i < sizes.length; i++) sizeEl.add(new Option(sizes[i].value, sizes[i].id)); for (var i = 0; i < types.length; i++) typeEl.add(new Option(types[i].value, types[i].id)); sizeEl.onchange = calculatePrice; typeEl.onchange = calculatePrice; function calculatePrice() { var e = prices.find(function (e) { return e.sizeId == sizeEl.value && e.typeId == typeEl.value; }); $("#price").text("Цена: " + (e ? e.value : "")); } Запутался как дальше реализовать сложение следующих двух пунктов. Понимаю что аналогично с размером, но как правильно - не могу понять. |
Начинает пользователь с главного, размер, пусть будет три размера 10*10, 20*20 и 30*30.
<select name="size">.... Логично. После выбирает тип, пусть будет тип 1, тип 2 и тип3. <select name="type">... Логично. Выбирает рамку, она зависит от размера <select name="ramka">... Не понятно. Размера чего, основного или своего? Если первое, то причем тут список? А упаковка, это черная, белая, красная или просто выбрать/нет ее? |
Цитата:
Есть изделие, оно основное, и все относится к изделию, размер изделия, упаковка и рамка для изделия, рамка и упаковка зависит от размера самого изделия, больше изделие нужно больше упаковки, и больше рамка, а значит выше себестоимость. Рамка пусть будет рамка1, рамка 2, рамка3. Упаковка пусть будет упаковка1, упаковка2, упаковка3. Т.е. выбирает пользователь размер, например 10*10 и например тип2, получает цену, к ней нужно добавить цену рамки и упаковки, если они нужны (на выбор пользователя), а их цены зависят от размеров изделия (10*10 и т.д.). По итогу пользователь получает конечную сумму изделия, с учетом выбранного размера, а также включенную в стоимость рамку и упаковку если это нужно. |
Я о том, что в описанном не понять как же все завязано на размере. Было бы понятно, например, если бы:
1) Есть базовая цена Р печати за площадь рваную 1 дм (10х10). Выбор площади, это умножение базовой цены на выбранную площадь. 2) Есть базовые цены за рамку из: дерева, пластика, железа. В зависимости от площади печати (размера исходника) базовая цена каждого типа рамки увеличивается на N%: 10х10 = Р * 1, 20х20 = Р * 1.2, 30х30 = Р * 1.3. Подобным образом и цены других позиций зависят от размера. 3) Упаковка, либо выбрать ее и добавить к цене фиксированное значение и это флажок, либо это разный материал упаковки с разной ценой или также надбавка за размер только тогда это список. Либо вариант для всех один - выбор любого в позициях, это увеличение единственной базовой цены на N%. У вас же фиксированные цены для каждой позиции в каждом списке, но при этом запутанный объект их описывающий. |
Давайте попробую по другому объяснить.
1. Вот базовые цены: ![]() 2. Рамки ![]() 3. Упаковка ![]() Пользователь выбирает размер и тип обязательно (получает цену из пункта 1), затем (необязательно), выбирает рамку (цена рамки складывается с базовой ценой), после (необязательно), выбирает упаковку (цена упаковки складывается с предыдущей ценой). Т.е. основной пункт это размеры, размеры фиксированные, тип, упаковка, рамка - у каждого пункта своя цена и зависит от этого самого размера, и складывается между собой. |
Если так, то зачем же кухня с объектом, поместите цены в опции списков, а по изменению в них выбирайте значения списков (либо из data атрибута выбранной опции) и складывайте. Что может быть проще?
|
Цитата:
|
Ну кроме указанного в таблице есть ведь список, главный, где нужно выбрать размер, так?
|
Цитата:
1. Выбор размера (10*10, 20*20, 30*30). 2. Тип - цена зависит от пункта 1. Цены только из таблицы с типами. 3. Рамка - цена зависит от пункта 1. Цены только из таблицы с рамками. 4. Упаковка - цена зависит от пункта 1. Цены только из таблицы с упаковками. Алгоритм пользователя: Выбор размера - 10*10 Выбор типа - тип 2 Цена = 150 Выбор рамки (необязательно) - Рамка2 Цена = 150 + 150 Цена = 300 Выбор упаковки (необязательно) - Зеленая Цена 300 + 200 Цена: 500 ![]() |
Я на JQ, чтобы короче:
<form method="POST" action="send.php" id="order"> <label>Размер: </label> <select name="size" required> <option value="" disabled selected>Выбрать</option> <option value="1">10x10</option> <option value="2">20x20</option> <option value="3">30x30</option> </select><br /> <label>Тип: </label> <select name="type" required> <option value="" disabled selected>Выбрать</option> <option data-price="[100,200,300]" value="1">Тип 1</option> <option data-price="[150,250,350]" value="2">Тип 2</option> <option data-price="[200,300,400]" value="3">Тип 3</option> </select><br /> <label>рамка: </label> <select name="frame"> <option value="">Выбрать</option> <option data-price="[100,200,300]" value="1">Рамка 1</option> <option data-price="[150,250,350]" value="2">Рамка 2</option> <option data-price="[200,300,400]" value="3">Рамка 3</option> </select><br /> <label>упаковка: </label> <select name="packing"> <option value="">Выбрать</option> <option data-price="[100,200,300]" value="1">Красная</option> <option data-price="[150,250,350]" value="2">Синяя</option> <option data-price="[200,300,400]" value="3">Зеленая</option> </select><br /> Итого: <output name="total"></output><br /> <input type="submit" value="Заказать"> </form> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> <script> $('#order').on('change', 'select', function(e) { var f = e.delegateTarget, p = $('select', f), size = p.eq(0).children(':selected').index()-1, v = 0; if(!p.filter(function() { return this.required && !this.value }).length) { $.each(p.slice(1), function() { v += this.value ? $(this).children(':selected').data('price')[size] : 0 }); f.total.value = v; } }); </script> Правильно считает? |
Часовой пояс GMT +3, время: 00:15. |