
[spoiler]
Метод имеет два события: OnGetOptimalPrice и OnGetOptimalPriceResult, различающихся набором передаваемых параметров. Предположим, что для реализации логики обработчика OnGetOptimalPriceResult необходимо знать список групп пользователя, переданный в метод. Увы, он доступен только в обработчике OnGetOptimalPrice. Раз так, придется научить обработчики работать в паре.
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();
}
} |
Пояснения относительно методов disableHandler, enableHandler, isEnabledHandler были даны в , повторяться не будем. Суть же основной идеи проста - сохранить параметры вызова метода в одном обработчике (onGetOptimalPrice), а использовать в другом (onGetOptimalPriceResult), после чего очистить кеш параметров внутри обработчика.
А тому кто писал метод поиска оптимальной цены..... вот цифры с боевого проекта 18`000 товаров, примерно 100 скидок без SKU, для подбора оптимальной цены уходит 40 минут, на сервере с 56 балами по монитору
Вторая проблема вытекает из первой, всегда нужно рассматривать два варианта работы с данными, один это обновление информации через API для корректного взаимодействия методов в админке и фоновое изменения, например выгрузка по расписанию. В вашем случае если реализовать фоновую обработку 18`000 записей через Ваш пример, что будет?
Это я к чему, может не стоит учит писать такой код, а есть смысл расширить функционал и передавать корректный массив данных, скажем дать возможность передавать функциям переменную $arParams где будет служебная информация из первой функции, а уже если эта информация отсутствует повторно её запрашивать \ вызывать исключение
2. Владимир, еще раз повторюсь - события именно этого метода взяты для примера. "Узким местом" выгрузки в Яндекс, которая (как я понимаю) Вас беспокоит, является совсем другое. Работа по ее оптимизации ведется.
3. Да, правильней изначально передавать в обработчик всю информацию. Задача статьи - дать решение для случаев, где такой возможности нет.