Стили в 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; ?>>