myskif
@myskif
Верстальщик

Как сделать пошаговую работу скрипта в MODX console?

Здравствуйте, необходимо выполнить данный скрипт
$q = $modx->newQuery('msProduct');
$q->where(array('parent' => '9'));
$col = $modx->getCollection('msProduct', $q);
foreach ($col as $item){
    $oe_number = $item->get('oe_number');
    $article = $item->get('article');
    $old_price = $item->get('old_price');
    $price = $old_price * 1.2;
    $item->set('price', $price);
    if (empty($oe_number)) {
      $item->set('oe_number', $article);
    }
    $item->save();
}

Но так как товаров порядка 30 000, то нужно разбить на пошаговое выполнение, нашел данную шпаргалку — ilyaut.ru/cheats/step-by-step-the-script-in-console/, но мозгов доделать не хватает, вот что получилось

<?php
// Сколько ресурсов обрабатывать за раз
$step = 1;
// Если процесс уже остановлен, сбрасываем OFFSET
if (!isset($_SESSION['Console']['completed'])) {
    $_SESSION['console_offset'] = 0;
}
$offset = isset($_SESSION['console_offset']) && $_SESSION['console_offset'] ? $_SESSION['console_offset'] : 0;

// Формируем запрос

$q = $modx->newQuery('msProduct');
$q->where(array('parent' => '9'));
$total = $modx->getCount('msProduct', $q);

// Пропускаем все уже обработанные объекты
$q->limit($step, $offset);
$resources = $modx->getCollection('msProduct', $q);

// Обработка
foreach ($resources as $resource){
  $oe_number = $resource->get('oe_number');
  $article = $resource->get('article');
  $old_price = $resource->get('old_price');
  $price = $old_price * 1.2;
  $resource->set('price', $price);
  if (empty($oe_number)) {
    $resource->set('oe_number', $article);
  }
  $resource->save();
  print "<p>Processing resource <b>".$resource->get('pagetitle')."</b></p>";
}

// Меняем offset
$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
  unset($_SESSION['console_offset']);
} else {
  $sucsess = round($_SESSION['console_offset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
$current = isset($_SESSION['console_offset']) ?
           $_SESSION['console_offset'] :
           ($sucsess == 100 ? $total : 0);
print "\n";
print $sucsess.'% ('.$current.')'."\n\n";

Подскажите, как правильно написать пошаговое выполнение скрипта
  • Вопрос задан
  • 241 просмотр
Решения вопроса 1
myskif
@myskif Автор вопроса
Верстальщик
Проблема была на хостинге и заключалась в mod_security, проверить включен ли он можно через
<?php
    phpinfo();
?>

Если включен, то нужно попросить хостера выключить
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы