Изменение опции размера в корзине miniShop2
Добрый день!
Имеем магазин на miniShop2.
У товаров есть опция — size
Товар в корзину можно добавить из каталога и со страницы товара.
— Из каталога происходит добавление без учета опции size
— Со страницы товара добавляем с учетом выбранного размера
Необходимо в корзине вывести select с опцией размера для данного товара. Но если товар добавлен с уже выбранным размером, то по умолчанию этот размер установлен в selected
А если товар добавлен без выбора размера, то просто предоставить выбор.
Пока вывожу так:
tpl.msCart
Не знаю как выводить в селекте уже выбранный размер. Помогите пожалуйста. И в целом как-то все это не правильно походу я вывожу. Дайте совет, как сделать правильно?
UPD:
Извиняюсь перед всеми кто попросил расписать функционал, а я пропал, возможно уже не актуально, но может кому-то пригодится.
С функционалом помог Илья Уткин, ему за это огромное спасибо.
Суть работы такая:
— если товар добавлен в корзину со страницы товара, то выбранный размер по умолчанию остается, его можно изменить при желании в корзине;
— если товар добавлен в корзину со страницы каталога, без выбора размера, то скрываем кнопку «Оформить», вместо нее показываем надпись «Укажите нужный вам размер выбранных товаров»;
— после того, как пользователь выберет размер для товара, отрабатывает скрипт, который удаляет товар из корзины и добавляет его же с выбранным размером.
Вывод размера в корзине:
Чанк tpl.msOptions.size.cart:
Кнопки в корзине для продолжения:
Js скрипт:
Вроде ничего не забыл.
Имеем магазин на miniShop2.
У товаров есть опция — size
Товар в корзину можно добавить из каталога и со страницы товара.
— Из каталога происходит добавление без учета опции size
— Со страницы товара добавляем с учетом выбранного размера
Необходимо в корзине вывести select с опцией размера для данного товара. Но если товар добавлен с уже выбранным размером, то по умолчанию этот размер установлен в selected
А если товар добавлен без выбора размера, то просто предоставить выбор.
Пока вывожу так:
tpl.msCart
[[!msOptions?&product=`{$product.id}`&options=`size`&tpl=`tpl.msOptions.size.cart`]]
tpl.msOptions.size.cart{foreach $options as $name => $values}
<div class="select-wrapper cart__selects-size">
<select name="options[{$name}]" id="option_{$name}" class="select select-default">
{foreach $values as $value}
<option value="{$value}">{$value}</option>
{/foreach}
</select>
</div>
{/foreach}
Не знаю как выводить в селекте уже выбранный размер. Помогите пожалуйста. И в целом как-то все это не правильно походу я вывожу. Дайте совет, как сделать правильно?
UPD:
Извиняюсь перед всеми кто попросил расписать функционал, а я пропал, возможно уже не актуально, но может кому-то пригодится.
С функционалом помог Илья Уткин, ему за это огромное спасибо.
Суть работы такая:
— если товар добавлен в корзину со страницы товара, то выбранный размер по умолчанию остается, его можно изменить при желании в корзине;
— если товар добавлен в корзину со страницы каталога, без выбора размера, то скрываем кнопку «Оформить», вместо нее показываем надпись «Укажите нужный вам размер выбранных товаров»;
— после того, как пользователь выберет размер для товара, отрабатывает скрипт, который удаляет товар из корзины и добавляет его же с выбранным размером.
Вывод размера в корзине:
{if $product.size?}
<div class="select-wrapper cart__selects-size" data-size="{$product.options.size}" data-product="{$product.id}" data-count="{$product.count}" data-key="{$product.key}">
{'!msOptions' | snippet : [
'product' => $product.id,
'options' => 'size',
'tpl' => 'tpl.msOptions.size.cart',
]}
</div>
{/if}
Чанк tpl.msOptions.size.cart:
{foreach $options as $name => $values}
<select name="{$name}" id="{$name}" class="select select-default">
<option>Размер</option>
{foreach $values as $value}
<option value="{$value}">{$value | uppercase}</option>
{/foreach}
</select>
{/foreach}
Кнопки в корзине для продолжения:
<a href="{$_modx->makeUrl(131)}" class="btn btn-default js-change" id="order_button">Оформить заказ</a>
<p style="display: none;" id="size_empty">Укажите нужный вам размер выбранных товаров!!!</p>
Js скрипт:
// выбор размера в корзине
if ($('.cart__selects-size').length > 0) {
$('.cart__selects-size').each(function(){
var size = $(this).data('size');
if (size) {
$(this).find('select').val(size);
} else {
$('#order_button').hide();
$('#size_empty').show();
}
});
$('.cart__selects-size select').change(function(){
window.changed = {
product : $(this).parents('.cart__selects-size').data('product'),
count : $(this).parents('.cart__selects-size').data('count'),
key : $(this).parents('.cart__selects-size').data('key'),
size : $(this).val()
}
// Отключаем показ сообщений
window.defaultSuccessMessage = miniShop2.Message.success;
miniShop2.Message.success = function(){};
// Отключаем редирект, если корзина станет пустой
window.defaultRemoveCallback = miniShop2.Cart.callbacks.remove.response.success;
miniShop2.Cart.callbacks.remove.response.success = function () {
// Показываем сообщение
miniShop2.Message.show('Размер сохранён', {
theme: 'ms2-message-success',
sticky: false
});
// Отключаем сообщение о добавлении товара
window.defaultAddCallback = miniShop2.Cart.callbacks.add.response.success;
miniShop2.Cart.callbacks.add.response.success = function (response) {
miniShop2.Cart.callbacks.add.response.success = window.defaultAddCallback;
};
// Добавляем в корзину товар с указанным размером
miniShop2.sendData = {
formData: {
action: 'cart/add',
id: window.changed.product,
count: window.changed.count,
options: {
size: window.changed.size
}
}
};
miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.add, miniShop2.Callbacks.Cart.add);
setTimeout(function() {
location.reload();
}, 700);
};
// Удаляем из корзины товар без размера
miniShop2.sendData = {
formData: {
action: 'cart/remove',
key: window.changed.key
}
};
miniShop2.send(miniShop2.sendData.formData, miniShop2.Cart.callbacks.remove, miniShop2.Callbacks.Cart.remove);
});
}
Вроде ничего не забыл.
Поблагодарить автора
Отправить деньги
Комментарии: 18
получилось реализовать данный функционал?
Да получилось, вопрос еще актуальный, могу расписать решение?
напишите пожалуйста
Сорян, что пропал. Обновил заметку.
Тоже интересно )
Сорян, что пропал. Обновил заметку.
присоединяюсь, распишите пожалуйста.
Сорян, что пропал. Обновил заметку.
Сразу не расписали, теперь все мучаются.
Сорян, что пропал. Обновил заметку.
Спасибо большое! Странно, что это не реализовано в базовом функционале. Т.к. по дефолту из каталога товар добавляется без опции размера, даже если ее передавать вместе с формой точно так же, как это делается на странице товара…
Сорян, что пропал. Обновил заметку.
Я по три раза не говорю, не говорю, не говорю)))
Спасибо за обновление!
Спасибо за обновление!
Я специально всем ответил, чтобы всем уведомление пришло и все увидели, вдруг кто-то не поставил галочку «Уведомлять о новых комментариях». А я хз придет ли уведомление или нет. Извиняюсь за спам.
Откровенно криво реализован данный момент в самом минишопе (не в вашем скрипте — а непосредственно в самом минишопе).
Из-за этого приходится сначала удалить товар из корзины, затем по новой его добавить с новой опцией.
Хотя Василию ни что не мешало в минишоповскую функцию change — отправлять массив с опциями.
Может пофиксит этот момент.
Спасибо за подсказку! Сижу вот мучаюсь с такой же задачей.
Теперь хоть появилась мысль как сделать костыль без изменения минишоповких исходников =)
Из-за этого приходится сначала удалить товар из корзины, затем по новой его добавить с новой опцией.
Хотя Василию ни что не мешало в минишоповскую функцию change — отправлять массив с опциями.
Может пофиксит этот момент.
Спасибо за подсказку! Сижу вот мучаюсь с такой же задачей.
Теперь хоть появилась мысль как сделать костыль без изменения минишоповких исходников =)
Присылайте PR — рассмотрим.
Василий давно не занимается minishop2 — он на данный момент поддерживается сообществом.
Василий давно не занимается minishop2 — он на данный момент поддерживается сообществом.
Отправил
Поделитесь пожалуйста потом готовым решением, по задаче «Изменение опции размера в корзине miniShop2». Интересно посмотреть, как у вас получилось.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.