Создание плагина для Joomla

Общая информация о плагинах

Joomla

Цикл статей "Создание плагина для Joomla 2.5 и Joomla 3" мы начнем с рассмотрения общей информации о плагинах: что такое плагины, каким образом они работают в Joomla и какие типы плагинов существуют.

Английские термины и их перевод

Во избежания недопонимания в связи с использованием и переводом некоторых английских терминов, предлагаю вашему вниманию список соответствия этих терминов их переводу на русский (список будет пополнять по мере написания статей):

plugin
плагин
execution cycle
цикл исполнения
event
событие
to trigger event
вызывать событие

Что такое плагин?

Плагин, это простая PHP программа, которая исполняется в одной или более предопределенных точках в цикле исполнения Joomla. Эти точки называются событиями и вызываются изнутри Joomla.

Плагин может быть очень простым - например, установить значение перед сохранением в базу данных. Или он может быть очень сложным - например, конвертировать все URL в документе в другой формат. Плагины даже можно использовать для переопределения стандартных базовых классов Joomla.

Плагины привязаны к событиям. Для понимания плагинов, нам необходимо знать предопределенные события в Joomla, а также понимать, как создавать свои собственные события.

Как же работают плагины?

Работа плагинов заключается в трех шагах:

  1. Один или несколько плагинов включаются в текущий скрипт, обычно с помощью метода JPluginHelper::importPlugin(). Так как плагины, как правило, являются объявлениями классов, в этой точке не происходит исполнения кода.
  2. Вызывается событие, обычно с помощью метода $dispatcher->trigger() (где $dispatcher - это объект класса JDispatcher). Каждое событие имеет название, такое как onBeforeInitialise или onContentBeforeSave.
  3. Код, обрабатывающий событие, ищет среди включенных плагинов загруженные на данный момент. Затем он проверяет, есть ли у них метод, который совпадает с названием события. Если такие методы найдены, то они исполняются.

Загрузка и исполнение PHP скриптов, которые объявляют классы

Большинство плагинов в Joomla содержат только объявление класса. Это значит, что они объявляют класс и определяют методы класса, но не включают ни единой строчки кода вне объявления класса.

Когда загружается такой тип файла (например, с помощью PHP команды require_once), в работающей памяти создается новый класс со всеми методами. Однако ни один из этих методов в реальности не исполняется. Метод исполнится только тогда, когда строка кода вызовет этот метод. Вот почему метод JPluginHelper::importPlugin() только подготавливает плагин к исполнению, но, как правило, не исполняет код. Методы плагина исполняются только тогда, когда вызывается событие, например с помощью метода $dispatcher-> trigger().

Соглашения по именованию плагинов

Чтобы метод JPluginHelper::importPlugin() смог найти плагины, нам необходимо следовать правильному соглашению по именованию файлов плагина и именам классов. Папка плагина и имена файлов создаются по следующей схеме:

plugins/<тип плагина>/<название плагина>/<название плагина>.php

Например, SEF плагин - plugins/system/sef/sef.php. У плагинов есть XML-файл с таким же именем (например, plugins/system/sef/sef.xml). Мы обсудим XML-файл позже, когда будем говорить о создании своего собственного плагина.

Имя класса плагина основывается на следующем соглашении по именованию:

"plg" + <тип плагина> + <имя файла плагина>

Напрмер, имя класса SEF плагина будет plgSystemSEF.

Типы плагинов: где вы можете вставить плагин?

Плагины исполняются, когда вызываются их события. События плагинов, которые определены в Joomla, отличаются от событий в событийно-ориентированных программах. В событийно-ориентированном программировании программа ждет события, которые чаще всего относятся к действиям пользователя (клик мышки, ввод с клавиатуры и т.п.). А в Joomla события можно представить как контрольные точки вдоль различных путей цикла исполнения. Каждый раз, когда цикл исполнения достигает контрольной точки события, событие вызывается.

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

Authentication (Аутентификация)
Существует только одно событие для аутентификации - onUserAuthenticate. Это событие вызывается тогда, когда пользователь пытается авторизоваться на сайте или в панели управления.

