Создание конструктора миграций

Архитектура модуля позволяет расширить список конструкторов написанных вами.

Класс конструктора должен наследоваться от класса \Elpha\Migration\Builder\SimpleBuilder. Это класс простой миграции и в нем реализовано объявление полей "Часть названия", "Описание" и "Ссылка на задачу в трекере" на первом шаге конструктора.

        
namespace Foo\Bar;

use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Result;
use Elpha\Migration\Builder\SimpleBuilder;

class YourOwnBuilder extends SimpleBuilder
{

    const CODE = 'your_own';

    /**
     * @var int
     */
    protected $steps = 2;

    /**
     * @inheritDoc
     */
    public static function getTitle(): string
    {
        return 'Ваш собственный конструктор';
    }

    /**
     * Инициализация шага 2
     */
    protected function initializeStep2()
    {
        $this->addField(
            ($this->getStep() == 2 ? 'text' : 'hidden'),
            'message',
            'Сообщение',
            '',
            false,
            true,
            [],
            function ($value, array $params): Result {
                $result = new Result();

                if (!$value) {
                    $result->addError(new Error('Сообщение не может быть пустым'));

                    return $result;
                }

                return $result;
            }
        );
    }

    /**
     * @inheritDoc
     */
    public function createMigration(): Result
    {
        $result = new Result();

        $migrationName = $this->getMigrationName($this->getField('part_name')->getValue());

        $variables = [
            'description' => $this->getField('description')->getValue(),
            'task' => $this->getField('task')->getValue(),
            'message' => $this->getField('message')->getValue(),
        ];

        if (false === $this->createFile(__DIR__ . '/your_own_builder.php', $migrationName, $variables)) {
            $result->addError(new Error(Loc::getMessage('EMI_SIMPLE_BUILDER_WRITE_ERROR', ['#NAME#' => \htmlspecialcharsbx($migrationName),])));
        }

        $result->setData(['migration_name' => $migrationName]);

        return $result;
    }
}
        
    

const CODE = 'your_own' константа определяющая символьный код конструктора.

protected $steps = 2 переменная определяет кол-во шагов в конструкторе. В зависимости от введенных параметров, можно менять общее количество шагов.

protected function initializeStep2() метод вызывается при инициализации второго шага и предыдущих. Может быть protected function initializeStep3() и так далее.

Поля для шага можно добавить методом $this->addField

Аргумент Описание
string $type Тип поля
string $name Символьный код поля
string $label Заголовок поля
$value Начальное значение поля
bool $multiple Множественное поле или нет
bool $require Обязательное поле или нет
array $params Параметры поля
callable $validator Функция-валидатор значения поля

На данный момент для добавления полей доступны следующие типы:

  • text — тип поля текст;
  • hidden — тип поля hidden;
  • textarea — тип поля текстовое поле;
  • select — тип поля выбор из списка;
  • checkbox_group — тип поля группа чекбоксов;
  • radio — тип поля radio;
  • checkbox_group_container — тип поля контейнер групп чекбоксов;

public function createMigration(): Result метод вызывается по прохождению всех шагов пользователем. Для создания файла миграции используется $this->createFile(__DIR__ . '/your_own_builder.php', $migrationName, $variables) с указанием шаблона и передачей переменных для подстановки значений в шаблон. Код шаблона приведен ниже:

        
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

/**
 * @var string $parentUse
 * @var string $migrationName
 * @var string $parentClass
 * @var string $description
 * @var string $task
 * @var string $message
 */

echo '<?php' . PHP_EOL . PHP_EOL;

?>namespace Elpha\Migration;

<?= $parentUse?>
class <?= $migrationName?> extends <?= $parentClass?>

{

    protected $description = "<?= \addslashes(trim($description))?>";

    protected $task = "<?= \addslashes(trim($task))?>";

    public function up(): bool
    {
        $helper = $this->getHelperManager();

        $this->outText("<?= \addslashes(trim($message))?>");

        return true;
    }

    public function down(): bool
    {
        $helper = $this->getHelperManager();

        return true;
    }
}

        
    

 

Для того, чтобы конструктор отобразился в списке следует использовать событие GetBuilders модуля и зарегистрировать ваш класс, вернув в результате массив с указанием класса конструктора и сортировки в выпадающем списке на странице миграций.

        
use Bitrix\Main\EventManager;
use Bitrix\Main\Event;
use Bitrix\Main\EventResult;

EventManager::getInstance()->addEventHandler(
    'elpha.migration',
    'GetBuilders',
    function (Event $event) {
        return new EventResult(
            EventResult::SUCCESS,
            [
                \Foo\Bar\YourOwnBuilder::getBuilderCode() => [
                    'class' => \Foo\Bar\YourOwnBuilder::class,
                    'sort' => 100500,
                ],
            ]
        );
    }
);