В документации есть пример (http://dev.1c-bitrix.ru/api_help/main/events/onbeforeuserregister.php) где нужно зарегистрировать функцию обработчик // регистрируем обработчик события "OnBeforeUserRegister" RegisterModuleDependences("main", "OnBeforeUserRegister", "my_module_id", "MyClass", "OnBeforeUserRegisterHandler"); А ниже пользовательский пример, где обработчик достаточно добавить: // добавляем обработчик события при регистрации AddEventHandler("main", "OnBeforeUserRegister", "OnBeforeUserRegisterHandler"); Подскажите пожалуйста в чём разница, и когда что использовать.
RegisterModuleDependences - делается один раз (при установке модуля) и это "постоянный" обработчик события действует до момента вызова UnRegisterModuleDependences.
AddEventHandler - вызывается на каждом хите - работает до момента окончания работы скрипта.
Евгений Жуков пишет: Обычно в /bitrix/php_interface/init.php
а в коде компонента его можно задать? и если его задавать в init.php, после обновления сайта заданный обработчик останется? есть документация по работе с событиями?
В принципе там все доступно описано, если внимательно почитать и походить по ссылкам внутри документации. По логике вещей, учитывая Порядок выполнения страницы, следующим после подгрузки init.php подгружается /bitrix/php_interface/[ID сайта]/init.php, который не обновляется (единственный минус, что, если нужно выполнять обработчик на всех сайтах, то нужно прописать это в каждом файле init.php для каждого сайта).
вот таким образом в инстале я регистрирую меню, но нужно зарегистрировать уже после того как модуль стоит через updater.php - обновление модуля. как там сделать?
А никто не пробовал свое событие в модуле сделать? Я что-то видимо сегодня очень туплю - но я не смог разрбраться до конца - где в типовых модулях битрикс при установке создаются новые события..
В принципе там все доступно описано, если внимательно почитать и походить по ссылкам внутри документации. По логике вещей, учитывая Порядок выполнения страницы , следующим после подгрузки init.php подгружается /bitrix/php_interface/[ID сайта]/init.php , который не обновляется (единственный минус, что, если нужно выполнять обработчик на всех сайтах, то нужно прописать это в каждом файле init.php для каждого сайта).
Вопрос: как обработчику события узнать, какое событие он обрабатывает? Как следует инициализировать такой обработчик функциями RegisterModuleDependences и AddEventHandler?
Предлагаю описать иначе:
Цитата
Вопрос: как обработчику события узнать, какое событие он обрабатывает?
Цитата
Решение: Зависит от способа инициализации.
1. AddEventHandler - сделайте прослойку.
Код
function OnAdd()
{
RealHandler("add");
}
function OnUpdate()
{
RealHandler("update");
}
2. RegisterModuleDependences - при регистрации добавьте аргумент.
Мы в своих модулях делаем универсальные обработчики, внутри которых идет разбор переменных в зависимости от источника вызова, и регистрируем обработчик с аргументом определяющим модуль. Как правило from_module_id = TO_METHOD_ARG. И другие разработчики делают универсальные обработчики (вижу по приходящим со стороны проектам), но видимо не все разработчики знают, что можно зарегистрировать обработчик с аргументом, и делают прослойки как "рекомендовано" в доках. У нас опять пришел со стороны проект с тремя сотнями(!) прослоек в модуле.
С одной стороны по коду обработчика вижу, что писал далеко не студент, а программист, которого я и к себе бы в команду взял на хороших условиях, а с другой стороны такое извращение в виде прослоек. Это уже явно говорит о том, что решение берется из документации.
Дополнение: Наверное стоит так же в решении по второму способу дописать и корректировку обработчика
Код
function Handler($arguments, &$arFields)
{
//Код обработчика
}
где, переменная без операнда аргумент, а переменная с операндом содержит массив данных, переданных в событие источником.