В данной статье мы с вами создадим модуль для Joomla 2.5, который отображает последние записи из компонента EasyBlog. Ознакомиться с работой этого модуля можно на главной странице этого сайта. Кроме отображения последних записей, мы добавим функцию интеграции с phpBB, позволяющую выводить аватары пользователей. Таким образом стстья будет полезна тем, кто хочет научится самостоятельно создавать модули для Joomla 2.5. Итак, приступим.
CMS Joomla разработана на основе шаблона проектирования Модель-Представление-Поведение (MCV). Поэтому и структура всех компонентов в составе этой системы уравления контентом, для знакомых с данным шаблоном, покажется абсолютно понятной и логичной.
Рассмотрим структуру абстрактного модуля, в нашем случае он будет называться mod_easyblog_latest, как минимум он должен содержать:
- mod_easyblog_latest.php — основной файл модуля.
- mod_easyblog_latest.xml — файл, содержащий информацию о модуле, а так же при необходимости настройки модуля.
- helper.php — файл, содержащий функции для получения информации, которую отображает модуль.
- index.html — пустой файл, необходимый в качестве дополнительного метода защиты (для того, чтобы в браузере не отображался список файлов директории к которой по какой-либо причине был открыт доступ для просмотра).
- 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="Аватар"/>';
}
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.
А как к примеру отобразить аватар не из форума а из изи блога?
И как возможно вывести аватар в форму логина, то есть там где отображается здравствуйте (пользователь) Что бы с боку выводил аватар из изи блога ?