•  
  •  
  •  
  •  
1 1 1 1 1 1 1 1 1 1 Рейтинг 5.00 (1 Голос)
Примеры того, как использовать плагины - 5.0 out of 5 based on 1 vote

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

System: SEF

Наш первый пример заключается в SEF плагине. Этому классу дано имя plgSystemSef в файле plugins/system/sef/sef.php. Он обеспечивает для Joomla использование ЧПУ (человекопонятных УРЛ). Этим плагином сканируется HTML-документы на присутствие ссылок, которые преобразуются в  вид человекопонятных ссылок. Ним также проводится замена относительных URL полными URL для определенных иных типов ссылок.

Каким образом происходит его вызов?

Приступим к просмотру того, где же происходит исполнение этого плагина. Говоря иначе, приступим к  рассмотрению кода, в который включен данный плагин и который занимается вызовом события этого плагина. SEF плагин является системным плагином и его вызов происходит совместно с событием onAfterRender. До того как вызывать событие, нам необходимо обеспечить включение файла плагина.

Если нами загружается страница с фронт-енда нашего ресурса, то мы можем воспользоваться методом render() класса JSite (в файле includes/application.php). Перед окончанием данного метода код будет выглядеть следующим образом:

JPluginHelper::importPlugin('system');

Этой командой загружается в рабочую память весь массив включенных системных плагинов (если плагин выключается с помощью Менеджера плагинов, то его загрузка не происходит). Когда классы системных плагинов находятся в рабочей памяти, то нам доступен вызов одного или более системного события. Так данные плагины выступают в роли простых объявлениях классов, нами пока не выполнялся никакой код. Дальше в методе render() класса JSite мы на самом деле вызываем метод onAfterRender():

// Trigger the onAfterRender event.
$this->triggerEvent('onAfterRender');

Этим кодом вызывается onAfterRender(). Следует проследить за кодом, для лучшего понимания происходящего процесса. Переменную $this считаем объектом класса JSite, поэтому $this->triggerEvent обеспечивает вызов метода triggerEvent() класса JSit, в котором только один параметр – строка "OnAfterRender".

JSite занимается расширением класса JApplication. Так как JSite не оснащен собственным методом triggerEvent() (иначе говоря, ним не переопределяется наследуемый от родительских классов метод), то ним вызывается метод JApplication:

function triggerEvent($event, $args=null)
{
     $dispatcher = JDispatcher::getInstance();
     return $dispatcher->trigger($event, $args);
}

Этим кодом создается объект типа JDispatcher после чего вызывается метод trigger() этого объекта. Параметру $event задается значение "onAfterRender", а второму параметру $args устанавливается значение по умолчанию "null", так как нами он не передавался.

Результат этих действий заключается в исполнении методов onAfterRender() для всякого рабочего плагина, доступ к которому обеспечивает рабочая память. При этом поиск ограничивают системные плагины, потому что нами указан тип "system", во время вызова importPlugin('system'), поэтому рабочая память обладает только системными плагинами.

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

Authentication: joomla

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

Плагин относится к файлу plugins/authentication/joomla/joomla.php, а имя его класса plgAuthenticationJoomla.

Способ его вызова

Когда пользователем осуществляется попытка авторизации на сайте, происходит метод authenticate() класса JAuthentication. Этот метод имеет ожидаемый фрагмент кода:

$plugins = JPluginHelper::getPlugin('authentication');

Нею обеспечивается загрузка в рабочую память всех включенных плагинов аутентификации. После этого метод представляет для нас оператор foreach:

foreach ($plugins as $plugin)
{
 $className = 'plg'.$plugin->type.$plugin->name;
 if (class_exists($className)) {
    $plugin = new $className($this, (array)$plugin);
 }
 else {
    // bail here if the plugin can't be created
    JError::raiseWarning(50, JText::sprintf('JLIB_USER_ERROR_AUTHENTICATION_FAILED_LOAD_PLUGIN', $className));
    continue;
 }
 
 // Try to authenticate
 $plugin->onUserAuthenticate($credentials, $options, $response);
}

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

Content: joomla

Плагин расположен в файле plugins/content/joomla/joomla.php, а название его класса plgContentJoomla. Он обладает двумя методами. Метод onContentAfterSave() применяется для отсылки уведомлений для пользователей с помощью электронной почты во время сохранения нового материала. Метод onContentBefore Delete() применяется в целях проверки категорий до их удаления - связаны ли с ними какие- либо данные, контакты и т.п.

Займемся рассмотрением метод onContentBeforeDelete().

Каков его вызов?

Когда пользователем удаляется категория, данные, контакты и иные «айтемы» с помощью администраторской панели Joomla, то происходит вызов событие onContentBeforeDelete. Одним из мест его проведения является класс JModelAdmin. Если нами будет изучен метод delete, то мы столкнёмся со следующим кодом:

// Trigger the onContentBeforeDelete event.
$result = $dispatcher->trigger($this->event_before_delete, array($context, $table));

В нем свойство event_before_delete получило значение onContentBeforeDelete в методе конструктора класса.

