Как добавить позицию модуля внутрь любого компонента Joomla

"Все аспекты самостоятельного создания и продвижения сайтов
от практика с многолетним опытом." — блог Рудь Сергея
info@site-on.net
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
10.04.2014

Добрый день, уважаемые читатели и постоянные подписчики блога 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

В нашей только что созданной позиции our-module я вывел стандартный модуль Breadcrumbs (хлебные крошки, навигация по сайту). Вы же можете вывести любой другой модуль, никаких ограничений.

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

С уважением, .
Пожалуйста, оцените эту статью
Средняя оценка: 4.75 из 5 (проголосовало: 20)
Статья оказалась вам полезной? Подпишитесь, чтобы не пропустить новые!

Ваш email:
Вы можете помочь развитию проекта, сделав всего 1 клик:
Спасибо!
Пожалуйста, прокомментируйте, как Вам моя статья?
Имя:
Комментарий:

Если Вы хотите вставить код, пожалуйста, заключайте его в [code][/code]

Подписаться на новые комментарии:

E-mail:


Защита от спама: у треугольника три...
Ответ:
Подписаться на новые комментарии без комментирования - Email:
Защита от спама: у треугольника три...
Ответ:

12.02.2015 16:49:33 Igor:
Плюс, однозначно! Сколько я бился!
Брат, спасибо!

Ответить на комментарий


17.03.2015 23:58:27 Настя:
Спасибо, долго искала ответ!

Ответить на комментарий


07.04.2015 22:29:05 Матвей:
Хороший способ, но мне получается так вставить простенькие модули типа меню, навигации...
слайдер Sot VirtueMart Thumbnail slide не получается, страница просто белая,
<html><head></head><body></body></html>

Ответить на комментарий


03.09.2015 05:20:40 Сергей:
Очень полезно и ёмко.
Спасибо!

Ответить на комментарий


02.11.2015 11:15:31 inverser.pro:
Конечно, у Вас дизайн сайта ужасный, но благодарю за статеичу.
Не мешало бы указать в ней, что нужно добавить позицию в файле
templateDetails.xml
в шаблоне, а затем уж – выводить.

Ответить на комментарий


28.12.2015 22:20:58 Георгий:
Ты просто кладезь информации! Огромное спасибо!

Ответить на комментарий


30.12.2015 14:54:33 Роман:
Штука полезная но есть вопрос как можно спрятать обрамляющий html код если в позиции не будет модуля например <div>ваш код вызова модуля</div>

Ответить на комментарий


20.07.2016 19:40:34 Юрий:
Огромное спасибо!

Ответить на комментарий

Использую для работы
Мои расширения
Свежие статьи
Рекомендую
Горячо обсуждаемые
Подписка
  • Следовать в twitter:
  • Подписаться по RSS:
  • Подписаться по E-mail:
  • Следить ВКонтакте:
  • Следить на Facebook:
Пользовательское соглашение об условиях использования сайта и Политика конфиденциальности
Перепечатывание или копирование материалов сайта (текста, изображений и другого содержимого) для их публичного или коммерческого использования в сети Интернет, либо в печатных изданиях строго запрещены. При нарушении данного правила, с нашей стороны будут предприняты соответствующие меры, вплоть до судебной жалобы.
© site-on.net
Шрифт: +стандартно-