Отлаживая ошибки или производя разработку для 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
Если появились вопросы или замечания к переводу — напишите, пожалуйста, в комментариях.
Довольно полезный официальный документ на эту тему: Joomla! API Execution Order (Порядок выполнения API Joomla!)
просто гениальнейшая статья по апи джумлы. Спасибо за труды! Очень помогает в ковырянии проекта на 1.5.
Спасибо, это как раз то что мне было нужно.
полезно, поучительно, спасибо
Замечательная статья! Все очень толково и просто — как раз для начинающих разбираться в механизмах работы Joomla. Спасибо!