Установка, удаление, активация и деактивация модулей

Построение списка модулей на странице “Управление модулями”

  1. Генерируется предварительный список модулей на основе содержимого директории app/addons. Каждая подпапка считается модулем.
  2. Для каждой папки делается попытка загрузить app/addons/[addon]/addon.xml. Если загрузка не удалась, или файл в формате XML не читается, то модуль игнорируется. При этом ошибки чтения самого файла addon.xml будет выведено сообщение об ошибке (Error).
  3. Для всех оставшихся модулей берется имя модуля. Для актуальной схемы 3.0 имя модуля берется из PO-файла var/langs/[lang_code]/addons/[addon].po.
  4. Данные уже установленных модулей берутся из базы данных и применяются поверх списка неустановленных модулей. То есть, если модуль уже установлен, изменение его имени или описания не применяется.

Процесс установки модуля

  1. Убеждаемся, что в таблице ?:addons нет записи для модуля.

  2. Загружаем схему модуля из файла addon.xml.

  3. Если модуль помечен как unmanaged, установку разрешается продолжить только в консольном режиме.

  4. В автозагрузчик классов Tygh::$app['class_loader'] добавляем папку с модулем, чтобы работала автозагрузка классов модуля.

  5. Производится проверка совместимости.

    Примечание

    Если какая-либо проверка провалилась, то выводится текст ошибки и установка модуля прерывается.

  6. Производится проверка зависимостей необходимых модулей.

    Примечание

    Конфликтные модули на этом этапе не проверяются, они будут проверяться при активации модуля.

  7. Выполняются функции, заданные в разделе <functions> с for="before_install".

    Примечание

    Если в процессе выполнения функции была вызвана ошибка базы данных, то установка прекращается и запускается удаление модуля.

  8. Создается запись в Registry::set('addons.' . $addon) в которую записывается только статус disabled и приоритет модуля.

  9. Выполняются запросы из секции <queries> с for="install".

    Примечание

    При ошибке базы данных установка прекращается и запускается удаление модуля.

  10. В базе данных создаются настройки (секция <settings>).

    Примечание

    При ошибке базы данных установка прекращается и запускается удаление модуля.

  11. Создаются записи в таблицах ?:addons и ?:addon_descriptions, при этом модулю пока ставится статус disabled (Выключен).

  12. Устанавливаются языковые переменные из PO-файла.

  13. Устанавливаются шаблоны: копируются из var/themes_repository в design/themes.

  14. В Registry::set('addons.' . $addon) и в Registry::set('settings.' . $addon, $settings) записываются значения настроек модуля.

  15. Английские значения языковых переменных сохраняются в таблицу ?:original_values.

  16. Производится установка вкладок товаров (product tabs) на основе директории [theme]/templates/addons/[addon]/blocks/product_tabs.

  17. Выполняются функции, заданные в разделе <functions> с for="install".

    Примечание

    Если в процессе выполнения функции была вызвана ошибка базы данных, то установка прекращается и запускается удаление модуля.

  18. Производится активация модуля, если в файле addon.xml статус модуля задан как Active.

    Примечание

    Если активация провалилась, то модуль остается установленным, просто он останется выключен по умолчанию. При этом процесс установки продолжается.

  19. Производится импорт макета: app/addons/[addon]/layouts.xml.

  20. Очищается кэш магазина.

  21. Устанавливаются демонстрационные данные.

    Примечание

    Это происходит только в том случае, если модуль устанавливается в процессе установки магазина, и была выбрана опция установки демонстрационных данных.

    Примечание

    При ошибке базы данных установка прекращается и запускается удаление модуля.

Процесс удаления модуля

  1. Если модуль помечен как unmanaged, удаление разрешается продолжить только в консольном режиме.

  2. Проверяется наличие других модулей, у которых текущий модуль указан в качестве зависимости. Если такие модули найдены, то удаление прекращается и выводится ошибка:

    Важно

    Warning::The add-on cannot be uninstalled because the following add-ons depend on it: [addons]”.

  3. Выполняются функции, заданные в разделе <functions> с for="uninstall".

  4. Удаляются записи из таблиц ?:addons и ?:addon_descriptions.

  5. Удаляются настройки модуля.

  6. Удаляются языковые переменные модуля.

  7. Выполняются запросы из секции <queries> с for="uninstall".

  8. Удаляются вкладки товаров (product tabs) модуля.

  9. Удаляются шаблоны модуля из design/themes.

  10. Откатываются макеты модуля.

  11. Очищается Registry::get('addons.' . $addon_name).

  12. Удаляются хуки модуля из списка зарегистрированных хуков (Registry::get('hooks')). Очищается кэш магазина.

Процесс активации модуля

  1. Загружаем схему модуля из файла addon.xml.

  2. Если модуль помечен как unmanaged, активацию разрешается продолжить только в консольном режиме.

  3. Запускается хук:

    fn_set_hook('update_addon_status_pre', $addon, $status, $show_notification, $on_install, $allow_unmanaged, $old_status, $scheme);
    
  4. Производится первая часть проверки совместимости конфликтных модулей: берем все активные модули на текущий момент и смотрим, не является ли наш модуль конфликтом для них.

    Примечание

    Если проверка не пройдена, то выводится текст ошибки и активация прерывается.

  5. Проверяется существование функции fn_settings_actions_addons_[addon](). Если функция существует, то она вызывается с аргументами: ($new_status, $old_status, $on_install).

  6. Производится вторая часть проверки совместимости конфликтных модулей: убеждаемся что все модули, конфликтующие с нашим, выключены на текущий момент.

    Примечание

    Если проверка не пройдена, то выводится текст ошибки и активация прерывается.

  7. В базе в таблице ?:addons меняется значение поля status у модуля на A.

  8. Проверяется существование функции fn_settings_actions_addons_post_[addon](). Если функция существует, то она вызывается с аргументами: ($new_status).

  9. Производится обновление статусов вкладок товаров (product tabs): включаются product_tabs нашего модуля.

  10. В Registry::set('addons.[addon].status') записывается новый статус A.

Процесс деактивации модуля

  1. Загружаем схему модуля из файла addon.xml.

  2. Если модуль помечен как unmanaged, деактивацию разрешается продолжить только в консольном режиме.

  3. Запускается хук:

    fn_set_hook('update_addon_status_pre', $addon, $status, $show_notification, $on_install, $allow_unmanaged, $old_status, $scheme);
    
  4. Проверяется существование функции fn_settings_actions_addons_[addon](). Если функция существует, то она вызывается с аргументами: ($new_status, $old_status, $on_install).

  5. В базе данных в таблице ?:addons меняется значение поля status у модуля на D.

  6. Проверяется существование функции fn_settings_actions_addons_post_[addon](). Если функция существует, то она вызывается с аргументами: ($new_status).

  7. Производится обновление статусов вкладок товаров (product tabs): выключаются product_tabs нашего модуля.

  8. В Registry::set('addons.[addon].status') записывается новый статус D.