Дано:
Сайт на Joomla! 1.5;
Задача:
На главной странице показывать таблицу в которой будет список последних запланированных событий. Например, в три колонки: “дата”, “место”, “время”. Текст в колонке “место” должен быть ссылкой на более подробное описание события.
Решение:
Информация о событиях будет храниться как обычный материал в какой то специфической категории. Например, я создал категорию “События” с ID=2. К этой категории и будем прикреплять материалы в которых будут описываться события.
Для начала придумаем имя нашему модулю. У меня это будет scheduler. Создадим папку mod_scheduler в которой будут храниться все файлы нашего будущего модуля. Далее в этой папке создаём файл с названием mod_scheduler.xml:
<?xml version="1.0" encoding="utf-8"?>
<install type="module" version="1.5.0">
<name>Scheduler</name>
<author>boonya</author>
<creationDate>May 2010</creationDate>
<copyright>Copyright (C) 2010</copyright>
<license>GNU/GPL</license>
<authorEmail>boonya41@gmail.com</authorEmail>
<authorUrl>http://boonya.info/</authorUrl>
<version>1.0</version>
<description>Показывает график последних событий.</description>
<files>
<filename module="mod_scheduler">mod_scheduler.php</filename>
<filename>helper.php</filename>
<filename>tmpl/default.php</filename>
</files>
<languages>
<language tag="ru-RU">ru-RU.mod_scheduler.ini</language>
</languages>
<params>
<param name="sectionid" type="text" default="2" label="Section id" />
<param name="number" type="text" default="5" label="Number of rows on the frontpage" />
</params>
</install>
Объясняю:
Файл обязательно должен быть в кодировке UTF-8.
Строка <install type=”module” version=”1.5.0″> означает что это модуль для Joomla! версии 1.5.0 и выше.
<name>Scheduler</name> – имя модуля
<author>boonya</author> – автор
<creationDate>May 2010</creationDate> -дата создания
<copyright>Copyright (C) 2010</copyright> – авторские права
<license>GNU/GPL</license> – лицензия
<authorEmail>boonya41@gmail.com</authorEmail> – имэйл автора
<authorUrl>http://boonya.info/</authorUrl> – веб-страничка автора
<version>1.0</version> – версия модуля
<description>Показывает график последних событий.</description> – описание модуля
Далее идёт блок <files> *** </files> в котором нужно объявить все файлы модуля. Потом в конструкции <languages> *** </languages> обявляем языковые файлы.И на последок в <params> *** </params> перечисляем опции модуля которые можно будет настраивать через админку.
Расскажу по подробнее об опциях.
Строка <param name=”sectionid” type=”text” default=”2″ label=”Section id” /> состоит из:
<param – имя тэга должно быть обязательно таким;
name=”sectionid” – имя переменной настройки, может быть любым;
type=”text” – тип содержимого опции. В данном случае это текст, то есть в админке будет поле для ввода;
default=”2″ – значение по умолчанию;
label=”Section id” – имя языковой переменной;
А так же можно ещё добавить параметр description=”" в котором можно написать краткое описание настройки.
Дальше нам нужно написать саму логигу модуля. Создаём файл mod_scheduler.php и пишем в него следующий код:
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');
// подключаем класс
require_once(dirname(__FILE__).DS.'helper.php');
// берем параметры из файла конфигурации
$sectionid = $params->get('sectionid');
$number = $params->get('number');
// берем items из файла helper
$items = ModScheduler::getItems($sectionid,$number);
// подключаем шаблон для отображения
require(JModuleHelper::getLayoutPath('mod_scheduler'));
?>
Строка defined(‘_JEXEC’) or die(‘Restricted access’); защищает файл от прямого вызова;
require_once(dirname(__FILE__).DS.’helper.php’); – подключает файл с обработчиком модуля;
Строки
$sectionid = $params->get(’sectionid’);
$number = $params->get(‘number’); – получают настройки модуля (это те самые опции которые в предидущем файле обявляли в тегах <param. По этому их имена должны совпадать со значениями параметра name=” *** “).
$items = ModScheduler::getItems($sectionid,$number); – здесь мы запускаем обработчик модуля который возвращает нам нужные данные;
А эта строка require(JModuleHelper::getLayoutPath(‘mod_scheduler’)); подключит файл шаблона этого модуля;
Теперь будем разбираться непосредственно с логикой модуля.
Это будет класс в файле helper.php.
Первая строка defined(‘_JEXEC’) or die(‘Restricted access’); нам уже знакома.
Дальше вот это:
// класс извлекающий информацию из БД, обрабатывающет и формирует её должным образом
class ModScheduler
{
// основная функция, которая получает инфу из БД
// и возвращает её уже правильно сформированной
public function getItems ($sectionid, $number)
{
// подключаемся к БД
$db = &JFactory::getDBO();
// выполняем запрос
// где $sectionid - это категория
$db->setQuery("
SELECT `id`,`title`,`alias`,`created`
FROM `#__content`
WHERE
`sectionid` = '". $sectionid ."'
ORDER BY `created` DESC
LIMIT 0 , ". $number ."
");
// сохраняем массив данных в переменную
// если данных нет, то переменную инициализируем как пустой массив
$items = ($items = $db->loadObjectList()) ? $items : array();
// обрабатываем полученный массив функцией formating этого же класса
$items = ModScheduler::formating($items);
// возвращаем готовые данные
return $items;
}
// функция, которая обрабатывает массив данных полученный из БД
// в соответствии с нашими требованиями
private function formating ($items)
{
// обрабатываем по очереди каждую ячейку массива
foreach ($items as $item)
{
// время полученное в формате Y-m-d H:i:s преобразуем в метку времени UNIX
$timestamp = strtotime($item->created);
// получаем отформатированную дату из метки времени
$data['date'] = ($date = date("d.m.Y", $timestamp)) ? $date : '---';
// получаем отформатированное время
$data['start'] = ($start = date("H:i", $timestamp)) ? $start : '---';
// получаем заголовок
$data['location'] = ($location = trim($item->title)) ? $location : '---';
// получаем ссылку
$link = intval($item->id) .':'. trim($item->alias);
// формируем ссылку в соответствии с настройками системы
$data['link'] = JRoute::_(ContentHelperRoute::getArticleRoute($link));
// заносим сформированную инфу в отдельную ячейку массива
$result[] = $data;
}
// возвращаем результат
return $result;
}
}
Создаём шаблон:
Шаблоном будет файл tmpl/default.php со следующим кодом
<?php
// если в массиве есть результаты, то показываем следующий блок
if (count($items) > 0)
{
?>
<table>
<tr>
<th scope="col"><?php echo JText::_('Date'); ?></th>
<th scope="col"><?php echo JText::_('Location'); ?></th>
<th scope="col"><?php echo JText::_('Start time'); ?></th>
</tr>
<?php foreach ($items as $item) { ?>
<tr>
<td><?php echo $item['date']; ?></td>
<td><a href="<?php echo $item['link']; ?>" title="<?php echo JText::_('Read more'); ?>"><?php echo $item['location']; ?></a></td>
<td><?php echo $item['start']; ?></td>
</tr>
<?php } ?>
</table>
<?php
} else { // если результатов в массиве нет, показываем следующий блок
?>
<div>
<?php echo JText::_('No events'); ?>
</div>
<?php } ?>
Напоследок, создаем языковый файл:
Файл называется, ru-RU.mod_scheduler.ini и содержит в себе такой код
DATE=дата LOCATION=место START TIME=начало READ MORE=Подробнее SECTION ID=ID раздела NUMBER OF ROWS ON THE FRONTPAGE=Количество строк на главной NO EVENTS=Нет событий
А в прочем перевести можете как вам угодно, единственное, фраза до знака “=” должна быть в верхнем регистре и совпадать с фразой в конструкции типа <?php echo JText::_(‘ ВАША ФРАЗА ‘); ?>
Дальше запаковываем это всё в zip архив и загружаем в админке – “Расширения” – “Установить/Удалить” – “Загрузить файл пакета”.
Ваш модуль появится в менеджере модулей.
Пользуйтесь

везде пишут статьи как написат модуль. а мне интересно как делают модуль, результаты работы которого отображает компонент. как например стандартный модуль поиска mod_search, который работает в купе с компонентом com_search
Спасибо за информацию! Очень интересно! А не могли бы Вы выложить этот модуль в готовом виде? Или прислать, если возможно.
Спасибо!
спасибо за статью, очень толково и грамотно написано!
автору респект!!!!