boonya's blog
Сделать модуль для Joomla! 1.5

Дано:

Сайт на 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 архив и загружаем в админке – “Расширения” – “Установить/Удалить” – “Загрузить файл пакета”.

Ваш модуль появится в менеджере модулей.

Пользуйтесь ;)

  1. partizzzzzan пишет:

    везде пишут статьи как написат модуль. а мне интересно как делают модуль, результаты работы которого отображает компонент. как например стандартный модуль поиска mod_search, который работает в купе с компонентом com_search

  2. Zigfrid пишет:

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

    Спасибо!

  3. Дмитрий пишет:

    спасибо за статью, очень толково и грамотно написано!
    автору респект!!!!

Оставить комментарий
Поля отмеченные красной звездочкой должны быть обязательно заполнены.
XHTML:
Можно использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree

Яндекс цитирования
22 queries: 0.365 seconds.
boonya.info (c) 2010