Кому это может пригодится - тому кто запустил большой процесс и хочет видеть промежуточные результаты, у кого есть лимиты на выполнение скриптов, у кого есть только админка, консоли нет и ему надо выкатить большие правки в бд.
<?php
namespace Sprint\Migration;
use \Sprint\Migration\Helpers\IblockHelper;
class Version20150520000002 extends Version {
protected $description = "Пошаговая миграция";
public function up(){
//Добавляем 100 элементов
$helper = new IblockHelper();
$iblockId1 = $helper->getIblockId('content_news');
if (!isset($this->params['add'])){
$this->params['add'] = 0;
}
$cnt = 100;
if ($this->params['add'] <= $cnt){
$this->outProgress('Прогресс добавления', $this->params['add'], $cnt);
$helper->addElement($iblockId1, array('NAME' => 'name'.microtime()));
$this->params['add']++;
$this->restart();
}
}
public function down(){
//Удаляем все элементы по 10 штук за раз
$helper = new IblockHelper();
$iblockId1 = $helper->getIblockId('content_news');
$dbRes = \CIBlockElement::GetList(array(), array('IBLOCK_ID' => $iblockId1), false, array('nTopCount' => 10));
$bFound = 0;
while ($aItem = $dbRes->Fetch()){
\CIBlockElement::Delete($aItem['ID']);
$this->out('deleted %d', $aItem['ID']);
$bFound++;
}
if ($bFound){
$this->restart();
}
}
}
В абстрактный класс миграции Sprint\Migration\Version добавились 2 метода реализующих пошаговое выполнение:
Основной это restart()
при его вызове кидается исключение Sprint\Migration\Exceptions\Restart , прерывающее выполнение кода и запускающего его заново.
таким образом метод up() или down() выполняется бесконечное число раз и надо написать условие по которому перестать делать restart()
в примере наката миграции это достижение нужного числа элементов, а при откате отсутсвие этих элементов, когда удалять уже нечего
перед рестартом миграции можно задать параметры (числовые или строковые), которые потребуются после рестарта, различные счетчики и т.д. эти параметры доступны в свойстве params (array), во время первого запуска массив пустой, а после рестарта в нем будут те данные которые в него передали, в примере это счетчик чила добавленных элементов
Дополнительный метод - outProgress($msg, $val, $total) выводит битриксовый прогресс-бар если миграция выполняется через админку или строку в формате "$msg $val/$total" - если запуск происходит через консоль
p.s.1
для вывода различных сообщений предлагается использовать методы out($msg, $var1 = null), outSuccess($msg, $var1 = null), outError($msg, $var1 = null) это обертки для стандартной sprintf, но еще поддерживается раскраска в несколько цветов, а методы outSuccess, outError, outProgress - стараются использовать битриксовый класс \CAdminMessage::ShowMessage, если это возможно
<?php
namespace Sprint\Migration;
use \Sprint\Migration\Helpers\IblockHelper;
class Version20150520000003 extends Version {
protected $description = "Примеры вывода сообщений";
public function up(){
$this->out('Примеры вывода сообщений');
$this->out('Используется [b]sprintf[/] на самом деле, напишем пару чисел %d %d и строку %s', 199, 200, 'hello');
$this->out('Но еще можно [red]раскрашивать[/] и [b]жирным[/] делать например');
$this->out('А если [blue]выполняете в админке[/], увидите нативные сообщения');
$this->outSuccess('Все готово на %d%%', 100);
$this->outError('Ошибка');
$this->outProgress('Прогресс', 10, 100);
}
public function down(){
}
}
Результат
p.s.2
в админке можно теперь менять отображение списка миграций
сами файлы миграций создаются через админку или консольную команду, разработчикам надо будет реализовать 2 метода up() и down() - которые запускаются при установке и откате миграции
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».