Установка, удаление, активация и деактивация модулей¶
Построение списка модулей на странице “Управление модулям蔶
- Генерируется предварительный список модулей на основе содержимого директории app/addons. Каждая подпапка считается модулем.
- Для каждой папки делается попытка загрузить app/addons/[addon]/addon.xml. Если загрузка не удалась, или xml не читается, то модуль игнорируется. При этом ошибки чтения самого addon.xml будут выведены в Error notice.
- Для всех оставшихся модулей берется имя модуля. Для актуальной схемы 3.0 название модуля берется из PO-файла var/langs/[lang_code]/addons/[addon].po.
- Данные уже установленных модулей берутся из БД и накатываются поверх списка неустановленных модулей. Т.е. если модуль уже установлен, изменение его имени или описания не применится.
Процесс установки модуля¶
Убеждаемся, что в таблице
?:addons
нет записи для модуля.Загружаем схему модуля из addon.xml.
Если модуль помечен как
unmanaged
, установку разрешается продолжить только в консольном режиме.В автозагрузчик классов
Tygh::$app['class_loader']
добавляем папку с модулем, чтобы работала автозагрузка классов модуля.Производится проверка совместимости.
Примечание
Если какая-либо проверка провалилась, то выводится текст ошибки и установка модуля прерывается.
Производится проверка зависимостей необходимых модулей.
Примечание
Конфликтные модули на этом этапе не проверяются, они будут проверяться при активации модуля.
Выполняются функции, заданные в разделе
<functions>
сfor="before_install"
.Примечание
Если в процессе выполнения функции была вызвана ошибка БД, то установка прекращается и запускается удаление модуля.
Создается запись в
Registry::set('addons.' . $addon)
в которую записывается только статусdisabled
и приоритет модуля.Выполняются запросы из секции
<queries>
сfor="install"
.Примечание
При ошибке БД установка прекращается и запускается удаление модуля.
В БД создаются настройки (
секция <settings>
).Примечание
При ошибке БД установка прекращается и запускается удаление модуля.
Создаются записи в таблицах
?:addons
и?:addon_descriptions
, при этом модулю пока ставится статусdisabled
(Выкл.).Устанавливаются языковые переменные из PO-файла.
Устанавливаются шаблоны: копируются из var/themes_repository в design/themes.
В
Registry::set('addons.' . $addon)
и вRegistry::set('settings.' . $addon, $settings)
записываются значения настроек модуля.Английские значения языковых переменных сохраняются в таблицу
?:original_values
.Производится установка product tabs на основе директории [theme]/templates/addons/[addon]/blocks/product_tabs.
Выполняются функции, заданные в разделе
<functions>
сfor="install"
.Примечание
Если в процессе выполнения функции была вызвана ошибка БД, то установка прекращается и запускается удаление модуля.
Производится активация модуля, если в addon.xml статус модуля задан как Active.
Примечание
Если активация провалилась, то модуль остается установленным, просто он останется выключен по умолчанию. При этом процесс установки продолжается.
Производится импорт макета: app/addons/[addon]/layouts.xml.
20.Очищается кэш магазина.
Устанавливаются демо-данные.
Примечание
Это происходит только в том случае, если модуль устанавливается в процессе установки магазина, и была выбрана опция установки демо-данных.
Примечание
При ошибке БД установка прекращается и запускается удаление модуля.
Процесс удаления модуля¶
Если модуль помечен как
unmanaged
, удаление разрешается продолжить только в консольном режиме.Проверяется наличие других модулей, у которых текущий модуль указан в качестве зависимости. Если такие модули найдены, то удаление прекращается и выводится ошибка:
Важно
Warning::The add-on cannot be uninstalled because the following add-ons depend on it: [addons]”.
Выполняются функции, заданные в разделе
<functions>
сfor="uninstall"
.Удаляются записи из таблиц
?:addons
и?:addon_descriptions
.Удаляются настройки модуля.
Удаляются языковые переменные модуля.
- Выполняются запросы из секции
<queries>
сfor="uninstall"
. - Удаляются product tabs модуля.
- Удаляются шаблоны модуля из
design/themes
. - Откатываются макеты модуля.
- Очищается
Registry::get('addons.' . $addon_name)
. - Удаляются хуки модуля из списка зарегистрированных хуков (
Registry::get('hooks')
). Очищается кэш магазина.
Процесс активации модуля¶
Загружаем схему модуля из addon.xml.
Если модуль помечен как
unmanaged
, активацию разрешается продолжить только в консольном режиме.Запускается хук:
fn_set_hook('update_addon_status_pre', $addon, $status, $show_notification, $on_install, $allow_unmanaged, $old_status, $scheme);
Производится первая часть проверки совместимости конфликтных модулей: берем все активные модули на текущий момент и смотрим, не является ли наш модуль конклифтом для них.
Примечание
Если проверка провалилась, то выводится текст ошибки и активация прерывается.
Проверяется существование функции
fn_settings_actions_addons_[addon]()
. Если функция существует, то она вызывается с аргументами:($new_status, $old_status, $on_install)
.Производится вторая часть проверки совместимости конфликтных модулей: убеждаемся что все модули, конфликтующие с нашим, выключены на текущий момент.
Примечание
Если проверка провалилась, то выводится текст ошибки и активация прерывается.
В базе в таблице
?:addons
меняется значение поляstatus
у модуля на A.Проверяется существование функции
fn_settings_actions_addons_post_[addon]()
. Если функция существует, то она вызывается с аргументами:($new_status)
.Производится обновление статусов product tabs: включаются product_tabs нашего модуля.
В
Registry::set('addons.[addon].status')
записывается новый статус A.
Процесс деактивации модуля¶
Загружаем схему модуля из addon.xml.
Если модуль помечен как
unmanaged
, декативацию разрешается продолжить только в консольном режиме.Запускается хук:
fn_set_hook('update_addon_status_pre', $addon, $status, $show_notification, $on_install, $allow_unmanaged, $old_status, $scheme);
Проверяется существование функции
fn_settings_actions_addons_[addon]()
. Если функция существует, то она вызывается с аргументами:($new_status, $old_status, $on_install)
.В БД в таблице
?:addons
меняется значение поля status у модуля на D.Проверяется существование функции
fn_settings_actions_addons_post_[addon]()
. Если функция существует, то она вызывается с аргументами:($new_status)
.Производится обновление статусов product tabs: выключаются product_tabs нашего модуля.
В
Registry::set('addons.[addon].status')
записывается новый статус D.