Задача довольно экзотическая. Мне захотелось с помощью функции AddEventHandler передать дополнительный параметр в обработчик. В RegisterModuleDependences такой параметр есть, называется TO_METHOD_ARG. А в AddEventHandler нет.
У себя я решил задачу кошерно через несколько классов с наследованием.
Но поделюсь другим забавным решением через имена функций. К моему удивлению, всё работает и даже $arFields в обработчике можно менять.
Я хотел, чтобы обработчик у меня был один, а получал разные параметры.
Обратите внимание: функция OnBeforeUserUpdateHandler получает на входе лишний параметр $HANDLER_ID. Это благодаря магии.
Результат после сохранения пользователя:
У себя я решил задачу кошерно через несколько классов с наследованием.
Но поделюсь другим забавным решением через имена функций. К моему удивлению, всё работает и даже $arFields в обработчике можно менять.
Я хотел, чтобы обработчик у меня был один, а получал разные параметры.
Обратите внимание: функция OnBeforeUserUpdateHandler получает на входе лишний параметр $HANDLER_ID. Это благодаря магии.
AddEventHandler(
"main", "OnBeforeUserUpdate", Array('CMyClass', "id22__OnBeforeUserUpdateHandler"));
AddEventHandler(
"main", "OnBeforeUserUpdate", Array('CMyClass', "id33__OnBeforeUserUpdateHandler"));
class CMyClass
{
public static function OnBeforeUserUpdateHandler( $HANDLER_ID, &$arFields )
{
if ( strlen($arFields[ "ADMIN_NOTES" ]) > 0 )
{
$arFields[ "ADMIN_NOTES" ] .= "\n";
}
$arFields[ "ADMIN_NOTES" ] .=
"Обработчик события OnBeforeUserUpdateHandler, номер ".$HANDLER_ID;
}
// магия
public static function __callStatic( $name, $arguments)
{
// parse
//id22__OnBeforeUserUpdateHandler
$id = 0;
$pos = strpos($name, '__');
if ( $pos >= 2 )
{
$id = substr( $name, 2, $pos-2 ); // 22
$id = intval( $id );
if ( $id > 0 )
{
$real_func_name = substr( $name, $pos + 2 ); // OnBeforeUserUpdateHandler
$args = array_merge( array($id), $arguments );
$result = call_user_func_array( array( get_called_class(), $real_func_name), $args );
return $result;
}
}
// выдать Fatal Error если функция не соответствует шаблону
if (!$id)
{
trigger_error("Function not found ".get_called_class()."::".$name, E_USER_ERROR);
}
}
}
|
Результат после сохранения пользователя: