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;
}
}
Вызывается в разные моменты работы пакета для получения массива дополнительных сборов заказа. Сюда можно включить, например, выбранный покупателем способ доставки и ее стоимость, размер скидки или комиссии.
Параметри:
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| 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, товар не буде змінений |
Викликається після будь-якої зміни кошика.
Параметри:
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| 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 | Так | Масив з товарами кошика |
switch ($modx->event->name) {
case 'OnBeforeOrderProcessing': {
$FL->setField('name', 'Вася');
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 | Так | Дані збереженого кошика |
Викликається після збереження замовлення в базу даних.
Параметри:
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| order_id | Ні | Ідентифікатор замовлення |
| values | Так | Значення полів з таблиці commerce_orders |
| items | Так | Масив товарів з таблиці commerce_order_products |
| subtotals | Так | Масив дод.зборів із таблиці commerce_order_products |
Викликається після закінчення обробки замовлення.
Параметри:
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| FL | Так | FormLister |
| order | Ні | Дані замовлення |
| cart | Ні | Дані збереженого кошика |
Викликається перед зміною поточної валюти. Дозволяє підмінити нову валюту на іншу. Параметри:
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| old | Ні | Символьний ідентифікатор поточної валюти |
| new | Так | Символьний ідентифікатор встановленої валюти |
Викликається після призначення плейсхолдерів з даними замовлення на сторінці переадресації після успішного оформлення замовлення або здійснення оплати.
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| order | Ні | Дані замовлення |
Викликається перед додаванням історії замовлення. Дозволяє змінити статус і коментар, або скасувати додавання або повідомлення покупця.
| Ім'я параметра | Передається по посиланню | Опис |
|---|---|---|
| order_id | Ні | ідентифікатор замовлення |
| 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=""></ul>',
'TplCurrentPage' => '@CODE:<li class="page-item active"><span class="page-link"></span></li>',
'TplPage' => '@CODE:<li class="page-item"><a href="" class="page-link page" data-page=""></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;
}
}