Сегодня я хочу рассказать как практически использовать замечательную возможность шаблонизации в Joomla на реальном примере.
Допустим, по условию ТЗ, нам нужно создать каталог товаров с двухуровневой структурой - категории и подкатегории. И по разработаному макету нужно, чтобы в верхнем горизонтальном меню (в шапке) у нас были только родительские категории. После входа в одну из родительских категорий нужно чтобы в левой колонке появлялось вертикальное меню, но только с подкатегориями выбранной родительской категории.
Ничего сложного? Использовать два разных модуля? Мы решим эту задачу с помощью одного.
Допустим, каталог у нас построен на JoomShopping и для вывода категорий мы будем использовать стандартный модуль Jshopping Categories.
Этот модуль выводит сразу и категории и подкатегории. Устанавливаем модуль в позицию top и ещё раз в позицию left.
У модуля есть шаблон вывода - default.php. Для того чтобы модуль в разных позициях шаблона работал по разному - создаем копию шаблона вывода, называем её default2.php (правим как нам нужно) и помещаем в эту же папку. Теперь нам остается как-то сообщить модулю, что он находится в конкретной позиции шаблона (либо top, либо left) и, взависимости от этого, модуль должен подключить определенный шаблон вывода.
А делается это вот так. Так как у нас модуль используется 2 раза мы можем менять шаблон вывода только в позиции left, а в остальных случаях оставить стандартный шаблон. В index.php Вашего шаблона сайта вывод модуля в позиции top оставляем as is, а вывод в позицию left должен быть с атрибутом:
<jdoc:include type="modules" name="left" style="xhtml" order="left"/>
Именно переменная order и укажет модулю в какой позиции он находится.
В файле mod_jshopping_categories.php находим в самом низу вызов шаблона вывода
require(JModuleHelper::getLayoutPath('mod_jshopping_categories'));
и меняем на
if($attribs && $attribs['order']=='left') require(JModuleHelper::getLayoutPath('mod_jshopping_categories','default2')); else require(JModuleHelper::getLayoutPath('mod_jshopping_categories'));
Второй параметр функции getLayoutPath позоляет нам указать имя шаблона вывода.
Задача решена.