1С-Битрикс. Подписываемся на события любой сущности ORM
Почему-то в документации этот момент упущен, ну, или я просто не нашёл.
Разберём на примере сущности инфоблока — класса \Bitrix\Iblock\IblockTable.
Код обработчика для события OnBeforeAdd
Bitrix\Main\EventManager::getInstance()->addEventHandler( 'iblock', '\Bitrix\Iblock\Iblock::OnBeforeAdd', function (\Bitrix\Main\Event $e) { // some code echo '<pre>';print_r($e->getParameters());echo '</pre>'; } );
Да, всё на самом деле вот так просто :-) Единственный ньюанс — так это суффикс Table у класса, который в вызове обработчика не используется.
Список доступных событий всех сущностей:
namespace Bitrix\Main\Entity; abstract class DataManager { const EVENT_ON_BEFORE_ADD = "OnBeforeAdd"; const EVENT_ON_ADD = "OnAdd"; const EVENT_ON_AFTER_ADD = "OnAfterAdd"; const EVENT_ON_BEFORE_UPDATE = "OnBeforeUpdate"; const EVENT_ON_UPDATE = "OnUpdate"; const EVENT_ON_AFTER_UPDATE = "OnAfterUpdate"; const EVENT_ON_BEFORE_DELETE = "OnBeforeDelete"; const EVENT_ON_DELETE = "OnDelete"; const EVENT_ON_AFTER_DELETE = "OnAfterDelete";
Обновлено 30.05.16
Покажу так же пример подписки на события highload-блоков. Например, наш highload-блок назван Color. Чтобы подписаться на событие, вызываемое до обновления его записи, и, запретить добавлять элементы без заполненного поля XML_ID, хватит кода:
if (Bitrix\Main\Loader::includeModule('highloadblock')) { $hlColorIterator = Bitrix\Highloadblock\HighloadBlockTable::getList([ 'filter' => [ '=NAME' => 'Color' ] ]); if ($hlColor = $hlColorIterator->fetch()) { /** @var \Bitrix\Main\Entity\Base entity */ $colorEntity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlColor); Bitrix\Main\EventManager::getInstance()->addEventHandler( '', $colorEntity->getName() . 'OnBeforeUpdate', function (Bitrix\Main\Entity\Event $event) { /** @var \Bitrix\Main\Entity\EventResult $result */ $result = new Bitrix\Main\Entity\EventResult(); $data = $event->getParameter('fields'); if (!strlen(trim($data['UF_XML_ID']))) { $result->addError(new Bitrix\Main\Entity\FieldError( $event->getEntity()->getField('UF_XML_ID'), sprintf('Field "UF_XML_ID" required.') )); } return $result; } ); } }
6 комментариев
Олег, привет. Спасибо за блог, всегда нахожу что-то полезное :) Подскажи пожалуйста, есть ли аналог событий OnGetDiscount/OnGetDiscountResult для новых (конвертированных) скидок?
Привет!
Честно говоря, с конвертированными скидками не работал. Конвертированные скидки — это по сути правила работы с корзиной.
А правила работы с корзиной можно точно расширять и добавлять свои.
А не пробовали подвеситься на "\Bitrix\Main\SiteTable::OnAfterUpdate" или "\Bitrix\Main\Site::OnAfterUpdate" У меня что-то не заводится, может оно как-то по другому должно работать?
А вы уверены, что используемый вами код вызывает \Bitrix\Main\SiteTable::update? Только он дёрнет событие \Bitrix\Main\SiteTable::OnAfterUpdate
А у вас работает вариант "\Bitrix\Iblock\Iblock::OnBeforeAdd"? У меня либо бубен сломан, либо что-то не так. Такое ощущение что подписаться можно только на избранные сущности. Пробовал также с \Bitrix\Iblock\Element/Section. События тупо не срабатывают.
Дмитрий, аналогично #c685