Регистрация обработчика события через `EventManager::addEventHandler()` для события `OnBeforeEndBufferContent`

Регистрация через `EventManager::addEventHandler()` не подойдёт, если вы хотите избежать явного подключения модуля в `init.php`. Вот почему:

Проблема с `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()`.

bitrixone © 2025