Создание модуля 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>