Captcha (Капча)
Капча помогает бороться со спамом, заставляя пользователя вводить некоторый текст, который основан на искаженном изображении. Капча появилась в Joomla начиная с версии 2.5. Она реализована помощью трех событий: onInit, onDisplay и onCheckAnswer.

Content (Контент)
Плагины контента вызываются, когда отображается или редактируется контент. Список событий контента:

onContentAfterDelete
onContentAfterDisplay
onContentAfterSave
onContentAfterTitle (начиная с Joomla 3)
onContentBeforeDelete
onContentBeforeDisplay
onContentBeforeSave
onContentBeforeTitle
onContentChangeState
onContentPrepare
onContentPrepareData
onContentPrepareForm

Contacts (Контакты)
Плагины контактов включают всего два события: onSubmitContact и onValidateContact.

Editors (Редакторы)
В Joomla редакторы реализованы в качестве плагинов. Однако, они не особо подходят под паттерн плагинов, которые мы обсуждаем. Добавление редактора в Joomla требует глубоких знаний JavaScript и не является легкой задачей. Список событий редакторов:

onInit
onSave
onSetContent
onGetContent
onGetInsertMethod
onDisplay

Editors-XTD
Плагины Editors-XTD используются для создания кнопок, которые отображаются под редакторами (например: Изображение, Разрыв страницы и  Подробнее). Существует два события этого типа: onDisplay и onCustomEditorButton.

Extension (Расширение)
Этот тип плагина появился в Joomla 1.6. События расширений вызываются тогда, когда расширения устанавливаются, удаляются или редактируются в Менеджере модулей, плагинов, шаблонов или языков. Список событий:

onExtensionBeforeInstall
onExtensionBeforeUpdate
onExtensionBeforeUninstall
onExtensionAfterInstall
onExtensionAfterUpdate
onExtensionAfterUninstall

Quickicon (Быстрый запуск)
Плагины быстрого запуска используютя для создания иконок, которые отображаются на стартовой странице панели управления. Для данного типа существует всего одно событие - onGetIcons, которое вызывается тогда, когда модуль Quick Icons конструирует набор иконок.

Search (Поиск)
Плагины поиска реализуют функционал поиска в Joomla. Базовые плагины: категории, контакты, контент, ленты новостей и ссылки. События поиска: onContentSearchAreas и onContentSearch. Событие onContentSearchAreas используется для создания массива контента для поиска. Событие onContentSearch используется для исполнения поиска для каждого типа контента. Разработчики расширений могут включать плагины поиска в свои расширения, чтобы разрешить поиску Joomla работать с их компонентом.

Smart Search (Finder - Умный поиск)
Плагины умного поиска находятся в папке plugins/finder. Эти плагины используются для индексации контента сайта для использования с компонентом "Умный поиск". Существуют плагины для каждого типа контента (категории, контакты, контент, ленты новостей и ссылки) и могут быть включены для разрешения индексации. Список событий:

onFinderAfterDelete
onFinderAfterSave
onFinderBeforeSave
onFinderCategoryChangeState
onFinderChangeState

System (Система)
Системные плагины предоставляют события, которые вызываются при каждом цикле исполнения Joomla. Они включают событие onAfterInitialise (первое событие, которое вызывается в Joomla) и события, привязанные к методам render(), dispatch() и route(). Системные события необходимо использовать для плагинов, которые необходимо вызывать во время каждого цикла исполнения, независимо от того, какая выполняется задача. Список событий:

onAfterInitialise
onAfterRoute
onAfterDispatch
onAfterRender
onBeforeCompileHead
onBeforeRender

User (Пользователь)
Плагины пользователя вызываются во время двух различных задач. Одна группа событий привязана к редактированию информации о пользователе в Менеджере пользователя (например: onUserAfterDelete и onUserBeforeSave). Вторая группа событий относится авторизации на сайте (например: onUserLogin и onUserLogout). Список событий:

onUserAfterDelete
onUserBeforeDelete
onUserBeforeSave
onUserAfterSave
onUserLogin
onUserLogout
onLoginFailure
onLogoutFailure
onUserAuthenticate
onUserAuthorisation

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

Оригинальная статья: Mark Dexter and Louis Landry
Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)