В этой статье я покажу на примерах один из вариантов работы с событиями модуля highload-инфоблоков. Хотя это и не обязательно, стараясь соответствовать новым веяниям в битриксопрограммировании, я использовал функции с пространствами имен (если считаете, что сделал я что-то неправильно, пожалуйста, отпишитесь в комментариях). По задумке, в следующих примерах "Partner" должно быть заменено на ваш идентификатор партнера в marketplace (если он у вас есть, либо используйте любое слово), а "Myentity" - на название сущности вашего highload-инфоблока (то, что вы указываете при его создании).
[spoiler]
Использование OnBeforeAdd, OnBeforeUpdate
События OтBeforeAdd, OnBeforeUpdate вызываются до проверки полей на правильность. В их обработчиках еще возможна модификация результата - для этого функция должна вернуть переменную типа "\Bitrix\Main\Entity\EventResult". Также возможна проверка полей на правильность и возврат сообщения об ошибке.
Использование OnAdd, OnUpdate
Эти события вызываются после проверки полей на правильность, перед обновлением записи в базе данных и модификация результата в их обработчиках уже невозможна.
Использование OnAfterAdd, OnAfterUpdate
Эти события вызываются после добавления и обновления записей в highload-инфоблоках. В данном примере статическая переменнная используется для предотвращения вечного цикла из-за того, что внутри обработчика вызывается функция Update, которая должна повторно запустить обработчик. Использование такого подхода может быть оправдано в каких-то случаях, хотя обычно бывает достаточно OnAdd, OnUpdate.
Использование OnBeforeDelete
Событие OnBeforeDelete вызывается перед удалением элемента и может быть использовано для отмены удаления (для этого нужно сгенерировать объект типа \Bitrix\Main\Entity\EntityError и добавить его в список ошибок с помощью метода \Bitrix\Main\Entity\EventResult\setError).
Использование OnDelete
Событие OnDelete вызывается перед удалением элмента хайлоадблока, и уже не может быть использовано для отмены удаления.
Использование OnAfterDelete
Событие OnAfterDelete вызывается после удаления элемента хайлоадблока.
Функции \Bitrix\Main\Entity\Event
Полный список функций \Bitrix\Main\Entity\Event вы можете найти в файле /bitrix/modules/main/lib/event.php, я же поясню лишь значение некоторых:
Объекты ошибок
Есть 2 типа ошибок - ошибка в каком-то поле и общая ошибка (ошибка сущности). Для их генерации существуют классы \Bitrix\Main\Entity\FieldError и \Bitrix\Main\Entity\EntityError соответственно.
См. также сниппеты "События ORM/хайлоадблоков" на сайте estrin.pw
[spoiler]
Использование OnBeforeAdd, OnBeforeUpdate
События OтBeforeAdd, OnBeforeUpdate вызываются до проверки полей на правильность. В их обработчиках еще возможна модификация результата - для этого функция должна вернуть переменную типа "\Bitrix\Main\Entity\EventResult". Также возможна проверка полей на правильность и возврат сообщения об ошибке.
|
Использование OnAdd, OnUpdate
Эти события вызываются после проверки полей на правильность, перед обновлением записи в базе данных и модификация результата в их обработчиках уже невозможна.
|
Использование OnAfterAdd, OnAfterUpdate
Эти события вызываются после добавления и обновления записей в highload-инфоблоках. В данном примере статическая переменнная используется для предотвращения вечного цикла из-за того, что внутри обработчика вызывается функция Update, которая должна повторно запустить обработчик. Использование такого подхода может быть оправдано в каких-то случаях, хотя обычно бывает достаточно OnAdd, OnUpdate.
|
Использование OnBeforeDelete
Событие OnBeforeDelete вызывается перед удалением элемента и может быть использовано для отмены удаления (для этого нужно сгенерировать объект типа \Bitrix\Main\Entity\EntityError и добавить его в список ошибок с помощью метода \Bitrix\Main\Entity\EventResult\setError).
|
Использование OnDelete
Событие OnDelete вызывается перед удалением элмента хайлоадблока, и уже не может быть использовано для отмены удаления.
|
Использование OnAfterDelete
Событие OnAfterDelete вызывается после удаления элемента хайлоадблока.
|
Функции \Bitrix\Main\Entity\Event
Полный список функций \Bitrix\Main\Entity\Event вы можете найти в файле /bitrix/modules/main/lib/event.php, я же поясню лишь значение некоторых:
|
Объекты ошибок
Есть 2 типа ошибок - ошибка в каком-то поле и общая ошибка (ошибка сущности). Для их генерации существуют классы \Bitrix\Main\Entity\FieldError и \Bitrix\Main\Entity\EntityError соответственно.
|
19.12.201402:1519.12.2014 02:15:40
например, я создаю свой какой-то модуль. В нем мне нужно создать обработчик, который будет записывать в xml_id значение id элемента (очень печально, но именно по полю UF_XML_ID осуществляется связка свойств типа "Справочник" - так мне объяснили в техподдержке).
Я понимаю, что нужно использовать OnAfterAdd и OnAfterUpdate
но вот как и куда эти обработчики поместить - что-то я потерялся:(
и как RegisterModuleDependences(....); в инсталляции модуля правильно прописать
Если же вы пишите модуль, то вместо
в файле /install/index.php в блоке "DoInstall" после регистрации в системе самого модуля (RegisterModule(self::MODULE_ID) )
прописываю:
P.S. Отпишитесь плиз если получится, мне тоже интересно.