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

Недавно под задачу написал плагин для joomla и после этого решил сделать заметку о том как для joomla создать плагин.
Как работает джумла плагин
Для начала немного теории. Так что же такое плагин в контексте джумлы. А это скрипт, который исполняется в определённых местах основного цикла joomla. Места выполнения скрипта ещё называют событиями. Работу плагина можно разбить на несколько шагов:
- Все плагины, которые включены в админ панели включаются в цикл джумла.
- Происходит вызов определённого события. Например в стандартном шаблоне для статьи компонента com_content
встречается код
echo $this->item->event->beforeDisplayContent. Это и есть вызов события. - Джумла выбирает из включенных плагинов те которые относятся к вызову события (плагины подразделяются на системные, контент, пользовательские и тд) и
выполняет код метода вызываемого события (у нас это
beforeDisplayContent).
Пока не совсем всё ясно но к концу статьи должно проясниться. Ниже в таблице показаны какие события могут обрабатывать плагины joomla.
События плагинов joomla
| Тип плагина | Название события | Описание |
|---|---|---|
| Аутентификация (Authentication) | onUserAuthenticate |
Это событие срабатывает когда кто то авторизуется в админке или на сайте |
| Капча(Captcha) |
onInitonDisplayonCheckAnswer |
События капчи |
| Контент (Content) | onContentAfterDeleteonContentAfterDisplayonContentAfterSaveonContentAfterTitleonContentBeforeDeleteonContentBeforeDisplayonContentBeforeSaveonContentBeforeTitleonContentChangeStateonContentPrepareonContentPrepareDataonContentPrepareForm |
События контента (добавление, отображение, подготовка и тд ) |
| Контакты (Contacts) |
onSubmitContactonValidateContact |
События обработки контактов (отправка контактов и валидация) |
| Редакторы (Editors) |
onInitonSaveonSetContentonGetContentonGetInsertMethodonDisplay |
События редакторов joomla |
| Editors-XTD |
onDisplayonCustomEditorButton |
События специальных кнопок для редакторов (разрыв страницы и тд) |
| Расширение(Extension) |
onExtensionBeforeInstallonExtensionBeforeUpdateonExtensionBeforeUninstallonExtensionAfterInstallonExtensionAfterUpdateonExtensionAfterUninstall |
События расширений (установка модулей, компонентов и тд, удаление, обновление) |
| Система (System) |
onAfterInitialiseonAfterRouteonAfterDispatchonAfterRenderonBeforeCompileHeadonBeforeRender |
Системные плагины выводятся после каждого цикла joomla |
| Пользователь (User) |
onUserAfterDeleteonUserBeforeDeleteonUserBeforeSaveonUserAfterSavevonUserLoginonUserLogoutonLoginFailureonLogoutFailureonUserAuthenticateonUserAuthorisation |
Эти события срабатывают при авторизации пользователя или редактировании его данных |
Почти все плагины 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 Ответить
Александр спасибо, поправлю.