Встала задача реализовать на сайте пиццерии 🍕 добавление дополнительных товаров к заказу. Например, заказываем пиццу и к ней нужно сразу (при добавлении в корзину) добавить еще сок 🥤 или картошку фри 🍟. Реализация была сделана через Связи товаров в minishop2. Остальное было написано самостоятельно:

 

Добавляем в форму товара дополнительные параметры:

<input type="hidden" name="ms2_custom" value="cart/add">
<input type="checkbox" name="linked[]" value="42">
  1. В input с name linked[] помещается лишь один id доп. товара. Чтобы добавить несколько товаров, нужно создать несколько input полей с разными id.
  2. Заменяем ms2_action на ms2_custom

Создаем плагин на событие OnHandleRequest:

<?php
switch ($modx->event->name) {

    case 'OnHandleRequest':
        // Handle ajax requests
        $isAjax = !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest';
        if (empty($_REQUEST['ms2_custom']) || !$isAjax) {
            return;
        }

        switch ($_REQUEST['ms2_custom']) {
            case 'cart/add':

                $data = $_REQUEST;

                if ($miniShop2 = $modx->getService('miniShop2')) {
                    // Инициализируем класс в текущий контекст
                    $miniShop2->initialize($modx->context->key);

                    $response = $miniShop2->cart->add(@$data['id'], @$data['count'], @$data['options']);

                    foreach ($data['linked'] as $link) {
                        $miniShop2->cart->add($link);
                    }

                    $data = $miniShop2->cart->status();
                    $response['data'] = $data;
                    $response['message'] = 'Количество товаров в корзине успешно изменено: ' . $data['total_count'];
                }

                break;

        @session_write_close();
        exit($modx->toJSON($response));
        break;
}

JS логика:

$('body').on('click', '#add-to-cart', function () {

        var arr = $(this).parents('form').serializeArray();

        $.ajax({
            url: '/',
            method: 'post',
            dataType: 'json',
            data: arr,
            success: function (response) {
                if (response.success == true) {
                    if (response.message) {
                        miniShop2.Message.success(response.message);
                        $('.ms2_total_count').html(response.data.total_count);
                    }
                } else {
                    miniShop2.Message.error(response.message);
                }
            }
        });
    });
← Чиним modRelation - вывод похожих ресурсовВосстановить доступ →