Добавляем товар в корзину с параметрами (checkbox)
Пытаюсь добавить в корзину товар с параметрами.
Создал TV с именем add, в нём через запятую указываю значения.
Переделал сниппет для фильтрации. Вызывается [[*add:checkbox]], всё хорошо.
В minishop.js судя по функции ищется тег с классом .params, в данном случае input, и передается атрибут имени = значение.
В чанке tpl.msCart.row добавил (название тв: [[+data.add]])
Максимум чего смог добиться это в корзине показывается (название тв: on)
Необходимо: на странице товара, покупатель отмечает чекбоксы, а выбранные передавались в корзину.
Я так думаю, необходимо добавить другую функцию в minishop.js который парсил бы данные и проверял наличие checked у чекбокса?
UPD: Если в input добавить value="'.$v.'" и добавить товар в корзину, в корзине выведет значение ТВ-параметра add, но только последнее из цикла for(..) какой бы чекбокс не отметить.
UPD2: Нашел в консоле заголовки ответа, содержит следующее:
UPD3: изменил сниппет:
Теперь передаются все параметры:
UPD4:
Исправил на add0, add1 без квадратных скобок.
В корзине показывает, если сделать вывод [[+data.add1]]
Получается, мы получили 4 разных параметра.
Но делать проверку в корзине через
Создал TV с именем add, в нём через запятую указываю значения.
Переделал сниппет для фильтрации. Вызывается [[*add:checkbox]], всё хорошо.
if (empty($input) || empty($name)) {return '';}
$tmp = explode(',',$input);
$rows = '';
$idx = 0;
foreach ($tmp as $v) {
$v = trim($v);
$rows .= '<div class="controls">
<label class="checkbox">
<input class="params" name="'.$name.'_'.$idx.'" type="checkbox">'.$v.'</label>
</div>';$idx++;
}
return $rows;
В minishop.js судя по функции ищется тег с классом .params, в данном случае input, и передается атрибут имени = значение.
В чанке tpl.msCart.row добавил (название тв: [[+data.add]])
Максимум чего смог добиться это в корзине показывается (название тв: on)
Необходимо: на странице товара, покупатель отмечает чекбоксы, а выбранные передавались в корзину.
Я так думаю, необходимо добавить другую функцию в minishop.js который парсил бы данные и проверял наличие checked у чекбокса?
UPD: Если в input добавить value="'.$v.'" и добавить товар в корзину, в корзине выведет значение ТВ-параметра add, но только последнее из цикла for(..) какой бы чекбокс не отметить.
UPD2: Нашел в консоле заголовки ответа, содержит следующее:
action:addToCart
gid:5
num:1
data[add]: последний параметр из цикла
UPD3: изменил сниппет:
if (empty($input) || empty($name)) {return '';}
$tmp = explode(',',$input);
$rows = '';
$idx = 0;
foreach ($tmp as $v) {
$v = trim($v);
$rows .= '<div class="controls">
<label class="checkbox">
<input class="params" name="'.$name.'['.$idx.']" id="'.$name.'['.$idx.']" type="checkbox" value="'.$v.'" checked="checked">'.$v.'</label></div>';$idx++;
}
return $rows;
Код с лишней информацией в input'e, позже исправлю.Теперь передаются все параметры:
action:addToCart
gid:5
num:1
data[add[0]]:чекбокс 1
data[add[1]]:чекбокс 2
data[add[2]]:чекбокс 3
data[add[3]]:чекбокс 4
Но в корзине [[+data.add]] ничего не возвращает.UPD4:
Исправил на add0, add1 без квадратных скобок.
В корзине показывает, если сделать вывод [[+data.add1]]
Получается, мы получили 4 разных параметра.
Но делать проверку в корзине через
[[+data.add*:isnot=``:then=``]]
и каждое свойства выводить в ручную задача ресурсоёмкая и неудобно в плане масштабирования. Т.к. количество addn заранее не известно. Как вывести в корзине все значения которые передаются вместе с товаром? Комментарии: 5
Засуньте в чанк одного товара корзины свой сниппет, который возьмет из сессии массив параметров этого товара (data) и в цикле их выведет.
Спасибо, как раз думал откуда данные брать, чтобы постоянно цикл не гонять даже когда нет товаров.
Хм, передавать — передается. Но по умолчанию ставил checked=checked на всех параметрах. А теперь заметил, что сколько бы не выбрал галочкой — всегда передаются все.
Пытаюсь изменить minishop.js, чтобы он проверял чекбокс на 'checked', но все равно либо не передает параметры, либо передает все.
Если выделить 1 или 2 или 3 из 4, значение в data.* не передается вообще. Если все выделить, передаются все.
Пытаюсь изменить minishop.js, чтобы он проверял чекбокс на 'checked', но все равно либо не передает параметры, либо передает все.
$('.addToCartLink').live('click', function(e) {
var gid = $(this).data('gid');
var params = {};
$('.params').each(function(id, param) {
if($('.params').prop('checked') == true) {
params[param.name] = param.value;
}
});
Если выделить 1 или 2 или 3 из 4, значение в data.* не передается вообще. Если все выделить, передаются все.
Надо почаще писать. После написания сразу же нашел решение.
Вот так работает.
$('.params').each(function(id, param) {
if(param.checked) {
params[param.name] = param.value;
}
Вот так работает.
$('.params').each(function(id, param) {
if(param.checked || param.name == 'color') {
params[param.name] = param.value;
}
Так еще отправляет select с именем color.
Буду рад, если подскажите универсальное решение для полей типа checkbox и select
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.