События работы со скидками
События работы со скидками позволяют подключить провайдеры скидок и купонов сторонних модулей, дополнить данные заказа для расчета скидок и отследить изменение состояния купонов.
События
| Событие | Описание и параметры |
|---|---|
onBuildDiscountProviders |
При первой инициализации менеджера скидок в методе Событие не передает параметры. Обработчик должен вернуть объект |
onBuildCouponProviders |
При построении списка провайдеров купонов в методе Параметры
Обработчик должен вернуть объект |
onExtendOrderData |
При подготовке дополнительных данных заказа для расчета скидок в методе Параметры
Успешный результат обработчика должен содержать массив дополнительных данных. Менеджер рекурсивно объединит его с данными заказа |
onManagerCouponAdd |
При добавлении нового купона в менеджер методом Событие передает поля купона. Основные поля: |
onManagerCouponDelete |
После удаления купона из менеджера методом Событие передает поля удаленного купона. Основные поля: |
onManagerCouponApplyByProduct |
После применения одного или нескольких купонов к позиции корзины методом Параметры
|
onManagerCouponApply |
После обработки применения купона к корзине или доставке методом Событие передает данные в ключах |
onManagerSaveApplied |
После завершения сохранения примененных купонов методом Событие передает массив с результатами по идентификаторам модулей. Данные модуля содержат ключ |
События onManagerCouponAdd, onManagerCouponDelete, onManagerCouponApplyByProduct, onManagerCouponApply и onManagerSaveApplied уведомляют об изменениях. Вызывающий код не обрабатывает результаты их обработчиков.
Ответ обработчика onBuildDiscountProviders
\Bitrix\Main\EventResult функция-обработчик( \Bitrix\Main\Event $event );
Верните объект \Bitrix\Main\EventResult с типом \Bitrix\Main\EventResult::SUCCESS. Во втором аргументе конструктора передайте массив функций провайдера, а в третьем — идентификатор модуля провайдера.
| Ключ | Описание |
|---|---|
prepareData |
Обязательная функция. Получает массив скидки и настройки менеджера. Возвращает подготовленный массив скидки или false, если данные нельзя подготовить |
getEditUrl |
Получает массив с ключами ID и MODULE_ID. Возвращает ссылку на страницу редактирования скидки |
calculateApplyCoupons |
Получает массив купонов, данные корзины и параметры расчета. Возвращает результат применения купонов |
roundPrice |
Получает данные позиции корзины и правило округления. Возвращает массив с ключами PRICE, DISCOUNT_PRICE и ROUND_RULE |
roundBasket |
Получает позиции корзины, правила округления и данные заказа без корзины. Возвращает позиции с округленными ценами |
Идентификатор модуля в результате события должен совпадать с MODULE_ID скидки. Менеджер добавляет провайдер, только если обработчик вернул успешный результат, непустой массив и ключ prepareData. Регистрируйте обработчик до первого обращения к менеджеру скидок: после инициализации повторный вызов \Bitrix\Sale\OrderDiscountBase::init не отправляет событие повторно.
Ответ обработчика onBuildCouponProviders
Верните объект \Bitrix\Main\EventResult с типом \Bitrix\Main\EventResult::SUCCESS. Во втором аргументе конструктора передайте массив функций провайдера, а в третьем — идентификатор модуля провайдера.
| Ключ | Описание |
|---|---|
getData |
Обязательная функция. Получает код купона и возвращает данные купона или false |
isExist |
Обязательная функция. Получает код купона и возвращает данные найденного купона или false |
saveApplied |
Обязательная функция. Получает примененные купоны, идентификатор пользователя заказа и дату применения. Возвращает результат сохранения |
mode |
Необязательный режим данных купона: \Bitrix\Sale\DiscountCouponsManagerBase::COUPON_MODE_SIMPLE или \Bitrix\Sale\DiscountCouponsManagerBase::COUPON_MODE_FULL. По умолчанию используется простой режим |
Менеджер купонов запрашивает сторонние провайдеры, только если настройка модуля sale use_sale_discount_only не равна Y.
Пример
Регистрация провайдера скидок
Пример регистрирует минимальный провайдер модуля example.discount. Функция prepareData преобразует скидку в формат, который менеджер сохраняет вместе с заказом.
<?php
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
use Bitrix\Main\EventResult;
$prepareData = static function(array $discount, array $config)
{
if (empty($discount['ID']))
{
return false;
}
$discountId = (int)$discount['ID'];
return [
'MODULE_ID' => 'example.discount',
'DISCOUNT_ID' => $discountId,
'NAME' => (string)($discount['NAME'] ?? 'Скидка стороннего модуля'),
'CONDITIONS' => $discount['CONDITIONS'] ?? [],
'UNPACK' => (string)($discount['UNPACK'] ?? ''),
'ACTIONS' => $discount['ACTIONS'] ?? [],
'APPLICATION' => (string)($discount['APPLICATION'] ?? ''),
'USE_COUPONS' => (string)($discount['USE_COUPONS'] ?? 'N'),
'SORT' => (int)($discount['SORT'] ?? 100),
'PRIORITY' => (int)($discount['PRIORITY'] ?? 1),
'LAST_DISCOUNT' => (string)($discount['LAST_DISCOUNT'] ?? 'N'),
'ACTIONS_DESCR' => $discount['ACTIONS_DESCR'] ?? [],
'EDIT_PAGE_URL' => '/bitrix/admin/example_discount_edit.php?ID=' . $discountId,
];
};
EventManager::getInstance()->addEventHandler(
'sale',
'onBuildDiscountProviders',
static function(Event $event) use ($prepareData): EventResult
{
return new EventResult(
EventResult::SUCCESS,
[
'prepareData' => $prepareData,
],
'example.discount'
);
}
);
Обработка добавления купона
Пример записывает идентификатор скидки в журнал после добавления купона в менеджер.
<?php
use Bitrix\Main\Diag\Debug;
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
'sale',
'onManagerCouponAdd',
static function(Event $event): void
{
$discountId = (int)$event->getParameter('DISCOUNT_ID');
Debug::writeToFile(
['discountId' => $discountId],
'Coupon added',
'upload/coupon-events.log'
);
}
);