Совет по Joomla: программный рендер модулей
Модули порой удобно использовать в местах, которые в Joomla не всегда предназначены для этого 😀. Например, в переопределениях макета. Из материала делаем посадочную страницу: часть инфы находится в самом материале, часть - в полях, а часть удобно вывести модулем. При этом модуль этот должен находиться между телом материала и данными из пользовательских полей.
Для реализации берём в руки ModuleHelper и приступаем.
<?php use \Joomla\CMS\Helper\ModuleHelper; $modules = ModuleHelper::getModules('landing-masonry'); if(!empty($modules)) { foreach ($modules as $module) { // рендерим всё, что нашли в позиции landing-masonry echo ModuleHelper::renderModule($module); } }
А что если посложнее?
В этом случае всё просто. Но здесь в тему будет упомянуть ещё один способ работы с модулями. Контекст: магазин одежды. В карточке товара нужно вывести информацию о размерной сетке, типовые рекомендации по уходу и т.д. Это короткие тексты, которые повторяются из товара в товар и не нужно их копировать многажды. Эти тексты отображались простым аккордеоном Bootstrap.
Вид карточки товара JoomShopping. Все тексты, кроме описания товара - одинаковые во всех товарах. Описание товара уникальное для каждого товара.
Но! В этот же аккордеон нужно было добавить и описание товара JoomShopping. Поэтому я сделал с помощью своего модуля WT Quick links следующее.
Создал модуль типа WT Quick Links, в котором в список элементов занёс все нужные тексты.
Не стал назначать модуль какой-либо позиции. В шаблоне JoomShopping захардкодил id модуля. Хотя лучше было бы назначить модуль в некой уникальной позиции, которая встречалась бы только в нужном нам месте на сайте.
Программным способом в данные модуля добавил нужные данные из JoomShopping так, как мне нужно (в начало списка - описание товара).
Отрендерил модуль с помощью
ModuleHelperв product_default.php шаблона JoomShopping.
<?php use Joomla\CMS\Helper\ModuleHelper; use Joomla\Registry\Registry; // Модуль id 136 - Доставка, оплата и гарантии в карточку товара + ОПИСАНИЕ ТОВАРА JoomShopping $module = ModuleHelper::getModuleById('136'); $module_params = new Registry($module->params); // Формируем новые параметры модуля перед рендером. $new_module_params = []; $i = 1; // Помещаем описание товара в самое начало if (!empty($this->product->description)){ $new_module_params['fields']['fields0'] = (object) [ 'item_header' => Text::_('JSHOP_DESCRIPTION'), 'item_text' => $this->product->description ]; } // Переименовываем все остальные ключи массива элементов из модуля foreach ($module_params->get('fields') as $key => $value) { $new_module_params['fields']['fields' . $i] = $value; $i++; } $new_module_params = new Registry($new_module_params); // Соединяем старые и новые параметры модуля. $module_params->merge($new_module_params); $module->params = $module_params->toString(); // Всё готово! Рендерим модуль. echo ModuleHelper::renderModule($module);
