Стандартными средствами Joomla возможно назначить различные шаблоны для каждого пункта меню, так чтобы сайт, например, имел один шаблон для основной части и другой шаблон для блога. Это довольно мощный функционал, но есть задачи, которые нужно решить иначе.

В данной статье будет рассмотрен альтернативный способ применения различных шаблонов Joomla без использования пунктов меню задействовав свой PHP-код. Итак, приступим!

Где именно не хватает функциональности Joomla?

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

Для начала рассмотрим, как работает система шаблонов. При нажатии на интересующий пункт меню начинается загрузка страницы, Joomla проверяет какой шаблон назначен этому разделу и новая страница отобразиться в нужном шаблоне, другими словами: что нашли, то и применили. Если ни один шаблон не назначен странице, то будет подгружен шаблон выбранный по-умолчанию.

Шаблон по-умолчанию, кто это? Может быть шаблон заданный главной странице? На самом деле, шаблон по-умолчанию определяется иерархией сайта, в данном случае применяются права наследования меню. Например статья, которая не имеет собственного пункта меню, будет назначена в пункт меню категории, где она находится, и таким образом будет иметь общий с ней (с категорией) шаблон. Частный случай, когда категория не имеет назначенного пункта меню, будет выбран шаблон основной части сайта.

Основная проблема заключается в том, какой шаблон будет выбирать Joomla в тот или иной момент:

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

Решение с использованием PHP-кода

Joomla имеет очень гибкую структуру и любую задачу можно решить несколькими строками кода на языке PHP. Для этого необходимо создать плагин, который будет выполнять определенные действия при возникновении onAfterRoute-события:

PHP код:
  1. public function onAfterRoute() {
  2. $app = JFactory::getApplication();
  3.  
  4. // ...
  5. }

Данное событие описывает момент, когда процесс рендеринга страниц еще не начался, но мы уже знаем какой компонент будет вызывать Joomla. Важно не забыть выставить ограничение нашему плагину только в frontend-части сайта:

PHP код:
  1. public function onAfterRoute() {
  2. $app = JFactory::getApplication();
  3.  
  4. if ($app instanceof JApplicationSite) {
  5. // ...
  6. }
  7. }

Теперь можно взять информацию о компонентах и отображениях (view), которые будут использоваться в данной странице:

PHP код:
  1. public function onAfterRoute() {
  2. $app = JFactory::getApplication();
  3.  
  4. if ($app instanceof JApplicationSite) {
  5. $jinput = $app->input;
  6. $option = $jinput->getCmd('option', '');
  7. $view = $jinput->getCmd('view', '');
  8.  
  9. // ...
  10. }
  11. }

Далее крайне важный момент: вызвав метод setTemplate, мы поменяем текущую привязку шаблона на другой:

PHP код:
  1. public function onAfterRoute() {
  2. $app = JFactory::getApplication();
  3.  
  4. if ($app instanceof JApplicationSite) {
  5. $jinput = $app->input;
  6. $option = $jinput->getCmd('option', '');
  7. $view = $jinput->getCmd('view', '');
  8.  
  9. // ...
  10.  
  11. if($option === 'com_content' && $view === 'article') {
  12. $app->setTemplate('protostar', $params);
  13. }
  14. }
  15. }

Это далеко не совершенный код, но мы назначали нужный нам шаблон и он будет загружен по-умолчанию. Если нам необходимо изменить данную настройку, помните, что второй аргумент setTemplate включает в себя собственную конфигурацию шаблона, который возможно создать с помощью класса jRegistry:

PHP код:
  1. public function onAfterRoute() {
  2. $app = JFactory::getApplication();
  3.  
  4. if ($app instanceof JApplicationSite) {
  5. $jinput = $app->input;
  6. $option = $jinput->getCmd('option', '');
  7. $view = $jinput->getCmd('view', '');
  8. $params = new JRegistry();
  9. $params->def('templateColor', '#f00');
  10. $params->def('templateBackgroundColor', '#000');
  11.  
  12. if($option === 'com_content' && $view === 'article') {
  13. $app->setTemplate('protostar', $params);
  14. }
  15. }
  16. }

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

В заключение

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


 
4.44 1 1 1 1 1 (Оценок: 225)
4.44 225
Опубликовано: 09-11-2015

Комментарии  

eugene.voznyachuk
0 #2 eugene.voznyachuk 20.04.2018 05:18
А в Gantry можно это использовать. Кто-нибудь пробовал?
Людмила
+1 #1 Людмила 31.08.2016 15:44
Очень интересная статья. Не знала,что можно другими способами. Спасибо за подробные разъяснения.

Вы не зарегистрированы, чтобы оставлять комментарии.