В этой статье я отойду от стандартного понимания разработки "hello, world", и попытаюсь описать распространенные вопросы которые могут задаваться при разработке модуля. Предупреждаю, что статья получилась не маленькой, но думаю максимально структурированной. Особенно уделите внимание исходным кодам, буду внутри писать пояснения. Давайте сразу приступим к созданию корневого каталога (папки) для будущего модуля, у нас это будет "mod_minigallery".

Далее по шагам:

1. Установочный xml файл.

Создадим в корневом каталоге файл "mod_minigallery.xml" (Не забывайте, файл должен быть сохранен в кодировке "UTF-8 без BOM").

Установочный .XML файл является главной основой при разработке, описывает содержимое модуля и используемые параметры.

Первое, что необходимо сделать - это создать в своей голове, структуру будущего модуля.
Разложить всё по порядку:
* Будут ли у нас использоваться стили css, скрипты или еще, что-то ? - Да, создадим папку "media", куда положим все эти вспомогательные инструменты
* Используем ли мы собственную таблицу Базе Данных? - Да, значит это папка "sql"
* Будет ли у нас собственный тип полей ?
* .....

Исходя из поставленных вопросов, задача будет уже более понятной для восприятия, и структуру будет проще описывать в установочном файле, что позволит сократить вероятность допущения ошибок (не всегда установочные файлы бывают маленькими).

