В новой версии мы внедрили функционал миграций (обновлений) для плагинов. Функционал позволит разработчикам удобно выполнять обновления своих плагинов, в особенности, если эти обновления затрагивают изменения базы данных.
Как это работает
Пользователь заливает новую версию плагина в каталог
/plugins/
. Система сравнивает текущую версию плагина с версией этого плагина в БД. И если версия в БД старее, то в админке появляется кнопка «Применить обновление», которая автоматически запустит необходимые скрипты для обновления.
Скрипты (классы) для обновления у плагина находятся в каталоге
/update/
, который в свою очередь содержит каталоги с номерами версий. Для каждой версии можно создать несколько скриптов с произвольным названием, главное, что нужно помнить — названия файлов должно быть
уникальным в рамках всего плагина для всех его версий.
Файл с обновлением представляет собой класс наследник от базового класса
ModulePluginManager_EntityUpdate
и название класса является производным от имени файла — Plugin[plugin_name]_Update_[file_name]. Например, для файла /update/1.0/CreateTable.php класс будет таким:
<?php
class PluginArticle_Update_CreateTable extends ModulePluginManager_EntityUpdate {
/**
* Выполняется при обновлении версии
*/
public function up() {
if (!$this->isTableExists('prefix_article')) {
/**
* При активации выполняем SQL дамп
*/
$this->exportSQL(Plugin::GetPath(__CLASS__).'/dump.sql');
}
}
/**
* Выполняется при откате версии
*/
public function down() {
$this->exportSQLQuery('DROP TABLE prefix_article;');
}
}
Как видно из примера, класс содержит два метода
up
и
down
. Первый выполняется при обновлении до версии, второй при откате версии. В этих методах может быть не только работа с БД, но и другая необходимая для обновления логика.
При удалении плагина из админки выполняется автоматический откат всех изменений всех версий (метод down).
Данный поход позволит «разгрузить» у плагинов методы
Activate
и
Deactivate
от лишней логики и дать удобный механизм обновления версий. Для корректной работы данного механизма, необходимо версии плагинов именовать используя вот этот стандарт —
ru2.php.net/manual/ru/function.version-compare.php, он позволит правильно сортировать версии.