Детальный анализ модуля Prestashop 1.5 (часть 1)
Эта статья продолжает тему создание модуля своими руками.
Что такое модуль PrestaShop?
Расширяемость престашоп заключается в использовании модулей-небольших программ, которые используют для изменения или добавления функциональности Престашоп для более удобного и индивидуального использования движка, без необходимости редактировать его основные файлы.
Основные составляющие модуля:
-корневая папка, имеющая название такое же как и название модуля
-основной файл PHP “начальной загрузки”, расположенный в корневой папке модуля и имеющий такое же название, как и модуль.
-два логотипа модуля, отображающихся в админке Prestashop logo.gif (32×32 px) и logo.png (16×16 px).
-файлы отображения модуля, содержащие темы модуля tpl, css, js, которые расположены в суб-папках модуля:
/views/css суб-папки содержащие css файлы
/views/js суб-папки для JavaScript файлов
/views/templates/front суб-папки для файлов контроллеров модуля
/views/templates/hooks суб-папки для файлов tpl привязанных к хуку
-языковые файлы расположенные в суб папке /translations, если есть необходимость для перевода модуля
-дополнительно модуль может содержать корневую папку, файлы темы модуля tpl и файлы стилей в используемом шаблоне Prestashop в папке themes/MyTheme/modules/. Зачем эти дополнительные файлы я описывал в теме по ссылке
- конфигурационный файл config.xml
вот так на примере выглядит дерево модуля

как видно в Престашоп для модулей стал применяется шаблон проектирования MVC(Model-View-Controller), только в более простой и доступной форме

