cron в компоненте msPriceList

Всем привет, на днях приобрели дополнение msPriceList. Встала задача повесить экспорт на cron. Покопался в процессорах и нашел некий процессор export.class.php, который принимает id

Что-то вроде такого
$exportPriceList = $modx->runProcessor('file/export',['id'=>1],['processors_path'=>MODX_CORE_PATH.'components/mspricelist/processors/mgr/']);
Текст ошибки следующий

[2019-03-27 10:00:38] (WARN @ /home/------/www/core/components/mspricelist/processors/mgr/file/export.class.php : 140)
PHP notice: Trying to get property 'subscriptions' of non-object
[2019-03-27 10:00:38] (INFO in msPriceListProcessor::process @ /home/------/www/core/components/mspricelist/processors/web/export.class.php : 122)
Запись в файл 100 шт.

Fatal error: Uncaught TypeError: Argument 1 passed to modRegistry::setLogging() must be an instance of modRegister, 
string given, called in /home/------/www/core/components/mspricelist/processors/mgr/file/export.class.php on line 157 and defined in /home/------/www/core/model/modx/registry/modregistry.class.php:166 Stack trace: 
#0 /home/----/www/core/components/mspricelist/processors/mgr/file/export.class.php(157): modRegistry->setLogging('HTML', NULL, 3) 
#1 /home/-----/www/core/components/mspricelist/processors/mgr/file/export.class.php(60): 
msPriceListFileGenerateProcessor->export() 
#2 /home/-------/www/core/model/modx/modprocessor.class.php(177): 
msPriceListFileGenerateProcessor->process()
 #3 /home/-----/www/core/model/modx/modx.class.php(1764): 
modProcessor->run() 
#4 /home/-----/www/core/components/console/processors/exec.class.php(24) : eval()'d code(2): 
modX->runProcessor('file/export', Array, Array) 
#5 /home/----/www/core/components/console/processors/exec.class.php(24): eval()
 #6 /home/-----/www/core/model/ in /home/s17546/www/core/model/modx/registry/modregistry.class.php on line 166
Stanislavsky
27 марта 2019, 10:08
modx.pro
954
0
Поблагодарить автора Отправить деньги

Комментарии: 17

Андрей Степаненко
27 марта 2019, 12:49
+1
Признак о том что работа осущевстляется через крон нужно тоже передавать crontab
$data = array(
    'crontab' => true,
    'id' => 1,
);

