Добрый день, уважаемые читатели и постоянные подписчики блога Site on! В прошлых статьях этого раздела я писал про создание собственного шаблона для Джумла с нуля, так вот сегодняшняя тема будет узконаправленным продолжением.
Бывают случаи, когда нам необходимо поместить позицию модуля не в правой или левой колонке, а внутри какого-нибудь компонента, прямо в его теле. Например, мы находимся на странице категории VirtueMart2:
И нам необходимо вставить какой-нибудь модуль (слайд-шоу, карусель товаров и тд.) между пагинацией и товарами:
Это было бы легко сделать, если нашей задачей было бы вставить модуль под пагинацией, так как на пагинации вывод категории VM заканчивается (то есть заканчивается вывод компонента <jdoc:include type="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); } ?>
И вот результат: