партнер компании 1с-битрикс
сайт фрилансера Сергея Эстрина
Войти как пользователь
Вы можете войти на сайт, если вы зарегистрированы на одном из этих сервисов:
Универсальная галерея - модуль для битрикс
В этой статье я покажу на примерах как работать с событиями в ядре d7 на примере модуля grain.forum (Простой адаптивный форум). Будет показано и как создавать обработчик события с возможностью и изменения данных с позиции разработчика сайта, и как вызываются обработчики событий внутри модуля. Это статья не про ORM-события (т.е. события, связанные с хранением данных в базе, и где используется более стандартизованный подход), а про обычные события, которые могут использоваться для чего угодно.
[spoiler]
Пояснение: событие OnGlobalsGetFilter в модуле grain.forum предназначено для модификации глобального фильтра для форумов и их разделов (фильтра, который применяется в компонентах всегда и в основном используется для привязки форумов и разделов к сайтам).

Пример обработки события (со стороны разработчика)

namespace Grain\ForumAccess;


\Bitrix\Main\EventManager::getInstance()->addEventHandler
    
'grain.forum'
    
'OnGlobalsGetForumFilter'
    
'\Grain\ForumAccess\OnGlobalsGetForumFilter'
); 

function 
OnGlobalsGetForumFilter(\Bitrix\Main\Event $event
{
    
$arFilter $event->getParameter(0);
    
    
$arFilter["SITE_ID"] = array("s1","s2"); // модифицируем массив фильтра, делаем чтобы отображались форумы с двух сайтов: s1 и s2
    
    
$result = new \Bitrix\Main\EventResult($event->getEventType(), $arFilter);
    return 
$result;
}

Возвращаемый объект

Обработчик события может (но не обязан) вернуть объект типа \Bitrix\Main\EventResult;

Создать такой объект можно так

$result = new \Bitrix\Main\EventResult($type$arReturn);

где $type может принимать значения:
\Bitrix\Main\EventResult::SUCCESS - при успешной обработке
\Bitrix\Main\EventResult::ERROR - если нужно вернуть ошибку
$event->getEventType() - статус на входе (например, после другого обработчика)

$arReturn - возвращаемое значение, зависит от события, и может быть, как числом или строкой, так и, например, массивом

Пример вызова события (со стороны модуля)


$event = new Event("grain.forum""OnGlobalsGetFilter", array($arFilter));

$event->send();
foreach (
$event->getResults() as $eventResult)
{
    if(
$eventResult->getType() == \Bitrix\Main\EventResult::ERROR// если обработчик вернул ошибку, ничего не делаем 
        
continue;
    
$arFilter array_merge($arFilter$eventResult->getParameters());
}

Дополнительная информация:
Сниппеты, связанные с событиями в d7
Описание api модуля "Простой адаптивный форум"

Чтобы оставить сообщение, авторизуйтесь, или войдите с помощью: