рони, это не намек на что вот демка возьмите и сделайте, просто прошу помощи как её реализовать.
|
Не так все делается. Сперва надо спроектировать структуру данных, где все барахло будет лежать.
|
т.е значения в обьектах не хранить или есть другой вариант?
|
dzho,
в одном обьекте структуру дерево создать, и всё в форму тогда change только на форму |
Без реляционной БД ты застрелишься в реальном масштабе с такой чухней. Другими словами ты откусил гораздо больше, чем сможешь проглотить. Ну или жуй.
Нужна таблица продуктов и таблица опций продуктов, минимально так: Таблица Автомобили. ID Название Таблица Цвет ID ProductID Название цвета Цена Таблица Опции ID ProductID Название опции Цена Технически так и делается, но ты мне покажи бизнес-логику. Как ты определишь цену на Мазда Красная Опция1, если у тебя в каждой блеать опции конечная цена продукта? Ты думал об этом, да, и придумал перевернуть все через жопу, то есть загнать все цвета и опции в запись продукта, то есть Таблица Автомобили. ID Название Название цвета 0 - Цена Название цвета 1 - Цена Название цвета 2 - Цена Название опции 1 - Цена Нифига не полегчало. Как ты выберешь Мазда Цвет 0 Опция 1, если выбрать можно только что-то одно? Нельзя же выбрать два цвета - красный и синий. Ну, технически можно, но это получится бред. Чтобы выбрать Опцию дополнительно к цвету, придется ввести еще признак, показывающий, что эту опцию можно выбрать дополнительно к уже выбранным, поскольку цвет - такая опция как и любая другая, то есть одно из потребительских свойств продукта. Твоя бредовая бизнес-логика и не дает тебе понять и реализовать этот бред. Делай нормально. Нормально это как выше. Цены за цвет и опции определяются как таковые, то есть как за отдельные товары, несмотря, что это опции. Это значит базовый цвет будет стоить 0, базовая опция - без которой нельзя продать машину, будет стоить 0. А все навороты - больше 0. Следовательно в продуктовой таблице цена за товар уже включает в себя базовую комплектацию и значит там есть цена Таблица Автомобили. ID Название Цена базовой комплектации |
Если машинки там чисто для примера, то действующее вещество твоего бреда вот где
Название Название цвета 0 - Цена Название цвета 1 - Цена Название цвета 2 - Цена Название опции 1 - Цена Из такого списка можно выбрать только одну опцию, а у тебя задумка, выбирать из него цвет по одному и еще опцию эту дополнительно. Конечно ты можешь захардкодить бредовую логику прямо в скрипп, ну захардкодь. |
зависимые селекты и сумма
:write:
вариант для медитации ... при условии product это начальная цена, всё остальное повышающие коэффициенты.
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.optionally:checked ~ .rez {
display: inline;
}
.optionally ~ .rez {
display: none;
}
</style>
</head>
<body>
<p>
Если Выбрал значения из первого select т.е mazda значения цен одни, а когда выбираешь например bmw<br>
то значения другие.
</p>
<form id="form" action="http://">
<!-- select product -->
<select class="car">
<option value="">Выбрать</option>
<option value="mazda">mazda</option>
<option value="lada">lada</option>
<option value="bmw">bmw</option>
</select>
<br>
<br>
<!-- color product -->
<select class="color">
<option value="">Выбрать</option>
<option value="red">Красный</option>
<option value="blue">Белый</option>
<option value="blue">Синий</option>
</select>
<br>
<br>
<!-- checkbox list -->
<br>
<br>
<!-- Здесь значение меняються от выбранных вариантов -->
<!-- size product -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от первого select -->
<br>
<br>
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от второго select -->
<br>
<br>
<input type="checkbox" class="optionally" id="opt"><label for="opt">дополнительный настройки
</label>
<br>
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от checkbox -->
<br>
<label>Здесь суммируются значения котые выбрал пользователь</label><br>
<input type="text" class="summa" placeholder="Сумма">
</form>
<script>
window.addEventListener("DOMContentLoaded", function() {
var d = {
mazda: {
product: 350,
red: 450,
white: 500,
blue: 550,
option: 360
},
lada: {
product: 400,
red: 600,
white: 700,
blue: 350,
option: 660
},
bmw: {
product: 600,
red: 700,
white: 300,
blue: 340,
option: 360
}
},
f = document.querySelector("#form"),
g = f.querySelector(".summa"),
h = f.querySelectorAll(".rez"),
a = f.querySelectorAll(".car, .color, #opt"),
b;
f.addEventListener("change", function() {
var c = a[0].value;
b = [0, 0, 0];
if (c) {
b[0] = d[c].product;
var e = a[1].value;
e && (b[1] = d[c][e]);
a[2].checked && (b[2] = d[c].option)
} else a[1].value = "";
g.value = b.reduce(function(b, a, c) {
h[c].value = a + " руб.";
return b + a
}, 0) + " руб."
})
});
</script>
</body>
</html>
|
Рони, спасибо это почти то что нужно:)
http://codepen.io/dzheysen/pen/amJYWJ на основе этого сделал превьюшку но есть сложности как реализовать добавленный функционал // Здесь проблема. Как сделать чтобы при выборе цвета была зависимость в значениях checkbox // например пользователь выбрал значение 1.20 и значения меняются // получаеться так если 1м.20см то значения c такой ценой // option: 1500, // optionTwo: 1400, // optionThree: 2000, // а если 1м.50см // option: 2400, // optionTwo: 0, // optionThree: 0, // optionFour: 0, // optionFive: 0 |
dzho,
не понимаю вашего описания, будет дерево, будет код. |
<div class="block-form">
<form id="form" action="http://">
<h2>Наши услуги</h2>
<div class="block-left">
<!-- Выбор услуги -->
<select class="ListService">
<option value="">Выбрать</option>
<option value="Enamelling">Эмалировка</option>
<option value="Starkril">Старкрил 2</option>
<option value="liquidAcrylic">Жидкий акрил</option>
<option value="AcrylicLiner">Акриловый вкладыш</option>
</select>
<br>
<!-- Длина ванны -->
<select class="meters">
<option value="">Выбрать</option>
<option value="meterOne">1м.20 см</option>
<option value="meterTwo">1м.50 см</option>
<option value="meterThree">1м.70 см</option>
</select>
<!-- Опции услуг -->
<label for="opt">
<input type="checkbox" class="optionally" id="opt"><p>Цвет ванны</p>
</label>
<label for="opt1">
<input type="checkbox" class="optionally" id="opt1"><p>Установка уголка</p>
</label>
<label for="opt2">
<input type="checkbox" class="optionally" id="opt2"><p>Установка сливной системы</p>
</label>
<label for="opt3">
<input type="checkbox" class="optionally" id="opt3"><p>Установка экрана под ванну</p>
</label>
<label for="opt4">
<input type="checkbox" class="optionally" id="opt4"><p>Установка счетчиков.гор. холодной воды</p>
</label>
<label for="opt5">
<input type="checkbox" class="optionally" id="opt5"><p>Установка счетчиков.хол. горячей воды</p>
</label>
<h3>Итого</h3>
</div>
<div class="block-right">
<!-- checkbox list -->
<!-- Здесь значение меняются от выбранных вариантов -->
<!-- size product -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от первого select -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly"> <!-- зависимость от второго select -->
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<input type="text" class="rez" placeholder="0 руб" readonly="readonly">
<br>
<input type="text" class="summa" placeholder="Сумма">
</form>
</div>
</div>
window.addEventListener("DOMContentLoaded", function() {
var d = {
Enamelling: { // Эмалировка
product: 1500, // цена
meterOne: 1400, // стоимость длины ванны 1.20
meterTwo: 1500, // стоимость длины ванны 1.50
meterThree: 1500, //стоимость длины ванны 1.70
colorBath: 0, // стоимость цвета заливки
option: 1500, // checkbox установка уголка
optionTwo: 1400, // checkbox установка сливной системы
optionThree: 2000, // checkbox установка экрана под ванну
optionFour: 850, // установка счетчиков гор.холодн.воды
optionFive: 900 // установка счетчиков хол. горячей воды
},
Starkril: { // Старкрил 2
product: 2000, // цена
meterOne: 1400, // стоимость длины ванны 1.20
meterTwo: 1500, // стоимость длины ванны 1.50
meterThree: 1500, //стоимость длины ванны 1.70
colorBath: 0, // стоимость цвета заливки
option: 1500, // checkbox установка уголка
optionTwo: 1400, // checkbox установка сливной системы
optionThree: 2000, // checkbox установка экрана под ванну
optionFour: 850, // установка счетчиков гор.холодн.воды
optionFive: 900 // установка счетчиков хол. горячей воды
},
liquidAcrylic: { // Жидкий акрил
product: 3000, // цена
meterOne: 1500, // стоимость длины ванны 1.20
meterTwo: 2000, // стоимость длины ванны 1.50
meterThree: 2500, //стоимость длины ванны 1.70
colorBath: 0, // стоимость цвета заливки
option: 1500, // checkbox установка уголка
optionTwo: 1400, // checkbox установка сливной системы
optionThree: 2000, // checkbox установка экрана под ванну
optionFour: 850, // установка счетчиков гор.холодн.воды
optionFive: 900 // установка счетчиков хол. горячей воды
},
AcrylicLiner: { // Акриловый вкладыш
product: 1500, // цена
meterOne: 1400, // стоимость длины ванны 1.20
meterTwo: 3000, // стоимость длины ванны 1.20
meterThree: 3000, //стоимость длины ванны 1.70
colorBath: 2000, // стоимость цвета заливки
option: 2000, // checkbox установка уголка
optionTwo: 0, // checkbox установка сливной системы
optionThree: 2000, // checkbox установка экрана под ванну
optionFour: 850, // установка счетчиков гор.холодн.воды
optionFive: 900 // установка счетчиков хол. горячей воды
},
},
f = document.querySelector("#form"),
g = f.querySelector(".summa"),
h = f.querySelectorAll(".rez"),
a = f.querySelectorAll(".ListService, .meters, #opt", "#opt2", "#opt3","#opt4","#opt5"),
b;
f.addEventListener("change", function() {
var c = a[0].value;
b = [0, 0, 0, 0, 0 , 0, 0];
if (c) {
b[0] = d[c].product;
var e = a[1].value;
e && (b[1] = d[c][e]);
a[2].checked && (b[2] = d[c].option )
} else a[2].value = "";
g.value = b.reduce(function(b, a, c) {
h[c].value = a + " руб.";
return b + a
}, 0) + " руб."
})
});
Сейчас не работает вызов опций начинаю от "Установка уголка" просмотрев Ваш код не совсем понял как подцепить эти их :) Так же логика при выборе услуги " Старкрил2" получается пользователь выбирает эту услугу размер ванны 1.20 то изменяются значения опций option: 1500, // checkbox установка уголка optionTwo: 1400, // checkbox установка сливной системы optionThree: 2000, // checkbox установка экрана под ванну а если выбирает "Стакрил2" размер ванны 1.50 изменяются значения опций option: 2400, // checkbox установка уголка optionTwo: 0, // checkbox установка сливной системы optionThree: 0, // checkbox установка экрана под ванну optionFour: 0, // установка счетчиков гор.холодн.воды optionFive: 0 // установка счетчиков хол. горячей воды значения изменяются при выборе 1.70 colorBath: 0, // цвет ванны option: 2400, // checkbox установка уголка optionTwo: 0, // checkbox установка сливной системы optionThree: 1000, // checkbox установка экрана под ванну optionFour: 0, // установка счетчиков гор.холодн.воды optionFive: 0 // установка счетчиков хол. горячей воды Надеюсь расписал доходчиво:) |
| Часовой пояс GMT +3, время: 16:32. |