RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Шаблонизация модулей

Правильная шаблонизация любой части сайта - это простота разработки и удобство управления сайтом в будущем. Этот вопросы и еще некоторые мелочи (например, создание ссылок на материалы) мы разберем на примере создания модуля, который будет выводить случайный список последних материалов.

Разделение кода модуля

Все что мы делали до этого в предыдущих статьях по написанию модулей - это каша из кода. В одном файле разом происходят: запрос к базе данных, преобразование данных, логика модуля, подстановка полученной информации в 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>

Смотрите также:
Комментарии (3) Добавить комментарий
  • Константин
    Константин
    25 Августа 2011, 02:56
     ↑  0  ↓     ответ

    HELPER.PHP: 48 строка...

    // Создаем ссылку на контент с помощью ранее подключенного роутера (route.php)

    $link[2] = ContentHelperRoute::getArticleRoute($rows[$ranitem]->id,

    }

    }

    ContentHelperRoute::getArticleRoute($rows[$ranitem]->id,.........

  • Константин
    Константин
    25 Августа 2011, 14:46
     ↑  0  ↓     ответ

    В Joomla 1.7 пришлось заменить эту 48 строчку на такую

    $link[2] = JRoute::_(ContentHelperRoute::getArticleRoute($rows[$ranitem]->id));

    а в default.php убрать /

    href="/<?php print $link[2] ?>"><?php print $link[1] ?></a>

  • al12.nazarov@mail.ru
    al12.nazarov@mail.ru
    09 Февраля 2016, 21:08
     ↑  0  ↓     ответ

    Я не силен в написании модулей и вообще любых кодов, но есть некая задумка... Есть модуль вывода новостей RSS. Хочу вывести новости в бегущей строке с ссылкой на источник. Возможно ли изменить этот модуль для отображения именно в бегущей строке? Или искать уже готовый модуль? Задавал этот вопрос не нескольких форумах, но ответа нет. Что посоветуете?

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.