Загрузка...

Для начала давайте разберемся с тем, что же вообще такое плагин Joomla. Вообще, если отбросить шаблоны, в Joomla есть три типа расширений, которые увеличивают функциональность сайта. Это:

  • Компоненты
  • Модули
  • Плагины

Компоненты Joomla позволяют создать приложения с широким функционалом. Если вам нужны уникальные типы контента, отдельные страницы сайта с контентом этих типов, уникальные URL для таких страниц – ваш выбор компонент. Примеры компонентов: форум, интернет-магазин, социальная сеть, тикет-система, система бронирования и т.п.

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

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

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

Хак ядра Joomla (или просто «Хак») – внесение изменений в код системных файлов Joomla, которые могут быть стерты при обновлении CMS.

Из определения должно быть понятно, чем плохо вносить хаки, но всё-таки поясню.

В Joomla есть файлы ядра (первоначальные) – те, которые поставляются в архиве с CMS, и файлы установленных расширений (добавленные) – те, которые появляются после установки администратором расширений или других манипуляций с сайтом. Разделение файлов на такие группы не обязательно связано с их назначением. Например, файлы модуля Joomla могут являться как файлами ядра (когда модуль поставляется вместе с Joomla), так и файлами установленных расширений (когда вы сами установили этот модуль в Joomla). Это же относится и к другим типам расширений.

Теперь представьте, что вы внесли некоторое изменение в файл ядра (создали хак). В случае обновления Joomla (которые, кстати, выходят довольно часто) существует вероятность, что разработчики в обновленной версии внесли изменения в тот же самый файл, в который внесли их и вы. Что произойдет в этом случае? Файл с вашими изменениями (с хаком) просто будет перезаписан файлом из обновленной версии. При этом все изменения, которые вы вносили, будут удалены. Не очень приятно, не правда ли?

Интересно еще и другое. Файлы установленных расширений тоже являются системными файлами ядра, но только уже не Joomla, а данных расширений. Например, в случае, если вы установили модуль, внесли в его файлы изменения, а затем вышло обновление модуля и вы обновили его на сайте, с вашими изменениями произойдет ровно то же самое, что и в случае хака Joomla – они будут стерты при перезаписи.

Вы спросите: «Как же тогда вообще вносить изменения в файлы, если это необходимо?». Одним из решений описанной выше проблемы, являются, так называемые, переопределения макетов и альтернативные макеты. Они работают хорошо, но, к сожалению, как понятно из названия, переопределяют только макеты отображения, но не функционал ядра.

Другим решением как раз и являются плагины.

Плагин позволяет вставить в некотором месте выполнения программы (php-скрипта) свой собственный код, который будет изменять или расширять функционал этой программы.

Интересно, что при использовании плагина, нам не нужно будет вносить изменения в файлы ядра. Вы спросите: «Как такое возможно?». Это будет важный и правильный вопрос.

Я предлагаю представлять плагин, как флешку для компьютера. Joomla же, в данном случае, это сам компьютер. Также плагином может быть любое другое устройство, которое вы вставляете в разъем USB. Что при этом происходит? С помощью дополнительного устройства вы расширяете функционал компьютера, не внося в его конструкцию никаких изменений. Вы вставили флешку – появился дополнительный диск, вы вставили колонки – компьютер теперь может воспроизводить звук. Компьютер может работать как с этим устройством, так и без него. Наличие этого устройства необязательно. Сам компьютер от него никак не изменяется.

Плагины в Joomla работают аналогичным образом – они расширяют функционал, не обязательно, видимый, путем включения своего кода  в код основной системы. А роль разъема USB, который используется для соединения компьютера и флешки, в Joomla выполняют так называемые триггеры (triggered events).

Триггеры для плагинов Joomla

Триггер в Joomla, представляет собой «разъем», в который может подключиться плагин и выполнить свой код. В коде Joomla это выглядит примерно следующим образом:

