294  /  382
Справочник

Совместная работа пары событий

Просмотров: 12787
Дата последнего изменения: 12.08.2020
Роберт Басыров
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Рассмотрим использование пары обработчиков событий на примере событий метода CCatalogProduct::GetOptimalPrice.

Метод имеет два события: OnGetOptimalPrice и OnGetOptimalPriceResult, различающихся набором передаваемых параметров. Предположим, что для реализации логики обработчика OnGetOptimalPriceResult необходимо знать список групп пользователя, переданный в метод. Но эти данные доступны только в обработчике OnGetOptimalPrice.

Необходимо сохранить параметры вызова метода в одном обработчике (onGetOptimalPrice), а использовать в другом (onGetOptimalPriceResult), после чего очистить кеш параметров внутри обработчика. Реализация работы обработчиков "в паре":

class myClass
{
   protected static $handlerDisallow = 0; 
 
   protected static $handlerParams = array();

   public static function disableHandler()
   {
   self::$handlerDisallow--;
   }

   public static function enableHandler()
   {
   self::$handlerDisallow++;
   }

   public static function isEnabledHandler()
   {
   return (self::$handlerDisallow >= 0);
   }

   public static function onGetOptimalPrice()
   {
        /* проверяем, что обработчик уже запущен */
        if (!self::isEnabledHandler())
                return;
        /* взводим флаг запуска */
        self::disableHandler();   
        self::$handlerParams = func_get_args();
        return true;
   }
 
   public static function onGetOptimalPriceResult(&$data)  
   {  
        /* далее логика, использующая данные из self::$handlerParams
        примерно так
        if (self::$handlerParams[0] == 17) //первый параметр из вызова CCatalogProduct::GetOptimalPrice
           $data['RESULT_PRICE']['BASE_PRICE'] = 100;
         */
        self::$handlerParams = array();  // очищаем параметры - в обязательном порядке 
        /* вновь разрешаем запускать обработчик */ 
        self::enableHandler();  
    } 
}

Примечание: в общем случае в обработчик надо передавать все входные данные, но если такой возможности нет, то приходится использовать описанный выше способ.


Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии