Схема работы Joomla
Обработка запроса в Joomla состоит из нескольких этапов:
- Входной запрос передается на файл index.php – либо запрошенный адрес непосредственно передается от пользователя к интерпретатору языка PHP, либо при помощи конструкций mod_rewrite вид входного запроса модифицируется для того, что бы Joomla могла его понять.
- Включается конфигурационный файл configuration.php.
- Если в конфигурации указано, что сайт находится “на техническом обслуживании”, то работа прекращается и пользователю выдается предупреждение о том, что сайт закрыт. Флаг закрытости сайта устанавливается в административной части Joomla, либо путем ручной правки конфигурационного файла.
- Инициализация, включение основных системных файлов (как правило, находящихся в директории /includes/) и создание объекта доступа к базе данных (параметры соединения, такие как логин и пароль указываются в файле конфигурации).
- Загружаются на выполнение системные мамботы (мамботы находящиеся в папке /system/). В стандартном дистрибутиве таких мамботов нет, но существует множество сторонних мамботов, как например AutoLiveSite, позволяющий динамически подменять конфигурационную переменную $mosConfig_live_site в зависимости от того, какой хост был запрошен. Определение вызываемого компонента зависит от настроек конфигурационного файла Joomla:
- Если установлен SEF-компонент (компонент, преобразующий ЧПУ-адреса в стандартную нотацию адреса в Joomla, вида “index.php?option=com_component&task=task&…”), то вызываемый на исполнение компонент не очевиден (по виду адреса его определить не возможно). Таким примером может быть компонент OpenSEF. И именно он вычисляет переменную $option хранящую имя компонента, и другие параметры адресной строки.
- Если SEF-компонентов нет, то имя компонента берется из $_GET переменной “option” ($_GET - это стандартная суперглобальная переменная языка PHP, предназначенная для хранения аргументов из GET-части запроса браузера).
- Если таковая переменная не указана (или индекс массива пуст), то имя компонента определяется по первому опубликованному пункту меню mainmenu.
- Создается основной объект mosMainFrame, управляющий всеми событиями и обеспечивающий основной функционал (например у него есть метод setPageTitle предназначенный для установки заголовка страницы).
- Инициализация пользовательской сессии. Сессии ведутся при помощи cookies – механизма HTTP-протокола, позволяющего хранить часть данных на пользовательском компьютере, и сессии хранящейся в таблице #__session.
- Отдельно обрабатывается событие входа/выхода пользователя – в этом случае сессия создается или уничтожается.
- Запускается на выполнение компонент, определенный на предыдущем шаге.
- При помощи функции ob_start языка PHP создается буфер вывода, что бы вывод не направлялся сразу в браузер пользователя.
- Проверяются права доступа пользователя по его идентификатору группы к данному пункту меню:
- Любой пункт меню имеет свой ID хранящийся в базе.
- Если пункт меню определен по переменной Itemid то происходит выборка именно по ID
- Если пункт меню не определен, то в таблице меню ищется подстрока соответствующая запросу данного компонента “option=com_компонент”
- Если определена переменная task (стандартно все компоненты, определяют выполняемую функцию именно по ней) то к запросу поиска добавляется ее значение “option=com_компонент&task=задача”
- Если уровень доступа данного пункта меню меньше чем уровень доступа пользователя – доступ к компоненту запрещается.
- Если доступ разрешен, то включается файл /components/com_компонент/компонент.php, если запрещен – выдается стандартное предупреждение о невозможности доступа.
- Выполняется код компонента (он может вызывать мамботы, включать сторонние файлы и действовать другим образом согласно правам пользователя и собственной логике работы). В общем случае работа компонента сводится к:
- Выполнении запросов в базу данных, модифицирующих или считывающих данные в зависимости от вызванной функции.
- Использовании функции языка PHP echo, предназначенной для вывода уже сформированного html-размеченного текста.
- Вывод компонента сохраняется в глобальную переменную $_MOS_OPTION при помощи функции ob_get_contents.
- Включается шаблон, определенный в настройках:
- Либо шаблон по умолчанию, название берется из конфигурационного файла configuration.php.
- Либо шаблон, специально присвоенный для данного пункта меню в административной части.
- В шаблоне при помощи функций mosLoadModules загружаются модули на соответствующие позиции. Исполнение модуля состоит из следующих этапов:
- Определение имени модуля
- Если включено кэширование и модуль находится в кэше, то модуль не вызывается на исполнение, результат берется из файла кэша.
- Для того, что бы поймать вывод модуля в буфер, как и в случае с компонентами используется семейство фукнций ob_* язка PHP. В зависимости от типа модуля происходит:
- Выполнение программного кода, хранящегося в файле /modules/mod_модуль.php и вывод данных сформированных модулем – для обычного модуля
- Считывание текста модуля из базы данных – для виртуальных модулей.
- В случае RSS-модуля происходит считывание настроек RSS-импорта, соединение к хосту, указанному в конфигурации RSS-фида, парсинг XML-вывода при помощи функций библиотеки DOMIT и вывод новостей пользователю.
- В шаблоне происходит вызов функции mosMainBody единственной задачей которой является вывод вместо себя того, что выдал компонент. Т.е. это просто обертка, надстройка, которая никак не связана с компонентами, она всего лишь выводит при помощи echo то, что было ранее сохранено в $_MOS_OPTION. Поэтому фразы "как отрегулировать mosMainBody" звучат глупо. Надо не ее регулировать, а сам компонент. Это всего лишь функция показа его содержимого.
- Работа завершается. Если в конфигурации включена “отладка сайта”, то все выполненные в базу данных запросы выводятся в конце страницы.
- Hits: 5506