1
2
3
4
5
Код Joomla;
Код Joomla;
Выполнить код плагинов определенного типа, если такие существуют в CMS (это триггер);
Код Joomla;
Код Joomla;

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

Таким образом, с помощью плагинов и триггеров, мы получаем в Joomla аналог разъема USB. Разница лишь в том, что в Joomla много мест, где вставлены триггеры (строчки вызова выполнения плагинов). Разработчики Joomla не знают, где именно вам потребуется вызвать код плагина, но они стараются предугадать места, где вам это может потребоваться с наибольшей вероятностью.

В Joomla существует известный набор триггеров, расположенных в разных частях CMS. Все триггеры  разбиты на группы. Каждая такая группа характеризует один из типов плагинов.

Типы плагинов Joomla и существующие наборы их триггеров

Каждый плагин Joomla относится к определенному типу. Тип плагина указывает на место его исполнения в CMS и примерный функционал. Кроме того, каждый тип плагинов имеет предопределенный набор триггеров.

1

Рассмотрим  типы плагинов Joomla, а также триггеры, которые они в себя включают. Место вызова триггера обычно понятно из его названия не требует дополнительных пояснений.

Тип «Authentication»

Плагины, которые выполняются при авторизации пользователя.

Триггеры:

  • onUserAuthenticate

Тип «Captcha»

Плагины, которые выполняются в процессе работы с капчами.

Триггеры:

  • onInit
  • onDisplay
  • onCheckAnswer

Тип «Content»

Плагины, которые выполняются в процессе работы с контентом (создания, изменения, сохранения, удаления, отображения и др.).

Триггеры:

  • onContentPrepare
  • onContentAfterTitle
  • onContentBeforeDisplay
  • onContentAfterDisplay
  • onContentBeforeSave
  • onContentAfterSave
  • onContentPrepareForm
  • onContentPrepareData
  • onContentBeforeDelete
  • onContentAfterDelete
  • onContentChangeState
  • onContentSearch
  • onContentSearchAreas

Тип «Editors»

Плагины, которые выполняются в процессе работы с текстовыми редакторами Joomla.

Триггеры:

  • onInit
  • onSave
  • onSetContent
  • onDisplay
  • onGetContent
  • onGetInsertMethod

Тип «Editors-XTD»

Плагины, которые выполняются в процессе работы с текстовыми редакторами Joomla (добавление дополнительных кнопок под редактором).

Триггеры:

  • onDisplay

Тип «Extensions»

Плагины, которые выполняются в процессе работы с расширениями Joomla (установка, обновление, удаление и др.).

Триггеры:

  • onExtensionAfterInstall
  • onExtensionAfterUninstall
  • onExtensionAfterUpdate
  • onExtensionBeforeSave
  • onExtensionAfterSave

Тип «Finder»

Плагины, которые выполняются в процессе работы умного поиска. Чаще всего сюда попадают плагины, индексирующие различный контент для умного поиска.

Триггеры:

  • onFinderCategoryChangeState
  • onFinderChangeState
  • onFinderAfterDelete
  • onFinderBeforeSave
  • onFinderAfterSave

Тип «Quick Icons»

Плагины, которые выполняются в процессе создания иконок (модуль quickions) на главной странице админки.

Триггеры:

  • onGetIcons

Тип «System»

Плагины, которые выполняются в ходе генерации любой страницы сайта.

Триггеры:

  • onAfterInitialise
  • onAfterRoute
  • onAfterDispatch
  • onAfterRender
  • onBeforeRender
  • onBeforeCompileHead

Тип «User»

Плагины, которые выполняются в процессе работы с пользователями (авторизация, регистрация, изменение информации о пользователе и др.).

