Создание Первого Модуля
Прежде чем начать писать код для вашего модуля PrestaShop, мы рекомендуем прочитать стандарты кодирования PrestaShop. Настройка подсказок вашего IDE или использование автоматизированных инструментов может помочь вам следовать стандартам проекта.
Создание Простого Модуля
Давайте создадим первый простой модуль, чтобы лучше описать его структуру. Мы назовем его "My module".
Сначала создайте папку модуля в папке `/modules` PrestaShop. Назовем ее mymodule
. Это будет "техническое" имя модуля.
Тест Константы
Основной файл mymodule.php
должен начинаться с следующего теста:
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
Это проверяет наличие всегда существующей константы PrestaShop (номер версии), и если она не существует, загрузка модуля прекращается. Это необходимо для предотвращения загрузки файла злоумышленниками напрямую.
Основной Класс
Основной файл должен содержать основной класс модуля.
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class MyModule extends Module
{
}
Этот главный класс должен носить то же имя, что и модуль, и его папка, в PascalCase. В нашем примере: MyModule
. Более того, этот класс должен расширять класс Module
, чтобы наследовать все его методы и атрибуты.
Метод конструктора
Теперь создадим метод конструктора модуля. Поскольку конструктор - это первый метод, который вызывается при загрузке модуля PrestaShop, это лучшее место для установки его деталей.
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class MyModule extends Module
{
public function __construct()
{
$this->name = 'mymodule';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Firstname Lastname';
$this->need_instance = 0;
$this->ps_versions_compliancy = [
'min' => '1.7.0.0',
'max' => '8.99.99',
];
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->trans('My module', [], 'Modules.Mymodule.Admin');
$this->description = $this->trans('Description of my module.', [], 'Modules.Mymodule.Admin');
$this->confirmUninstall = $this->trans('Are you sure you want to uninstall?', [], 'Modules.Mymodule.Admin');
if (!Configuration::get('MYMODULE_NAME')) {
$this->warning = $this->trans('No name provided', [], 'Modules.Mymodule.Admin');
}
}
}
Атрибуты класса:
$this->name
: внутренний идентификатор модуля (техническое имя).$this->tab
: раздел, в котором будет находиться модуль в разделе управления модулями в административной панели.$this->version
: номер версии модуля.$this->author
: имя автора модуля.$this->need_instance
: указывает, нужно ли загружать класс модуля при отображении страницы "Модули" в административной панели.$this->ps_versions_compliancy
: указывает, с какими версиями PrestaShop совместим этот модуль.$this->bootstrap
: указывает, что файлы шаблонов модуля были созданы с учетом инструментов bootstrap в PrestaShop.
Метод конструктора завершен. Теперь перейдите на страницу каталога модулей в административной панели и найдите "mymodule". Модуль виден в списке с отображаемой информацией, но пока без иконки.
Методы install() и uninstall()
Методы install()
и uninstall()
позволяют контролировать, что происходит при установке или удалении модуля администратором магазина. Они должны быть включены в основной блок кода класса модуля (в нашем примере MyModule
).
Метод install()
Вот минимально необходимый код для метода install()
:
public function install()
{
return parent::install();
}
В этом примере метод выполняет минимум, необходимый для установки модуля, возвращая результат метода install()
родительского класса Module
.
Расширенный пример метода install()
:
public function install()
{
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_ALL);
}
return (
parent::install()
&& Configuration::updateValue('MYMODULE_NAME', 'my module')
);
}
Если любая из строк в блоке проверки не пройдет, метод вернет false
и установка будет прервана.
Метод uninstall()
Метод uninstall()
следует той же логике, что и install()
:
public function uninstall()
{
return parent::uninstall();
}
Расширенный пример метода uninstall()
, который удаляет данные, добавленные в базу данных при установке:
public function uninstall()
{
return (
parent::uninstall()
&& Configuration::deleteByName('MYMODULE_NAME')
);
}
Объект Configuration
Объект Configuration
позволяет легко управлять всеми настройками магазина. Он хранит свои данные в таблице базы данных PREFIX_configuration
.
Это очень полезный и легкий в использовании объект, который вы будете часто использовать. Большинство нативных модулей также используют его для своих настроек.
Объект Shop
Пример использования объекта Shop
:
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_ALL);
}
Методы:
Shop::isFeatureActive()
: проверяет, активирована ли функция мульти-магазина, и если активировано как минимум два магазина.Shop::setContext(Shop::CONTEXT_ALL)
: изменяет контекст, чтобы применить изменения ко всем существующим магазинам вместо только текущего магазина.
Файл иконки
Иконка должна соответствовать следующим требованиям:
- Находиться в основной папке модуля.
- Формат PNG, размер 32 на 32 пикселя.
- Назван файл должен быть
logo.png
.
Установка модуля
Вы можете установить модуль двумя способами: через интерфейс административной панели или используя консоль Symfony (установка на основе CLI).
Установка модуля через интерфейс административной панели
Теперь, когда все основные элементы на месте, перезагрузите страницу каталога модулей административной панели, найдите ваш модуль и установите его.
Установка модуля с помощью консоли Symfony
Перейдите в директорию проекта с помощью командной строки и выполните:
php bin/console prestashop:module install mymodule
Для удаления модуля выполните:
php bin/console prestashop:module uninstall mymodule
Файл config.xml
Во время установки модуля PrestaShop автоматически создаёт небольшой файл config.xml
в папке модуля, который хранит информацию о модуле. Будьте очень осторожны при редактировании этого файла вручную.
Обеспечение безопасности
После того, как ваш модуль будет в сети, его файлы могут быть доступны любому в Интернете. Даже если они не смогут ничего вызвать, кроме ошибок PHP, вы можете захотеть предотвратить это.
Вы можете сделать это, добавив файл index.php
в корень любой папки модуля. Вот предложение, что поместить в файл:
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../');
exit;