Skip to content

Модуль для работы с миграциями. realweb.api.migration

Совместимость

realweb.api v.6

Создание миграций

  • через интерфейс в административной части: Настройки -> Realweb Migration -> Новый сценарий обновления (/bitrix/admin/rw_migration.php?lang=ru&q=create)
  • через терминал:
shell
php bitrix/tools/migrate create -n=<name> -p=<priority> -t=<time>

Новые миграции создаются в директории local/php_interface/migrations/

Выполнение миграций

  • через интерфейс в административной части: Настройки -> Realweb Migration -> Обновление (/bitrix/admin/rw_migration.php?lang=ru&q=main)
  • через терминал:
shell
php bitrix/tools/migrate apply -f

Примеры миграций

Базовый класс миграции

php
<?php

// @codingStandardsIgnoreLine
use Realweb\Api\Module\Site\Model\Helper;

class rw_m_1700199194_develop_update_iblocks extends \Realweb\Api\Module\Migration\Model\Scenario\Script
{
	public static function name(): string
	{
		return 'update_iblocks';
	}

	// @codingStandardsIgnoreLine
	public static function hash(): string
	{
		return '3efa676df204cf4a050f6e2a54b00108b8b78546';
	}

	public static function priority(): string
	{
		return self::PRIORITY_HIGH;
    }

	public static function approximatelyTime(): int
	{
		return 1;
    }

	public function commit(): void
	{
       
	}

	public function rollback(): void
	{

	}
}

Название миграции rw_m_1700199194_develop_update_iblocks включает префикс, временную метку, текущую ветку git и название миграции. В функции commit пишется код выполняймый в миграции, в rollback пишется код для отката миграции.

Сохранение типа инфоблока

php
$obIblockType = (new \Realweb\Api\Module\Migration\Model\Builder\Iblock\Type())
    ->save('content', function (\Realweb\Api\Module\Migration\Model\Entity\Iblock\Type $obEntity) {
        $obEntity
            ->sort(100)
            ->sections()
            ->langRu('Контент')
            ->langEn('Content');
    });

Сохранение инфоблока

php
$obIblock = (new \Realweb\Api\Module\Migration\Model\Builder\Iblock())
    ->save('content', 'content', function (\Realweb\Api\Module\Migration\Model\Entity\Iblock $rsIblock) {
        $rsIblock
            ->name('Контент')
            ->listPageUrl("#SITE_DIR#/")
            ->sectionPageUrl("#SITE_DIR#/#SECTION_CODE_PATH#/")
            ->detailPageUrl("#SITE_DIR#/#SECTION_CODE_PATH#/#ELEMENT_CODE#/")
            ->requiredCode()
            ->requiredSectionCode()
            ->textHtml()
            ->setIpropertyTemplates('{=this.Name}');

        /***PROPERTIES****/

        $rsIblock
            ->saveProperty('LINK')
            ->name('Ссылка')
            ->required()
            ->typeString();

        $rsIblock
            ->saveProperty('COUNT')
            ->name('Количество')
            ->index()
            ->required()
            ->typeNumber();

        $obProp = $rsIblock
            ->saveProperty('TYPE')
            ->name('Тип')
            ->required()
            ->typeDropdown();
        $obProp->saveEnum('По умолчанию')->xmlId('default');
        $obProp->saveEnum('Оплата')->xmlId('payment');
        $obProp->saveEnum('Доставка')->xmlId('delivery');

        /***SECTION-FIELDS****/

        $rsIblock->saveSectionField('LINK')
            ->label('Ссылка')
            ->typeString();

        $rsIblock->saveSectionField('COUNT')
            ->label('Количество')
            ->index()
            ->typeInt();

        $obField = $rsIblock->saveSectionField('TYPE')
            ->label('Тип')
            ->typeEnum();
        $obField->saveEnum('По умолчанию')->xmlId('default');
        $obField->saveEnum('Оплата')->xmlId('payment');
        $obField->saveEnum('Доставка')->xmlId('delivery');

        /***IBLOCK-FIELDS****/

        $rsIblock->saveIblockField('LINK')
            ->label('Ссылка')
            ->typeString();

        $rsIblock->saveIblockField('COUNT')
            ->label('Количество')
            ->index()
            ->typeInt();

        $obField = $rsIblock->saveIblockField('TYPE')
            ->label('Тип')
            ->typeEnum();
        $obField->saveEnum('По умолчанию')->xmlId('default');
        $obField->saveEnum('Оплата')->xmlId('payment');
        $obField->saveEnum('Доставка')->xmlId('delivery');

        /***ELEMENT-INTERFACE***/

        $rsIblock->saveElementFormInterface(0)
            ->setTabs(
                (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Collection())
                    ->addItem(
                        (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Entity('Элемент'))
                            ->addItem('ID')
                            ->addItem('NAME')
                            ->addItem('CODE', 'Код')
                            ->addItem('PROPERTY_TYPE')
                            ->addItem('PROPERTY_COUNT')
                            ->addItem('PROPERTY_LINK', 'Ссылка')
                    )
                    ->addItem(
                        (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Entity('Анонс'))
                            ->addItem('PREVIEW_PICTURE', 'Картинка')
                            ->addItem('PREVIEW_TEXT')
                    )
            );

        /***SECTION-INTERFACE***/

        $rsIblock->saveSectionFormInterface(0)
            ->setTabs(
                (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Collection())
                    ->addItem(
                        (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Entity('Элемент'))
                            ->addItem('ID')
                            ->addItem('NAME')
                            ->addItem('CODE', 'Код')
                            ->addItem('UF_TYPE')
                            ->addItem('UF_COUNT')
                            ->addItem('UF_LINK')
                    )
                    ->addItem(
                        (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Entity('Анонс'))
                            ->addItem('PICTURE', 'Картинка')
                            ->addItem('DESCRIPTION')
                    )
            );
    });

