В предыдущей статье по хайлоад блокам я писал о работе с элементами. В этой рассмотрим, как работать с событиями highload блоков: добавления, обновления, удаления.
Порядок вызова событий и допустимые действия в обработчиках каждого из них:
источник (https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=2244&LESSON_PATH=3913.5062.5748.2244#events)
Все примеры будут производиться с использованием highload блока — Colors
.
Поля:
Нужно уловить принцип написания функции addEventHandler для различных событий. Второй аргумент — это название вашего highload блока и название самого события.
На моём примере:
$eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate'); $eventManager->addEventHandler('', 'ColorsOnAfterAdd', 'OnAfterAdd'); и т.д. ...
Содержание:
Код нужно разместить в файле init.php.
OnBeforeAdd
Событие вызывается до добавление элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnBeforeAdd', 'OnBeforeAdd'); /** * * @param \Bitrix\Main\Entity\Event $event * @return \Bitrix\Main\Entity\EventResult */ function OnBeforeAdd(\Bitrix\Main\Entity\Event $event) { $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnBeforeAdd $eventType = $event->getEventType(); // получаем массив полей хайлоад блока $arFields = $event->getParameter("fields"); //получить все доступные в этом событие данные $arParameters = $event->getParameters(); $result = new \Bitrix\Main\Entity\EventResult(); //модификация данных if (empty($arFields['UF_FULL_DESCRIPTION'])) { $arFields['UF_FULL_DESCRIPTION'] = $arFields['UF_DESCRIPTION']; $result->modifyFields($arFields); } // для тестирования модификации данных закомментируйте этот блок if (empty($arFields['UF_DESCRIPTION'])) { $arErrors = Array(); $arErrors[] = new \Bitrix\Main\Entity\FieldError($entity->getField("UF_DESCRIPTION"), "Ошибка в поле UF_DESCRIPTION. Поле не должно быть пустым!"); $result->setErrors($arErrors); } return $result; }
OnAdd
Событие вызывается перед добавлением в бд, после валидации полей. Модификация данных не доступна.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnAdd', 'OnAdd'); function OnAdd(\Bitrix\Main\Entity\Event $event) { $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnAdd $eventType = $event->getEventType(); // поулчаем массив полей хайлоад блока $arFields = $event->getParameter("fields"); }
OnAfterAdd
Событие вызывается после добавления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после добавления нового элемента данного HL-блока.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnAfterAdd', 'OnAfterAdd'); function OnAfterAdd(\Bitrix\Main\Entity\Event $event) { //id добавляемого элемента $id = $event->getParameter("id"); $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnAfterAdd $eventType = $event->getEventType(); // получаем массив полей хайлоад блока $arFields = $event->getParameter("fields"); }
OnBeforeUpdate
Событие вызывается до обновления элемента highload(HL) блока и валидации полей.
Можно модифицировать данные, добавить собственную валидацию, вернуть ошибку, если валидация не пройдена.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnBeforeUpdate', 'OnBeforeUpdate'); /** * * @param \Bitrix\Main\Entity\Event $event * @return \Bitrix\Main\Entity\EventResult */ function OnBeforeUpdate(\Bitrix\Main\Entity\Event $event) { $id = $event->getParameter("id"); //id обновляемого элемента $id = $id["ID"]; $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnBeforeUpdate $eventType = $event->getEventType(); // получаем массив полей хайлоад блока $arFields = $event->getParameter("fields"); $result = new \Bitrix\Main\Entity\EventResult(); //модификация данных if (empty($arFields['UF_FULL_DESCRIPTION'])) { $arFields['UF_FULL_DESCRIPTION'] = $arFields['UF_DESCRIPTION']; $result->modifyFields($arFields); } // для тестирования модификации данных закомментируйте этот блок if (empty($arFields['UF_DESCRIPTION'])) { $arErrors = Array(); $arErrors[] = new \Bitrix\Main\Entity\FieldError($entity->getField("UF_DESCRIPTION"), "Ошибка в поле UF_DESCRIPTION. Поле не должно быть пустым!"); $result->setErrors($arErrors); } return $result; }
OnUpdate
Событие вызывается перед обновлением в бд, после валидации полей. Модификация данных не доступна.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnUpdate', 'OnUpdate'); function OnUpdate(\Bitrix\Main\Entity\Event $event) { $id = $event->getParameter("id"); //id обновляемого элемента $id = $id["ID"]; $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnUpdate $eventType = $event->getEventType(); // получаем массив полей хайлоад блока $arFields = $event->getParameter("fields"); }
OnAfterUpdate
Событие вызывается после обновления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после обновления элемента данного HL-блока.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnAfterUpdate', 'OnAfterUpdate'); function OnAfterUpdate(\Bitrix\Main\Entity\Event $event) { $id = $event->getParameter("id"); //id обновляемого элемента $id = $id["ID"]; $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnAfterUpdate $eventType = $event->getEventType(); // получаем массив полей хайлоад блока $arFields = $event->getParameter("fields"); }
OnBeforeDelete
Событие вызывается до удаления элемента highload(HL) блока.
Можно отменить удаление.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnBeforeDelete', 'OnBeforeDelete'); /** * * @param \Bitrix\Main\Entity\Event $event * @return \Bitrix\Main\Entity\EventResult */ function OnBeforeDelete(\Bitrix\Main\Entity\Event $event) { // поля в этом событии недоступны, только id $id = $event->getParameter("id"); //id удаляемого элемента $id = $id["ID"]; $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnBeforeDelete $eventType = $event->getEventType(); $result = new \Bitrix\Main\Entity\EventResult(); if ($id <= 20) { $arErrors = Array(); $arErrors[] = new \Bitrix\Main\Entity\EntityError("Ошибка! Нельзя удалять первые 20 элементов!"); $result->setErrors($arErrors); } return $result; }
OnDelete
Событие вызывается перед удалением из бд. Отмена удаления не доступна.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnDelete', 'OnDelete'); function OnDelete(\Bitrix\Main\Entity\Event $event) { // поля в этом событии недоступны, только id $id = $event->getParameter("id"); //id удаляемого элемента $id = $id["ID"]; $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnDelete $eventType = $event->getEventType(); }
OnAfterDelete
Событие вызывается после удаления элемента HL блока. Можно добавить дополнительную логику, которая будет запускаться после удаления элемента данного HL-блока.
Пример:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('', 'ColorsOnAfterDelete', 'OnAfterDelete'); /** * * @param \Bitrix\Main\Entity\Event $event */ function OnAfterDelete(\Bitrix\Main\Entity\Event $event) { $id = $event->getParameter("id"); //id удаляемого элемента $id = $id["ID"]; $entity = $event->getEntity(); $entityDataClass = $entity->GetDataClass(); // тип события. вернет ColorsOnAfterAdd $eventType = $event->getEventType(); if ($id > 30 && $id < 1000) { // ваша логика.... } }
Отличная статья! Помогло.