Установка, удаление, активация и деактивация модулей¶
Построение списка модулей на странице “Управление модулями”¶
- Генерируется предварительный список модулей на основе содержимого директории app/addons. Каждая подпапка считается модулем.
- Для каждой папки делается попытка загрузить app/addons/[addon]/addon.xml. Если загрузка не удалась, или файл в формате XML не читается, то модуль игнорируется. При этом ошибки чтения самого файла addon.xml будет выведено сообщение об ошибке (Error).
- Для всех оставшихся модулей берется имя модуля. Для актуальной схемы 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.
Очищается кэш магазина.
Устанавливаются демонстрационные данные.
Примечание
Это происходит только в том случае, если модуль устанавливается в процессе установки магазина, и была выбрана опция установки демонстрационных данных.
Примечание
При ошибке базы данных установка прекращается и запускается удаление модуля.
Процесс удаления модуля¶
Если модуль помечен как
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.