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

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

Каким образом происходит подключение плагинов

Чтобы вызвать плагин вначале применяется JPluginHelper::importPlugin(), что позволяет включить его классы и методы в рабочую память. Если мы обратим внимание на то, каким образом происходит исполнение данного метода, то мы сможем обнаружить, что код (которым выполняется подключение) располагается в приватном методе import() класса JPluginHelper (libraries/joomla/plugin/helper.php):

 

if (!isset($paths[$path]))
{
    require_once $path;
}
$paths[$path] = true;

Первой строкой осуществляется проверка того, было ли добавление определенного плагина. Переменная $paths выступает в качестве ассоциативного массива, содержащего все плагины, которые уже являются подключенными. Ключ - полный путь до файла плагина, а значение - название класса. Применение PHP функции isset() позволит нам проверить, существует ли подобный элемент в массиве. Если ответ отрицательный, то при помощи require_once подключается этот файл. И в конце, значение данного элемента устанавливается в логическое true, что позволяет установить этот элемент в массив. Это значит, что require_onceуже не будет вызываться для того же файла.

При этом следует разобраться с двумя важными вещами:

  • Как мы уже обсуждали раньше, чаще всего плагином объявляется класс, что не приводит к вызову кода. Тем не менее, класс и его методы загружаются в рабочую память для того, чтобы далее его методы можно было вызвать в цикле. При этом, результат выполнения метода JPluginHelper::importPlugin() не является исполнением кода.
  • Joomla не заставит плагин выступать в роли объявления класса. Плагин может являть собой простой PHP скрипт - такой, который исполняется при его подключении. Если нами будет сделан подобный плагин, то его вызов будет незамедлительным после вызова метода JPluginHelper::importPlugin(). Такие основы присущи механизму загрузки PHP скрипта с подключением плагинов.

Процесс загрузки классов Joomla

Теперь мы нуждаемся в понимании важного момента. Он заключается о том, каким образом в Joomla реализована загрузка базового класса в область рабочей памяти. Если нам удастся присмотреться к функции jimport, которую чаще всего применяют для загрузки базовых классов Joomla, то мы сможем отметить, что это лишь функция в файле libraries/loader.php. Следует обратить внимание на то, что данная функция является независимой, а не методом класса. Именно по этой причине она вызывается только с именем функции, без использования имени класса. Вот код этой функции:

 

function jimport($path)
{
    return JLoader::import($path);
}

Он лишь вызывает метод JLoader::import(). Пример знакомит с первыми строками метода JLoader::import():

// Only import the library if not already attempted.
if (!isset(self::$imported[$key]))

Он является проверкой – прошло ли подключение класса или нет. Переменная self::$imported выступает в роли статического ассоциативного массива с ключом (переменной $key), который равен аргументу, который передается в JImport (к примеру, "joomla.plugin.plugin"), и значением, которое равно логическому true или false. В тот момент, когда класс подключен, элемент добавляется к массиву. Тогда значение устанавливается в true, при успешном выполнении подключения, или в false, если не успешно. Это значит, что в момент подключения класса, Joomla не будет совершать повторную попытку подключения.

Методами JLoader::load(), JLoader::register() также проверяется до загрузки класса, не произошла ли загрузка класса раньше. И здесь нам необходимо сделать ключевой вывод: если класс уже существует (находится в рабочей памяти), то нам необходимо пропустить загрузку этого класса. Методом лишь возвращается значение true и происходит выход. Ни одним методом Joomla не загружается класс заново.

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

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

К примеру: процесс переопределения класса JTableNested

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

Перечень шагов, которые следует пройти:

1. Создание новой папки plugins/system/myclasses в установочном каталоге Joomla. После этого переходим к копированию в нее файла libraries/joomla/database/tablenested.php. В итоге вами будет получен файл plugins/system/myclasses/tablenested.php (не забывайте о добавлении файла index.html для каждой создаваемой папки).

2. Редактирование нового файла и замена существующего метода rebuild() на следующий код:

public function rebuild($parentId = null, $leftId = 0, $level = 0, $path = '')
{
    exit('Из файла myclasses/tabelnested.php');
}

Этим кодом будет доказано, что произошла загрузка нашего переопределенного класса, который заменяет базовый класс. Когда нами будет нажато "Перестроить" (к примеру, в "Менеджере категорий: Материалы"), программой будет произведен выход с сообщением "Из файла myclasses/tabelnested.php".

3. Теперь нам необходимо заняться добавлением плагина для загрузки нашего класса, который заменит базовый класс. Нами будет дано следующее название плагину - "myclasses". Для этой процедуры потребуется создание нового файла с именем myclasses.php. Директорией является  папка plugins/system/myclasses.

4. В новом файле (plugins/system/myclasses/myclasses.php) должен быть добавлен следующий код:

<?php
/**
 * Демонстрация плагина для замены базового класса.
 * Он исполняется перед первым импортом системы (перед
 * событием onBeforeInitialise).
 */

// Запрет прямого доступа.
defined('_JEXEC') or die;

// Заменяем базовый класс JTableNested переопределенной версией.
include_once JPATH_ROOT.'/plugins/system/myclasses/tablenested.php';

Следует обратить внимание, что этим кодом не объявляется класс. Он является обычным скриптом, что указывает на то, что он будет исполнен при подключении системного плагина, до первого системного события. Этим кодом просто включается наш новый файл tablenested.php.

5. Создаем XML-файл манифеста под этот плагин (plugins/system/myclasses/myclasses.xml), который имеет следующий код:

<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="system">
    <name>plg_system_myclasses</name>
    <author>Mark Dexter and Louis Landry</author>
    <creationDate>November 2012</creationDate>
    <copyright>Copyright (C) 2012 Mark Dexter and Louis Landry.</copyright>
    <license>GPL2</license>
    <authorEmail>admin [at] joomla.org</authorEmail>
    <authorUrl>www.joomla.org</authorUrl>
    <version>1.0.0</version>
    <description>Демонстрация плагина MyClasses</description>
    <files>
        <filename plugin="myclasses">myclasses.php</filename>
        <filename>index.html</filename>
    </files>
    <config>
    </config>
</extension>

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

7. Переходим в "Материалы" -> "Менеджер категорий" и кликаем на "Перестроить". Joomla должна остановиться и вам будет показано сообщение "Из файла myclasses/tabelnested.php". Это является доказательством того, что нами успешно переопределен базовый класс.

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

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

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

echo '<pre>';
print_r(JLoader::getClassList());
echo '</pre>';
die();

Успехов во время разработки!

Портфолио
Память о Вас и Ваших близких на многие поколения
Подробнее
Прокат металла
Подробнее
Интернет-магазин кожи и меха
Подробнее
100% оригинальная парфюмерия в Москве
Подробнее
Вьетнамский ресторан премиум класса
Подробнее
Внедрение информационных систем
Подробнее
Организация международных конференций
Подробнее
Производство молочной продукции
Подробнее
Спортивный сайт
Подробнее
Интернет-магазин мебели и аксессуаров
Подробнее
Интернет-магазин электротранспорта
Подробнее
Сайт института актуальной экономики
Подробнее
Наши клиенты
Парк развлечений Boom Zoom
Алгор
Норбит
Molga Consulting
Metrotile
Нетология
Monqi
Премиум Пак
Aasha Herbals
Аджва
Салон красоты Сударушка
Пава
ТЦ &quot;Панфиловский&quot;
Фитнес Лаборатория
Система Главбух
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
Все отзывы
Добавить отзыв