Если вам нужно простое окно, вы можете использовать jquery-событие cart-add-complete.commerce
:
$(document).on('cart-add-complete.commerce', function(e, params) {
alert('Товар в корзине!');
});
Но зачастую этого недостаточно, т.к. из параметров события можно достать только идентификатор добавленного товара. В таком случае может помочь серверное событие OnCommerceAjaxResponse
, которое позволит модифицировать ответ сервера после добавления товара и добавить в ответ свои данные.
Допустим, вам нужно, чтобы в окне показывалось название товара и содержимое корзины. Для этого создайте плагин:
switch ($modx->event->name) {
case 'OnCommerceAjaxResponse': {
if (empty($_GET['q']) || empty($_POST['action'])) {
break;
}
// нужно только событие добавления в корзину
if ($_GET['q'] != 'commerce/action' || $_POST['action'] != 'cart/add') {
break;
}
// только успешное добавление в корзину товаров
if ($response['status'] != 'success' || $response['instance'] != 'products') {
break;
}
// получаем корзину
$cart = ci()->carts->getCart($response['instance']);
// получаем строку корзины по ее идентификатору
$row = $cart->get($response['row']);
if ($row) {
// формируем заголовок окна - название товара
$product = $modx->runSnippet('DocLister', [
'idType' => 'documents',
'documents' => $row['id'],
'tpl' => '@CODE:Товар «[+pagetitle+]» добавлен в корзину!',
]);
// формируем корзину
$cart = $modx->runSnippet('Cart', [
'theme' => 'mini',
'ownerTPL' => '@CODE:
<div data-commerce-cart="[+hash+]">
<table class="table">
<thead>
<tr>
<td>[%cart.item_title%]</td>
<td>[%cart.count%]</td>
<td class="text-xs-right">[%cart.item_price%]</td>
<td class="text-xs-right">[%cart.item_summary%]</td>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="3">[%cart.total%]:</td>
<td class="text-xs-right">[[PriceFormat? &price=`[+total+]` &convert=`0`]]</td>
</tr>
</tfoot>
<tbody>
[+dl.wrap+]
</tbody>
</table>
</div>
',
]);
// добавляем в ответ сервера разметку модального окна
// ! идентификатор страницы заказа должен быть заполнен в настройках плагина Commerce !
$params['response']['popup'] = ci()->tpl->parseChunk('@CODE:
<div class="modal fade" id="popupcart" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<button type="button" class="close icon-close" data-dismiss="modal"></button>
<div class="modal-title">
[+product+]
</div>
<div class="modal-body">
<p>Состав корзины:</p>
[+cart+]
</div>
<div class="modal-footer">
<a href="[+order_url+]" class="btn btn-sm btn-orange">Оформить заказ</a>
<a href="/04_extras/commerce/99_primery/50_okno_pri_dobavlenii_v_korzinu.html#" class="btn btn-sm btn-secondary" data-dismiss="modal">Продолжить покупки</a>
</div>
</div>
</div>
</div>
', [
'product' => $product,
'cart' => $cart,
'order_url' => $modx->makeUrl($modx->commerce->getSetting('order_page_id')),
]);
}
break;
}
}
Чтобы показать данное окно, добавьте на страницу js-код. Он будет проверять, есть ли в ответе разметка модального окна, и если есть - показывать его.
$(document).on('cart-add-complete.commerce', function(e, params) {
if (params.response.popup) {
$('#popupcart, .modal-backdrop').remove();
var $modal = $(params.response.popup);
$modal.on('hidden.bs.modal', function() {
$modal.remove();
});
$modal.appendTo(document.body).modal('show');
}
});
Еще один пример всплывающего окна уведомления (growl) с использованием https://github.com/apvarun/toastify-js
$(document).on('cart-add-complete.commerce', function (e, params) {
var instance = params.data.instance;
switch (instance) {
case 'comparison':
var growlText = "Товар добавлен к сравнению";
var growlLink = "/compare";
break;
case 'wishlist':
var growlText = "Товар добавлен в избранное";
var growlLink = "/favorites";
break;
case 'products':
default:
var growlText = "Товар добавлен в корзину";
var growlLink = "/cart";
break;
}
Toastify({
text: growlText,
close: true,
destination: growlLink
}).showToast();
});