Изменение опции размера в корзине miniShop2

Добрый день!
Имеем магазин на 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);
    });
}

Наглядно можно посмотреть тут и тут.

Вроде ничего не забыл.
Андрей Шевяков
11 апреля 2019, 22:23
modx.pro
2
1 005
0
Поблагодарить автора Отправить деньги

Комментарии: 18

atrox
06 сентября 2019, 07:31
0
получилось реализовать данный функционал?
    Андрей Шевяков
    12 октября 2019, 22:28
    0
    Да получилось, вопрос еще актуальный, могу расписать решение?
      atrox
      13 октября 2019, 20:11
      0
      напишите пожалуйста
      Alex DOM
      15 ноября 2019, 16:35
      0
      Тоже интересно )
      Антон Тарасов
      10 февраля 2020, 20:16
      0
      присоединяюсь, распишите пожалуйста.
      Владимир
      04 мая 2020, 20:16
      0
      Сразу не расписали, теперь все мучаются.
        Андрей Шевяков
        05 мая 2020, 18:27
        0
        Сорян, что пропал. Обновил заметку.
          Владимир
          05 мая 2020, 18:57
          +1
          Спасибо большое! Странно, что это не реализовано в базовом функционале. Т.к. по дефолту из каталога товар добавляется без опции размера, даже если ее передавать вместе с формой точно так же, как это делается на странице товара…
      Андрей Шевяков
      05 мая 2020, 18:27
      0
      Сорян, что пропал. Обновил заметку.
        Антон Тарасов
        05 мая 2020, 18:32
        +1
        Я по три раза не говорю, не говорю, не говорю)))
        Спасибо за обновление!
          Андрей Шевяков
          05 мая 2020, 18:36
          +1
          Я специально всем ответил, чтобы всем уведомление пришло и все увидели, вдруг кто-то не поставил галочку «Уведомлять о новых комментариях». А я хз придет ли уведомление или нет. Извиняюсь за спам.
      Дмитрий Танцирев
      16 сентября 2020, 13:10
      +1
      Откровенно криво реализован данный момент в самом минишопе (не в вашем скрипте — а непосредственно в самом минишопе).
      Из-за этого приходится сначала удалить товар из корзины, затем по новой его добавить с новой опцией.
      Хотя Василию ни что не мешало в минишоповскую функцию change — отправлять массив с опциями.
      Может пофиксит этот момент.

      Спасибо за подсказку! Сижу вот мучаюсь с такой же задачей.
      Теперь хоть появилась мысль как сделать костыль без изменения минишоповких исходников =)
        Иван Бочкарев
        16 сентября 2020, 13:24
        +1
        Присылайте PR — рассмотрим.
        Василий давно не занимается minishop2 — он на данный момент поддерживается сообществом.
          Дмитрий Танцирев
          16 сентября 2020, 14:38
          0
          Отправил
            Андрей Шевяков
            16 сентября 2020, 15:46
            0
            Поделитесь пожалуйста потом готовым решением, по задаче «Изменение опции размера в корзине miniShop2». Интересно посмотреть, как у вас получилось.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        18