При установке обновления приложения или плагина бывает необходимо внести изменения в структуру базы данных или удалить более не актуальные файлы. Такие разовые действия называются метаобновлениями.
Для автоматического выполнения метаобновлений очередная версия продукта должна содержать правильно оформленные PHP-файлы с требуемой логикой (для выполнения SQL-запросов, удаления лишних файлов и т. п.).
Правила оформления исходного кода файлов метаобновлений
- Имя файла (с расширением
.php
) должно представлять собой метку времени UNIX, соответствующую более позднему времени, чем время установки текущей (еще не обновленной) версии продукта. Пример правильного имени файла:1383820487.php
. - Файлы с исходным кодом метаобновлений должны находиться в директории
lib/updates/
либо в любой поддиректории внутриlib/updates/
. Например, файлы метаобновлений каждого нового поколения продукта может быть целесообразным хранить в отдельной поддиректории:lib/updates/1/
,lib/updates/2/
,lib/updates/3/
и т. п. - В файлах метаобновлений можно использовать любые классы фреймворка и обновляемого приложения.
-
Файлы метаобновлений должны быть написаны так, чтобы их исходный код мог быть выполнен любое количество раз без негативных последствий. Потенциально невыполнимые операции рекомендуется обрабатывать с помощью блока
try...catch
, чтобы исключить возможность прерывания работы скрипта.Пример:
<?php $model = new waModel(); //попытка получить содержимое потенциально отсутствующего поля таблицы try { $model->query('SELECT sort FROM myapp_item WHERE 0'); //в случае неудачи — если поле отсутствует — добавляем его в таблицу } catch (waDbException $e) { $sql = 'ALTER TABLE myapp_item ADD sort INT(11) NOT NULL DEFAULT 0'; $model->exec($sql); }
Как происходит выполнение метаобновлений
При первом запуске продукта после установки обновления с помощью «Инсталлера» проверяется значение записи с именем update_time
для данного продукта в таблице wa_app_settings
. После этого в хронологическом порядке начинает по очереди выполняться исходный код файлов метаобновлений продукта, в именах которых метка времени превышает значение, полученное из базы данных. Если исходный код какого-либо файла метаобновлений не выполнится, то исходный код остальных файлов также выполнен не будет. После успешного завершения метаобновления автоматически обновляется значение update_time
в базе данных с текущей меткой времени.