Начиная с 16 версии в UMI.CMS появились манифесты. Они позволяют выполнять различные действия при установке или обновлении системы. Манифесты используются для нескольких системных модулей, например, для переиндексации умных фильтров, для изменения идентификаторов импортированных через umiDump объектов и т.д. Манифесты выполняются на одном из последних шагов установки/обновления, уже после установки всех компонентов и решения.

Имплементация механизма манифестов находится в директории /classes/system/subsystems/manifest . Для более глубокого понимания работы манифестов рекомендуем изучить основные файлы:

classes/manifest/Manifest.php
classes/action/Action.php
classes/transaction/Transaction.php

а также их интерфейсы.

Манифесты бывают трех видов: для ядра в целом, для конкретного модуля и для конкретного решения. В этой статье будет описан процесс создания манифестов для модулей и решений.

Для каждого модуля и решения может быть написан отдельный манифест. Для добавления манифеста нужно создать конфигурационный xml-файл и php-файлы действий. Xml-файл должен называться install.xml или update.xml (можно создать оба вида). Каждый xml-файл описывает один манифест. Манифест install.xml выполняется при установке системы. Манифест update.xml выполняется при обновлении системы. Оба манифеста могут пользоваться общими действиями в пределах одного модуля/решения.

Структура файлов для модуля:

/classes/components/<module>/manifest/<install|update>.xml
/classes/components/<module>/manifest/actions/MyAction.php"
/classes/components/<module>/manifest/actions/AnotherAction.php

Структура файлов для решения:

/templates/<template>/manifest/<install|update>.xml
/templates/<template>/manifest/actions/MyAction.php
/templates/<template>/manifest/actions/AnotherAction.php

Пример конфигурационного файла из модуля webforms (/classes/components/webforms/manifest/install.xml):

<?xml version="1.0" encoding="utf-8"?>
<manifest>
<route>
<transaction name="update_related_id_on_install">
<action name="\UmiCms\Manifest\WebForms\UpdateRelatedId" />
</transaction>
</route>
</manifest>

Каждый манифест состоит из набора транзакций, каждая транзакция состоит из набора действий.

Атрибут "name" элемента <action> должен совпадать с именем класса действия (в данном случае это полное имя класса с пространством имен). Имя файла должно совпадать с именем класса (без пространства имен).

Класс действия схематично выглядит так:

<?php 
namespace UmiCms\Manifest\WebForms;

class UpdateRelatedIdAction extends \Action {
  public function __construct($name, array $params = []) {
    parent::__construct($name, $params);
  }

  public function execute() {
  }

  public function rollback() {
  }
}

(полная версия находится в файле /classes/components/webforms/manifest/actions/UpdateRelatedId.php).

1) Класс наследуется от Action (глобальное пространство имен). Название класса обязательно должно заканчиваться словом "Action".
2) Конструктор можно не указывать, если в нем только вызывается родительский конструктор
3) В методе execute находится логика действия
4) В методе rollback находится логика, откатывающая действия метода execute