Документация для разработчиков
Темная тема

AddEventHandler

Описание и параметры

AddEventHandler(
	string from_module_id,
	string MESSAGE_ID,
	mixed callback,
	int sort = 100,
	mixed full_path = false
);

Регистрирует произвольный обработчик callback события MESSAGE_ID модуля from_module_id. Если указан полный путь к файлу с обработчиком full_path, то он будет автоматически подключен перед вызовом обработчика. Вызывается на каждом хите и работает до момента окончания работы скрипта.

Аналоги функции в новом ядре D7: Bitrix\Main\EventManager::addEventHandler (новый формат) и Bitrix\Main\EventManager::addEventHandlerCompatible.

Параметры функции

ПараметрОписание
from_module_id Идентификатор модуля который будет инициировать событие.
MESSAGE_ID Идентификатор события.
callback Название функции обработчика. Если это метод класса, то массив вида Array(класс(объект), название метода).
sort Очередность (порядок), в котором выполняется данный обработчик (обработчиков данного события может быть больше одного).
Необязательный параметр, по умолчанию равен 100.
full_path Полный путь к файлу для подключения при возникновении события перед вызовом callback.

Примечание

Все зарегистрированные обработчики хранятся в глобальной переменной $MAIN_MODULE_EVENTS.

Примеры использования

<?
// скрипт в файле /bitrix/php_interface/init.php
AddEventHandler("main", "OnBeforeUserLogin", Array("MyClass", "BeforeLogin"));
class MyClass { function BeforeLogin(&$arFields) { if(strtolower($arFields["LOGIN"])=="guest") { global $APPLICATION; $APPLICATION->throwException("Пользователь с именем входа Guest не может быть авторизован."); return false; } } } ?>


Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Sergey Spiridonov
Сообщение не промодерировано, возможны ошибки и неточности.
Код
$eventManager->addEventHandler("search", "BeforeIndex", array("someClass", "BeforeIndexHandler"),false, 500);
ВНИМАНИЕ!!! Параметр сортировки выполнения обработчиков события - реально по API стоит последним!
(В таблице описания параметров - предпоследним. Не ошибитесь.)
0
Юлия Федотова
Сообщение не промодерировано, возможны ошибки и неточности.
Как скорректировать запись если нужно применить AddEventHandler только для определенного инфоблока? запись такая
Код
<?php

AddEventHandler("iblock", "OnBeforeIBlockElementUpdate","DoNotUpdate");
function DoNotUpdate(&$arFields)
{
    if ($_REQUEST['mode']=='import')
    {
        unset($arFields['PREVIEW_PICTURE']);
        unset($arFields['DETAIL_PICTURE']);
        unset($arFields['PREVIEW_TEXT']);
        unset($arFields['DETAIL_TEXT']);
    }
}
AddEventHandler("iblock", "OnBeforeIBlockElementAdd","DoNotAdd");
function DoNotAdd(&$arFields)
{
    if ($_REQUEST['mode']=='import')
    {   
      unset($arFields['PREVIEW_PICTURE']);
      unset($arFields['DETAIL_PICTURE']);
      unset($arFields['PREVIEW_TEXT']);
      unset($arFields['DETAIL_TEXT']);
    }
}

?>
         
0
Андрей Огибин
Если нужно передать переменную в обработчик (в данном случае мне нужно было добавить в цепочку навигации NAME из arResult)
Код
AddEventHandler("main", "OnEpilog", function() use ($arResult) {
    global $APPLICATION;
    $APPLICATION->AddChainItem($arResult['NAME']);
});
1
Роберт Басыров
Задача: Посчитать количество залогиненных пользователей на сайте на данный момент времени и вывести на экран это число.

Решение: В файле \bitrix\php_interface\init.php:

Код
AddEventHandler("main", "OnBeforeProlog", "MyUserOnline");
function MyUserOnline()
{
   if($GLOBALS["USER"]->IsAuthorized())
      CUser::SetLastActivityDate($GLOBALS["USER"]->GetID());
} 


В том месте, где нужно получить пользователей в онлайне:
Код
//online status
$db = CUser::GetList($by, $order, array("LAST_ACTIVITY"=>120));
while($dba = $db->Fetch())
   echo $dba['ID']."<br>"; 
6
Роберт Басыров
Задача: При авторизации сделать проверку наличия действующих сессий с данным логином, и при наличии сбросить их, что бы в один момент времени был авторизован только 1 клиент.

Решение:
1. В файл /bitrix/php_interface/init.php дописываем:

Код
AddEventHandler("main", "OnAfterUserLogin", "MyOnAfterUserLogin"); 
AddEventHandler("main", "OnBeforeProlog", "MyOnBeforeProlog"); 


function MyOnAfterUserLogin($arFields) 
{ 
   global $USER; 
   $USER->Update($USER->GetID(),array("UF_USERSESS"=>session_id())); 
} 

function MyOnBeforeProlog($arFields) 
{ 
   global $USER; 
   $arUser = $USER->GetByID($USER->GetID())->Fetch(); 
   if (session_id() != $arUser[UF_USERSESS]) 
      $USER->Logout(); 
} 


2. В Настройки -> Настройки продукта -> Пользовательские поля
создаем новый элемент следующего вида:

Тип данных: Строка
Объект: USER
Код поля: UF_USERSESS
Не показывать в списке: Y
Размер поля ввода для отображения: 32
© «Битрикс», 2001-2024, «1С-Битрикс», 2024
Наверх