Advertisement
AlexeyGfi

Использование Stepper-а Битрикса

Mar 30th, 2023
783
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.31 KB | None | 0 0
  1. <?php
  2. // Пример класса, который использует механизм степпера
  3. // для выполнения большого списка операций,
  4. // требующего разбиения на шаги
  5. // https://t.me/bitrixoid_iz_kolhoza/370
  6.  
  7. namespace AlexeyGfi\CatalogHelpers;
  8.  
  9. use Bitrix\Main\Config\Option;
  10. use Bitrix\Main\Update\Stepper;
  11.  
  12. class CacheWarmingUpStepper extends Stepper
  13. {
  14.     public static $iblockId = 69;
  15.  
  16.     // !!! Нужно указывать реально установленный модуль
  17.     // Потому что агент будет пробовать подключить этот модуль
  18.     // и если его нет - не будет выполняться
  19.     protected static $moduleId = 'main';
  20.     protected const STEP_PORTION = 50;
  21.  
  22.     public static function bindChain()
  23.     {
  24.         $stepperModuleId = static::getModuleId();
  25.  
  26.         // Если есть опции - значит процесс идёт
  27.         if (!Option::get(
  28.             'main.stepper.' . $stepperModuleId,
  29.             __CLASS__
  30.         )) {
  31.             Stepper::bindClass(
  32.                 __CLASS__,
  33.                 self::getModuleId(),
  34.                 0 // Первый шаг выполнится тудже
  35.             );
  36.         }
  37.     }
  38.  
  39.     public static function getTitle()
  40.     {
  41.         return 'Прогрев кеша галереи товаров';
  42.     }
  43.  
  44.     public function execute(array &$option = []): bool
  45.     {
  46.         // Опция, которая будет пробрасываться дальше
  47.         // Например, используется в запросе для ->setOffset
  48.         $option['skip'] = $option['skip'] ?? 0;
  49.         $processed = 0;
  50.  
  51.         // Готовим и обрабатываем порцию текущего шага
  52.         // ...
  53.         $processed++;
  54.         // ...
  55.  
  56.         if (!$processed) {
  57.             // Говорим, что процесс завершён
  58.             return self::FINISH_EXECUTION;
  59.         }
  60.  
  61.         // Увеличиваем счётчик пропускаемых элементов
  62.         $option['skip'] += self::STEP_PORTION;
  63.  
  64.         // Уходим на следующий шаг
  65.         return self::CONTINUE_EXECUTION;
  66.     }
  67. }
  68.  
  69.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement