Куда идем?

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

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

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

Что такое плагины Joomla и зачем они нужны?

Для начала давайте разберемся с тем, что же вообще такое плагин 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 это выглядит примерно следующим образом:

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

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

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

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

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

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

Типы плагинов Joomla

Рассмотрим  типы плагинов 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 очень просто. Достаточно добавить в нужном вам месте следующий код:

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

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

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

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

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

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

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

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

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

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

--------

Если вы серьезно занимаетесь IT-технологиями и ищите подходящий дата-центр для размещения своих серверов, то всегда можете разместить сервер в Москве. Здесь же можно арендавать сервер или серверную стойку. Поверьте, это гораздо удобнее, чем сидеть рядом с ним в офисе =).

Об авторе
Wedal
(Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.
Добавить комментарий

Комментарии  
0
Здравствуйте, а вы не знаете, можно ли обеспечить исполнение системного плагина раньше, чем контентного? Столкнулся с тем, что SEO glossary сперва находит слово, а только потом срабатывает плагин rokcandy и преобразует сниппет в html, за который seo glossary цепляться не должен...
1
Антон, я уже немного подзабыл этот момент. В ядре Joomla плагины перебираются в цикле и их код выполняется последовательно, в зависимости от сортировки. Т.е., например, вы можете поменять в менеджере плагинов два плагина местами, и тогда последовательность выполнения их кода изменится.
Вот что уже не помню, так работает ли это для разных групп плагинов или только для плагинов в пределах одной группы. Так или иначе, попробуйте изменить порядок этих плагинов в админке. Возможно это поможет.
0
Спасибо. Статья действительно помогла понять суть плагинов joomla.
Было бы классно если бы был ещё какой-то конкретный пример. )
0
Добрый человек, подскажи пожалуйста, не отображается плагин CAPTCHA - Invisible reCAPTCHA файлы есть, а в плагинах нигде не отображается, как его переустановить??? всю голову сломал
0
Сергей, если файлы есть а в плагинах ТОЧНО нет, то это исключительный случай. Это встроенный плагин, насколько мне известно. Его можно удалить через админку, но тогда удалились бы и файлы. Теоретически, можно удалить только запись о нем из базы данных, но не представляю, кто стал бы так заморачиваться. Я бы предположил, что всё-таки плагин есть в списке плагинов в админке, но вы плохо искали. Если всё-таки вы уверены, что его нет в списке, то переходите в Расширения -> Менеджер расширений -> Найти, и жмите кнопку "Найти". В списке вы должны увидеть искомый плагин. Если это так, то действительно не было записи о нем в базе. Тогда выделяйте его и жмите "Установить". Если вы не увидели этого плагина, то значит он уже установлен и нужно лучше искать в списке плагинов.
1
Не вводите людей в заблуждение.
Триггер это "Спусковой крючок", даже в переводе и ни как не порт как у USB. Один порт одно устройство. По факту команда для выполнения метода ЛЮБОГО активного плагина, если такой метод у него есть. Да, да... любой группы которая была загружена. За загрузку обычно отвечает компонент, но можно и самостоятельно. Если писать плагины в группе system, то грузиться они будут автоматически.
0
Лёха, приведите более понятную аналогию из жизни. USB не обязательно означает одно устройство. И устройство не обязательно означает один плагин. Согласен, если рассматривать сравнение очень дотошно, оно может быть где-то не очень корректным. Но в целом представление дает.

Насчет плагинов группы System - да, вы правы - они выполняют любые триггеры, не только относящиеся к системным. Это важное замечание. Отсюда же следует, что с данным типом плагинов нужно быть максимально осторожным, ведь разделение на группы было придумано не просто так - а для увеличения производительности.
1
Плагины можно сравнить с рабочими:

Пригласим для выполнения работ бригады (группы)
JPluginHelper::importPlugin('superplugins');
JPluginHelper::importPlugin('mycomponent');

Есть задача "Кто поклеит зеленые обои?"
$dispatcher->trigger( 'onPastingWallpaper', array($address, 'green'));

На это из ПРИГЛАШЕННЫХ бригад откликнулись (плагины) Петров, Иванов. У них как раз есть эти способности (методы)
public function onPastingWallpaper($address, $color){}

Петров получив задание и увидев адрес сказал "Далеко!" и отказался, а Иванова все устроило и он выполнил задачу.
1
Лёха, хорошее сравнение, спасибо! Возможно, для кого-то из читателей оно будет более понятно.

Хотя пример последнего абзаца требует уточнения: Петров сможет отказаться только в том случае, если это есть у него в голове (воля, характер, инстинкты, лень). Если же Петров - типичный ответственный работник, без заскоков (нет в плагине кода, который отвергал вы выполнения для отдельных адресов) - то он также выполнит задачу, как и Иванов. Т.е. обои поклеят оба: сначала один, потом второй. Первым этот сделает тот, кто ближе (плагин, который в списке плагинов в сортировке приоритетов стоит выше).