Задача довольно экзотическая. Мне захотелось с помощью функции 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); } } } |
Результат после сохранения пользователя: