В данной статье мы с вами создадим модуль для Joomla 2.5, который отображает последние записи из компонента EasyBlog. Ознакомиться с работой этого модуля можно на главной странице этого сайта. Кроме отображения последних записей, мы добавим функцию интеграции с phpBB, позволяющую выводить аватары пользователей. Таким образом стстья будет полезна тем, кто хочет научится самостоятельно создавать модули для Joomla 2.5. Итак, приступим.

CMS Joomla разработана на основе шаблона проектирования Модель-Представление-Поведение (MCV). Поэтому и структура всех компонентов в составе этой системы уравления контентом, для знакомых с данным шаблоном, покажется абсолютно понятной и логичной.

Рассмотрим структуру абстрактного модуля, в нашем случае он будет называться mod_easyblog_latest, как минимум он должен содержать:

  1.  mod_easyblog_latest.php — основной файл модуля.
  2.  mod_easyblog_latest.xml —  файл, содержащий информацию о модуле, а так же при необходимости настройки модуля.
  3. helper.php — файл, содержащий функции для получения информации, которую отображает модуль.
  4. index.html — пустой файл, необходимый в качестве дополнительного метода защиты (для того, чтобы в браузере не отображался список файлов директории к которой по какой-либо причине был открыт доступ для просмотра).
  5. tmpl/default.php — стандарнтый шаблон, непосредственно отображающий информацию на сайте, полученную при помощи функций, содержащихся в файле helper.

 В нашем случае в составе модуля кроме этих компонентов будет находиться папка images, содержащая файл noavatar.png, который будет выводиться в случае, если у пользователя аватар не установлен, но в настройках модуля включено отображение аватаров.

Рассмотрим теперь по порядку содержимое всех этих файлов. Весь код подробно прокомментирован, содержимое файла mod_easyblog.xml интуитивно понятен.

mod_easyblog_latest.php

//запрещаем прямой доступ к данному файлу
defined('_JEXEC') or die('Direct Access to this location is not allowed.');

//подключаем файл helper.php,
//содержащий класс с основными функциями,
//которые используются нашим модулем
require_once(dirname(__FILE__).DS.'helper.php');

//получаем настройки нашего модуля из файла mod_easy_blog.xml

//разделитель, отделяющий Имя автора записи от Названия записи
$delimeter = $params->get('delimeter');
//количество записей, отображаемых модулем
$post_count = $params->get('post_count');
//формат даты, отображаемой модулем
$date_format = $params->get('date_format');
//опция определяющая показывать или нет аватары при интеграции с phpBB
$display_avatars = $params->get('display_avatars');
//папка форума phpBB относительно корневого каталога Joomla
$phpbb = $params->get('phpbb');
//префикс таблиц форума из базы данных
$prefix = $params->get('prefix');
//максимальная высота аватара
$maxheight = $params->get('avatar_height');
//максимальная ширина аватара
$maxwidth = $params->get('avatar_width');
//сохранять или нет пропорции при изменении размера аватара
$avatar_keep_proportional = $params->get('avatar_keep_proportional');


//вызов функции getList класса modEasyBlogLatest, описанного в файле helper.php,
//полученные данные записываются в переменную $articles, которая
//используется для отображения этих данных в основном шаблоне модуля
$articles = modEasyBlogLatest::getList($params);

//подключаем основной шаблон модуля,
//по умолчанию файл default.php из папки tmpl
require(JModuleHelper::getLayoutPath('mod_easyblog_latest'));    

mod_easyblog_latest.xml

<extension type="module" client="site" version="1.6" method="upgrade">
        <name>EasyBlog Latest</name>
        <author>dr.MIG</author>
        <creationdate>2012-05-13</creationdate>>
        <copyright>Copyright dr.MIG</copyright>
        <license>GPL 2.0</license>
        <authoremail>admin AT ymanet.ru</authoremail>
        <authorurl>www.ymanet.ru</authorurl>
        <version>1.0</version>
        <description>Модуль выводит последние опубликованные записи блога.</description>
        <files>
                <filename module="mod_easyblog_latest">mod_easyblog_latest.php</filename>
                <filename>index.html</filename>
                <filename>helper.php</filename>
                <filename>tmpl/default.php</filename>
                <filename>tmpl/index.html</filename>
                <filename>images/noavatar.png</filename>
        </files>
<config>
        <fields name="params">
            </fields></config></extension><fieldset name="basic">
            <field name="delimeter" type="text" default="→" label="Разделитель" description="Метка, отделяющая имя автора от заголовка статьи"></field>
            <field name="post_count" type="text" default="5" label="Количество статей" description="Количество статей, выводимых модулем"></field>
            <field name="date_format" type="text" default="(d.m.Y)" label="Формат даты" description="Формат даты"></field>
            <field name="display_avatars" label="Отображать аватары с форума phpBB" type="radio" default="0" description="Отображать аватары с форума phpBB">
                <option value="0">JNO</option>
                <option value="1">JYES</option>         
            </field>
            <field name="phpbb" type="text" default="" label="Путь к форуму phpBB" description="Путь к форуму для получения аватара"></field>
            <field name="prefix" type="text" default="" label="Префикс таблиц форума" description="Префикс таблиц форума"></field>
            <field name="avatar_height" type="text" default="" label="Высота аватара" description="Высота аватара"></field>
            <field name="avatar_width" type="text" default="" label="Ширина аватара" description="Ширина аватара"></field>
            <field name="avatar_keep_proportional" label="Сохранять пропорции аватара" type="radio" default="0" description="Сохранять пропорции аватара">
                <option value="0">JNO</option>
                <option value="1">JYES</option>         
            </field>  
            </fieldset>
		</fields>