Этот код интересен по следующим двум вещам. Первый момент заключается в том, что нами ожидается возвращаемое значение, которым является переменная $result. Вторым моментом является то, что нами передаются два параметра в метод trigger(): название события и массив с двумя элементами. Методом trigger() распаковывается данный массив и передает каждый из его элементов в качестве параметров в метод ContentBeforeDelete(). Наш случай заключается в использовании двух параметров $context и $table. Переменная $context содержит в себе информацию о том, каков контекст являлся причиной вызова этого события (к примеру, "com_categories.category"). Переменная $table является массивом с данных, которые планируется удалить.

Для чего пользоваться плагинами?

Ответ данному вопросу – из-за гибкости. Для примера рассмотрим плагин "Content: joomla". При  проверке категории до ее удаления в плагине, нами предоставляются для администратора определенные варианты. Вначале, плагины можно выключить, что позволяет администратору отключить проверку категории. Далее, наличие параметров в плагине обеспечивает индивидуальное включение/выключение проверки. Также, вами может быть предоставлен собственный плагин, которым заменяется либо дополняется функциональность данного плагина или любого иного стандартного плагина. К тому же, этим плагином предоставляется легкая шаблонная модель для разработчиков, которые занимаются сторонними расширениями, которым хочется внедрить проверку категорий в собственных расширениях.

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

Следующая статья позволит приступить к практике и перейти к созданию личного плагина.

Портфолио
Память о Вас и Ваших близких на многие поколения
Подробнее
Прокат металла
Подробнее
Интернет-магазин кожи и меха
Подробнее
100% оригинальная парфюмерия в Москве
Подробнее
Вьетнамский ресторан премиум класса
Подробнее
Внедрение информационных систем
Подробнее
Организация международных конференций
Подробнее
Производство молочной продукции
Подробнее
Спортивный сайт
Подробнее
Интернет-магазин мебели и аксессуаров
Подробнее
Интернет-магазин электротранспорта
Подробнее
Сайт института актуальной экономики
Подробнее
Наши клиенты
Парк развлечений Boom Zoom
Алгор
Норбит
Molga Consulting
Metrotile
Нетология
Monqi
Премиум Пак
Aasha Herbals
Аджва
Салон красоты Сударушка
Пава
ТЦ "Панфиловский"
Фитнес Лаборатория
Система Главбух
Vanguard
GoAsia
ТЦ «Солнечный ветер»
Teledoc
Tchernov Cable
Отзывы
Благодарю компанию web-now.pro за помощь в разработке и запуске проекта POLITSECRETS.RU. Перед нами стояла задача – внедрить проект в сжатые сроки и по оптимальной цене. Порадовало то, что мне подроб...
Вера БлашенковаСекреты успешных выборов, Москва... апр.2016
Мне очень понравился подход с которым нас встретили "Ваша задача заниматься бизнесом, наша - сделать Вам представительство в сети". После этого ребята разработали полное тз на проект, мы внесли пожела...
МаксимIT-TASK, Москва... янв.2016
Работа проделана хорошо! Дизайнер и менеджер на отлично. Надеюсь на сотрудничество в дальнейшем. Есть шероховатости в деталях по задачам, но приятно сказывается оперативность и желание исправить, внес...
БруноСоциальная сеть След Жизни, Москва... янв.2016
Работой остались очень довольны. К работе подходят ответственно, аккуратно, открыто. Проект был сдан чуть раньше срока, по ходу работы возникали изменения, все они принимались безоговорочно, работа вы...
ЕвгенийМагазин текстиля, Москва... дек.2015
Сотрудничаем с 2007 года и сделали не один проект. Самое главное - команда умеет отстаивать своё мнение и постоянно развивается.
МарияМеждународные конференции, Москва... дек.2015
Спасибо всему коллективу компании! Разработали красивый и что самое главной рабочий интернет магазин! Реклама настроена и запущена, продажи идут, бизнес развивается! Нам постоянно подсказывают о новых...
ВадимИнтернет магазин Aromatic.pro, Москва... сен.2015
Большое спасибо команде за оперативность, качественные работы, отличный креатив и привлекательные цены!
Виктория, ОАО "Фармстандарт... июль.2015
Здравствуйте уважаемые партнеры! С наступающим Новым Годом! Желаю Вам дальнейшего процветания и успехов в Вашей благородной работе! С вами приятно сотрудничать! Очень благодарен Вам за своевременное о...
Сергей ЮрченкоКинотруд, Москва... дек.2014
Благодарим команду Brand Now и лично Дениса Логинова за оригинальное видение,разнообразие идей, четкость взаимодействия и безукоризненное соблюдение сроков выполнения проекта! Планируем продолжить сот...
ТатьянаBizness Linkerz... июль.2014
Компания КУН выражает благодарность за сотрудничество: непростая задача была выполнена в требуемые сроки и полностью удовлетворила заявленному ТЗ. Приятно удивила готовность Генерального директора нач...
Мария, Компания КУНhttp://www.kuhn.com/... апр.2014
Все отзывы
Добавить отзыв