В мире электронной коммерции гибкость и возможность адаптации функций на сайте играют важную роль. С введением виджетов в PrestaShop 1.7, разработчики получили мощный инструмент для улучшения взаимодействия с пользователями. Эта статья посвящена тому, что такое виджеты, как они работают и почему их использование может существенно упростить процесс разработки модулей и настройки интерфейса.
Что такое виджеты?
Виджеты — это продвинутая концепция, расширяющая функциональность хуков в PrestaShop. В отличие от базовых хуков, которые ограничиваются выводом контента в строго определённые места шаблона, виджеты позволяют разработчикам модулей отображать контент в любых местах, где это необходимо.
Ограничения хуков
При использовании хуков, если модуль хочет показать дополнительный контент в нескольких местах, ему нужно регистрировать и реализовывать все возможные хуки. Это требует значительных усилий и часто приводит к дублированию кода. Виджеты решают эту проблему, позволяя модулю быть более универсальным и адаптивным.
Как использовать виджеты?
Чтобы модуль стал совместимым с виджетами, разработчикам нужно выполнить несколько простых шагов.
1. Реализация интерфейса
Первым делом необходимо реализовать интерфейс PrestaShop\PrestaShop\Core\Module\WidgetInterface
. Это подтверждает, что ваш модуль поддерживает функциональность виджетов.
2. Объявление обязательных методов
После реализации интерфейса требуется объявить два метода:
renderWidget($hookName, array $configuration)
: Этот метод отвечает за генерацию представления виджета, позволяя получать необходимые данные и отображать шаблон.getWidgetVariables($hookName, array $configuration)
: Этот метод возвращает переменные, которые будут переданы в шаблон Smarty.
Параметры обоих методов идентичны и позволяют адаптировать поведение модуля в зависимости от переданного хука.
Пример кода
Вот пример реализации модуля с виджетами:
if (!defined('_PS_VERSION_')) {
exit;
}
use PrestaShop\PrestaShop\Core\Module\WidgetInterface;
class MyModule extends Module implements WidgetInterface
{
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',
'max' => _PS_VERSION_
];
$this->bootstrap = true;
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?');
}
public function renderWidget($hookName, array $configuration)
{
$this->smarty->assign($this->getWidgetVariables($hookName, $configuration));
return $this->fetch('module:'.$this->name.'/views/templates/widget/mymodule.tpl');
}
public function getWidgetVariables($hookName , array $configuration)
{
$myParamKey = $configuration['my_param_key'] ?? null;
return [
'my_var1' => 'my_var1_value',
'my_var2' => 'my_var2_value',
'my_var_n' => 'my_var_n_value',
'my_dynamic_var_by_param' => $this->getMyDynamicVarByParamKey($myParamKey),
];
}
public function getMyDynamicVarByParamKey(string $paramKey)
{
if($paramKey === 'my_param_value') {
return 'my_dynamic_var_by_my_param_value';
}
return null;
}
}
Вызов виджетов
После того как модуль реализовал метод renderWidget()
, есть два способа его вызова:
-
С помощью хуков:
- Вызов хуков можно осуществлять через PHP-класс:
Hook::exec($hook_name)
или в шаблоне Smarty:{hook h='<hook_name>'}
.
- Вызов хуков можно осуществлять через PHP-класс:
-
С помощью виджетов:
- Вызов функции
renderWidget()
может быть выполнен напрямую из шаблона Smarty:
{widget name='<module_name>'}
или с указанием имени хука:
{widget name='<module_name>' hook='<hook_name>'}
- Вызов функции
Виджеты в PrestaShop открывают новые горизонты для разработчиков, предоставляя гибкие и мощные инструменты для создания адаптивного контента. Они упрощают процесс интеграции модулей и улучшают опыт пользователей. Используя виджеты, можно значительно ускорить разработку и повысить эффективность работы с контентом.
Как вам виджеты? Пробовали ли вы их использовать в своих проектах? Поделитесь своим мнением в комментариях!