События

Не все знают, что в Битриксе есть такая удобная вещь, как события (или триггеры, хэндлеры, 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.

Дата: 26 августа 2010
Теги: триггеры, события
Добавить в закладки:

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

Дмитрий, 7 Сентября 2010

В БД это триггеры, а в системах это события обычно.

Евгений, 20 Сентября 2010

Автор, ты опять путаешь понятия - в терминах Битрикса это не триггеры, а события. Не вноси путаницу в итак сложное понимание системы:) Но блог хорош - нашел для себя интересные материалы. Уже несколько лет работаю с Битриксом и всегда с интересом ищу новые материалы и опыт разработчиков. Спасибо!

spree
spree, 20 Сентября 2010

Согласен, пожалуй, даже исправлю. Спасибо за отзыв, подписывайтесь на rss )