В статье Создание шаблонов для Joomla мы поверхностно коснулись темы методов вывода контента в теле шаблона. Давайте теперь подробно разберем что это и с чем его едят. Итак, объявления метода jdoc присутствуют в каждом шаблоне Joomlaи выводят в тело шаблона (то бишь на страницу сайта) ту или иную информацию. В целом объявление метода выглядит следующим образом
<jdoc:include type="component" />
Данная строчка выводит на сайте информацию из компонентов, например статьи из com_content. Тип элементов вывода указывается в атрибуте.
1. type — типы элементов вывода.
Для первых четырех указанных типов достаточно лишь указать их на странице. В случае с типом модуля задача немного усложняется. Для того, чтобы вывести на странице модуль нам нужно сперва создать для него модульную позицию с уникальным идентификатором (название позиции модуля). Это делается при помощи атрибута name=«имя позиции» и обязательным добавлением строки:
<position>название позиции</position>
в файл templateDetails.xml. Описывая название позиции в templateDetails.xml мы обозначаем ее в системе и видим в менеджере модулей. Имена позиций могут быть произвольными, хотя name=«user3» позиция, по-умолчанию используется для отображения верхнего меню.
2. style — описание стиля вывода (mod chrome).
От указанного стиля зависит внешний вид и структура оболочки модуля. Выглядит как
:<jdoc:include type="modules" name="user1" style="xhtml" />
По-умолчанию заложено несколько стилей вывода модулей:
function modChrome_xhtml($module, &$params, &$attribs)
{
if (!empty ($module->content)) : ?>
<div class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<?php if ($module->showtitle != 0) : ?>
<h3><?php echo $module->title; ?></h3>
<?php endif; ?>
<?php echo $module->content; ?>
</div>
<?php endif;
}
function modChrome_table($module, &$params, &$attribs)
{ ?>
<table cellpadding="0" cellspacing="0" class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<?php if ($module->showtitle != 0) : ?>
<tr>
<th>
<?php echo $module->title; ?>
</th>
</tr>
<?php endif; ?>
<tr>
<td>
<?php echo $module->content; ?>
</td>
</tr>
</table>
<?php
}
function modChrome_horz($module, &$params, &$attribs)
{ ?>
<table cellspacing="1" cellpadding="0" width="100%">
<tr>
<td>
<?php modChrome_table($module, $params, $attribs); ?>
</td>
</tr>
</table>
<?php
}
function modChrome_rounded($module, &$params, &$attribs)
{ ?>
<div class="module<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<div>
<div>
<div>
<?php if ($module->showtitle != 0) : ?>
<h3><?php echo $module->title; ?></h3>
<?php endif; ?>
<?php echo $module->content; ?>
</div>
</div>
</div>
</div>
<?php
}
function modChrome_outline($module, &$params, &$attribs)
{
static $css=false;
if (!$css)
{
$css=true;
jimport('joomla.environment.browser');
$doc = JFactory::getDocument();
$browser = JBrowser::getInstance();
$doc->addStyleDeclaration(".mod-preview-info { padding: 2px 4px 2px 4px; border: 1px solid black; position: absolute; background-color: white; color: red;}");
$doc->addStyleDeclaration(".mod-preview-wrapper { background-color:#eee; border: 1px dotted black; color:#700;}");
if ($browser->getBrowser()=='msie')
{
if ($browser->getMajor() <= 7) {
$doc->addStyleDeclaration(".mod-preview-info {filter: alpha(opacity=80);}");
$doc->addStyleDeclaration(".mod-preview-wrapper {filter: alpha(opacity=50);}");
}
else {
$doc->addStyleDeclaration(".mod-preview-info {-ms-filter: alpha(opacity=80);}");
$doc->addStyleDeclaration(".mod-preview-wrapper {-ms-filter: alpha(opacity=50);}");
}
}
else
{
$doc->addStyleDeclaration(".mod-preview-info {opacity: 0.8;}");
$doc->addStyleDeclaration(".mod-preview-wrapper {opacity: 0.5;}");
}
}
?>
<div class="mod-preview">
<div class="mod-preview-info"><?php echo $module->position."[".$module->style."]"; ?></div>
<div class="mod-preview-wrapper">
<?php echo $module->content; ?>
</div>
</div>
<?php
}
function modChrome_none($module, &$params, &$attribs)
{
echo $module->content;
}
Все предустановленные стили располагаются в файле templates/system/html/modules.php. Но мы не ограничены использованием только предоставленных вариантов, а вполне можем создавать свои собственные.
3. Создание пользовательского mode chrome.
Итак, предоставленные по умолчанию типы представления модулей не удовлетворяют текущих требований. Нужно добавить свой собственный стиль оформления. В качестве примера выберем достаточно часто повторяющуюся ситуацию. По заданию нужно вместо <h3> поместить заголовок модуля в тэг <span>, который является семантически нейтральным. Так же требуется поместить контентблок модуля в отдельный <div>. Для создания собственного стиля вывода модуля, воспользуемся стандартными средствами. В большинстве шаблонов Joomla существет папка html/ (templates/имя шаблона/html/), используется для так называемой шаблонизации. То есть, если скопировать в эту папку шаблон модуля, то вместо шаблона из директории modules/my_module/tmpl/default будет выводиться файл из templates/имя шаблона/html/my_modules/default. Аналогично шаблонизируются и компоненты. Удобно и практично. В папке html/ Вашего шаблона создадим файл modules.php. Если такой папки в шаблоне нет, то создадим ее. В файл запишем
<?php
function modChrome_modbox($module, &$params, &$attribs) // Вызываем функцию
{
if (!empty ($module->content)) : /* Проверяем наличие в поиции включенного модуля */?>
<div class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); /* выводим суффикс css класса модуля */ ?>">
<?php if ($module->showtitle != 0) : /* проверяем включен ли заголовок модуля */ ?>
<span class="title"><?php echo $module->title; /* Выводим заголовок */ ?></span>
<?php endif; ?>
<div class="modcontent">
<?php echo $module->content; /* Выводим содержимое модуля */ ?>
</div>
</div>
<?php endif;
}
?>
Готово. Теперь нужно только указать его в качестве стиля вывода.
<jdoc:include type="modules" name="user1" style="modbox"/>
Назначаем в нашу позицию модуль и смотрим результат.