Встала задача реализовать на сайте пиццерии 🍕 добавление дополнительных товаров к заказу. Например, заказываем пиццу и к ней нужно сразу (при добавлении в корзину) добавить еще сок 🥤 или картошку фри 🍟. Реализация была сделана через Связи товаров в minishop2. Остальное было написано самостоятельно:
Добавляем в форму товара дополнительные параметры:
<input type="hidden" name="ms2_custom" value="cart/add">
<input type="checkbox" name="linked[]" value="42">
- В input с name linked[] помещается лишь один id доп. товара. Чтобы добавить несколько товаров, нужно создать несколько input полей с разными id.
- Заменяем 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);
}
}
});
});