Commerce устанавливает на сайт дополнительные события, которые можно перехватывать с помощью плагинов, и тем самым добавлять свою логику в процессы магазина.
В основном в событиях используется передача параметров по ссылке, т.е. чтобы изменить что-то, не нужно возвращать результат - достаточно изменить значение параметра. Небольшой пример:
switch ($modx->event->name) {
case 'OnBeforeCartItemAdding': {
$params['item']['price'] += 100;
break;
}
}
Здесь видно два важных момента:
$modx->event->name
вместо сложившейся практики сохранения ссылки на $modx->Event
, так как Commerce активно использует вложенные события (http://modx.im/blog/docs/5933.html).$params
, а не переменная $item
, так как ссылка есть только в массиве.Старт инициализации основного плагина. Параметров нет.
Может использоваться для регистрации клиентских скриптов, которые зависят от Commerce, для регистрации дополнительных корзин, хранилищ, добавления элементов в контейнер зависимостей и пр.
switch ($modx->event->name) {
case 'OnInitializeCommerce': {
ci()->set('myCustomClass', function($ci) use ($params) {
require_once MODX_BASE_PATH . 'path/to/CustomClass.php';
return new CustomClass($params);
});
$modx->regClientScript('path/to/custom-commerce-script.js');
break;
}
}
Вызывается после того, как основной плагин инициализирован, корзины и вспомогательные сервисы зарегистрированы. Параметров нет.
Вызывается в момент получения обработчика заказов. Можно зарегистрировать свой обработчик. Параметров нет.
class CustomOrdersProcessor implements \Commerce\Interfaces\Processor {
...
}
switch ($modx->event->name) {
case 'OnInitializeOrderProcessor': {
$processor = new CustomOrdersProcessor($modx);
$modx->commerce->setProcessor($processor);
break;
}
}
Вызывается в момент инициализации сниппета Order, позволяет редактировать параметры вызова (правила валидации, параметры отправки и пр.)
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
config | Да | Массив с параметрами вызова сниппета Order |
switch ($modx->event->name) {
case 'OnInitializeOrderForm': {
$params['rules']['msg'] = [
'required' => 'Заполните комментарий к заказу!',
];
break;
}
}
Вызывается в разные моменты работы пакета для получения массива дополнительных сборов заказа. Сюда можно включить, например, выбранный покупателем способ доставки и ее стоимость, размер скидки или комиссии.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
rows | Да |
Массив строк, каждая строка представляет собой массив с ключами title и price - название и цена соответственно.
|
total | Да | Итоговая стоимость заказа |
realonly | Нет | Принимает значение true , если собираются только элементы, которые реально изменяют стоимость заказа. Это имеет смысл, чтобы не сохранять с заказом сугубо информативные элементы. |
switch ($modx->event->name) {
case 'OnCollectSubtotals': {
$params['total'] += 100;
$params['rows']['fee'] = [
'title' => 'Комиссия магазина',
'price' => 100,
];
break;
}
}
Чтобы выводить дополнительный сбор только после перехода покупателя к оформлению заказа, можно использовать метод обработчика заказов isOrderStarted()
:
if ($modx->commerce->loadProcessor()->isOrderStarted()) {
// добавляем стоимость доставки
}
Если вывод также зависит от выбранного способа доставки или оплаты, можно использовать методы обработчика getCurrentDelivery()
и getCurrentPayment()
:
$processor = $modx->commerce->loadProcessor();
if ($processor->getCurrentDelivery() == 'mydelivery' && $processor->getCurrentPayment() == 'mypayment') {
// добавляем стоимость доставки
}
Сбор всех доступных покупателю способов доставки заказа.
Параметры:
Имя параметра | Передается по ссылке | Описание | ||||||
---|---|---|---|---|---|---|---|---|
rows | Да |
Массив строк
|
switch ($modx->event->name) {
case 'OnRegisterDelivery': {
$params['rows']['mydelivery'] = [
'title' => 'Доставка',
'price' => 100,
];
break;
}
}
Сбор всех доступных покупателю способов оплаты. Параметров нет.
class CustomPayment implements \Commerce\Interfaces\Payment {
...
}
switch ($modx->event->name) {
case 'OnRegisterPayments': {
$class = new CustomPayment($modx, $params);
$modx->commerce->registerPayment('mypayment', 'Мой способ платежа', $class);
break;
}
}
Часто бывает так, что способы оплаты заказа зависят от выбранного способа доставки. В таком случае можно использовать метод обработчика заказа getCurrentDelivery()
для организации условий:
if ($modx->isBackend() || $modx->commerce->loadProcessor()->getCurrentDelivery() == 'mydelivery') {
// регистрируем обработчик платежа
}
Важно также заметить, что в этом примере используется проверка $modx->isBackend()
, чтобы пользовательские условия не влияли на доступность метода оплаты при редактировании и просмотре заказов в панели администрирования.
Вызывается перед выводом способов доставки и оплаты, после их регистрации. Можно изменить выбранный способ, изменить их состав. Удобно, когда доставка зависит от оплаты, или наоборот.
Из-за того, что корзины выводятся отдельно от формы заказа, и обычно раньше ее, изменение способов доставки никак не повлияет на дополнительные сборы, установленные данными способами доставки, и на общую сумму заказа.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
payments | Да | Массив способов оплаты |
delivery | Да | Массив способов доставки |
current_payment | Да | Выбранный способ оплаты |
current_delivery | Да | Выбранный способ доставки |
switch ($modx->event->name) {
case 'OnBeforeOrderAddonsRender': {
if (isset($params['delivery']['pickup'])) {
// добавляем пояснение для самовывоза
$params['delivery']['pickup']['markup'] .= '<p>Дождитесь звонка оператора для согласования времени самовывоза!</p>';
}
if (isset($params['payments']['cash']) && $params['current_delivery'] != 'pickup') {
// если доставка - не самовывоз, убираем способ оплаты наличными
unset($params['payments']['cash']);
}
break;
}
}
Вызывается перед отправкой ответа сервера при ajax-запросе, например при добавлении в корзину или обновлении корзин. Позволяет модифицировать ответ.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
response | Да | Массив элементов, из которых состоит ответ сервера. Ключ status есть в любом случае, он может принимать значения success или failed и означает, успешен ли запрос или нет. Остальные элементы в разных запросах различаются. |
switch ($modx->event->name) {
case 'OnCommerceAjaxResponse': {
$url = trim($_GET['q'], '/');
if ($url == 'commerce/action' && $_POST['action'] == 'cart/add') {
$params['response']['myparam'] = 'myresponse';
}
break;
}
}
Вызывается перед добавлением товара в корзину. Позволяет отменить действие, либо модифицировать атрибуты добавляемого товара.
Параметры:
Имя параметра | Передается по ссылке | Описание | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
instance | Нет | Тип корзины | ||||||||||||
prevent | Да | Флаг отмены действия. Если переключить в true , товар не будет добавлен. | ||||||||||||
item | Да | Массив с атрибутами добавляемого товара. Элементы следующие:
|
switch ($modx->event->name) {
case 'OnBeforeCartItemAdding': {
if ($params['item']['price'] < 100) {
$params['prevent'] = true;
$modx->event->stopPropagation();
}
break;
}
}
Вызывается перед изменением товара в корзине. Позволяет модифицировать изменяемые атрибуты.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
instance | Нет | Тип корзины |
row | Да | Идентификатор изменяемой строки корзины |
item | Да | Массив с уже измененными атрибутами товара |
wasadded | Нет | Флаг, означающий, что первым действием было добавление товара |
prevent | Да | Флаг отмены действия. Если переключить в true , товар не будет изменен |
Вызывается перед удалением товара из корзины. Позволяет отменить удаление либо изменить товар, который нужно удалить.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
by | Нет | row или id |
row | Да | Идентификатор изменяемой строки корзины, определен, только если если by = row |
id | Да | Идентификатор товара, определен, только если если by = id |
prevent | Да | Флаг отмены действия. Если переключить в true , товар не будет удален |
Вызывается перед очисткой корзины. Позволяет отменить очистку.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
instance | Нет | Тип корзины |
prevent | Да | Флаг отмены действия. Если переключить в true , корзина не будет очищена |
Вызывается после любого изменения корзины.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
instance | Нет | Тип корзины |
switch ($modx->event->name) {
case 'OnCartChanged': {
if ($params['instance'] == 'products') {
$cart = ci()->carts->getCart($params['instance']);
if ($cart) {
$items = $cart->getItems();
if (count($items)) {
// для примера увеличим количество товара в первой строке
$row = key($items);
$items[$row]['count'] += 1;
$cart->setItems($items);
}
}
}
break;
}
}
Вызывается при изменении данных в процессе оформления заказа.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
data | Нет | Данные заказа |
Вызывается после валидации данных заказа, до создания самого заказа. Позволяет модифицировать как данные покупателя, так и состав корзины заказа.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
FL | Да | FormLister |
items | Да | Массив с товарами корзины |
prevent | Да | Флаг отмены действия. Если переключить в true , произойдет отмена заказа |
switch ($modx->event->name) {
case 'OnBeforeOrderProcessing': {
$FL->setField('name', 'Вася');
break;
}
}
Если требуется отменить заказ, желательно добавить сообщение пользователю:
switch ($modx->event->name) {
case 'OnBeforeOrderProcessing': {
$params['prevent'] = true;
$FL->addMessage('Заказ отменен!');
break;
}
}
Вызывается перед созданием платежа - после создания заказа (если был выбран какой-либо способ платежа), либо при оплате ранее созданного заказа по специальной ссылке.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Да | Массив с данными заказа |
payment | Нет | Массив с описанием и классом обработчика платежа |
FL | Да | FormLister. Присутствует только в процессе оформления заказа |
instant_redirect | Да | Если 1 - покупатель сразу будет перенаправлен в платежную систему, 0 - будет показан шаблон redirect_template |
redirect_text | Да | Текст сообщения о перенаправлении на оплату. Присутствует только в процессе оформления заказа |
redirect_template | Да | Шаблон текста уведомления об оформлении заказа и перенаправлении на оплату |
switch ($modx->event->name) {
case 'OnBeforePaymentProcess': {
if (isset($FL) && $order['fields']['payment_method'] == 'mypayment') {
$params['redirect_text'] = 'Перенаправление!';
}
break;
}
}
Вызывается при создании и сохранении платежа, позволяет изменить сумму.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order_id | Нет | Идентификатор заказа, который оплачивается |
order_amount | Нет | Стоимость заказа |
amount | Да | Сумма платежа, за вычетом суммы оплаченных ранее траншей |
hash | Да | Хэш платежа, для формирования ссылок |
switch ($modx->event->name) {
case 'OnBeforePaymentCreate': {
// получаем данные формы заказа
$data = ci()->commerce->loadProcessor()->getRawData();
// если включена предоплата, уменьшаем сумму вполовину
if (!empty($data['partial'])) {
$params['amount'] = $params['amount'] * 0.5;
}
break;
}
}
Вызывается перед самым сохранением заказа в базу данных, когда все данные собраны, при создании, либо обновлении заказа. Позволяет полностью изменить заказ. Отменить сохранение нельзя.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order_id | Нет | Идентификатор заказа, null если заказ новый |
values | Да | Значения полей для сохранения в таблицу commerce_orders |
items | Да | Массив товаров, подготовленный для сохранения в таблицу commerce_order_products |
subtotals | Да | Массив доп.сборов, сохраняется также в commerce_order_products в облегченной форме |
Вызывается после сохранения заказа, перед отправкой уведомления менеджеру.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
FL | Да | FormLister |
order | Да | Данные заказа |
cart | Да | Данные сохраненной корзины |
Вызывается после сохранения заказа в базу данных.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
mode | Нет | При создании заказа - "new", при обновлении - "upd" |
order_id | Нет | Идентификатор заказа |
values | Да | Значения полей из таблицы commerce_orders |
items | Да | Массив товаров из таблицы commerce_order_products |
subtotals | Да | Массив доп.сборов из таблицы commerce_order_products |
Вызывается после окончания обработки заказа.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
FL | Да | FormLister |
order | Нет | Данные заказа |
cart | Нет | Данные сохраненной корзины |
Вызывается после оплаты заказа (полной или частичной).
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order_id | Нет | Идентификатор заказа |
order | Нет | Данные заказа |
status_id | Нет | Идентификатор статуса заказа после оплаты |
payment | Нет | Данные платежа |
total | Нет | Полная сумма всех платежей по заказу |
fully_paid | Нет | true, если заказ полностью оплачен |
Вызывается перед сменой текущей валюты. Позволяет подменить новую валюту на другую. Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
old | Нет | Символьный идентификатор текущей валюты |
new | Да | Символьный идентификатор устанавливаемой валюты |
Вызывается после назначения плейсхолдеров с данными заказа на странице переадресации после успешного оформления заказа или проведения оплаты.
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Нет | Данные заказа |
Вызывается перед добавлением истории заказа. Позволяет изменить статус и комментарий, либо отменить добавление или уведомление покупателя.
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order_id | Нет | Идентификатор заказа |
order | Нет | Данные заказа |
status_id | Да | Идентификатор назначаемого статуса заказа |
comment | Да | Комментарий |
notify | Да | Нужно ли уведомлять покупателя об изменении статуса, true или false |
prevent | Да | Отменить изменение истории, true или false |
switch ($modx->event->name) {
case 'OnBeforeOrderHistoryUpdate': {
if ($status_id == 4) {
$params['prevent'] = true;
$modx->event->stopPropagation();
}
if ($status_id == 10) {
$params['comment'] = 'Мой комментарий';
}
}
}
Вызывается перед уведомлением покупателя при изменении истории заказа или изменении данных заказа. Позволяет изменить уведомление либо отменить отправку.
Имя параметра | Передается по ссылке | Описание |
---|---|---|
reason | Нет | Тип события:order_changed - добавление истории заказаstatus_changed - изменение данных заказа |
order | Да | Данные заказа |
subject | Да | Шаблон темы письма-уведомления |
body | Да | Шаблон текста письма-уведомления |
data | Да | Данные, которые будут использоваться при парсинге шаблонов письма |
prevent | Да | Отменить отправку уведомления, true или false |
Эти события вызываются при работе менеджера с заказами в панели администрирования магазином.
Вызывается перед выводом списка заказов. Позволяет модифицировать вывод.
Имя параметра | Передается по ссылке | Описание |
---|---|---|
config | Да | Конфигурация DocLister. Вывод формируется его контроллером onetable |
columns | Да | Конфигурация колонок - массив пар идентификатор колонки => параметры колонки |
filters | Да | Конфигурация фильтров |
Параметры конфигурации DocLister по умолчанию:
[
'orderBy' => 'created_at DESC',
'display' => 10,
'paginate' => 'pages',
'TplWrapPaginate' => '@CODE:<ul class="[+class+]">[+wrap+]</ul>',
'TplCurrentPage' => '@CODE:<li class="page-item active"><span class="page-link">[+num+]</span></li>',
'TplPage' => '@CODE:<li class="page-item"><a href="[+link+]" class="page-link page" data-page="[+num+]">[+num+]</a></li>',
'TplNextP' => '@CODE:',
'TplPrevP' => '@CODE:',
];
В параметрах колонок можно использовать следующие параметры:
Имя параметра | Описание |
---|---|
title | Заголовок колонки |
content | Содержимое. Может быть строкой - именем поля из заказа, либо анонимной функцией со следующими параметрами:$data - данные заказа$DL - ссылка на объект $_DocLister$eDL - ссылка на объект $_extDocLister |
sort | Индекс для сортировки |
style | Css-стиль колонки, добавляется к каждой ячейке |
Конфигурация колонок по умолчанию:
[
'id' => [
'title' => '#',
'content' => 'id',
'sort' => 0,
'style' => 'width: 1%; text-align: center;',
],
...
'name' => [
'title' => $lang['order.name_field'],
'content' => 'name',
'sort' => 20,
],
...
'email' => [
'title' => $lang['order.email_field'],
'content' => function($data, $DL, $eDL) {
if (!empty($data['email']) && filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
return '<a href="mailto:' . $data['email'] . '">' . $data['email'] . '</a>';
}
return '';
},
'sort' => 40,
'style' => 'white-space: nowrap;',
],
...
];
Пример:
switch ($modx->event->name) {
case 'OnManagerBeforeOrdersListRender': {
$params['config']['display'] = 50;
$params['columns']['lastname'] = [
'title' => 'Фамилия',
'content' => function($data, $DL, $eDL) {
if (!empty($data['fields']['lastname'])) {
return htmlentities($data['fields']['lastname']);
}
return '';
},
'sort' => 23,
];
}
}
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы со списком заказов. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
orders | Нет | Массив заказов для вывода |
Вызывается перед выводом детальной информации о заказе
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Да | Данные заказа |
groups | Да | Конфигурация групп с информацией о заказе |
config | Да | Конфигурация DocLister для вывода товаров из заказа |
columns | Да | Конфигурация колонок для вывода товаров заказа |
subcolumns | Да | Конфигурация колонок для вывода дополнительных сборов |
Пример:
switch ($modx->Event->name) {
case 'OnManagerBeforeOrderRender': {
$params['groups']['order_info']['fields']['msg'] = [
'title' => 'Комментарий',
'content' => function($data) {
return !empty($data['fields']['msg']) ? htmlentities($data['fields']['msg']) : '';
},
'sort' => 40,
];
unset($params['columns']['options']);
break;
}
}
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы детального просмотра заказа. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Нет | Массив с данными заказа |
products | Нет | Массив с товарами заказа |
subtotals | Нет | Массив с доп.сборами заказа |
Вызывается перед выводом страницы редактирования заказа.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Да | Данные заказа |
fields | Да | Конфигурация полей заказа |
config | Да | Конфигурация DocLister для вывода товаров из заказа |
columns | Да | Конфигурация колонок для вывода полей редактирования товаров заказа |
subcolumns | Да | Конфигурация колонок для вывода дполей редактирования ополнительных сборов |
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы редактирования заказа. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Нет | Массив с данными заказа |
products | Нет | Массив с товарами заказа |
subtotals | Нет | Массив с доп.сборами заказа |
Вызывается при сохранении отредактированного заказа перед валидацией новых значений.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Нет | Оригинальные данные заказа |
data | Да | Массив с новыми данными и провилами их проверки. Для проверки правил используется валидатор из комплекта FormLister. |
Структура массива с новыми данными:
[
'order' => [
'data' => [
// данные заказа
'name' => 'Вася',
'email' => 'test@test.test',
...
],
'rules' => [
// правила проверки, например:
'!name' => [
'lengthBetween' => [
'params' => [2, 255],
'message' => $lang['module.error.name_length'],
],
],
'email' => [
'email' => $lang['module.error.email_incorrect'],
],
...
],
],
'cart' => [
'data' => [
// данные корзины заказа
],
'rules' => [
// правила проверки
],
],
'subtotals' => [
'data' => [
// данные дополнительных сборов заказа
],
'rules' => [
// правила проверки
],
],
];
Вызывается после проверки данных заказа, независимо от того, пройдена проверка или нет.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
order | Нет | Данные заказа |
data | Да | Данные из события OnManagerBeforeOrderValidating |
errors | Да | Массив с ошибками. Если массив пустой - валидация пройдет успешно, если нет - редактирование заказа будет отменено, а ошибки будут выведены на экран |
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы со списком статусов заказов. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
list | Нет | Массив со статусами заказов |
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы редактирования статуса заказов. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
status | Нет | Массив с данными статуса заказов |
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы со списком валют. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
list | Нет | Массив со списком валют |
Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы редактирования валюты. Для установки значения нужно использовать метод $modx->event->setOutput()
.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
status | Нет | Массив с данными валюты |
Вызывается при сохранении валюты, в случае, если редактируемая валюта назначается валютой по умолчанию.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
old | Нет | Данные валюты, которая была установлена по умолчанию прежде |
new | Да | Данные валюты, назначаемой по умолчанию |
Вызывается перед орбаботкой пути при работе в модуле в панели администрирования. Дает возможность зарегистрировать свой контроллер.
Параметры:
Имя параметра | Передается по ссылке | Описание |
---|---|---|
module | Да | Ссылка на класс-менеджер модуля \Commerce\Module\Manager |
class MyController extends \Commerce\Module\Controllers\Controller implements \Commerce\Module\Interfaces\Controller
{
...
}
switch ($modx->Event->name) {
case 'OnManagerRegisterCommerceController': {
$module->registerController('customroute', new MyController($modx, $module));
break;
}
}