Модуль для Joomla: вывод материала в позицию модуля. Часть 1

Модули Joomla - это одно из основных направлений расширения функционала CMS. В Joomla можно организовать вывод модуля в специально предназначенную (или просто подходящую для него) позицию. Кроме того можно, например, вывести любой модуль на странице в текст материала или даже в другой модуль при помощи простой команды - \{loadposition xxx\}, где ххх - какая-нибудь позиция модуля. Но вот сделать обратное, например, вывести какой либо материал, статью в позицию модуля - это уже труднее. Как же это реализовать? Конечно же для этого нужен специальный модуль.

И вот здесь есть 2 варианта:

  1. Найти подходящий модуль в на одном из сайтов посвященных CMS Joomla.
  2. Написать свой собственный модуль для вывода материала.

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

Иногда на поиск нужного модуля может уйти целый день, а это не всегда good. Поэтому я, прежде чем искать нужный модуль, всегда задаю себе вопрос "А не проще ли написать свой велосипед?" и часто прихожу к выводу, что это и проще, и быстрее по времени. Приведу пример.

Допустим мне нужно вывесли в позицию модуля текст какой-либо статьи, соответственно для решения этой задачи мне нужен модуль. Немного конкретизирую функции модуля.

Во-первых, в настройках модуля нужно указывать статью текст которой нужно вывести.

Во-вторых, так как статьи хранятся в базе данных, то в коде модуля нужно организовать доступ к БД и вывод оттуда нужной информации.

Приступим к работе. Для начала определюсь какие файлы будут в моем модуле и за что будет отвечать каждый файл. Условное имя моего модуля будет mod_fastjob_articleinmodule, создадим на компьютере папку по имени модуля, в ней и будут нужные нам файлы, а именно: index.html, mod_fastjob_articleinmodule.php, mod_fastjob_articleinmodule.xml, ru-RU.mod_fastjob_articleinmodule.ini, ru-RU.mod_fastjob_articleinmodule.sys.ini. Файл index.html нужен исключительно для того, чтобы предотвратить прямой доступ к папке; mod_fastjob_articleinmodule.php - основной файл, в котором и будет весь код модуля; mod_fastjob_articleinmodule.xml - файл с настройками модуля; ru-RU.mod_fastjob_articleinmodule.ini и ru-RU.mod_fastjob_articleinmodule.sys.ini - языковые файлы, мой модуль будет только на русском языке, так что таких файлов всего два.

Работаем с файлом mod_fastjob_articleinmodule.xml

<?xml version="1.0" encoding="utf-8"?> //версия, кодировка
<extension type="module" version="2.5.0" method="upgrade"> //укажем тип - модуль, версию CMS, и метод установки
        <name>MOD_FASTJOB_ARTICLEINMODULE</name> //имя шаблона
        <creationDate>Aug 2013</creationDate> //укажем дату создания модуля
        <author>Azzaul</author> //укажем создателя модуля
        <authorEmail> Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. </authorEmail> //укажем адрес электронной почты для связи
        <authorUrl>http://www.fast-job.ru</authorUrl> //сайт
        <copyright>Copyright 2011 - 2013. All rights reserved.</copyright> //Информация об авторских правах
        <license>GNU</license> //тип лицензии
        <version>1.0.0</version> //версия модуля, в процессе доработки она будет изменяться
        <description>Этот модуль будет выводить текст материала</description> //описание модуля
        <files> //укажем файлы модуля
                <filename module="mod_fastjob_articleinmodule">mod_fastjob_articleinmodule.php</filename> //укажем основной файл
                <filename>mod_fastjob_articleinmodule.xml</filename>
                <filename>index.html</filename>
        </files>
    <languages> //укажем языковые файлы
        <language tag="ru-RU">ru-RU.mod_fastjob_articleinmodule.ini</language>
        <language tag="ru-RU">ru-RU.mod_fastjob_articleinmodule.sys.ini</language>
    </languages>
    <config> //собственно настройки модуля, их можно изменить из админки
        <fields name="params">
            <fieldset name="advanced">
                <field name="fj_artinmod_id" type="text" label="MOD_FASTJOB_ARTICLEINMODULE_ID_LABEL" description="MOD_FASTJOB_ARTICLEINMODULE_ID_DESC" /> //сюда добавим текстовое поле для ввода id материала
            </fieldset>
        </fields>
    </config>
</extension>

Итак, в настройки модуля я добавил поле для ввода текста, туда мы будем вводить id материала, для которого нужен вывод текста в модуль. Теперь можно будет в настройках вводить id и модуль будет по нему находить материал и выводить текст.

Работаем с языковыми файлами

Добавим в файл ru-RU.mod_fastjob_articleinmodule.sys.ini следующую строку:

; Это заголовок нашего модуля
MOD_FASTJOB_ARTICLEINMODULE="Вывод материала в позицию модуля"

Добавим в файл ru-RU.mod_fastjob_articleinmodule.ini следующее:

; Это заголовок нашего модуля
     MOD_FASTJOB_ARTICLEINMODULE="Вывод материала в позицию модуля"
     ; Это метка для поля куда мы будем вводить id
     MOD_FASTJOB_ARTICLEINMODULE_ID_DESC="Введите id статьи: "
     ; Это описание для данной настройки модуля
   MOD_FASTJOB_ARTICLEINMODULE_ID_DESC="Вы должны указать в поле id статьи, для которой нужно выводить текст в модуль. ID статьи вы можете посмотреть в настройках статьи"

Ну и самое главное, основной файл модуля:

<?php
     //запрещаем доступ к коду модуля и подключаем необходимые файлы
     defined('_JEXEC') or die( 'Ай-яй-яй, и что это тебе здесь надо' );
     define('JPATH_BASE', dirname(__FILE__) );
     define( 'DS', DIRECTORY_SEPARATOR );
     require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
     require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
     require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' );

     //получаем id материала из настроек
     $article_id = $params->get('fj_artinmod_id');
  //обратите внимание, что fj_artinmod_id - это значение name в файле настроек модуля mod_fastjob_articleinmodule.xml

    //работаем с базой данных
     $db = JFactory::getDbo();
     $pref = $db->getPrefix(); //получаем префикс базы данных, как вы знаете в Joomla 2.5 он генерируется автоматически
    // составляем запрос к БД Joomla
     $res = 'SELECT `introtext` FROM `'.$pref.'content` WHERE `id`="'.$article_id.'"';
   // получаем информацию из базы данных, я решил получить только часть статьи которая обычно видна в блоге категории и называется интротекст, но аналогично можно получить и другие параметры
     $db->setQuery($res);
     $article_data = $db->loadAssoc();
    // конечно параметр всего один, но мы же в будущем доработаем наш модуль поэтому loadAssoc() это, так сказать, задел на будущее
    ?>
    <!--А вот тут мы выведем наш текст-->
    <div><?php echo $article_data['introtext']; ?></div>

Ну вот собственно и весь код модуля. У меня на реализацию модуля ушло чуть больше получаса, скорее всего на поиски аналога я затратил бы не меньше времени. Но, конечно же, данный модуль - это только заготовка, в следующей статье я расскажу каким образом можно улучшить данный модуль.

Скачать готовый модуль

Также можно почитать:



Оставить комментарий: