Установка, удаление, активация и деактивация модулей¶
Построение списка модулей на странице “Управление модулями”¶
- Генерируется предварительный список модулей на основе содержимого директории 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_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_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.