Проблема с `EventManager::addEventHandler()`
1. Требует явного подключения модуля
Код регистрации обработчика (например, в `include.php` модуля) выполнится только если модуль подключён через `CModule::IncludeModule()`.
Если модуль не подключён в `init.php` или другом месте — обработчик не зарегистрируется.
2. Нет записи в БД
В отличие от `RegisterModuleDependences()`, D7-обработчики не сохраняются в `b_module_to_event`.
Битрикс не знает о существовании вашего обработчика, пока модуль не подключён.
Как работает `RegisterModuleDependences()`
1. Регистрация в БД:
При установке модуля запись о событии сохраняется в `b_module_to_event`.
2. Автоподключение модуля:
При срабатывании события Битрикс автоматически подключает модуль и вызывает обработчик.
3. Не требует `init.php`:
Модуль работает даже без явного подключения в коде.
Пример: почему `EventManager` не сработает
Код в `include.php` модуля:
// Подключается ТОЛЬКО если модуль вызван через CModule::IncludeModule()
EventManager::getInstance()->addEventHandler( 'main', 'OnBeforeEndBufferContent', [MainEvents::class, 'decorateSite'] );
Сценарий без `init.php`:
1. Модуль не подключён явно.
2. `include.php` модуля не выполняется.
3. Обработчик не регистрируется.
4. Событие игнорируется.
Решение: используйте гибридный подход
Если хотите остаться в рамках D7, но избежать подключения в `init.php`:
1. Регистрация через `RegisterModuleDependences()` (в `install/index.php`):
RegisterModuleDependences( "main", "OnBeforeEndBufferContent", "bazarow.decorateursite", "\\Bazarow\\DecorateUrSite\\EventHandlers\\MainEvents", "decorateSite" );
2. Обработчик в D7-стиле:
namespace Bazarow\DecorateUrSite\EventHandlers; use Bitrix\Main\EventManager; class MainEvents { public static function decorateSite() { // Логика добавления <script> } }
Итог
Метод |
Подключение в init.php
|
Автоподгрузка модуля |
---|---|---|
EventManager::addEventHandler
|
Обязательно | Нет |
RegisterModuleDependences
|
Не нужно | Да |
Для вашего случая (добавление `<script>` без подключения в `init.php`) используйте `RegisterModuleDependences()`.