Серверні події

    Серверні події

    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, так як посилання є тільки в масиві.

    Опис подій

    OnInitializeCommerce

    Старт ініціалізації основного плагіна. Параметрів немає.

    Може використовуватися для реєстрації клієнтських скриптів, які залежать від 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;
        }
    }

    OnInitializeOrderProcessor

    Викликається в момент отримання обробника замовлень. Можна зареєструвати свій обробник. Параметрів немає.

    class CustomOrdersProcessor implements \Commerce\Interfaces\Processor {
        ...
    }
    
    switch ($modx->event->name) {
        case 'OnInitializeOrderProcessor': {
            $processor = new CustomOrdersProcessor($modx);
            $modx->commerce->setProcessor($processor);
            break;
        }
    }

    OnCollectSubtotals

    Вызывается в разные моменты работы пакета для получения массива дополнительных сборов заказа. Сюда можно включить, например, выбранный покупателем способ доставки и ее стоимость, размер скидки или комиссии.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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') {
        // додаємо вартість доставки
    }

    OnRegisterDelivery

    Збір всіх доступних покупцеві способів доставки замовлення.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    rowsТак

    Масив рядків<псевдонім> => <параметри>, де <псевдонім> це символьний ідентифікатор способу доставки, а <параметри> - це масив масив з наступними ключами:

    titleназва способу доставки
    priceціна
    markupдодатковий html-код
    switch ($modx->event->name) {
        case 'OnRegisterDelivery': {
            $params['rows']['mydelivery'] = [
                'title' => 'Доставка',
                'price' => 100,
            ];
            break;
        }
    }

    OnRegisterPayments

    Збір всіх доступних покупцеві способів оплати. Параметрів немає.

    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(),щоб призначені для користувача умови не впливали на доступність методу оплати при редагуванні і перегляді замовлень в панелі адміністрування.

    OnBeforeOrderAddonsRender

    Викликається перед виведенням способів доставки і оплати, після їх реєстрації. Можна змінити обраний спосіб, змінити їх склад. Зручно, коли доставка залежить від оплати, або навпаки.

    Через те, що кошики виводяться окремо від форми замовлення, і зазвичай раніше її, зміна способів доставки ніяк не вплине на додаткові збори, встановлені даними способами доставки і на загальну суму замовлення.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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;
        }
    }

    OnCommerceAjaxResponse

    Викликається перед відправкою відповіді сервера при 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;
        }
    }

    OnBeforeCartItemAdding

    Викликається перед додаванням товару в кошик. Дозволяє скасувати дію, або модифікувати атрибути додається товару.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    instanceНіТип кошика
    preventТак Прапор скасування дії. Якщо переключити в true, товар не буде додано.
    itemТак

    Масив з атрибутами товару, що додається. Елементи наступні:

    idІдентифікатор товару
    nameНазва
    countКількість
    priceЦіна однієї одиниці товару
    optionsМасив додаткових опцій
    metaМасив додаткових даних
    switch ($modx->event->name) {
        case 'OnBeforeCartItemAdding': {
            if ($params['item']['price'] < 100) {
                $params['prevent'] = true;
                $modx->event->stopPropagation();
            }
            break;
        }
    }

    OnBeforeCartItemUpdating

    Викликається перед зміною товару в кошику. Дозволяє модифікувати змінювані атрибути.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    instanceНіТип кошика
    rowТакІдентифікатор змінного рядка кошика
    itemТак

    Масив з уже зміненими атрибутами товару

    wasaddedНіПрапор, який означає, що першою дією було додавання товару
    preventТакПрапор скасування дії. Якщо переключити в true, товар не буде змінений

    OnCartChanged

    Викликається після будь-якої зміни кошика.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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;
        }
    }

    OnOrderRawDataChanged

    Викликається при зміні даних в процесі оформлення замовлення.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    dataНіДані замовлення

    OnBeforeOrderProcessing

    Викликається після валідації даних замовлення, до створення самого замовлення. Дозволяє модифікувати як дані покупця, так і склад кошика замовлення.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    FLТакFormLister
    itemsТакМасив з товарами кошика
    switch ($modx->event->name) {
        case 'OnBeforeOrderProcessing': {
            $FL->setField('name', 'Вася');
            break;
        }
    }

    OnBeforePaymentProcess

    Викликається перед створенням платежу - після створення замовлення (якщо був обраний будь-який спосіб платежу), або при оплаті раніше створеного замовлення по спеціальному посиланню.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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;
        }
    }

    OnBeforePaymentCreate

    Викликається при створенні і збереженні платежу, дозволяє змінити суму.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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;
        }
    }

    OnBeforeOrderSaving

    Викликається перед самим збереженням замовлення в базу даних, коли всі дані зібрані, при створенні, або оновленні замовлення. Дозволяє повністю змінити замовлення. Скасувати збереження не можна.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    order_idНіІдентифікатор замовлення, null якщо замовлення нове
    valuesТакЗначення полів для збереження в таблицю commerce_orders
    itemsТакМасив товарів, підготовлений для збереження в таблицю commerce_order_products
    subtotalsТакМасив доп. зборів, зберігається також в commerce_order_products в полегшеній формі

    OnBeforeOrderSending

    Викликається після збереження замовлення, перед відправкою повідомлення менеджеру.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    FLТакFormLister
    orderТакДані замовлення
    cartТакДані збереженого кошика

    OnOrderSaved

    Викликається після збереження замовлення в базу даних.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    order_idНіІдентифікатор замовлення
    valuesТакЗначення полів з таблиці commerce_orders
    itemsТакМасив товарів з таблиці commerce_order_products
    subtotalsТакМасив дод.зборів із таблиці commerce_order_products

    OnOrderProcessed

    Викликається після закінчення обробки замовлення.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    FLТакFormLister
    orderНіДані замовлення
    cartНіДані збереженого кошика

    OnBeforeCurrencyChange

    Викликається перед зміною поточної валюти. Дозволяє підмінити нову валюту на іншу. Параметри:

    Ім'я параметраПередається по посиланнюОпис
    oldНіСимвольний ідентифікатор поточної валюти
    newТакСимвольний ідентифікатор встановленої валюти

    OnOrderPlaceholdersPopulated

    Викликається після призначення плейсхолдерів з даними замовлення на сторінці переадресації після успішного оформлення замовлення або здійснення оплати.

    Ім'я параметраПередається по посиланнюОпис
    orderНіДані замовлення

    OnBeforeOrderHistoryUpdate

    Викликається перед додаванням історії замовлення. Дозволяє змінити статус і коментар, або скасувати додавання або повідомлення покупця.

    Ім'я параметраПередається по посиланнюОпис
    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'] = 'Мій коментар';
        }
        }
    }

    OnBeforeCustomerNotifySending

    Викликається перед повідомленням покупця при зміні історії замовлення або зміні даних замовлення. Дозволяє змінити повідомлення або скасувати відправку.

    Ім'я параметраПередається по посиланнюОпис
    reasonНіТип події:
    order_changed - додавання історії замовлення
    status_changed - зміна даних замовлення
    orderТакДані замовлення
    subjectТакШаблон теми листа-повідомлення
    bodyТакШаблон тексту листа-повідомлення
    dataТакДані, які будуть використовуватися при парсінгу шаблонів листа
    preventТакСкасувати відправку повідомлення, true або false

    Події панелі адміністратора

    Ці події викликаються при роботі менеджера з замовленнями в панелі адміністрування магазином.

    OnManagerBeforeOrdersListRender

    Викликається перед виведенням списку замовлень. Дозволяє модифікувати висновок.

    Ім'я параметраПередається по повідомленнюОпис
    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Індекс для сортування
    styleCss-стиль колонки, додається до кожної клітинки

    Конфігурація колонок за замовчуванням:

    [
        '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,
            ];
        }
    }

    OnManagerOrdersListRender

    Це стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки зі списком замовлень. Для установки значення потрібно використовувати метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    ordersНіМасив замовлень для виведення

    OnManagerBeforeOrderRender

    Викликається перед виведенням детальної інформації про замовлення

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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;
        }
    }

    OnManagerOrderRender

    Це стандартне подія Modx, розраховане на отримання рядка, яка буде виведена в кінці сторінки детального перегляду замовлення. Для установки значення потрібно використовувати метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    orderНіМасив з даними замовлення
    productsНіМасив з товарами замовлення
    subtotalsНіМасив з дод.зборами замовлення

    OnManagerBeforeOrderEditRender

    Викликається перед виведенням сторінки редагування замовлення.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    orderТакДані замовлення
    fieldsТакКонфігурація полів замовлення
    configТакКонфігурація DocLister для виведення товарів з замовлення
    columnsТакКонфігурація колонок для виведення полів редагування товарів замовлення
    subcolumnsТакКонфігурація колонок для виведення полів редагування додаткових зборів

    OnManagerOrderRender

    Ця стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки редагування замовлення. Для установки значення потрібно використовувати метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    orderНіМасив з даними замовлення
    productsНіМасив товарів замовлення
    subtotalsНіМасив дод.зборів замовлення

    OnManagerBeforeOrderValidating

    Викликається при збереженні відредагованого замовлення перед валідацією нових значень.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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' => [
                // правила перевірки
            ],
        ],
    ];

    OnManagerOrderValidated

    Викликається після перевірки даних замовлення, незалежно від того, пройдена перевірка чи ні.

    Параметри:

    Имя параметраПередается по ссылкеОпис
    orderНіДані замовлення
    dataТакДані з події OnManagerBeforeOrderValidating
    errorsТакМасив з помилками.Якщо масив порожній - валідація пройде успішно, якщо немає - редагування замовлення буде скасовано, а помилки будуть виведені на екран

    OnManagerStatusesListRender

    Это стандартное событие Modx, рассчитанное на получение строки, которая будет выведена в конце страницы со списком статусов заказов. Для установки значения нужно использовать метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОписание
    listНіМасив зі статусами замовлень

    OnManagerStatusRender

    Це стандартна подія Modx, розрахована на оримання рядка, яка буде виведена в кінці сторінки редагування статусу замовлень. Для установки значення потрібно використовувати метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    statusНіМасив з даними статусу замовлень

    OnManagerCurrencyListRender

    Це стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки зі списком валют. Для установки значення потрібно використовувати метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    listНіМасив зі списком валют

    OnManagerCurrencyRender

    Це стандартна подія Modx, розрахована на отримання рядка, яка буде виведена в кінці сторінки редагування валюти. Для установки значення потрібно використовувати метод $modx->event->setOutput().

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    statusНіМасив з даними валюти

    OnManagerBeforeDefaultCurrencyChange

    Викликається при збереженні валюти, в разі, якщо редагована валюта призначається валютою за умовчанням.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    oldНіДані валюти, яка була встановлена за замовчуванням першою
    newТакДані валюти, що призначається за умовчанням

    OnManagerRegisterCommerceController

    Викликається перед обробкой шляху при роботі в модулі в панелі адміністрування. Дає можливість зареєструвати свій контролер.

    Параметри:

    Ім'я параметраПередається по посиланнюОпис
    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;
        }
    }