Статьи

Схема работы 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: 5272