Путь обработки запроса в фреймворке Joomla

Отлаживая ошибки или производя разработку для Joomla, полезно понять основной «Путь выполнения» в Joomla! (Execution Path). «Путь выполнения» — список вызовов функции, которые сделаны во время каждого запроса страницы. В то время как требования изменятся от запроса к запросу (в зависимости от параметров строки запроса, cookies, информации сеанса, и т.д.), основной путь обработки запроса — тот же самый каждый раз. Мы опишем основы и предоставим информацию, чтобы помочь разработчикам находить информацию для своей определенной ситуации.

Почти все запросы к Joomla! начинают обрабатываться в index.php файле находящемся в корне инсталлированной Joomla!. Запросы в администраторской части (back-end) идут в…/administrator/index.php файл, но подобны запросам с front-end. Есть также некоторые случаи, где определенные страницы могут быть вызваны напрямую, но в большинстве случаев, index.php — отправная точка.

…/index.php
Следующий код — мера по безопасности и определяет переменную, которую другие страницы используют для проверки возможности прямого вызова. Все другие php-файлы, которые нельзя вызывать непосредственно в Joomla! должны включать проверку этой переменной в верхней части файла:

// Включаем флаг указывающий на родительский файл
define( '_JEXEC', 1 );

Затем мы устанавливаем значения некоторых других переменных и включаем/требуем_включить некоторые файлы. Код ПРОФИЛИРОВЩИКА (PROFILER) используется, если у вас есть система отладки (Debug System), включенная в глобальной конфигурации, и используется, чтобы распечатать отладочную информацию внизу страницы. Мы можем видеть больше запросов и можем проигнорировать их:

define('JPATH_BASE', dirname(__FILE__) );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
JDEBUG ? $_PROFILER->mark( 'afterLoad' ) : null;

Наконец, мы получаем Joomla-объект «JApplication» и вызываем метод инициализирующий его:

$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();

Онлайн-ресурс Joomla! API — замечательное место, для использования его как справочник по функциям API Joomla. Например, функция getApplication инициализирующая метод, описана здесь:
http://api.joomla.org/Joomla-Framework/JFactory.html#getApplication
http://api.joomla.org/Joomla-Framework/Application/JApplication.html#initialise

API перечисляет файлы, связанные с этими двумя классами, которые могут быть найдены здесь:
…/libraries/joomla/factory.php
…/libraries/joomla/application/application.php

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

Затем мы импортируем системные плагины и запустим onAfterInitialise метод на них:

JPluginHelper::importPlugin('system');
JDEBUG ? $_PROFILER->mark('afterInitialise') : null;
// запускаем onAfterInitialise события
$mainframe->triggerEvent('onAfterInitialise');

triggerEvent метод — еще один из тех что мы будем часто видеть, но не будем объяснять его суть каждый раз. Этот вызов говорит Joomla! пройти каждый включенный плагин определенного типа и вызвать событие на нем (выполнить его код). В данном случае, это называется Событе onAfterInitialise системного плагина.

Затем, мы называем маршрутизирующий метод (route method):

$mainframe->route();

Это описание принципа работы route method содержащееся в коде файла application.php:

/**
* Выбор направления приложения.
*
* Маршрутизация это процесс проверки содержания запроса для определения компонента
* который должен получить запрос. Дополнительные параметры компонента, установленные 
* в запросе будут обработаны при получении.
*
*
* @abstract
* @access	public
*/
function route()

При авторизации мы допускаем юзера для просмотра пункта меню:

// авторизация
$Itemid = JRequest::getInt( 'Itemid');
$mainframe->authorize($Itemid);

Как только мы узнаем, что пользователь допущен, мы посылаем запрос соответствующему компоненту:

$option = JRequest::getCmd('option');
$mainframe->dispatch($option);

Вызов метода отправки (dispatch method) один из важных. Это — точка входа в компонент, который был затребован. Каждый запрос к Joomla! заканчивается тем, что вызывается определенный компонент похожими путями. Для примера, давайте предположим, что мы запрашиваем следующий URL:
/index.php?option=com_content&view=article&id=39&Itemid=37

Этот URL говорит Joomla! направить запрос к компоненту com_content. Переменная запроса Itemid говорит Joomla! для какого пункта меню предназначен этот запрос (с учетом авторизации). Большинство других переменных строки запроса используется в компоненте, но многие из них (представление, контроллер, задача, и т.д) используются в большинстве компонентов.

Joomla! выполнит следующий файл компонента: …/components/com_content/content.php
Для компонента com_somethingelse, Joomla! выполнит файл: …/components/com_somethingelse/somethingelse.php

В итоге мы формируем результирующий ответ пользователю:

$mainframe->render();
// trigger the onAfterRender events
JDEBUG ? $_PROFILER->mark('afterRender') : null;
$mainframe->triggerEvent('onAfterRender');
/**
 * ОТДАЕМ РЕЗАУЛЬТАТ ЗАПРОСА
 */
echo JResponse::toString($mainframe->getCfg('gzip'));

Метод отдающий результат запроса (render method) — еще один важный метод. Этот метод скажет объекту JDocument выполнить(предоставить) себя и результат будет применен в шаблоне и модулях. Эта тема будет также затронута в другой будущей статье, которая будет в конечном счете связана с этой.

Это все. Не так уж и сложно.
Источник: http://www.cmsmarket.com/resources/dev-corner/110-joomla-execution-path-walkthrough
Если появились вопросы или замечания к переводу — напишите, пожалуйста, в комментариях.

Комментариев: 5


Добавление комментария:

 css.php