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;
    }
}