/* @var modProcessorResponse $response */
$response = $modx->runProcessor('file/export', $data, array(
    'processors_path' => MODX_CORE_PATH . 'components/mspricelist/processors/mgr/'
));
if ($response->isError()) {
    return $response->getAllErrors();
}
    Stanislavsky
    27 марта 2019, 13:16
    0
    Спасибо за оперативность.

    Теперь ошибка следующая

    [2019-03-27 13:15:34] (ERROR @ /home/s17546/www/core/components/mspricelist/processors/web/export.class.php : 62) PHP warning: array_keys() expects parameter 1 to be array, null given
    [2019-03-27 13:15:34] (ERROR @ /home/s17546/www/core/components/mspricelist/processors/mgr/file/export.class.php : 62) mspricelist_error_empty_resources
      Андрей Степаненко
      27 марта 2019, 15:50
      0
      Родительская категория указана?
      Alexey
      19 ноября 2022, 15:11
      0
      Привет! Та же проблема вылезла с кроном. Не подскажешь, как удалось решить? Родитель, разумеется, указан, из админки этот прайс-лист создаётся без проблем
      Петропавловский Артем
      25 ноября 2022, 17:21
      0
      Как решили проблему? Вы в тех. поддержке не отвечаете.
        Alexey
        25 ноября 2022, 20:31
        0
        Поддерживаю! Техподдержка с понедельника молчит.
          Alexey
          28 ноября 2022, 18:26
          1
          +2
          Рабочее решение, благодарность @vectorserver:

          define('MODX_API_MODE', true);
          require '../index.php';
          
          $modx->user = $modx->getObject('modUser', 1);
          
          $msPriceList = $modx->getService('msPriceList', 'msPriceList', MODX_CORE_PATH . 'components/mspricelist/model/');
          $modx->lexicon->load('mspricelist:default');
          
          $corePath = $modx->getOption('mspricelist_core_path', null, $modx->getOption('core_path') . 'components/mspricelist/');
          $path = $modx->getOption('processorsPath', $msPriceList->config, $corePath . 'processors/');
          
          $params = array(
              'crontab' => true,
              'id' => 2,
          );
          
          /* @var modProcessorResponse $response */
          $response = $modx->runProcessor('mgr/file/export', $params, array(
              'processors_path' => $path
          ));
          
          if ($response->isError()) {
              die( $response->getMessage() );
          } else{
              echo "cron OK";
          }
            Петропавловский Артем
            29 ноября 2022, 16:26
            0
            Благодарю!
              Alexey
              29 ноября 2022, 16:35
              +1
              Совсем забыл про существенный момент — столько времени компонент ковырял, что память стала подводить))

              В файле core/components/mspricelist/processors/mgr/file/export.class.php в методе startExport закомментил это условие:



              Без этого запуск генерации прайс-листа из внешнего файла не происходит
                Петропавловский Артем
                29 ноября 2022, 16:44
                0
                Да, этого не хватало. Спасибо! Тоже на ковыряние много времени убил.
                  vectorserver
                  30 ноября 2022, 06:53
                  1
                  +2
                  Нужно еще просто было указать в параметрах, еще один ключ stage

                  $params = array(
                      'crontab' => true,    
                      'stage' => 'new_session',
                      'id' => 2,
                  );


                  Готовый рабочий вариант:
                  <?php
                  define('MODX_API_MODE', true);
                  require '../index.php';
                  
                  /* @var modX $modx */
                  
                  //Дадим права админа навыполнение процессора
                  $modx->user = $modx->getObject('modUser', 1);
                  
                  //id строки в таблице (колонка ID), таб "Прайс-листы"
                  $row_ID = 2;
                  
                  /** @var msPriceList $msPriceList */
                  $msPriceList = $modx->getService('msPriceList', 'msPriceList', MODX_CORE_PATH . 'components/mspricelist/model/');
                  
                  $corePath = $modx->getOption('mspricelist_core_path', null, $modx->getOption('core_path') . 'components/mspricelist/');
                  $path = $modx->getOption('processorsPath', $msPriceList->config, $corePath . 'processors/');
                  
                  
                  /* @var modX $modx */
                  $params = array(
                      'crontab' => true,
                      'stage' => 'new_session',
                      'id' => $row_ID,
                  );
                  
                  /* @var modProcessorResponse $response */
                  $response = $modx->runProcessor('mgr/file/export', $params, array(
                      'processors_path' => $path
                  ));
                  
                  if ($response->isError()) {
                      die($response->getMessage());
                  } else {
                      echo json_encode($response->response);
                  }
                    Alexey
                    30 ноября 2022, 08:42
                    +2
                    Да, вчера обратил внимание, что если закомментить указанную строку в файле processors/mgr/file/export.class.php ( if ($new_session == 'new_session') ), то начинается проблема при запуске генерации прайса с большим количеством позиций из админки, там же за несколько этапов генерация идет, каждый раз новую сессию создавая, и подумал, что нужно попозжЕ попытаться пробросить параметр из скрипта для крона, но vectorserver опередил))), за что ему снова человеческое спасибо!

                    Кстати, при запуске кода для крона, можно убрать эту строку:

                    $modx->user = $modx->getObject('modUser', 1);

                    авторизация при запуске процессора не требуется, как выяснилось — проверил в инкогнито, всё работает.
          Alexey
          28 ноября 2022, 16:05
          0
          @Андрей Степаненко будьте добры, ответьте на вопрос по крону. Либо тут, либо в ТП модстора. Уже неделю тишина. Проблема та же — по крону не запускается генерация прайс-листа
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          17