Обновление коснулось возможности отправлять повторные циклические запросы на сервер и выполнять один и тот же код несколько раз — до тех пор, пока все, что вам нужно не будет обработано.
Вот небольшая демонстрация того, как это новшество можно использовать:
Включить этот функционал очень просто. Нужно определить переменную $_SESSION['Console']['completed'] и присвоить ей значение false — тогда консоль будет выполнять скрипт до тех пор, пока значение этой переменной не станет равной true.
Вот код, который выполнялся в видео. Здесь происходит пошаговая обработка ресурсов, причем за один шаг обрабатывается только один ресурс. Такой код поможет вам обработать неограниченное число объектов даже на слабом сервере — нужно только время.
<?php
$q = $modx->newQuery('modResource', array('published' => 0));
$q->limit(1);
if ($resources = $modx->getCollection('modResource', $q)) {
foreach ($resources as $resource) {
print "Публикую ресурс <b>".$resource->get('pagetitle')."</b>";
$resource->set('published', 1);
$resource->save();
}
// Говорим консольке, что обработка еще не завершена
$_SESSION['Console']['completed'] = false;
} else {
// Останавливаем обработку
$_SESSION['Console']['completed'] = true;
print "Готово";
}А вот пример посложнее — уже с использованием offset:<?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('modResource');
$total = $modx->getCount('modResource', $q);
// Пропускаем все уже обработанные объекты
$q->limit($step, $offset);
$resources = $modx->getCollection('modResource', $q);
// Обработка
foreach ($resources as $resource) {
print "<p>Processing resource <b>".$resource->get('pagetitle')."</b></p>";
sleep(0.5);
}
// Меняем offset
$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
$sucsess = 100;
$_SESSION['Console']['completed'] = true;
} 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 '_';
}
}
print "\n";
print $sucsess.'% ('.$_SESSION['console_offset'].')'."\n\n";Единственный нюанс в том, что код можно продолжать редактировать по ходу выполнения скрипта. Но я еще не определился — баг это или фича)Источник: modxclub.ru/topics/console-2.0.3-beta-cziklicheskie-zaprosyi-v-konsoli-modx-1695.html
Объектная
<?php # строки из csv файла добавляются в таблицу foreach ( $parse_csv as $rows => $colums ) { // Insert columns. $columns = array( 'col1', 'col2' ); //еще много кода // Insert values. $values = array ( mb_convert_encoding($colums[0], "utf-8", "windows-1251"),//proizvd mb_convert_encoding($colums[1], "utf-8", "windows-1251"),//series ); $object = $modx->newObject('Cartridges'); foreach(array_combine($columns, $values) as $col => $val) { $object->set($col, $val); } $object->save(); }Суть такова, проходим по csv файлу и каждую строку заносим в базу, там в цикле также присутствует загрузка файла на сервер по ссылке из csv, вот это и занимает много времени, поэтому мне нужно чтобы был виден процессЕсли да, тогда можно в конце основного foreach вставить break, чтобы за один раз обрабатывалась только одна строка. А в самом конце проверять, осталось ли еще что-то в CSV-файле, и если да, то указывать а если нет — то завершаем работу