Триггеры:

  • onUserAuthorisation
  • onUserAuthorisationFailure
  • onUserBeforeSave
  • onUserAfterSave
  • onUserBeforeDelete
  • onUserAfterDelete
  • onUserLogin
  • onUserLoginFailure
  • onUserAfterLogin
  • onUserLogout
  • onUserBeforeSaveGroup
  • onUserAfterSaveGroup
  • onUserBeforeDeleteGroup
  • onUserAfterDeleteGroup

Тип «Contact Component»

Плагины, которые выполняются в ходе работы с компонентом контактов.

Триггеры:

  • onValidateContact
  • onSubmitContact

Тип «Installer Component»

Плагины, которые выполняются в процессе работы инсталлера Joomla (установка и удаление расширений).

Триггеры:

  • onInstallerBeforeInstallation
  • onInstallerBeforeInstaller
  • onInstallerAfterInstaller

Тип «Menu Component»

Плагины, которые выполняются в ходе работы с пунктами меню Joomla.

Триггеры:

  • onAfterGetMenuTypeOptions

Тип «Module»

Плагины, которые выполняются в ходе работы с модулями.

Триггеры:

  • onRenderModule
  • onAfterRenderModule
  • onPrepareModuleList
  • onAfterModuleList
  • onAfterCleanModuleList

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

Параметры триггеров в Joomla

Согласитесь, триггеры были бы не слишком полезны, если бы просто вызывали плагин, без какого-либо взаимодействия с остальным кодом. Например, какой смысл в триггере onUserLogin, вызывающемся после авторизации пользователя, если мы не знаем, какой именно пользователь был авторизован?

Именно поэтому каждый триггер передает в плагин набор наиболее важных параметров о событиях, с которыми он связан. Так, например, триггер onUserLogin, передает в плагин данные о пользователе, который только что прошел авторизацию, а также параметры этой авторизации.

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

Создание собственных триггеров

У вас может возникнуть вопрос: «Что делать, если ни один из существующих триггеров мне не подходит»? Бывают задачи, когда ваш код должен быть выполнен в таком месте, где триггеров нет. В этом случае вам придется сделать хак. Но это может быть либо большой хак, изменяющий блоки кода в разных местах файла, либо маленький, добавляющий ваш собственный триггер в нужное место.

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

Создать собственный триггер в Joomla очень просто. Достаточно добавить в нужном вам месте следующий код:

1
2
3
JPluginHelper::importPlugin('<Тип_плагина>');
$dispatcher = JDispatcher::getInstance();
$results = $dispatcher->trigger( '<Название_триггера>',<Массив_параметров_триггера> );

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

Создание собственного плагина Joomla

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

Если вы хоть немного разбираетесь в PHP, и хотите написать собственный плагин, ознакомьтесь с этими материалами:

  • https://docs.joomla.org/Jx:Creating_a_Plugin_for_Joomla – инструкция по созданию собственного плагина на сайте документации Joomla (англ.)
  • https://github.com/joomla/joomla-cms-examples/tree/master/plugins – заголовки плагинов различных типов. Они немного устаревшие, но большинство работает в Joomla 3

Примеры использования плагинов Joomla

Напоследок, хочу привести несколько примеров того, что можно делать с помощью собственных плагинов.

  • Отправка письма пользователю после его авторизации, аналогично тому, как это сделано в ВК. Что-то вроде: «В ваш аккаунт выполнен вход…»
  • Автоматический репост анонса статьи в социальные сети после ее создания и сохранения в админке.
  • Автоматический сбор информации по всем запросам, которые вводили пользователи в форме поиска на сайте.
  • LazyLoad – «ленивая» подгрузка изображений в статье.
  • Добавление кнопок с уникальным функционалом в текстовом редакторе статьи.
  • Подмена мета-данных страниц сайта, избавление от дублей, перенаправление по определенным условиям.
  • Защита форм авторизации от подбора пароля

Всё это и многое другое можно реализовать с помощью плагинов Joomla, не используя хаки и не боясь, что изменения будут стерты при обновлении CMS.

{

}