Создание модуля joomla 2.5

Заготовка
В первом шаге мы создадим заготовку для будущего модуля, её можно будет использовать всякий раз при создании нового модуля. Не пугайтесь всех тегов и объёма информации на самом деле всё просто, моя задача разложить весь процесс на порции. Создайте папку mod_categories
Перечень файлов в папке mod_categories:
- index.html
- helper.php
- mod_categories.php
- mod_categories.xml
- ru-RU.mod_categories.ini
- en-GB.mod_categories.ini
- categories.css
- tmpl/index.html
- tmpl/default.php
Назовите модуль оригинальным именем, у нас он имеет название categories, потому файлы mod_categories.php, mod_categories.xml, ru-RU.mod_categories.ini, en-GB.mod_categories.ini имеют название с приставкой categories. Иначе если написать другое имя могут возникнуть проблемы.
Всё этого достаточно для создания модуля. В следующем шаге мы будем заполнять файлы.
Скачать заготовку
Установка mod_categories.xml
Откройте файл mod_categories.xml и поместите в него следующий код. Код прокомментирован.
<?xml version="1.0" encoding="utf-8"?> <!--Что устанавливаем модуль компонент или плагин и для какой версии--> <extension type="module" version="2.5" client="site" method="upgrade"> <!--Имя компонента отображаемое в модулях--> <name>Priceleaf shop категории</name> <!--Дата создания--> <creationDate>Март 2012</creationDate> <!--Кто автор!?--> <author>Ваня</author> <!--Копирайты по желанию--> <copyright>All rights reserved</copyright> <!--Лицензия--> <license>GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html</license> <!--Версия модуля--> <version>2.0.0</version> <!--Описание модуля--> <description>Модуль категории priceleaf shop</description> <!--Перечисляем какие файлы нужно установить--> <files> <filename module="mod_categories">mod_categories.php</filename> <folder>tmpl</folder> <filename>index.html</filename> <filename>helper.php</filename> </files> <!--Устанавливаем языковые файлы--> <languages> <language tag="ru-RU">ru-RU.mod_categories.ini</language> <language tag="en-GB">en-GB.mod_categories.ini</language> </languages> <!--А это уже те самые параметры которые мы увидим в настройках модуля--> <config> <fields name="params"> <fieldset name="basic"> <field name="styletype" type="list" default="1" label="COM_MODULES_NTG_FIELDSET_LABEL_NAME" description="COM_MODULES_NTG_FIELDSET_LABEL_OPISANIE"> <option value="1">Пример 1</option> <option value="2">Пример 2</option> </field> </fieldset> <fieldset name="NTG"> </fieldset> <fieldset name="advanced"> <field name="cache_time" type="text" default="900" label="COM_MODULES_FIELD_CACHE_TIME_LABEL" description="COM_MODULES_FIELD_CACHE_TIME_DESC" /> </fieldset> </fields> </config> </extension>
Рассмотрим подробнее параметры настроек, думаю такие параметры как имя и установка файлов не вызовут проблем: <config></config> Параметры конфигурации настроек.
Дальше <fields name="params"></fields> с этого тега мы обозначаем что тут нужно вывести параметры настроек для модуля. В них уже помещаем специальные теги <fieldset name="basic"></fieldset> basic это Основные параметры модуля, так же ещё имеется параметр <fieldset name="advanced"> это Дополнительные параметры.
Эти параметры зарезервированы joomla потому как она встретит она выведет названия для них.
Что бы создать какой либо свой блок то нужно написать так <fieldset name="NTG"></fieldset> имя можно поставить любое это пример. Что бы вывести имя блока в языковом файле нужно написать COM_MODULES_NTG_FIELDSET_LABEL="Имя отдельных настроек"
Такие параметры как field name="styletype" это сами настройки, которыми можно управлять.
- name="styletype" имя нашего параметра, потом это имя мы будем проверять в шаблоне.
- type="list" параметр выпадающий список. Параметры могут быть разные, текстовое поле, чекбоксы и.т.д
- default="1" что будет выводить по умолчанию параметр 1 Пример 1.
- label="COM_MODULES_NTG_FIELDSET_LABEL_NAME" имя поля
- description="COM_MODULES_NTG_FIELDSET_LABEL_OPISANIE" описание поля
- <option value="1">Пример 1</option> это параметры нашего модуля.
Такие параметры как кеширование name="cache_time" это родные joomla функции. Их там много, но они особо ненужны. Но параметр кеш можно оставить. Есть родной параметр moduleclass_sfx, class_sfx, суффикс класса модуля, всё суффиксы можно поискать в интернете или полазить в xml родных модулей joomla.
Может щас Вам это не совсем понятно, но к концу урока если вы его читаете не с перерывом в 2- 3 дня станет всё понятно. Вообще эти параметры в joomla можно использовать и в компонентах и в плагинах.
Модель helper.php
Это модель модуля, такой же принцип используется и для компонента. В ней ничего сложного нет, код прокомментирован, но если вы желаете подробнее узнать структуру то можете изучить создание компонента для joomla 2.5 но это долго, гораздо сложнее и требует терпения, ссылка выше.
<?php
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
class ModCategoriesHelper
{
public function getItems($userCount)
{
//Подключение к бд joomla
$db = JFactory::getDBO();
//Выбираем из какой таблицы будем вытаскивать данные
$query = 'SELECT * FROM #__priceleafshop_razdel';
$db->setQuery($query);
$items = $db->loadObjectlist();
return $items;
}
public function getcats($userCount)
{
//Подключение к бд joomla
$db = JFactory::getDBO();
//Выбираем из какой таблицы будем вытаскивать данные
$query = 'SELECT * FROM #__priceleafshop_cat';
$db->setQuery($query);
$cats = $db->loadObjectlist();
return $cats;
}
public function getnas($userCount)
{
//Подключение к бд joomla
$db = JFactory::getDBO();
//Выбираем из какой таблицы будем вытаскивать данные
$query = 'SELECT * FROM #__priceleafshop_na';
$db->setQuery($query);
$nas = $db->loadObjectlist();
return $nas;
}
}
Создаём класс class ModCategoriesHelper и с помощью него будем передавать данные в шаблон. Указываем параметры для вывода из базы данных public function getcats($userCount) их можно создавать сколько угодно главное менять имена getcats.
Таким образом можно тащить данные с любых таблиц в вашей бд, обрабатывать их, пример тому я вытаскиваю данные из своего компонента.
Точка входа mod_categories.php
Точка входа это как входная дверь в дом, только через неё можно попасть в дом. В нём указываются классы для работы с таблицами в бд, а затем уже через файл helper.php получаем данные и передаём в шаблон.
<?php
//no direct access
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
// подключаем файл helper.php
require_once(dirname(__FILE__).DS.'helper.php');
// берем параметры из файла конфигурации
$userCount = $params->get('usercount');
// берем items из файла helper
$items = ModCategoriesHelper::getItems($userCount);
// берем cats из файла helper
$cats = ModCategoriesHelper::getcats($userCount);
// берем nas из файла helper
$nas = ModCategoriesHelper::getnas($userCount);
// подключаем шаблон для отображения
require(JModuleHelper::getLayoutPath('mod_categories'));
Особо тут рассматривать нечего, главное запомнить что при создании нового запроса в файле нужно указать $cats = ModCategoriesHelper::getcats($userCount); $cats переменная которая будет работать с бд, а getcats это тот параметр который вы указываете в helper.php.
Языковой файл ru-RU.mod_categories.ini
В языковом файле размещаете слова, которые потом подставляются в модуль. Это сделано для разделения от основного кода, что бы не рыскать куда же разработчик поместил это слово. Пишется это следующим образом COM_MODULES_NTG_FIELDSET_LABEL_NAME где _NAME уникальная приставка которая потом помещается в модуль для вывода текста.
COM_MODULES_NTG_FIELDSET_LABEL="Имя отдельных настроек" COM_MODULES_NTG_FIELDSET_LABEL_NAME="Выбор параметра" COM_MODULES_NTG_FIELDSET_LABEL_OPISANIE="Выберите 1 из двух вариантов"
Шаблон tmp/default.php
Шаблон это конечный результат нашей с вами работы. Рассмотрим самое важное как же эти настройки которые мы задали в админке вывести в модуле. А вот как помните мы указали имя блоку field name="styletype" так вот получаем его через $styletype=$params->get('styletype',''); затем можно делать проверку через оператор if ($styletype==1) {Обработка кода} проверки можно делать разные всё зависит от конкретного случая. Данные получаем так в helper.php мы указали $items = $db->loadObjectlist(); это цикл вывода массива. Тоесть данные поместил в массив и мне нужно их вывести, а выводим мы их через цикл foreach ($items as $item ) {echo $item->id; } а обработка и формирование данных по вашему желанию.
<?php defined('_JEXEC') or die('Restricted access'); // запрет к прямому обращению ?>
<link rel="stylesheet" type="text/css" href="/modules/mod_categories/categories.css">
<div id="linked-active">
<ul>
<?php
//Помещаем в $urlload адресную строку
$urlload=$_SERVER['QUERY_STRING'];
//Выводим список разделов
$styletype=$params->get('styletype','');
if ($styletype==1) {
foreach ($items as $item )
{
//Проверяем совпадает выбранная страница с адресной строкой, если да то выделяем её красным цветом.
$urlall = 'view=priceleaf&id='.$item->id.'';
//---->>
if ($urlload==$urlall)
{
echo '<li><a class="linc-aktiv-none" href="/component/priceleafshop/?view=priceleaf&id='.$item->id_'=">
<font color="red">'.$item->name.'</font></a></li>';
//При проверке выводим принадлежащие категории.
foreach ($cats as $cat )
{
if ($item->id==$cat->raz_cat)
{
//Вывод количества новостей
$sdgf=0;
foreach ($nas as $na)
{
if ($cat->id==$na->cat_naimenovanie)
{
$sdgf++;
}}
echo '<a class="linc-aktiv-none" href="/component/priceleafshop/?view=cat&id='.$cat->id_'=">'.$cat->name_cat.'</a> ('.$sdgf.')<br>';
}}}
//<<----
//---->>
else
{
echo '<li><a class="linc-aktiv-none" href="/component/priceleafshop/?view=priceleaf&id='.$item->id_'=">'.$item->name.'</a></li>';
//При проверке выводим принадлежащие категории.
foreach ($cats as $cat )
{
//Проверяем адрес для подсветки ссылки
$urlcat = 'view=cat&id='.$cat->id.'';
if ($item->id==$cat->raz_cat) {
if ($urlload==$urlcat) {
//Вывод количества новостей
$sdgf=0;
foreach ($nas as $na) {
if ($cat->id==$na->cat_naimenovanie)
{
$sdgf++;
}}
echo '<a class="linc-aktiv-none" href="/component/priceleafshop/?view=cat&id='.$cat->id_'=">
<font color="red">'.$cat->name_cat.'</font></a> ('.$sdgf.')<br><br>';
}}}}
//<<----
}
}
else {
echo "Второй вариант который вы выбрали в настройках, сюда можно можно поместить любой код. Скажем вывести данные из другой таблицы";
}
?>
</ul>
</div>
Файл index.html можно заполнить так.
<html><body bgcolor="#FFFFFF"></body></html>