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