2017
15
Янв

Joomla создание плагина

grigoriev
10699
joomla создание плагина
DOWNLOAD

Недавно под задачу написал плагин для joomla и после этого решил сделать заметку о том как для joomla создать плагин.

Как работает джумла плагин

Для начала немного теории. Так что же такое плагин в контексте джумлы. А это скрипт, который исполняется в определённых местах основного цикла joomla. Места выполнения скрипта ещё называют событиями. Работу плагина можно разбить на несколько шагов:

  • Все плагины, которые включены в админ панели включаются в цикл джумла.
  • Происходит вызов определённого события. Например в стандартном шаблоне для статьи компонента com_content встречается код echo $this->item->event->beforeDisplayContent. Это и есть вызов события.
  • Джумла выбирает из включенных плагинов те которые относятся к вызову события (плагины подразделяются на системные, контент, пользовательские и тд) и выполняет код метода вызываемого события (у нас это beforeDisplayContent ).

Пока не совсем всё ясно но к концу статьи должно проясниться. Ниже в таблице показаны какие события могут обрабатывать плагины joomla.

События плагинов joomla

Тип плагина Название события Описание
Аутентификация (Authentication) onUserAuthenticate Это событие срабатывает когда кто то авторизуется в админке или на сайте
Капча(Captcha) onInit
onDisplay
onCheckAnswer
События капчи
Контент (Content) onContentAfterDelete
onContentAfterDisplay
onContentAfterSave
onContentAfterTitle
onContentBeforeDelete
onContentBeforeDisplay
onContentBeforeSave
onContentBeforeTitle
onContentChangeState
onContentPrepare
onContentPrepareData
onContentPrepareForm
События контента (добавление, отображение, подготовка и тд )
Контакты (Contacts) onSubmitContact
onValidateContact
События обработки контактов (отправка контактов и валидация)
Редакторы (Editors) onInit
onSave
onSetContent
onGetContent
onGetInsertMethod
onDisplay
События редакторов joomla
Editors-XTD onDisplay
onCustomEditorButton
События специальных кнопок для редакторов (разрыв страницы и тд)
Расширение(Extension) onExtensionBeforeInstall
onExtensionBeforeUpdate
onExtensionBeforeUninstall
onExtensionAfterInstall
onExtensionAfterUpdate
onExtensionAfterUninstall
События расширений (установка модулей, компонентов и тд, удаление, обновление)
Система (System) onAfterInitialise
onAfterRoute
onAfterDispatch
onAfterRender
onBeforeCompileHead
onBeforeRender
Системные плагины выводятся после каждого цикла joomla
Пользователь (User) onUserAfterDelete
onUserBeforeDelete
onUserBeforeSave
onUserAfterSavev
onUserLogin
onUserLogout
onLoginFailure
onLogoutFailure
onUserAuthenticate
onUserAuthorisation
Эти события срабатывают при авторизации пользователя или редактировании его данных

Почти все плагины joomla являются классами. Они наследуются от класса JPlugin. Есть определённое соглашение о именовании плагина. Класс плагина должен именоваться по такому типу: plgТип нашего плагинаНазвание нашего плагина
Тоесть если мы захотим создать контент плагин с названием hello название класса будет plgContentHello. Теперь мы обладаем всеми данными для написания плагина.

Манифест плагина

Я решил написать простой контент плагин, который выводит заданное в админ панели приветствие ( например "Здравствуйте уважаемые читатели блога") перед статьёй во всех статьях блога. Пользы от него конечно мало но для примера написания плагина я думаю пойдёт. И так приступим. Плагин назовём Greet. Для начала создадим папку greet, а в ней файлы: index.html - это заглушка, greet.xml - это файл манифест (для установки плагина), greet.php - файл с кодом самого плагина. В текстовом редакторе откроем greet.xml. Ниже увидите листинг самого greet.xml

                                     
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.5.0" type="plugin" group="content" method="upgrade">
  <name>PLG_CONTENT_GREET</name>
  <author>Aleksey Grigoriev</author>
  <creationDate>January 2017</creationDate>
  <copyright>Copyright (C) 2017>
  <license>GNU General Public License</license>
  <authorUrl>www.aweb34.ru</authorUrl>
  <version>3.0.0</version>
  <description>PLG_CONTENT_GREET_DESCRIPTION</description>
  <files>
    <filename plugin="greet">greet.php</filename>
    <filename>index.html</filename>
        <folder>language</folder>
  </files>
        <config>
            <fields name="params">
                <fieldset name="basic">
                    <field name="greet" type="text"
                        description="PLG_CONTENT_GREET_DESC"
                        label="PLG_CONTENT_GREET_LABEL"
                        filter="string"
                        default=""
                        size="30"
                    />
                </fieldset>
            </fields>
        </config>  
