Шаблонизация модулей
рейтинг: 9.7/10, голосов: 6
Правильная шаблонизация любой части сайта - это простота разработки и удобство управления сайтом в будущем. Этот вопросы и еще некоторые мелочи (например, создание ссылок на материалы) мы разберем на примере создания модуля, который будет выводить случайный список последних материалов.
Разделение кода модуля
Все что мы делали до этого в предыдущих статьях по написанию модулей - это каша из кода. В одном файле разом происходят: запрос к базе данных, преобразование данных, логика модуля, подстановка полученной информации в html-код. Если сейчас вам кажется что код маленький и простой, то продолжая в таком духе это все превратится в кашу. Особенно много сложностей возникнет, когда вы после небольшого перерыва решите что-нибудь изменить.
Для внутреннего упрощения модуля, попробуем разделить его код на некоторые логические части, а именно - шаблон и helper. Шаблон будет отвечать за верстку, html-код. Helper - это класс помощник, который будет содержать в себе выборку из базы данных и форматирование данных так, чтобы их только осталось вставить в html.
Теперь PHP-файл выглядит следующим образом:
<?php
defined('_JEXEC') or die('Restricted access');
// Подключаем локальный helper
require_once(dirname(__FILE__).DS.'helper.php');
// Вызываем метод
$link = modRandomLatestHelper::getList($params);
// подключаем файл шаблона с помощью класса JModuleHelper
require(JModuleHelper::getLayoutPath('mod_ranlatest'));
?>
А фaйл helper.php будет выглядеть так:
<?php
defined('_JEXEC') or die('Restricted access');
// Используем route.php для создания ссылок на контент
require_once (JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php');
class modRandomLatestHelper
{
function getList(&$params)
{
// Получаем значение параметров
$psecid = trim($params->get("secid"));
$panum = (int) trim($params->get("articlenum"));
$pfront = $params->get("front", 0);
$pptext = trim($params->get("pretext"));
$mcsuffix = trim($params->get("stylesfx"));
// Получаем глобальный объект базы данных
$db =& JFactory::getDBO();
// Собираем sql-запрос
if ($psecid)
{
$arrsecid = explode(",", $psecid);
JArrayHelper::toInteger($arrsecid);
$CondA = " AND (sectionid = " . implode(' OR sectionid = ', $arrsecid ) . ")";
}
if (!$pfront) $CondB = " AND id NOT IN (select content_id from #__content_frontpage)";
if ($panum) $Lim = "LIMIT 0, $panum";
$query = "SELECT id, catid, sectionid, title FROM #__content WHERE state=1" .
($psecid ? $CondA : '') . ($pfront ? '' : $CondB) .
" ORDER BY created ASC $Lim";
// Выполняем запрос и получаем массив объектов
$db->setQuery($query);
$rows = $db->loadObjectList();
if (!$db->getErrorNum())
{
if (!empty($rows))
{
$ranitem = rand(0,count($rows)-1);
$link = array();
$link[0] = $pptext;
$link[1] = $rows[$ranitem]->title;
// Создаем ссылку на контент с помощью ранее подключенного роутера (route.php)
$link[2] = ContentHelperRoute::getArticleRoute($rows[$ranitem]->id,
}
}
// Возвращаем массив ссылок и заголовков
return $link;
}
}
?>
Шаблон, который подключается с помощью getLayoutPath - обычно должен располагаться по адресу /tmpl/default.php, либо переопределяется из соотвествующей директории в основном шаблоне сайта. (в нашем случаем его переопределит файл /templates/YOU_TEMPLATE/html/mod_MODULENAME/default.php ). Таким образом, если организовывать файлы так, как описано выше, то мы получим очень удобную и гибкую систему шаблонов для модуля.
Посмотрим на содержимое файла default.php:
<?php if ($link[0]) : ?>
<p class="ranlatest<?php echo $params->get('stylesfx'); ?>">
<?php print $link[0] ?>
</p>
<?php endif; ?>
<a class="ranlatest<?php echo $params->get('stylesfx'); ?>"
href="/<?php print $link[2] ?>"><?php print $link[1] ?></a>
Несколько шаблонов в одном модуле
Добавим несколько строк в xml файл модуля Joomla:
<param name="layout" type="list" default="random"
label="Layout"
description="The layout to display the link">
<option value="default">Default</option>
<option value="divmania">Div-mania</option>
<option value="oldschool">Old-school</option>
</param>
В основном PHP-файле (mod_ranlatest.php) изменим последнюю строку на следующую :
$layout = $params->get('layout', 'default');
require(JModuleHelper::getLayoutPath('mod_ranlatest', $layout));
Добавим в папку шаблонов (/modules/mod_ranlatest/tmpl/) соответствующие файлы:
файл divmania.php - верстка с использованием div'ов
<div class="ranlatest<?php echo $params->get('stylesfx'); ?>">
<?php if ($link[0]) : ?>
<p><?php print $link[0] ?></p>
<?php endif; ?>
<a href="/<?php print $link[2] ?>"><?php print $link[1] ?></a>
</div>
и файл oldschool.php - вариант табличной верстки
<table class="ranlatest<?php echo $params->get('stylesfx'); ?>">
<?php if ($link[0]) : ?>
<tr><td>
<?php print $link[0] ?>
</td></tr>
<?php endif; ?>
<tr><td>
<a href="/<?php print $link[2] ?>"><?php print $link[1] ?></a>
</td></tr>
</table>
HELPER.PHP: 48 строка...
// Создаем ссылку на контент с помощью ранее подключенного роутера (route.php)
$link[2] = ContentHelperRoute::getArticleRoute($rows[$ranitem]->id,
}
}
ContentHelperRoute::getArticleRoute($rows[$ranitem]->id,.........
В Joomla 1.7 пришлось заменить эту 48 строчку на такую
$link[2] = JRoute::_(ContentHelperRoute::getArticleRoute($rows[$ranitem]->id));
а в default.php убрать /
href="/<?php print $link[2] ?>"><?php print $link[1] ?></a>