Выпуск и обновление модуля
Модуль готов, и его нужно передать в другой магазин — рабочий сервер заказчика или маркетплейс. Модуль распространяют архивом ZIP, который загружают через панель управления. Чтобы установка и последующие обновления прошли гладко, архив собирают по нескольким правилам.
Итоговая структура
Вот что накопилось в модуле за курс:
modules/acmehello/
├── acmehello.php главный класс
├── composer.json автозагрузка классов из src
├── logo.png значок
├── classes/
│ └── AcmeReview.php модель ObjectModel
├── config/
│ ├── routes.yml маршруты панели
│ └── services.yml службы и команды
├── controllers/
│ ├── admin/ старый контроллер панели
│ └── front/ страницы витрины
├── mails/
│ └── en/ шаблоны писем
├── src/
│ ├── Command/ консольные команды
│ ├── Controller/Admin/ контроллеры Symfony
│ └── Repository/ службы
├── upgrade/
│ └── upgrade-1.1.0.php скрипты обновления
├── vendor/ автозагрузчик Composer
└── views/
├── css/ js/ стили и скрипты
└── templates/
├── admin/ шаблоны Twig
├── front/ шаблоны страниц
└── hook/ шаблоны хуковВерсия
Номер версии — три числа через точку в конструкторе главного класса:
// modules/acmehello/acmehello.php
$this->version = '1.2.0';| Что изменилось | Какое число растёт | Пример |
|---|---|---|
| Исправление ошибки | Третье | 1.1.0 → 1.1.1 |
| Новая возможность | Второе | 1.1.1 → 1.2.0 |
| Несовместимые изменения | Первое | 1.2.0 → 2.0.0 |
Движок хранит установленную версию в базе. Увидев в коде версию больше, он понимает, что модуль нужно обновить.
Что входит в обновление
Всё, что install() делает один раз, у установленного модуля само не повторится. Если новая версия добавляет хук, настройку, таблицу или колонку, это описывают в скрипте обновления:
<?php
// modules/acmehello/upgrade/upgrade-1.2.0.php
if (!defined('_PS_VERSION_')) {
exit;
}
function upgrade_module_1_2_0($module)
{
return $module->registerHook('actionProductDelete')
&& Configuration::updateValue('ACMEHELLO_LIMIT', 5);
}Скрипт подписывает модуль на новый хук и создаёт новую настройку. То же самое добавляют в install() — для тех, кто ставит модуль впервые. Если функция вернёт false, обновление остановится и панель покажет ошибку.
Подготовка папки
Перед сборкой архива в папке модуля выполняют:
composer install --no-dev --optimize-autoloaderКоманда создаёт папку vendor без библиотек для разработки. Папку vendor кладут в архив: в магазине, куда ставят модуль, Composer никто запускать не будет.
Что в архив не кладут:
| Не включать | Почему |
|---|---|
.git, .idea, node_modules | Служебные папки разработки |
config.xml, config_ru.xml | Кеш описания модуля, создаётся сам |
| Исходники стилей и скриптов до сборки | В магазине нужны только готовые файлы |
| Файлы с паролями и ключами | Архив может попасть к посторонним |
Файлы index.php
В каждую папку модуля принято класть файл index.php, который перенаправляет на главную. Он закрывает просмотр списка файлов, если сервер настроен неудачно. Маркетплейс PrestaShop требует такие файлы во всех папках.
Сборка архива
В корне архива должна быть одна папка с именем модуля:
cd modules
zip -r acmehello-1.2.0.zip acmehello -x "acmehello/.git/*" "acmehello/config*.xml"Команда создаёт архив acmehello-1.2.0.zip, внутри которого лежит папка acmehello со всеми файлами.
Установка и обновление из архива
- Откройте в панели «Модули → Менеджер модулей».
- Нажмите «Установить модуль» и перетащите архив в окно.
Если модуля в магазине нет, он установится. Если стоит более старая версия, файлы заменятся и выполнятся скрипты обновления от установленной версии до новой. Из консоли обновление после замены файлов запускают так:
php bin/console prestashop:module upgrade acmehelloПроверка перед выпуском
| Что проверить | Как |
|---|---|
| Чистая установка | Удалить модуль, поставить архив на свежий магазин |
| Обновление | Поставить прошлую версию, затем новую поверх |
| Удаление | После удаления не осталось таблиц и настроек |
| Режим отладки | Нет предупреждений PHP на страницах модуля |
| Переводы | Все строки обёрнуты в trans() и l |
Частая ошибка
Архив собрали из содержимого папки, а не из самой папки: в корне ZIP лежат acmehello.php и views. Панель ответит, что архив не является модулем. В корне архива должна быть ровно одна папка, и её имя должно совпадать с техническим именем модуля.