обрый день, уважаемые читатели и постоянные подписчики блога Site on! В прошлых статьях этого раздела я писал про создание собственного шаблона для Джумла с нуля, так вот сегодняшняя тема будет узконаправленным продолжением.

Бывают случаи, когда нам необходимо поместить позицию модуля не в правой или левой колонке, а внутри какого-нибудь компонента, прямо в его теле. Например, мы находимся на странице категории VirtueMart2:

категория VirtueMart2

И нам необходимо вставить какой-нибудь модуль (слайд-шоу, карусель товаров и тд.) между пагинацией и товарами:

позиция для модуля

Это было бы легко сделать, если нашей задачей было бы вставить модуль под пагинацией, так как на пагинации вывод категории VM заканчивается (то есть заканчивается вывод компонента <jdoc:include type="component" />), и продолжается тело шаблона:

component

Но нам нужно сделать так:

внутри component

Для этого нам необходимо зайти в код компонента. В нашем примере нужно зайти в файл, отвечающий за вывод категории /components/com_virtuemart/views/category/tmpl/default.php либо в /templates/имя_шаблона/html/com_virtuemart/category/default.php если у вас есть этот файл по такому пути.

Знакомую нам конструкцию:

<jdoc:include type="modules" name="our-module" style="xhtml" />

из прошлой статьи здесь использовать нельзя, так как мы находимся в компоненте, а не в шаблоне. Компонент просто не поймёт, что с ней делать, и оставит эту строку, как есть (не подставит вместо неё модули).

Вместо этой конструкции мы должны использовать PHP класс Joomla под названием JModuleHelper и его методы getModules и renderModule, например:

<?php
jimport( 'joomla.application.module.helper' ); // подключаем нужный класс, один раз на странице, перед первым выводом
$module = JModuleHelper::getModules('our-module'); // получаем в массив все модули из заданной позиции
$attribs['style'] = 'xhtml'; // задаём, если нужно, оболочку модулей (module chrome)
echo JModuleHelper::renderModule($module[0], $attribs); // выводим первый модуль из заданной позиции
?>

Обратите внимание, этот код нужно использовать если вы планируете выводить в этой позиции один модуль, если их будет несколько, то нужно делать так:

<?php
jimport( 'joomla.application.module.helper' );
$modules = JModuleHelper::getModules('our-module'); // изменили название переменной с единственного на множественное число для понятности
$attribs['style'] = 'xhtml';

foreach($modules as $module){ // в цикле перебираем и выводим все модули
echo JModuleHelper::renderModule($module, $attribs);
}
?>

И вот результат:

внутри component

{

}