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

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

Просмотров: 25593
Дата последнего изменения: 13.11.2023
Роберт Басыров
Сложность урока:
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();  
	} 
}

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


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

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