</extension>

Давайте разберёмся что здесь и к чему.

Тип расширения plugin, относится к группе content

<extension version="3.5.0" type="plugin" group="content" method="upgrade">

В папке находятся файл плагина и заглушка index.php, а так же папка с языковыми файлами, но об этом позже

 
<files>
    <filename plugin="greet">greet.php</filename>
    <filename>index.html</filename>
    <folder>language</folder>
</files>

В админ панели в настройках плагина будет тестовое поле с именем greet по умолчанию пустое с длинной в 30 символов. В это поле мы будем вводить наше приветствие. Элемент fields с атрибутом name="params" специально создан что бы мы могли получить параметры плагина.

<config>
    <fields name="params">
        <fieldset name="basic">
            <field name="greet" type="text"
                description="PLG_CONTENT_GREET_DESC"
                label="PLG_CONTENT_GREET_LABEL"
                filter="string"
                default=""
                size="30"
            />
        </fieldset>
    </fields>
</config>

Остальные поля я думаю интуитивно понятны.

Русификация плагина Joomla

Согласно манифесту у нас должна быть в папке greet папка с языковыми файлами. Так давайте создадим папку language в папке greet. Так же в папке language создадим папку ru-RU, а в ней файлы ru-RU.plg_content_greet.ini и ru-RU.plg_content_greet.sys.ini. Обратите внимание, что в наименовании языковых файлов есть определённые правила. Так как плагин тестовый, английской локализации я не предусмотрел. файл ru-RU.plg_content_greet.ini является основным языковым файлом. В нём находятся языковые константы, которые отвечают за отображение названий полей и тд, находящихся внутри плагина, и за название плагина в менеджере плагинов. Листинг файла:

PLG_CONTENT_GREET_DESC="Введите в поле текст приветствия"
PLG_CONTENT_GREET_LABEL="Текст приветствия"    

Файл ru-RU.plg_content_greet.sys.ini отвечает за отображение языковых констант во время установки плагина. Листинг:

PLG_CONTENT_GREET="Плагин приветствия"
PLG_CONTENT_GREET_DESCRIPTION="Плагин выводит приветствие 
после заголовка статьи" 

Разработка плагина joomla

Как я писал выше, основной код плагина у нас находится в файле greet.php. Давайте откроем его в текстовом редакторе и вставим код из листинга ниже.

                                     
<?php
//запрещает доступ не из joomla
defined('_JEXEC') or die;
//создаём класс плагина 
class plgContentGreet extends JPlugin
{  
    //задаём тип события
    public function onContentBeforeDisplay( $context, &$row, &$params, $page = 0 )
    {
        //получаем значение поля приветствия
            $param = $this->params->get('greet', 'defaultValue');
        //выводим приветствие
            return $param;       
    }
}  

Тут я думаю всё просто. Назвали класс нашего плагина согласно договорённость plgContentGreet. Получили значение поля приветствия. Имя поля greet. Используя метод onContentBeforeDisplay вывели наше приветствие.

Важно: Обратите внимание что приветствие мы вывели не через echo, а через return

Теперь нам осталось только запаковать папку greet в zip архив и установить наш плагин через менеджер расширений joomla. Скачать плагин можно нажав на кнопку download в начале статьи.

Поделиться:

Комментарии

Александр

Александр

17.03.2019 21:46 Ответить

У вас в greet.xml не закрыт и установщик Джумлы ругается

Александр

Александр

17.03.2019 21:47 Ответить

тег < copyright > порезался в предыдущем сообщении. В общем он не закрыл у вас в XML

Алексей Григорьев

Алексей Григорьев

18.03.2019 08:24 Ответить

Александр спасибо, поправлю.

You have no rights to post comments

Используя данный сайт, вы даете согласие на использование файлов cookie, помогающих мне сделать его удобнее для вас. Уведомление о cookie