Сохранение HighLoadBlock

php
$hlBuilder = (new \Realweb\Api\Module\Migration\Model\Builder\HighLoadBlock())
    ->save("Content", "realweb_hb_content", function (\Realweb\Api\Module\Migration\Model\Entity\HighLoadBlock $hlBlock) {
        $hlBlock
            ->saveField("NAME")
            ->typeString()
            ->label('Название')
            ->required();

        $hlBlock
            ->saveField("UF_XML_ID")
            ->typeString()
            ->label('Внешний код')
            ->required();

        $hlBlock->saveField("UF_SORT")
            ->typeInt()
            ->label('Сортировка');
    });

Сохранение пользовательского свойства

php
$fieldBuilder = (new \Realweb\Api\Module\Migration\Model\Builder\Field())
    ->save("COUNT", "USER", function (\Realweb\Api\Module\Migration\Model\Entity\Field $field) {
        $field
            ->typeInt()
            ->label('Количество');
    });

Каталог (Catalog)

Сохранение типа цен

php
(new \Realweb\Api\Module\Migration\Model\Builder\Catalog\Price())
    ->save("BASE", function (Realweb\Api\Module\Migration\Model\Entity\Catalog\Price $obPrice): void {
        $obPrice
            ->base('N') // по умолчанию
            ->userGroup(array(2)) // по умолчанию
            ->userGroupBuy(array(2)) // по умолчанию
            ->sort(100)// по умолчанию
            ->xmlId('BASE')
            ->label('Базовая');
    });

Сохранение склада

php
(new \Realweb\Api\Module\Migration\Model\Builder\Catalog\Store())
    ->save("SPB", function (Realweb\Api\Module\Migration\Model\Entity\Catalog\Store $obPrice): void {
        $obPrice
            ->isDefault('N') // по умолчанию
            ->siteId('s1') // по умолчанию
            ->shippingCenter('Y') // по умолчанию
            ->issuingCenter('Y') // по умолчанию
            ->active('Y') // по умолчанию
            ->sort(100) // по умолчанию
            ->xmlId('SPB')
            ->title('Санкт-Петербург')
            ->address('Невский пр-т 1')
            ->email('test@test.test')
            ->phone('79991112233')
            ->schedule('9:00 - 21:00')
            ->gpsS(50)
            ->gpsN(50)
            ->description('test');
    });

Интернет магазин (Sale)

Сохранение типа пользователя

php
(new \Realweb\Api\Module\Migration\Model\Builder\Sale\PersonType())
    ->save("INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\PersonType $obPersonType): void {
        $obPersonType
            ->lid('s1') // по умолчанию
            ->entityRegistryType('ORDER') // по умолчанию
            ->businessDomain('I') // по умолчанию
            ->active('Y') // по умолчанию
            ->sort(100) // по умолчанию
            ->xmlId('INDIVIDUAL')
            ->name('Физ лицо');
    });

Сохранение группы свойств

php
(new \Realweb\Api\Module\Migration\Model\Builder\Sale\PropertyGroup())
    ->save("ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\PropertyGroup $obPropertyGroup): void {
        $obPropertyGroup
            ->sort(100) // по умолчанию
            ->name('Адрес');
    });

Сохранение свойств

php
(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Property())
    ->save("NAME", "ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Property $obProperty): void {
        $obProperty
            ->sort(100)
            ->name('ФИО')
            ->typeName()
            ->setRequired();
    });

(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Property())
    ->save("PHONE", "ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Property $obProperty): void {
        $obProperty
            ->sort(200)
            ->name('Телефон')
            ->typePhone()
            ->setRequired();
    });

(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Property())
    ->save("EMAIL", "ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Property $obProperty): void {
        $obProperty
            ->sort(300)
            ->name('Email')
            ->typeEmail()
            ->setRequired();
    });

(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Property())
    ->save("STREET", "ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Property $obProperty): void {
        $obProperty
            ->sort(400)
            ->name('Улица')
            ->typeString();
    });

(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Property())
    ->save("IS_INTERNAL", "ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Property $obProperty): void {
        $obProperty
            ->sort(999)
            ->name('Внутренний заказ')
            ->typeCheckbox()
            ->setService();
    });

(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Property())
    ->save("TYPE", "ADDRESS", "INDIVIDUAL", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Property $obProperty): void {
        $obSaleProperty = $obProperty
            ->sort(500)
            ->name('Тип заказа')
            ->typeEnum();
        $obSaleProperty
            ->saveEnum('fast-order')
            ->name('Быстрый заказ')
            ->sort(10)
            ->xmlId('fast-order')
            ->description('Быстрый заказ');
        $obSaleProperty
            ->saveEnum('slow-order')
            ->name('Медленный заказ')
            ->sort(20)
            ->xmlId('slow-order')
            ->description('Медленный заказ');
    });

Сохранение статусов

php
(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Status())
    ->save("PO", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Status $obStatus): void {
        $obStatus
            ->typeOrder()
            ->lang('Название', 'Описание')
            ->sort(100)
            ->xmlId('PO')
            ->notify('Y');
    });

(new \Realweb\Api\Module\Migration\Model\Builder\Sale\Status())
    ->save("PD", function (Realweb\Api\Module\Migration\Model\Entity\Sale\Status $obStatus): void {
        $obStatus
            ->typeDelivery()
            ->lang('Название', 'Описание')
            ->sort(100)
            ->xmlId('PD')
            ->notify('Y');
    });

Шаблоны миграций

Шаблон миграций можно выбрать двумя способами:

  • через поле выбора в админинке
  • по названию миграции

Создание ИБ

Примеры названий:

  • create_ib_content_news
  • create_iblock_content_news
  • create_ib_1c-catalog_product-offers
Пример
php
(new \Realweb\Api\Module\Migration\Model\Builder\Iblock())
    ->save('content', 'news', function (\Realweb\Api\Module\Migration\Model\Entity\Iblock $rsIblock) {
        $rsIblock
            ->name("")
            ->listPageUrl("#SITE_DIR#/")
            ->sectionPageUrl("#SITE_DIR#/#SECTION_CODE_PATH#/")
            ->detailPageUrl("#SITE_DIR#/#SECTION_CODE_PATH#/#ELEMENT_CODE#/")
            ->requiredCode()
            ->requiredSectionCode()
            ->textHtml()
            ->setIpropertyTemplates();

        $rsIblock
            ->saveProperty("")
            ->name("")
            ->type("");

        $rsIblock
            ->saveSectionField("")
            ->label("")
            ->type("");

        $rsIblock
            ->saveIblockField("")
            ->label("")
            ->type("");

        $rsIblock->saveElementFormInterface(0)
            ->setTabs(
                (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Collection())
                    ->addItem(
                        (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Entity('Элемент'))
                            ->addItem('ID')
                            ->addItem('NAME')
                            ->addItem('CODE')
                            ->addItem('PREVIEW_PICTURE')
                        )
                );

        $rsIblock->saveSectionFormInterface(0)
            ->setTabs(
                (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Collection())
                    ->addItem(
                        (new \Realweb\Api\Module\Migration\Model\Entity\Option\Tab\Entity('Элемент'))
                            ->addItem('ID')
                            ->addItem('NAME')
                            ->addItem('CODE', 'Код')
                            ->addItem('UF_TYPE')
                            ->addItem('UF_COUNT')
                            ->addItem('UF_LINK')
                        )
                );
    });

Обновление ИБ

Примеры названий:

  • update_ib_content_news
  • update_iblock_content_news
  • update_ib_1c-catalog_product-offers
Пример
php
(new \Realweb\Api\Module\Migration\Model\Builder\Iblock())
    ->save('content', 'news', function (\Realweb\Api\Module\Migration\Model\Entity\Iblock $rsIblock) {

    });

Создание ХБ

Примеры названий:

  • create_hb_user_phones
  • create_highload_user_phones
  • create_highloadblock_user-phones
Пример
php
(new \Realweb\Api\Module\Migration\Model\Builder\HighLoadBlock())
    ->save("UserPhones", "realweb_hb_user_phones", function (\Realweb\Api\Module\Migration\Model\Entity\HighLoadBlock $hlBlock) {
        $hlBlock
            ->saveField("")
            ->type("")
            ->label("");
    });

Обновление ХБ

Примеры названий:

  • update_hb_user_phones
  • update_highload_user_phones
  • update_highloadblock_user-phones
Пример
php
(new \Realweb\Api\Module\Migration\Model\Builder\HighLoadBlock())
    ->save("UserPhones", "realweb_hb_user_phones", function (\Realweb\Api\Module\Migration\Model\Entity\HighLoadBlock $hlBlock) {
        
    });

Создание поля

Примеры названий:

  • create_field_user_phone
  • create_field_crm-lead_phone-number
Пример
php
(new \Realweb\Api\Module\Migration\Model\Builder\Field())
    ->save("USER", "PHONE", function (\Realweb\Api\Module\Migration\Model\Entity\Field $field) {
        $field
            ->type('')
            ->label('');
    });

Обновление поля

Примеры названий:

  • update_field_user_phone
  • update_field_crm-lead_phone-number
Пример
php
(new \Realweb\Api\Module\Migration\Model\Builder\Field())
    ->save("USER", "PHONE", function (\Realweb\Api\Module\Migration\Model\Entity\Field $field) {
        
    });

Репозиторий

Репозиторий модуля