Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Выпуск и обновление модуля

Модуль готов, и его нужно передать в другой магазин — рабочий сервер заказчика или маркетплейс. Модуль распространяют архивом 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 со всеми файлами.

Установка и обновление из архива

  1. Откройте в панели «Модули → Менеджер модулей».
  2. Нажмите «Установить модуль» и перетащите архив в окно.

Если модуля в магазине нет, он установится. Если стоит более старая версия, файлы заменятся и выполнятся скрипты обновления от установленной версии до новой. Из консоли обновление после замены файлов запускают так:

php bin/console prestashop:module upgrade acmehello

Проверка перед выпуском

Что проверитьКак
Чистая установкаУдалить модуль, поставить архив на свежий магазин
ОбновлениеПоставить прошлую версию, затем новую поверх
УдалениеПосле удаления не осталось таблиц и настроек
Режим отладкиНет предупреждений PHP на страницах модуля
ПереводыВсе строки обёрнуты в trans() и l

Частая ошибка

Архив собрали из содержимого папки, а не из самой папки: в корне ZIP лежат acmehello.php и views. Панель ответит, что архив не является модулем. В корне архива должна быть ровно одна папка, и её имя должно совпадать с техническим именем модуля.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.