Цикл статей "Создание плагина для Joomla 2.5 и Joomla 3" мы начнем с рассмотрения общей информации о плагинах: что такое плагины, каким образом они работают в Joomla и какие типы плагинов существуют.
Английские термины и их перевод
Во избежания недопонимания в связи с использованием и переводом некоторых английских терминов, предлагаю вашему вниманию список соответствия этих терминов их переводу на русский (список будет пополнять по мере написания статей):
- plugin
- плагин
- execution cycle
- цикл исполнения
- event
- событие
- to trigger event
- вызывать событие
Что такое плагин?
Плагин, это простая PHP программа, которая исполняется в одной или более предопределенных точках в цикле исполнения Joomla. Эти точки называются событиями и вызываются изнутри Joomla.
Плагин может быть очень простым - например, установить значение перед сохранением в базу данных. Или он может быть очень сложным - например, конвертировать все URL в документе в другой формат. Плагины даже можно использовать для переопределения стандартных базовых классов Joomla.
Плагины привязаны к событиям. Для понимания плагинов, нам необходимо знать предопределенные события в Joomla, а также понимать, как создавать свои собственные события.
Как же работают плагины?
Работа плагинов заключается в трех шагах:
- Один или несколько плагинов включаются в текущий скрипт, обычно с помощью метода JPluginHelper::importPlugin(). Так как плагины, как правило, являются объявлениями классов, в этой точке не происходит исполнения кода.
- Вызывается событие, обычно с помощью метода $dispatcher->trigger() (где $dispatcher - это объект класса JDispatcher). Каждое событие имеет название, такое как
onBeforeInitialise
илиonContentBeforeSave
. - Код, обрабатывающий событие, ищет среди включенных плагинов загруженные на данный момент. Затем он проверяет, есть ли у них метод, который совпадает с названием события. Если такие методы найдены, то они исполняются.
Загрузка и исполнение 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.