Encodera

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

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

Оглавление

Первый модуль

Модуль — это папка в modules с файлом PHP того же имени. В файле один класс, наследник Module: он описывает модуль и говорит, что делать при установке и удалении. Консольной команды для создания модуля нет — папку и файл создают вручную.

Папка и файл

Создайте папку modules/acmehello и в ней файл acmehello.php. Рядом можно положить значок logo.png размером 32 на 32 пикселя — он виден в списке модулей.

modules/acmehello/
├── acmehello.php
└── logo.png

Имя папки и имя файла совпадают и пишутся строчными латинскими буквами и цифрами. Приставка acme — название вашей компании: так имя не совпадёт с чужим модулем.

Главный класс

<?php
// modules/acmehello/acmehello.php
if (!defined('_PS_VERSION_')) {
    exit;
}
 
class AcmeHello extends Module
{
    public function __construct()
    {
        $this->name = 'acmehello';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'Acme';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = ['min' => '8.0.0', 'max' => _PS_VERSION_];
        $this->bootstrap = true;
 
        parent::__construct();
 
        $this->displayName = $this->trans('Acme: отзывы', [], 'Modules.Acmehello.Admin');
        $this->description = $this->trans('Приветствие и отзывы о товарах.', [], 'Modules.Acmehello.Admin');
    }
}

Откройте в панели «Модули → Менеджер модулей» и наберите в поиске acme: модуль появился в списке с кнопкой «Установить». Проверка _PS_VERSION_ в начале файла не даёт открыть его напрямую из браузера. Имя класса — имя модуля, регистр букв в нём не важен.

Поля конструктора

ПолеЧто означает
nameТехническое имя. Обязано совпадать с именем папки и файла
tabРаздел в списке модулей: front_office_features, administration, payments_gateways, shipping_logistics
versionВерсия модуля. По ней движок понимает, что модуль нужно обновить
authorАвтор, виден в списке модулей
need_instance0 — не создавать объект модуля при показе списка модулей. Почти всегда 0
ps_versions_compliancyС какими версиями PrestaShop модуль работает
bootstraptrue — страница настроек использует стили панели
displayNameНазвание для человека
descriptionОписание под названием

displayName и description задают после parent::__construct(): метод trans() переводит строку, а переводы доступны только после вызова родителя. Переводам посвящён отдельный урок.

Установка и удаление

Добавьте в класс два метода:

// modules/acmehello/acmehello.php
public function install(): bool
{
    return parent::install();
}
 
public function uninstall(): bool
{
    return parent::uninstall();
}

install() выполняется один раз, когда модуль устанавливают. Позже здесь появятся подписка на хуки, создание таблиц и настройки по умолчанию. uninstall() убирает за собой. Оба метода возвращают true, если всё прошло успешно; при false панель покажет ошибку.

Установка из консоли

Команды запускают из корня магазина:

php bin/console prestashop:module install acmehello

Команда печатает сообщение об успешной установке. В менеджере модулей кнопка «Установить» сменится на «Выключить». На витрине пока ничего не изменилось: модуль ещё ничего не выводит.

ДействиеЧто делает
installУстанавливает: вызывает install()
uninstallУдаляет: вызывает uninstall()
resetУдаляет и ставит заново
enable, disableВключает и выключает, не удаляя данные

Действие подставляют вместо install в команде выше. То же делают кнопки в менеджере модулей.

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

Свойство name написано не так, как папка: acme_hello или AcmeHello. Модуль в списке не появляется или не устанавливается, а в журнале пусто. Папка, файл и name должны совпадать буква в букву: acmehello, acmehello.php, 'acmehello'.

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

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