Стили вывода модулей
Стили в Joomla до версии 3
Для определения каким образом выводить тот или иной модуль в Joomla используются стили для вывода модулей.
<jdoc:include type="modules" name="some_position" style="mystyle" />
Стандартно в Joomla 1.6 есть 5 основных стиля:
- none - вывод содержимого модуля, без оформления и заголовка
- table - вывод модуля в виде таблицы
- horz - вывод модуля в теге <td> другой таблицы
- xhtml - вывод модуля в теге "div" и заголовка модуля в теге "h3"
- rounded - вывод модуля в 4-х "div", в основном используется для вывода модуля с закругленными углами
- outline - используется для отладочной информации
Каждый из этих стилей расписан в системном файле [Joomla root]/templates/system/html/modules.php и их можно использовать в любых шаблонах. Для того чтобы сделать собственный стиль вывода модуля, нужно создать аналогичный файл в шаблоне. Например, для вывода модулей стилем "mystyle"
<jdoc:include type="modules" name="some_position" style="mystyle" />
Нужно создать файл [Joomla root]/templates/[Используемый шаблон]/html/modules.php с функцией
<?php // защита от прямого доступа к файлу defined('_JEXEC') or die; /* * Вывод модулей стилем mystyle */ function modChrome_mystyle($module, &$params, &$attribs) { echo $module->title; echo $module->content; }
Объект $module содержит информацию о модуле. Основные свойства для него приведены в следующей таблице
Свойство | Описание |
---|---|
id | ID модуля (индивидуальный номер) |
title | Заголовок модуля |
content | Содержимое модуля |
showtitle | Параметр модуля, определяющий показывать или нет заголовок |
params | Параметры модуля, в формате JSON |
module | Используемый модуль, например mod_custom |
Объект $params содержит параметры модуля. Для получения значения параметра, нужно использовать следующий метод
$params->get('имя параметра');
$attribs - это ассоциативный массив, содержит атрибуты вызываемой конструкции. С помощью него можно задать дополнительные свойства для вывода модуля. Например в конструкции
<jdoc:include type="modules" name="some_position" style="mystyle" myattribute="SomeTask" />
для получения значения "SomeTask" можно использовать этот массив, $attribs['myattribute']
Практические примеры
Практические примеры довольно сложно давать по этой теме, так как это зависит от конкретной ситуации. И для этого желательно знать синтаксис PHP. Здесь приводятся довольно часто встречающиеся решения.
Использование суффикса класса модуля
Практически во всех модулях используется "Cуффикс класса модуля". В зависимости от него можно контролировать вывод модулей опубликованных в одной позиции. Например, в каком-то модуле нужно выводить заголовок в теге "h4".
<?php // защита от прямого доступа к файлу defined('_JEXEC') or die; /* * Вывод модулей стилем mystyle */ function modChrome_mystyle($module, &$params, &$attribs) { switch ($params->get('moduleclass_sfx')) { case 'h4': $title = '<h4>'.$module->title.'</h4>'; break; default: case 'h3': $title = '<h3>'.$module->title.'</h3>'; break; } echo $title; echo $module->content; }
Если в модуле прописать "Суффикс класса модуля" - "h4", то заголовок этого модуля будет выводиться в теге "h4", хотя он будет опубликован в одной позиции с другими модулями, у которых заголовок будет в теге "h3"
Вывод модуля только для не авторизованных пользователей
Бывают ситуации, когда необходимо вывести модуль только для гостей. Это можно сделать через настройки прав групп пользователей в Joomla 1.6. Но и можно сделать через стиль позиций модуля. Например
<?php // защита от прямого доступа к файлу defined('_JEXEC') or die; /* * Вывод модулей стилем mystyle */ function modChrome_mystyle($module, &$params, &$attribs) { $user = JFactory::getUser(); if ($user->get('guest')) { modChrome_xhtml($module, $params, $attribs); } }
Как видно в этом файле так же можно использовать функции из [Joomla root]/templates/system/html/modules.php, не подключая его. Если нужно вывести какой-то определенный модуль можно добавить в условие свойство $module->id
$user = JFactory::getUser(); if ($user->get('guest') && $module->id == 'ID модуля') { modChrome_xhtml($module, $params, $attribs); }
Стили для версий Joomla 4 и 5
Теперь механизм создания стилей переделан следующим образом. В папке шаблона ../html/layouts/chromes добавляется php файл с именем стиля.
Например: card.php
<?php /** * @package Joomla.Site * @subpackage Templates.cassiopeia * * @copyright (C) 2020 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ defined('_JEXEC') or die; use Joomla\Utilities\ArrayHelper; $module = $displayData['module']; $params = $displayData['params']; $attribs = $displayData['attribs']; if ($module->content === null || $module->content === '') { return; } $moduleTag = $params->get('module_tag', 'div'); $moduleAttribs = []; $moduleAttribs['class'] = $module->position . ' card ' . htmlspecialchars($params->get('moduleclass_sfx', ''), ENT_QUOTES, 'UTF-8'); $headerTag = htmlspecialchars($params->get('header_tag', 'h3'), ENT_QUOTES, 'UTF-8'); $headerClass = htmlspecialchars($params->get('header_class', ''), ENT_QUOTES, 'UTF-8'); $headerAttribs = []; $headerAttribs['class'] = $headerClass; // Выводите класс заголовка только в том случае, если это не заголовок карточки if ($headerClass !== 'card-title') : $headerAttribs['class'] = 'card-header ' . $headerClass; endif; // Добавьте класс из атрибутов, если таковые имеются if (!empty($attribs['class'])) { $moduleAttribs['class'] .= ' ' . htmlspecialchars($attribs['class'], ENT_QUOTES, 'UTF-8'); } // Добавляйте aria только в том случае, если moduleTag не является div if ($moduleTag !== 'div') { if ($module->showtitle) : $moduleAttribs['aria-labelledby'] = 'mod-' . $module->id; $headerAttribs['id'] = 'mod-' . $module->id; else : $moduleAttribs['aria-label'] = htmlspecialchars($module->title, ENT_QUOTES, 'UTF-8'); endif; } $header = '<' . $headerTag . ' ' . ArrayHelper::toString($headerAttribs) . '>' . $module->title . '</' . $headerTag . '>'; ?> <<?php echo $moduleTag; ?> <?php echo ArrayHelper::toString($moduleAttribs); ?>> <?php if ($module->showtitle && $headerClass !== 'card-title') : ?> <?php echo $header; ?> <?php endif; ?> <div class="card-body"> <?php if ($module->showtitle && $headerClass === 'card-title') : ?> <?php echo $header; ?> <?php endif; ?> <?php echo $module->content; ?> </div> </<?php echo $moduleTag; ?>>