И так, начнем первые шаги к разработке простого модуля с функционалом вывода текста и картинки.
Попробую вам объяснить основные используемые атрибуты и теги в xml файле установки:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <extension type="module" version="3" client="site" method="upgrade">
  3.         <!-- Наименование нашего модуля -->
  4.         <name>mod_minigallery</name>
  5.         <!-- Необязательные информационные теги, автор, копирайт, сайт и т.п. -->
  6.         <!-- Дата разработки модуля 07.10.2016 -->
  7.         <creationDate>Date</creationDate>
  8.         <!-- Имя разработчика, автора модуля -->
  9.         <author>Name Soname</author>
  10.         <!-- Почтовый адрес разработчика, автора модуля -->
  11.         <authorEmail>authormail</authorEmail>
  12.         <!-- Сайт разработчика, автора модуля -->
  13.         <authorUrl>http://www.siterybinsk.ru</authorUrl>
  14.         <!-- Сайт разработчика, автора модуля -->
  15.         <copyright>Copyright (C) 2005 - 2016 Open Source Matters. All rights reserved.</copyright>
  16.         <!-- Лицензия, Joomla распространяется по беслатной лицензии -->
  17.         <license>GNU General Public License version 2 or later</license>
  18.         <!-- Версия модуля -->
  19.         <version>1.0.0</version>
  20.         <!-- Описание модуля, будем использовать в языковых файлах -->
  21.         <description>MOD_MINIGALLERY_XML_DESCRIPTION</description>
  22.         <!-- Необязательный тег, customContent, отображает редактор (воспользуемся для вводного текста) -->
  23.         <customContent />
  24.         <install> <!-- Создаем таблицу в Базе Данных, для нашего модуля -->
  25.             <sql>
  26.                 <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
  27.             </sql>
  28.         </install>
  29.         <uninstall> <!-- Удаляем нашу таблицу из Базы Данных, при деинсталяции модуля -->
  30.             <sql>
  31.                 <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
  32.             </sql>
  33.         </uninstall>
  34.         <!-- Используем файлы и папки (assets, sql, tmpl) которые будут необходимы для работы модуля -->
  35.         <files>
  36.             <!-- атрибут module - указывается, что файлы будут скопированы в папку с нашим модулем -->
  37.             <filename module="mod_minigallery">mod_minigallery.xml</filename>
  38.             <filename module="mod_minigallery">mod_minigallery.php</filename>
  39.             <!-- В Файле helper приведу пример использования Базы Данных -->
  40.             <filename module="mod_minigallery">helper.php</filename>
  41.             <!-- Всегда используйте файлы заглушки в директориях, т.к. это предотвратит случай отображения ваших каталогов, полохо настроенного сервера -->
  42.             <filename module="mod_minigallery">index.html</filename>
  43.             <folder module="mod_minigallery">sql</folder>
  44.             <folder module="mod_minigallery">tmpl</folder>
  45.         </files>
  46.         <!-- Файлы media (предназначена для складирования стилей, изображений и прочего -->
  47.         <media destination="mod_minigallery" folder="media">
  48.             <filename>index.html</filename>
  49.             <folder>assets</folder>
  50.         </media>
  51.         <!-- Языковые файлы, сейчас будем использвать только русский язык -->
  52.         <languages>
  53.             <language tag="ru-RU">language/ru-RU/ru-RU.mod_minigallery.ini</language>
  54.             <language tag="ru-RU">language/ru-RU/ru-RU.mod_minigallery.sys.ini</language>
  55.         </languages>
  56.         <!-- Параметры модуля, основная, но необязательная часть модуля -->
  57.         <config>
  58.             <fields name="params">
  59.             <!-- Наши параметры, для примера воспользуемся вставкой изображения и текстовым полем, type - тип поля, (media, text, textarea и др.), label - наименование поля description - подробное описание нашего поля -->
  60.             <fieldset name="myparams" addfieldpath="/modules/mod_minigallery/fields">
  61.                 <!-- Константы будем использовать в языковых файлах (Это необязательно, можно написать и по-русски, но правильно через языковые ini файлы) -->
  62.                 <field
  63.                     name="myimage"
  64.                     type="media"
  65.                     label="MOD_MINIGALLERY_MY_IMAGE_LABEL"
  66.                     description="MOD_MINIGALLERY_MY_IMAGE_DESC" />
  67.                 <field
  68.                     name="mytext"
  69.                     type="text"
  70.                     label="MOD_MINIGALLERY_MY_TEXT_LABEL"
  71.                     description="MOD_MINIGALLERY_MY_TEXT_DESC" />
  72.                 <!-- ВНИМАНИЕ! Собственный тип поля -->
  73.                 <field
  74.                     name="myfield"
  75.                     type="myfield"
  76.                     label="MOD_MINIGALLERY_MY_FIELD_LABEL"
  77.                     description="MOD_MINIGALLERY_MY_FIELD_DESC" />
  78.             </fieldset>
  79.             <!-- Стандартные параметры модулей Joomla, кэширование, использование стилей и т.п. -->
  80.             <fieldset name="advanced">
  81.                 <field
  82.                     name="layout"
  83.                     type="modulelayout"
  84.                     label="JFIELD_ALT_LAYOUT_LABEL"
  85.                     description="JFIELD_ALT_MODULE_LAYOUT_DESC" />
  86.                 <field
  87.                     name="moduleclass_sfx"
  88.                     type="textarea" rows="3"
  89.                     label="COM_MODULES_FIELD_MODULECLASS_SFX_LABEL"
  90.                     description="COM_MODULES_FIELD_MODULECLASS_SFX_DESC" />
  91.                 <field
  92.                     name="cache"
  93.                     type="list"
  94.                     default="1"
  95.                     label="COM_MODULES_FIELD_CACHING_LABEL"
  96.                     description="COM_MODULES_FIELD_CACHING_DESC">
  97.                     <option
  98.                         value="1">JGLOBAL_USE_GLOBAL</option>
  99.                     <option
  100.                         value="0">COM_MODULES_FIELD_VALUE_NOCACHING</option>
  101.                 </field>
  102.                 <field
  103.                     name="cache_time"
  104.                     type="text"
  105.                     default="900"
  106.                     label="COM_MODULES_FIELD_CACHE_TIME_LABEL"
  107.                     description="COM_MODULES_FIELD_CACHE_TIME_DESC" />
  108.                 <field
  109.                     name="cachemode"
  110.                     type="hidden"
  111.                     default="static">
  112.                     <option
  113.                         value="static"></option>
  114.                 </field>
  115.             </fieldset>
  116.             </fields>
  117.         </config>
  118. </extension>

Установочный файл готов!

 

2. Подготовим языковые файлы .ini

     2.1 Создадим в корневом каталоге папку "language"
     2.2 В папке "language" создаем еще одну папку с локализацией языка у нас это русский "ru-RU"
     2.3 В папке "ru-RU" создаем два файла: 
             ru-RU.mod_minigallery.ini - отвечает за вывод информации на сайте и частичное меню параметров
             ru-RU.mod_minigallery.sys.ini - отвечает за вывод информации системного использования (имя модуля, описание и т.д.).

Файлы локализации .ini будут описывать константы и их определение, так, что думаю нет смысла тут подробно описывать, не забудьте, что файлы должны быть сохранены в кодировке "UTF-8 без BOM".

Языковые .INI файлы существуют для вывода текущего используемого языка сайта.

Сразу приведу содержимое файлов:
         ru-RU.mod_minigallery.ini
                  ; Russian Translation
                  ; Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.
                  ; License GNU General Public License version 2 or later;
                  ; Note : All ini files need to be saved as UTF-8 - No BOM   

                  MOD_MINIGALLERY_MY_IMAGE_LABEL="Выбрать изображение"
                  MOD_MINIGALLERY_MY_IMAGE_DESC="Выбрать изображение из каталога images"
                  MOD_MINIGALLERY_MY_TEXT_LABEL="Ваш текст"
                  MOD_MINIGALLERY_MY_TEXT_DESC="Выведет введнный вами текст"
                  MOD_MINIGALLERY_MY_FIELD_LABEL="Своё поле"
                  MOD_MINIGALLERY_MY_FIELD_DESC="Создает поля типа text"
                  MOD_MINIGALLERY_XML_DESCRIPTION="Это - модуль который покажет текст и картинку."
                  COM_MODULES_MYPARAMS_FIELDSET_LABEL="Мои параметры"
                  MOD_MINIGALLERY_MY_FIELD_BTN="Создать поле"

         ru-RU.mod_minigallery.sys.ini
                  ; Russian Translation
                  ; Copyright (C) 2005 - 2014 Open Source Matters. All rights reserved.
                  ; License GNU General Public License version 2 or later;
                  ; Note : All ini files need to be saved as UTF-8 - No BOM

                  MOD_MINIGALLERY="Минигалерея"
                  MOD_MINIGALLERY_XML_DESCRIPTION="Это - модуль который покажет текст и картинку."

 

3. Подготовим файлы sql

В корневом каталоге создадим папку sql, чтобы не путаться и понимать, тут находятся файлы запроса. В папке sql создаем два файл: install.mysql.utf8.sql и uninstall.mysql.utf8.sql, в кодировке "UTF-8 без BOM".

Файлы .SQL запросов к базе данных, отрабатывают в момент установки/обновления модуля, с возможностью автоматического создания таблиц и/или заранее подготовленных данных.

В файлах sql нет ничего сложно, это обычные mysql запросы. Наш функционал будет в виде создания простой таблички в Базе Данных. Единственный момент, что запрос выглядит с префиксом #__ - Joomla при установке данный префикс заменит автоматически. Поэтому тут ничего сложного, обычный sql запрос для создания таблицы.

Содержимое файла: install.mysql.utf8.sql

  1. CREATE TABLE `#__minigallery` (
  2. `id` INTEGER NOT NULL AUTO_INCREMENT,
  3. `name` VARCHAR(255) NOT NULL DEFAULT '',
  4. PRIMARY KEY (`id`)
  5. ) DEFAULT CHARSET=utf8;

Содержимое файла uninstall.mysql.utf8.sql

  1. DROP TABLE IF EXISTS `#__minigallery`;

* Не используйте комментирование кода в sql файлах.

 

4. Разбираемся "внутри" модуля.

Описание смотрите в комментариях к строкам кода.

4.1 Файл mod_minigallery.php точка входа в модуль или исполняемый файл.

Данный файл активизирует работу модуля и описывает последующие действия (модуль должен быть опубликован).

  1. <?php
  2. /**
  3.  * @package     Module minigallery
  4.  * @subpackage  mod_minigallery
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9. defined('_JEXEC') or die;
  10. // Подключаем файл helper.php 
  11. require_once __DIR__ . '/helper.php';
  12. // Используем суффикс css класса из параметров модуля
  13. $moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
  14. // Получаем путь к изображению из параметров
  15. $image = $params->get('myimage', '');
  16. // Получаем наш текст из параметров
  17. $text = $params->get('mytext', '');
  18. // Получаем данные произвольных полей
  19. $myFields = $params->get('myfield', array());
  20. // используем подключение стилей из папки assets
  21. // воспользуемся нашим классом в helper.php
  22. ModMinigalleryHelper::setMedia($module);
  23. // Получаем данные из Базы Данных
  24. // Сейчас будем использовать ввиде примера (данных не будет)
  25. $list = array();
  26. $list = ModMinigalleryHelper::getList();
  27. // Подключаем файл макета
  28. require JModuleHelper::getLayoutPath('mod_minigallery', $params->get('layout', 'default'));

4.2 Файл helper.php помощник модуля, на примере использования базы данных и подключения css стилей в head.

Вспомогательный файл, использование заключается в работе/обработке данных, подключения медиа файлов, в целом для облегчения разграничения логики в разработке.

  1. <?php
  2. /**
  3.  * @package     Module minigallery
  4.  * @subpackage  mod_minigallery
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9. defined('_JEXEC') or die;
  10. /**
  11.  * Helper for mod_minigallery
  12.  *
  13.  * @package     Module minigallery
  14.  * @subpackage  mod_minigallery
  15.  * @since       3.0
  16.  */
  17. class ModMinigalleryHelper
  18. {
  19.     function __construct() {}
  20.     // подключаем css стили в head сайта
  21.     public static function setMedia($module) {
  22.         // получаем JDocument для работы с документом (html страницей)
  23.         $document = JFactory::getDocument();
  24.         // получаем url для текущего выполнения сценария
  25.         $path = JUri::base();
  26.         // используем специальный метод addStyleSheet() для подключения стилей css файлов
  27.         $document->addStyleSheet( $path . 'media/'.$module->module.'/assets/css/minigallery.css' );
  28.         return;
  29.     }
  30.     // метод получения информации из базы данных
  31.     public static function getList() {
  32.         // Массив для полученных данных
  33.         $result = array();
  34.         // получаем объект класса для работы с базой данных
  35.         $db = JFactory::getDbo();
  36.         // создаем объект запроса
  37.         $query = $db->getQuery(true);
  38.        
  39.         // создаем запрос с данными
  40.         $query
  41.             ->select('*')
  42.             ->from($db->quoteName('#__minigallery'))
  43.             ->where('1');
  44.         // подготавливаем данные и загружаем в ассоциативный массив   
  45.         $result = $db->setQuery($query)->loadAssocList();
  46.         // Очищаем запрос (не обязательно, применимо когда несколько запросов подряд)
  47.         $query->clear();
  48.         // возвращаем 
  49.         return $result;
  50.     }
  51. }

4.3 Работа с макетом (layout).

Файл default.php - это наш макет с обработанными данными, располагается в папке "tmpl". CMS Joomla сама по себе удобна в использовании и имеет хороший функционал в плане переопределений, макеты не исключение и реализованы по этому же принципу, мы можем создавать макеты опираясь только на имеющихся данных.

Макет (Layout) заключает в себе вывод данных, в последствии которые отображаются визуально оформленные на странице сайта. По-умолчанию файл макета имеет название "default.php".

  1. <?php
  2. /**
  3.  * @package     Module minigallery
  4.  * @subpackage  mod_minigallery
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9. defined('_JEXEC') or die;
  10. ?>
  11. <!-- Выводим макет с данными -->
  12. <!-- Вводный текст из редактора -->
  13. <div><?php echo $module->content; ?></div>
  14. <!-- Параметры модуля -->
  15. <div class="minigallery <?php echo $moduleclass_sfx ?>">
  16.     <h2><?php echo $text ?></h2>
  17.     <?php /* если адрес картинки не пуст то показываем */ if($image !== ''): ?>
  18.     <img src="<?php echo $image ?>" />
  19.     <?php endif; ?>
  20. <!-- Созданные произвольные поля -->
  21. <?php if( !empty($myFields) ): ?>
  22.     <?php foreach($myFields as $field): ?>
  23.         <span><?php echo $field ?></span><br />
  24.     <?php endforeach; ?>
  25. <?php endif; ?>
  26. </div>

4.3.1 Нестандартный макет.

Разберем простой наглядный пример в текущем модуле и назовем его mylayout.php:

Выбор макета осуществляется в административной панели сайта, в настройках модуля. Макет подключается автоматически при наличии .php файла в папке "tmpl". 

  1. <?php
  2. /**
  3.  * @package     Module minigallery
  4.  * @subpackage  mod_minigallery
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9. defined('_JEXEC') or die;
  10. ?>
  11. <!-- Выводим макет с данными -->
  12. <!-- Вводный текст из редактора -->
  13. <div><?php echo $module->content; ?></div>
  14. <!-- Параметры модуля -->
  15. <div style="background-color: #ff0000;" class="minigallery <?php echo $moduleclass_sfx ?>">
  16.     <h2><?php echo $text ?></h2>
  17. <!-- Созданные произвольные поля -->
  18. <?php if( !empty($myFields) ): ?>
  19.     <?php foreach($myFields as $field): ?>
  20.         <span><?php echo $field ?></span><br />
  21.     <?php endforeach; ?>
  22. <?php endif; ?>
  23. </div>

В нашем примере данный макет будет отображать только тексты, на красном фоне.

 

5. Разберем пример использования собственных типов полей.

В корневом каталоге создадим папку "fields" и в ней php-файл myfield.php
На, что стоит обратить внимание на атрибут addfieldpath="/modules/mod_minigallery/fields" в установочном файле, это путь до используемого поля, без него не инициализируется собственный тип.

Собственный тип поля позволяет разрабатывать функционал не имеющий стандартного решения или не подходящий для текущей задачи.

mod_minigallery/fields/myfield.php:

  1. <?php
  2. /**
  3.  * @package     Module minigallery
  4.  * @subpackage  mod_minigallery
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9. defined('JPATH_BASE') or die;
  10. /**
  11.  * Clicks Field class for the Joomla Framework.
  12.  *
  13.  * @since  1.6
  14.  */
  15. class JFormFieldMyfield extends JFormField
  16. {
  17.     /**
  18.      * Имя поля.
  19.      *
  20.      * @var        string
  21.      * @since   1.6
  22.      */
  23.     protected $type = 'myfield';
  24.     /**
  25.      * Метод который вернет наше поле.
  26.      *
  27.      * @return  string    The field input markup.
  28.      *
  29.      * @since   1.6
  30.      */
  31.     protected function getInput()
  32.     {
  33.        // добавляем скрипт
  34.        JFactory::getDocument()->addScriptDeclaration('var divMyfield; function createField() {   
  35.          divMyfield = document.getElementById("myfield");
  36.            /* create input text */
  37.            var newTXT = document.createElement("input");
  38.            newTXT.setAttribute("type", "text");
  39.            newTXT.setAttribute("name", "'.$this->name.'[]");
  40.            newTXT.style.display="block";
  41.            /* append */
  42.            divMyfield.appendChild(newTXT);
  43.        }');
  44.        $html = '';
  45.        $html .= '<div id="myfield">';
  46.            if( !empty($this->value) ) {
  47.                foreach($this->value as $value) {
  48.                    $html .= '<input type="text" style="display:block;" name="'.$this->name.'[]" value="'.$value.'" />';
  49.                }
  50.            }
  51.        $html .= '</div>';
  52.        $html .= '<div style="clear:both;"></div><span id="myfieldbtn" class="btn" onclick="createField();">'.JText::_('MOD_MINIGALLERY_MY_FIELD_BTN').'</span>';
  53.        return $html;
  54.     }
  55. }

Обратите внимание также на 3 вещи в данном файле: $type, название класса JFormFieldMyfield, и наименование файла myfield.php. Все эти перечисления имеют общее название myfield.

 

6. Заключение.

Используйте при разработке грамотную структуру установочного файла. Старайтесь писать читаемый код. Разложите файлы по папкам так, чтобы в будущем было проще найти искомое. Обязательно при разработке создавайте языковые .INI файлы, с высокой доли вероятности вам потребуется перевод на другой язык.

P.S.

Вот и посеяно зерно, пожинайте плоды...
Если вы пытаетесь научиться сами написать модуль для CMS Joomla, это уже верное направление, не отчаивайтесь если у вас не получается, пробуйте... пробуйте... и снова пробуйте, и пробуйте делать это правильно. Даже если вы будете использовать модуль только для себя, относитесь так, что завтра его будут демонстрировать президенту, ведь в будущем вам будет легче разрабатывать легко-читаемый и понятный код. А это очень важная деталь для любого программиста.

Скачать готовый пример:

zipГотовый модуль (размер: 10 kb, скачиваний: 27)
Вы можете пожертвовать любую сумму для мотивации новых статей.
Создание сайтов

Читайте также:

Полезное из Web