Задать вопрос
@inviziblll

Как правильно подключить обработчик событий для highload-блоков в своем модуле?

Я пишу свой модуль и в нем нужно добавить функционал логирования событий, которые произошли с элементами highload-блоков при работе сайта, он должен фиксировать количество добавленных/измененных/удаленных элементов.
Как правильно зарегистрировать обработчик?

В файле install/index.php в методе InstallEvents я написал такой код по аналогиb с обработкой событий для других модулей Битрикс:
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->registerEventHandler('highloadblock','OnBeforeAdd', 'my_module', 'MyModuleClass', 'Handler');


Но у меня сомнения что этот код верный. В примерах для обработки событий highload-блоков указывается имя конкретного highload-блока, а имя модуля вообще не указывается.
$hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getById(12)->fetch();
$entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('', $entity->getName().'OnAdd', '\Partner\Myentity\OnAdd');

Но как быть если нужно создать универсальный обработчик для всех highload-блоков которые есть или будут созданы в системе?

Я должен обратится к списку highload-блоков, получить все и только затем для каждого блока добавить обработчик? И в каком файле модуля я должен делать такой запрос?
  • Вопрос задан
  • 987 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
smilingcheater
@smilingcheater
Да, вам надо сначала получить список всех инфоблоков, присутствующих на сайте, замет в цикле повесить обработчики

use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\EventManager;

$eventManager = EventManager::getInstance();
$items = HighloadBlockTable::getList([])->fetchAll();

foreach ($items as $item) {
    $eventManager->addEventHandler('', $item['NAME'] . 'OnAfterAdd', [MyModuleClass::class, 'handlerFenction']);
}
Ответ написан
@Nentra
Имя файла с подключаемым классом надо писать всё маленькими буквами как название самого класса только все буквы маленькие, иначе не будет работать.

После установки модуля нужно проверить в таблице битрикс "b_module_to_module" установилось ли событие.
И дальше уже отталкиваться от этого.

Если использовать автозагрузку классов из модуля, то файлы с классами нужно называть полностью маленький буквами, а не верблюжьим стилем как в файле с классом.

Файл с классом должен лежать в модуле в папке lib
Если используются пространства имён, то делать в этой папке соответствующей пространству имён подпапки

Пример для обработки события обновления поля Highload-блока.
Конкретно для Highload-блоков имя модуля, событие которого перехватываем не указывается,
к самому названию события приписывается название Highload-блока.

Файл
www\local\modules\red.october\install\index.php

<?php
	......................
	class red_october extends CModule
	{
		function installDB()
		{
			Loader::includeModule($this->MODULE_ID);
			
			//Регистрация события
			$eventManager = \Bitrix\Main\EventManager::getInstance();
			$eventManager->registerEventHandlerCompatible(
			'',
			'DollarExchangeRateOnAfterUpdate',
			'red.october',
			'\\red\\october\\Events\\RecordDataFinalSellingPrice',
			'RecordData'
			);
			
			...................
		}
		
		........................
		
		function unInstallDB()
		{
			
			//Отмена регистрации события
			$eventManager = \Bitrix\Main\EventManager::getInstance();
			$eventManager->unRegisterEventHandler(
			'',
			'DollarExchangeRateOnBeforeUpdate',
			'red.october',
			'\\red\\october\\Events\\RecordDataFinalSellingPrice',
			'RecordData'
			);
			
		}	
	}	
	?>


Файл с обработчиком события
\www\local\modules\red.october\lib\events\recorddatafinalsellingprice.php

<?
	namespace red\october\Events;


class RecordDataFinalSellingPrice
{ 
    public static function RecordData($recordId)
    {
	\Bitrix\Main\Diag\Debug::writeToFile($recordId, $varName = __DIR__, $fileName = "/local/debug/debug.log");
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы