Воспроизведение страницы Joomla 2.5 |
Ниже приведен фрагмент кода из следующей части файла index.php. На данном этапе у нас имеется результат выполнения компонента, но отсутствует какое-либо форматирование и другое содержимое страницы, например, модули или сообщения. В листинге ниже приведен исходный код метода $app->render (), отвечающего за воспроизведение страницы.
// Воспроизвести приложение. $app->render(); Метод render () из класса JSite
public function render() { $document = JFactory::getDocument(); $user = JFactory::getUser(); // Получить формат для воспроизведения страницы $format = $document->getType(); switch ($format) { case 'feed': $params = array(); break; case 'html': default: $template = $this->getTemplate(true); $file = JRequest::getCmd('tmpl', 'index'); if (!$this->getCfg('offline') && ($file == 'offline')) { $file = 'index'; } if ($this->getCfg('offline') && !$user->authorise('core.login.offline')) { $uri = JFactory::getURI(); $return = (string)$uri; $this->setUserState('users.login.form.data', array( 'return' => $return ) ); $file = 'offline'; JResponse::setHeader('Status', '503 Service Temporarily Unavailable', 'true'); } if (!is_dir(JPATH_THEMES . '/' . $template->template) && !$this->getCfg('offline')) { $file = 'component'; } $params = array( 'template' => $template->template, 'file' => $file.'.php', 'directory' => JPATH_THEMES, 'params' => $template->params ); break; } // Произвести синтаксический анализ документа $document $document = JFactory::getDocument(); $document->parse($params); // Инициировать событие onBeforeRender JPluginHelper::importPlugin('system'); $this->triggerEvent('onBeforeRender'); $caching = false; if ($this->getCfg('caching') && $this->getCfg('caching', 2) == 2 && !$user->get('id')) { $caching = true; } // Воспроизвести документ JResponse::setBody($document->render($caching, $params)); // Инициировать событие onAfterRender $this->triggerEvent('onAfterRender'); } Код данного метода начинается с получения документа пользователя, а также типа или формата документа. В зависимости от конкретного формата в операторе switch выполняется соответствующая обработка. В рассматриваемом здесь примере выбирается документ типа html, поэтому мы получаем его шаблон и устанавливаем массив в переменной $раrams.
После оператора switch вызывается метод parse () для синтаксического анализа документа, как показано в листинге ниже. А поскольку документ относится к типу html, то объект документа относится к классу JDocumentHTML из файла libraries/joomla/document/html/html.php.
Метод parse () из класса JDocumentHTML
public function parse($params = array()) { return $this->_fetchTemplate($params)->_parseTemplate(); } В первой части оператора возврата из данного метода загружается шаблон и соответствующий файл языковой поддержки. А поскольку метод _fetchTemplate () возвращает текущий объект, мы можем сначала связать методы в цепочку, а затем вызвать метод _parseTemplate (). Более подробно связывание методов в цепочку рассматривается в приложении А.
Метод _parseTemplate (), исходный код которого приведен в листинге ниже, проверяет файл index.php шаблона и создает массив со всеми элементами разметки jdoc:include.
Метод _parseTemplate () из класса JDocumentHTML
protected function _parseTemplate() { $matches = array(); if (preg_match_all('#<jdoc:include\ type="([^"]+)" (.*)\/>#iU', $this->_template, $matches)) { $template_tags_first = array(); $template_tags_last = array(); // Просмотреть элементы jdoc в обратном порядке for ($i = count($matches[0]) - 1; $i >= 0; $i--) { $type = $matches[1][$i]; $attribs = empty($matches[2][$i]) ? array() : JUtility::parseAttributes($matches[2][$i]); $name = isset($attribs['name']) ? $attribs['name'] : null; // Разделить буферы на первый и последний по порядку выполнения if ($type == 'module' || $type == 'modules') { $template_tags_first[$matches[0][$i]] = array('type' => $type, 'name' => $name, 'attribs' => $attribs); } else { $template_tags_last[$matches[0][$i]] = array('type' => $type, 'name' => $name, 'attribs' => $attribs); } } // Обратить последний массив, чтобы расположить элементы jdoc в прямом порядке $template_tags_last = array_reverse($template_tags_last); $this->_template_tags = $template_tags_first + $template_tags_last; } return $this; } Ключевым для понимания кода данного метода является оператор preg_match_all. Этот оператор проще пояснить, чем составить. В нем создаются три массива. Первый массив содержит список всех элементов разметки jdoc include из файла шаблона и размещается в элементе массива $matches [0]. Второй массив содержит список атрибутов type, обозначающих тип каждого из этих элементов, и размещается в элементе массива $matches [1]. К типам подобных элементов обычно относятся head, modules, messages, debug или component. И третий массив содержит список остальных атрибутов этих элементов, кроме атрибута type, и размещается в элементе массива $matches [2]
На основании этой информации в цикле for сначала создается ассоциативный массив из элементов type, name и attribs и затем он сохраняется в поле template tags объекта $document, как показано в выражении $this->_template_tags выше в данной статье.
В следующей статье нашего сайта мы расскажем о компоновке страницы на joomla сайте.
Понравился материал? Пригодилась информация? Плюсани в социалки!
|
Похожие новости | |