</config>
</extension>        

helper.php

//запрещаем прямой доступ к данному файлу
defined('_JEXEC') or die('Direct Access to this location is not allowed.');

//создаем основной класс с функциями
class modEasyBlogLatest {
    //функция, возвращающая массив, содержащий всю необходимую информацию,
    //которая будет отображаться модулем
    function getList($params)  {
        $delimeter = $params->get('delimeter');
        $post_count = $params->get('post_count');
        $date_format = $params->get('date_format');
        $display_avatars = $params->get('display_avatars');
        $phpbb = $params->get('phpbb');
        $prefix = $params->get('prefix');
        $maxheight = $params->get('avatar_height');
        $maxwidth = $params->get('avatar_width');
        $avatar_keep_proportional = $params->get('avatar_keep_proportional');
        
        $database = &JFactory::getDBO(); 
        
        $database->setQuery("SELECT id, created_by, title, created FROM #__easyblog_post WHERE published = 1 ORDER BY created DESC limit ".$post_count);
        $articles = $database->loadObjectList();
        
        //в случае включенной опции отображения аватар получаем их список из базы форума phpBB,
        //а так же вычисляем размеры аватар для вывода в модуле на основе настроек модуля
        if ($display_avatars) {
            for ($i=0; $icreated_by);
                $database->setQuery("SELECT user_avatar FROM ".$prefix."_users WHERE username='".$user->username."'");
                $user_avatar = $database->loadResult();
                    if (empty($user_avatar)) {
                        $user_avatar = '/modules/mod_easyblog_latest/images/noavatar.png'; 
                    }
                    else {
                        $user_avatar = '/'.$phpbb.'download/file.php?avatar='.$user_avatar;
                    }
                    $size = ($avatar_keep_proportional) ? @getimagesize($avatar) : false;
                    if($size!==false && ($size[0] > $maxwidth || $size[1] > $maxheight)) {
                        $wscale = $maxwidth/$size[0];
                        $hscale = $maxheight/$size[1];
                        $scale = min($hscale, $wscale);
                        $w = floor($scale*$size[0]);
                        $h = floor($scale*$size[1]);
                    } elseif($size!==false) {
                        $w = $size[0];
                        $h = $size[1];
                    } else {
                        $w = $maxwidth;
                        $h = $maxheight;    
                    }
                $avatar[$i]['w'] = $w;
                $avatar[$i]['h'] = $h;
                $avatar[$i]['src'] = $user_avatar;
                $articles[$i]->avatar = $avatar;
            }
        }
        return $articles;
    }
}    

default.php

    <div class="module_content">
        <ul style="list-style: none;">
        </ul>
    </div> 

Это заготовка для вывода списка, внутри нее необходимо разместить следующий php-код, который сформирует требуемый список:

<?php
$database = &JFactory::getDBO(); 
for ($i=0; $i<count($articles); $i++) {	
	$database->setQuery("SELECT nickname FROM #__easyblog_users WHERE id=".$articles[$i]->created_by);
	$userName = $database->loadResult();
	if ($display_avatars) {
		$avatar = '<img style="vertical-align:middle; float:left; margin:3px; max-width: '.$articles[$i]->avatar[$i]['w'].'px; max-height: '.$articles[$i]->avatar[$i]['h'].'px;" src="'.$articles[$i]->avatar[$i]['src'].'" alt="&#1040;&#1074;&#1072;&#1090;&#1072;&#1088;"/>';
	}
	echo '<li style="clear: left; margin-bottom: 5px;">'.$avatar.'<a href="/blogs/blogger/listings/invalid-blogger?gt;created_by_\'=">'.$userName.'</a> '.$delimeter.' <a href="/blogs/invalid-post?gt;id_\'=">'.$articles[$i]->title.'</a> '.JHTML::date($articles[$i]->created, $date_format).'</li>';
}
?>  

Теперь остается только упаковать все эти файлы в zip-архив и модуль готов к использованию после установки через стандартный Менеджер расширений Joomla.

Подробнее ознакомиться с функциями и внутренней структурой CMS Joomla вы можете на официальной странице разработчиков: http://docs.joomla.org/.

Узнать больше про язык программирования PHP, испольующийся при написании примеров к данной статье, вы можете здесь: http://www.php.net/.

Так же вы можете скачать модуль «Последние записи EasyBlog» для Joomla 2.5.