Комментарии

Системный подключаемый модуль SEF
( 1 Проголосовало )

В качестве первого примера рассмотрим системный подключаемый модуль SEF. Он представляет собой класс plgSystemSef, объявляемый в файле plugins/system/sef/sef.php и активизирующий функции Joomla с целью использовать удобные для поиска URL (иначе называемые SEF URL).

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

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

JPluginHelper::importPlugin('system');

В этой строке кода содержится команда для загрузки всех активизированных подключаемых модулей в рабочую область оперативной памяти. (Если подключаемый модуль заблокирован в компоненте Plugin Manager (Диспетчер подключаемых модулей), то он не загружается.) Эту команду придется выполнить лишь один раз по ходу исполнения кода данного метода. После загрузки классов системных подключаемых модулей в рабочую область оперативной памяти можно инициировать одно или несколько системных событий.

Системные подключаемые модули, по существу, являются объявлениями классов, и поэтому выполнение кода в них не предполагается. А далее в методе render () из класса JSite фактически вызывается метод onAfterRender (), как показано ниже.

// инициировать событие onAfterRender $this->triggerEvent('onAfterRender');

В этой строке кода инициируется событие onAfterRender. Рассмотрим подробнее, как это делается. Переменная $this ссылается на объект типа JSite, а следовательно, в операторе $this->triggerEvent вызывается метод triggerEvent () из класса JSite с единственным аргументом в виде символьной строки 'onAfterRender'.

Класс JSite расширяет класс JApplication (из файла libraries/joomla/application/application.php). А поскольку в классе JSite отсутствует собственный метод triggerEvent (), т.е. он не переопределяет этот метод, наследуемый от родительского класса, то он вызывает данный метод из класса JApplication.

Итак, метод triggerEvent () из класса JApplication выполняется, а его код приведен ниже.

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

В коде данного метода сначала создается объект типа JDispatcher, а затем вызывается метод trigger (). Первый аргумент $event этого метода получает строковое значение 1 onAfterRender1, а второй аргумент $args — исходное пустое значение null, поскольку второй аргумент при вызове метода triggerEvent () не передается. В конечном итоге это приводит к выполнению метода onAfterRender () для каждого активизированного подключаемого модуля, доступного в рабочей области оперативной памяти. В данном случае поиск в рабочей области оперативной памяти ограничивается системными подключаемыми модулями, поскольку при вызове метода importPlugin ('system') был указан лишь системный тип подключаемых модулей.

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


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости
Добавить комментарий


Защитный код