Любой модуль после установки в интернет-магазин может взаимодействовать с одним или более крючками (hook). Крючки позволяют “зацепить” файлы темы модуля в определенной позиции. Подробнее о hook я напишу отдельную статью.
Создание первого модуля
Давайте создадим простой первый модуль, это позволит нам лучше описать его структуру. Назовем его mymodule (мой модуль).
Сначала создайте папку модуля. Он должен иметь то же имя, что и модуль, без пробелов, только алфавитно-цифровых символов, без дефиса и подчеркивания, все в нижнем регистре: / mymodule .
Эта папка должна содержать: загрузочный файл, PHP файл с таким же именем, что и папка : mymodule.php .
Для того что бы защитить основной файл от несанкционированной загрузки пользователями в начале основного файла ставим код
|
1
2
|
if (!defined('_PS_VERSION_'))
exit;
|
Это проверка на существование Prestashop.
Для создания модулей Престашоп используется ООП (Объектно-ориентированное, или объектное, программирование) , в которой основными концепциями являются понятия объектов и классов.
Назначаем главный класс модуля, который должен иметь такое же имя как и модуль.
mymodule.php
|
1
2
3
4
5
6
7
8
9
|
<?php
if (!defined('_PS_VERSION_'))
exit;
class MyModule extends Module
{
тут объекты
}
?>
|
Теперь, давайте заполним блок кода класса основным линиям начальной загрузки.
Для экономии пространства я приведу блок кода с комментированными строками.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class MyModule extends Module
{
public function __construct()//функции конструктора класса:
{
$this->name = 'mymodule';//имя модуля
$this->tab = 'front_office_features';// категория модуля в бэк-офисе
$this->version = '1.0';// версия модуля
$this->author = 'Firstname Lastname';// автор модуля
$this->need_instance = 0;// указание, нужно ли подгружать класс модуля при обращении на страницу модулей, если 0-быстрее грузиться страница
$this->ps_versions_compliancy = array('min' => '1.5', 'max' => '1.5'); //указывает с какой версией престашоп совместим модуль
parent::__construct();// родительский конструктор
$this->displayName = $this->l('My module');// название модуля, будет отображено в бэк-офисе
$this->description = $this->l('Description of my module.');// описание модуля, будет отображено в бэк-офисе
$this->confirmUninstall = $this->l('Are you sure you want to uninstall?');//вывод сообщения о попытке удалить модуль, страховка
if (!Configuration::get('MYMODULE_NAME')) //Предупреждение, что модуль не имеет переменной MYMODULE_NAME
$this->warning = $this->l('No name provided');
}
|
Методы установки и удаления
Теперь рассмотрим объекты установки и удаления модуля. Чтобы зарегистрировать свои собственные настройки в базе данных их необходимо включить в эти блоки. Мы этим заниматься не будем, так как создаем простой модуль.
блок установки
|
1
2
3
4
5
6
7
8
9
10
|
public function install()
{
if (!parent::install() && // Убедиться, что модуль действительно установлен.
$this->registerHook('leftColumn') &&//регистрация модуля в хуке leftColumn
$this->registerHook('header') &&//регистрация модуля в хуке header
Configuration::updateValue('MYMODULE_NAME', 'my friend'))// назначение параметра MYMODULE_NAME со значением равным my friend
return false;
return true;
}
|
блок удаления
|
1
2
3
4
5
6
7
|
public function uninstall()
{
if (!parent::uninstall() ||
!Configuration::deleteByName('MYMODULE_NAME'))
return false;
return true;
}
|
Использование Smarty
Теперь рассмотрим блоки отвечающие за вывод информации модуля во фронт-офисе
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
public function hookDisplayLeftColumn($params)// отображение модуля в левой колонке сайта
{
// назначаем переменные которые будут выводиться в шаблоне tpl с помощью smarty
$this->context->smarty->assign(
array(
'my_module_name' => Configuration::get('MYMODULE_NAME'), // переменная выводящая параметр MYMODULE_NAME, который мы назначили //по умолчанию как my friend
'my_module_link' => $this->context->link->getModuleLink('mymodule', 'display')// в нашем модуле будет использована своя страница, //делаем ссылку с помощью переменной my_module_link (подробнее будет далее)
)
);
return $this->display(__FILE__, 'mymodule.tpl');// указываем файл шаблонизатора смарти с нашими переменными.
}
//блок добавляющий возможность переместить отображение mymodule.tpl в правой колонке.
public function hookDisplayRightColumn($params)
{
return $this->hookDisplayLeftColumn($params);
}
//блок добавляющий привязку стилей mymodule.css
public function hookDisplayHeader()
{
$this->context->controller->addCSS($this->_path.'css/mymodule.css', 'all');
}[/php]
в этом же блоке можно добавлять привязку js.
Добавление страницы конфигурации
Для того чтобы позволить пользователю изменять настройки модуля создаем стандартный метод для престашоп GetContent (), он посылает сигнал для престашоп, что есть определенные конфигурации которые можно поменять и выводит ссылку для модуля "Configure"(настройка).
Но наличие самой ссылки не дает возможность менять настройки, чтобы это было возможно нужно создать страницу конфигурации. Для начала рассмотрим блок метода GetContent ()
[php]public function getContent()
{
$output = null;
if (Tools::isSubmit('submit'.$this->name))// подтверждения изменения формы кнопкой
{
$my_module_name = strval(Tools::getValue('MYMODULE_NAME'));// получаем значение параметра MYMODULE_NAME и сохраняет его в
//$my_module_name переменной PHP.
if (!$my_module_name || empty($my_module_name) || !Validate::isGenericName($my_module_name))// проверка содержимого в переменной //$my_module_name
$output .= $this->displayError( $this->l('Invalid Configuration value') );// если ошибка в переменной то выводиться ошибка
else
{
Configuration::updateValue('MYMODULE_NAME', $my_module_name); // если проверка прошла успешно-заносим данные в нашу базу данных
$output .= $this->displayConfirmation($this->l('Settings updated'));// сообщение об успешной операции изменения переменной
}
}
return $output.$this->displayForm();//вывод визуальной формы для изменения настроек.
}
|
Отображение формы
Блок визуальной формы в бэк-офисе
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
public function displayForm()
{
// получение с помощью метода Get() выбранного языка по умолчанию
$default_lang = (int)Configuration::get('PS_LANG_DEFAULT');
// инициализации полей формы массива (array)
$fields_form[0]['form'] = array(
'legend' => array(
'title' => $this->l('Settings'),
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Configuration value'),
'name' => 'MYMODULE_NAME',
'size' => 80,
'required' => true
)
),
'submit' => array(
'title' => $this->l('Save'),
'class' => 'button'
)
);
$helper = new HelperForm();
// Module, t oken and currentIndex
$helper->module = $this;
$helper->name_controller = $this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;
// Language
$helper->default_form_language = $default_lang;
$helper->allow_employee_form_lang = $default_lang;
// Title and toolbar
$helper->title = $this->displayName;
$helper->show_toolbar = true; // false -> remove toolbar
$helper->toolbar_scroll = true; // yes - > Toolbar is always visible on the top of the screen.
$helper->submit_action = 'submit'.$this->name;
$helper->toolbar_btn = array(
'save' =>
array(
'desc' => $this->l('Save'),
'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.
'&token='.Tools::getAdminTokenLite('AdminModules'),
),
'back' => array(
'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
'desc' => $this->l('Back to list')
)
);
// Load current value
$helper->fields_value['MYMODULE_NAME'] = Configuration::get('MYMODULE_NAME');
return $helper->generateForm($fields_form);
}
|
Казалось бы код большой, но форма HelperForm(); стандартна для престашоп и мы ее не будем рассматривать. Отображается эта форма в верхней части модуля и содержит название модуля и кнопки.
часть кода
|
1
2
3
4
5
6
7
8
|
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Configuration value'),
'name' => 'MYMODULE_NAME',
'size' => 20,
'required' => true
))
|
Создает следующие HTML-теги:
|
1
2
3
4
5
|
<label>Configuration value </label>
<div class="margin-form">
<input id="MYMODULE_NAME" class="" type="text" size="20" value="my friend" name="MYMODULE_NAME">
<sup>*</sup>
<div class="clear"></div>
|
В принципе можно использовать способ HTML , котрый был применим в модулях для престашоп 1.4.
В заключении первой части хочу сказать, что может быть я не совсем правильно выражаю терминологию названия функций, методов, классов и блоков. Старался писать нормальным языком для тех кто не знает програмирования и как сам все понимаю.
Готовый файл mymodule.zip
Продолжение следует
До встречи на страницах webnewbie.ru





“Казалось бы код большой, но форма HelperForm(); стандартна для престашоп и мы ее не будем рассматривать. ”
Убивает отмазка. Вместо того чтобы пояснить, легче всего ссылаться на “ну мол это все знают” особенно новички ну )))
А Вам все выложи на тарелочке с голубой каемочкой. Напрягаться не хотим? Взять любой стандартный модуль и посмотреть(скопировать) форму HelperForm(); не догадываемся. Или зайти в бэк-офис престы и найти ссылку на официальную документацию не судьба. Так нет, вместо благодарности поливаете негативом. Спасибо я Вам скажу.
что-то не могу скачать готовый файлик, битая ссылка, а делая по примеру, при инсталляции пишет, что модуль не найден
Ссылку на файл поправил.