Не все знают, что в Битриксе есть такая удобная вещь, как события (или триггеры, хэндлеры, handlers). Термин «Триггер» обычно используется в базах данных и означает вызов функции при наступлении определенного события. Триггеры обычно используются для обеспечения целостности данных. В Битриксе же это называется «событие»
Ключевые слова здесь – Before ("до") и After ("после"). Например, до добавления элемента инфоблока (запись ещё не сохранена в БД) или после добавления (запись сохранена, то есть ID нового элемента уже доступен).
Чтобы было понятнее, рассмотрим пример. Некоторое время назад я выкладывал компонент «Древовидные комментарии». Заметим, что при удалении какого-либо комментария через административную панель дочерние комментарии автоматически не удаляются. А по логике должны бы. Добавим в файл /bitrix/php_interface/init.php следующий код:
define('IBLOCK_COMMENTS', 2);
AddEventHandler("iblock", "OnAfterIBlockElementAdd", "OnAfterIBlockElementAddHandler");
function OnAfterIBlockElementAddHandler(&$arFields)
{
if ($arFields['IBLOCK_ID'] == IBLOCK_COMMENTS) deleteSubComments ($arFields['ID']);
}
function deleteSubComments ($parent_id)
{
$arFilter = array("IBLOCK_ID"=>IBLOCK_COMMENTS, "PROPERTY_comment_id" => $parent_id);
$res = CIBlockElement::GetList(array("ID"=>"ASC"), $arFilter, false, array(), array("ID"));
if($res->SelectedRowsCount() > 0)
{
while($ob = $res->GetNextElement())
{
$arFields = $ob->GetFields();
CIBlockElement::Delete($arFields['ID']);
deleteSubComments ($arFields['ID']);
}
}
}
Поясним это пример. Функция AddEventHandler регистрирует новый триггер. Первым параметром передается ID используемого модуля, в нашем случае это iblock. Второй параметр – это event_id, то есть ID события. Наше событие, OnAfterIBlockElementAdd, означает «После добавления элемента инфоблока». И третий параметр – это функция, которая будет вызываться при событии. Это функцию описываем уже мы сами, она называется OnAfterIBlockElementAddHandler. Обратите внимание, что массив с полями элемента, который будет добавлен, передается по ссылке - &$arFields.



Комментарии (3)