AddEventHandler - uniqcle/Bitrix GitHub Wiki

AddEventHandler необходимо вызывать до возникновения события на тех страницах, где требуется его обработать.

Например, если событие нужно обработать на всех страницах, где оно возникает, то функцию можно вызвать в /bitrix/php_interface/init.php.

AddEventHandler("main", "OnBeforeUserLogin", "MyOnBeforeUserLoginHandler");
function MyOnBeforeUserLoginHandler($arFields)
{
   if(strtolower($arFields["LOGIN"])=="guest")
   {
       global $APPLICATION;
       $APPLICATION->throwException("Пользователь Guest не может быть авторизован.");
       return false;
   }
}

с классом

AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("IBlockHandler", "OnBeforeIBlockElementUpdateHandler"));

class IBlockHandler
{
    // создаем обработчик события "OnBeforeIBlockElementUpdate"
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {

    // file_put_contents($_SERVER["DOCUMENT_ROOT"]."/StatusChange_order.log", var_export($arFields, true)."\n\r", FILE_APPEND );
    }
}

Анонимные функции хорошо подходят для "решить быстро и безболезненно". Чтобы не засорять код именными функциями или классами делаю так:

use Bitrix\Main\EventManager;

$eventManager = EventManager::getInstance();

$eventManager->addEventHandlerCompatible("main", "OnAfterUserLogin", function(&$fields) {
// Мой код
});

RegisterModuleDependences производит регистрацию в БД, а AddEventHandler в файле init.php. То есть использование первой функции приводит к дополнительной нагрузке на БД. Её лучше использовать в ситуациях, когда выполняемые действия должны быть зафиксированы раз и навсегда и именно в БД.

Example

Повлиять на изминение ИБ через добавление через Админку
/*
Очистка поля от лишних символов
Подойдут обработчики
- Перед созданием нов. эл-та в каталоге OnBeforeIBlockElementAdd
- Перед редактирование эл-та в каталоге OnBeforeIBlockElementUpdate
*/
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("IBlockHandler", "OnBeforeIBlockElementUpdateHandler"));

class IBlockHandler
{
    // создаем обработчик события "OnBeforeIBlockElementUpdate"
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {
        $db_props = CIBlockElement::GetProperty($arFields['IBLOCK_ID'], $arFields['ID'], array("sort" => "asc"), Array("CODE"=>"ARTNUMBER"));
        if($ar_props = $db_props->Fetch()){

            if(strlen( $arFields['PROPERTY_VALUES'][$ar_props["ID"]][$ar_props["PROPERTY_VALUE_ID"]]['VALUE'] > 0 )){
                $arFields['PROPERTY_VALUES'][$ar_props["ID"]][$ar_props["PROPERTY_VALUE_ID"]]['VALUE'] = preg_replace("/[^\d]/","",$arFields['PROPERTY_VALUES'][$ar_props["ID"]][$ar_props["PROPERTY_VALUE_ID"]]['VALUE']);
            }
        }
        //file_put_contents($_SERVER["DOCUMENT_ROOT"]."/StatusChange_order.log", var_export( $arFields['PROPERTY_VALUES'][$ar_props["ID"]][$ar_props["PROPERTY_VALUE_ID"]]['VALUE'], true)."\n\r", FILE_APPEND );
    }
}
Добавление сообщения в ИБ через форму обратной связи
AddEventHandler("main", "OnBeforeEventAdd", array("MyHandlers", "OnBeforeEventAddHandler"));
class MyHandlers
{
    function OnBeforeEventAddHandler(&$event, &$lid, &$arFields)
    {
        if($event == 'FEEDBACK_FORM'){
            if(CModule::IncludeModule("iblock")){

                $elem = new CIBlockElement();
                $arParams = array(
                    "IBLOCK_ID" => 7,
                    "NAME" => "Сообщение от ".$arFields['AUTHOR'],
                    "PREVIEW_TEXT" => $arFields['TEXT'],
                    "DATE_ACTIVE_FROM" =>ConvertTimeStamp(false,"FULL"),

                );
                $elem->Add($arParams);
            }
        }

    }
}
Отмена регистрации если имя и фамилия совпадают
AddEventHandler("main", "OnBeforeEventAdd", array("MyHandlers", "OnBeforeEventAddHandler"));
AddEventHandler("main", "OnBeforeUserAdd", Array("MyHandlers", "OnBeforeUserAddHandler"));

class MyHandlers
{
    function OnBeforeEventAddHandler(&$event, &$lid, &$arFields)
    {
        //...
    }
    function OnBeforeUserAddHandler(&$arFields){
             if($arFields["LAST_NAME"] == $arFields["NAME"])
            {
                global $APPLICATION;
                $APPLICATION->throwException("Имя и Фамилия одинаковы!");
                return false;
            }
    }
}

D7

Стандартное событие

use Bitrix\Main;
use Bitrix\Main\Entity;

Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleOrderBeforeSaved', "OnOrderUpdateHandler");

function OnOrderUpdateHandler(\Bitrix\Main\Event $event){
// код...
}
use Bitrix\Main\EventManager;
use Bitrix\Sale;

\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'sale',
    'OnSaleOrderSaved ',
    array('CustomBasket', 'updateCustomBasket'));

class CustomBasket{

    public function updateCustomBasket(\Bitrix\Main\Event $event){
        $parameters = $event->getParameters();
        $order = $parameters['ENTITY'];
        //...
        file_put_contents($_SERVER["DOCUMENT_ROOT"]."/logs/basket.log", var_export($event, true)."\n\r", FILE_APPEND );
    }
}

Событие со своим классом-обработчиком

Предварительно загружаем свои классы в autoload

// init.php
use Bitrix\Main\EventManager;

$handler = EventManager::getInstance();

$handler->addEventHandler("main","OnBeforeUserUpdate",
      array(
          "Skillbox\\User",
          "OnBeforeUserUpdateHandler"
       )
);

/local/php_interface/skillbox/class/User.php

namespace Skillbox;

class User
{
    public function OnBeforeUserUpdateHandler(&$arFields){

        //file_put_contents($_SERVER["DOCUMENT_ROOT"]."/StatusChange_order.log", var_export($arFields, true)."\n\r", FILE_APPEND );
    }
}

ORM Events

Example

Редактирование свойства заказа перед добавлением
use Bitrix\Main;
use Bitrix\Main\Entity;

Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'OnSaleOrderBeforeSaved', "OnOrderUpdateHandler");

function OnOrderUpdateHandler(\Bitrix\Main\Event $event){

    $parameters = $event->getParameters();
    $order = $parameters['ENTITY'];

    $id_user = $order->getUserId();

    $arGroups = \Bitrix\Main\UserTable::getUserGroupIds( $id_user );


    $arGroupAvalaible = array(8); // массив групп, которые в которых нужно проверить доступность пользователя
    $result_intersect = array_intersect($arGroupAvalaible, $arGroups); // далее проверяем, если пользователь вошёл хотя бы в одну из групп
    if(!empty($result_intersect)){
        $typePrice = 'Крупнооптовая';
    } else $typePrice = 'Оптовая';

    $properties = $order->getPropertyCollection();
    $priceType = $properties->getItemByOrderPropertyId(20);
    $priceType->setValue($typePrice);

    file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/StatusChange_order.log", var_export($arGroups, true) . "\n\r", FILE_APPEND);
}

Reading

⚠️ **GitHub.com Fallback** ⚠️