Комментарии

Воспроизведение страницы Joomla 2.5
( 0 Голосов )
Ниже приведен фрагмент кода из следующей части файла 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 сайте.
 

Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости
Добавить комментарий


Защитный код