Выполнение компонента Joomla 2.5 (часть 1) |
Теперь нам известно, что делать дальше. Введенный пользователем URL (например, щелчком на ссылке на пункт меню) проверен, преобразован в массив команд и сохранен в переменной $_GET языка РНР. Итак, мы готовы выполнить компонент.
Возвращаясь к файлу index.php, мы обнаруживаем следующую часть исходного кода, приведенного в листинге ниже.
Вызов метода dispatch ():
// Произвести диспетчеризацию $app->dispatch(); // Пометить состояние после диспетчеризации в профилировщике JDEBUG ? $_PROFILER->mark('afterDispatch') : null;
Метод dispatch () фактически выполняет компонент. Рассмотрим, каким образом это делается. В листинге ниже приведен исходный код метода dispatch ().
Исходный код метода dispatch () из класса JSite:
public function dispatch($component = null) { try { // получить компонент, если он не задан if (!$component) { $component = JRequest::getCmd('option'); } $document = JFactory::getDocument(); $user = JFactory::getUser(); $router = $this->getRouter(); $params = $this->getParams(); switch($document->getType()) { case 'html': // получить язык $lang_code = JFactory::getLanguage()->getTag(); $languages = JLanguageHelper::getLanguages('lang_code'); // задать метаданные if (isset($languages[$lang_code]) && $languages[$lang_code]->metakey) { $document->setMetaData('keywords', $languages[$lang_code]->metakey); } else { $document->setMetaData('keywords', $this->getCfg('MetaKeys')); $document->setMetaData('rights', $this->getCfg('MetaRights') ) ; if ($router->getMode() == JROUTER_MODE_SEF) { $document->setBase(htmlspecialchars(JURI::current() ) ) ; } break; case 'feed': $document->setBase(htmlspecialchars(JURI::current())); break; } $document->setTitle($params->get('page_title')); $document->setDescription($params->get('page_description')); $contents = JComponentHelper::renderComponent($component); $document->setBuffer($contents, 'component'); // Инициировать событие onAfterDispatch JPluginHelper::importPlugin('system') ; $this->triggerEvent('onAfterDispatch'); } // обработать любые неперехваченные исключения catch (Exception $e) { $code = $e->getCode(); JError::raiseError($code ? $code : 500, $e->getMessage()); } }
Прежде всего следует обратить внимание на то, что весь код данного метода выполняется в блоке try/catch. Это означает, что код выполняется в следующей последовательности.
Код в фигурных скобках после оператора try (т.е. в блоке try) выполняется как обычно.
Если выполнение любого оператора в блоке try приводит к ошибке, управление программой передается первой строке кода в блоке catch, находящемся в самом конце данного метода.
В блоке try имя компонента получается по команде option, выявленной ранее в результате синтаксического анализа URL. Затем создается новый документ в виде объекта $ document. Этот объект будет использоваться далее для хранения всей информации о странице, которая в конечном итоге отправляется обратно браузеру.
В отношении документа необходимо иметь в виду следующее. Во-первых, это объект, находящийся в оперативной памяти, и поэтому нам не обязательно создавать его последовательно. Мы можем вставлять отдельные части документа в любом удобном для нас порядке. Выгодно используя эту особенность, мы можем составить документ в непоследовательном порядке, например, добавив сначала компонент, а затем вставив модули.
И во-вторых, в Joomla поддерживаются разные типы документов. При просмотре сайта мы обычно имеем дело с документом типа html. Документ данного типа требует некоторой специальной обработки. В частности, мы получаем язык для отображения текста на странице, задаем метаданные и базу документа, если используются URL типа SEF (т.е. удобные для поиска URL). Так, если документ представляет собой ленту новостей (type ="feed"), мы пропускаем большую часть процесса его обработки и только задаем базу документа. А если документ относится к любому другому типу, мы вообще не выполняем его специальную обработку, пропуская ее полностью.
Понравился материал? Пригодилась информация? Плюсани в социалки!
|
Похожие новости | |