Комментарии

Компоновка страницы в Joomla 2.5
( 3 Голосов )
В данной статье можно приступить непосредственно к компоновке страницы, расположив отдельные ее части в нужных местах шаблона. Вернувшись к методу render () из класса JSite, инициируем сначала системное событие onBeforeRender, а затем проверим, кеширована ли страница. И далее выполним следующую строку кода:

 

JResponse::setBody($document->render($caching, $params));
В этой строке кода устанавливается поле объекта типа JResponse с помощью метода render () из класса JDocumentHTML. Исходный код этого метода приведен в листинге ниже.
 
Метод render () из класса JDocumentHTML
public function render($caching = false, $params = array())
{
$this->_caching = $caching;
 
if (!empty($this->_template))
{
$data = $this->_renderTemplate();
}
else
{
$this->parse($params);
$data = $this->_renderTemplate();
}
 
parent::render();
return $data;
}
Ключевая строка кода данного метода выделена в листинге выше полужирным. В ней вызывается метод _renderTemplate (), циклически обращающийся к элементам массива, созданного ранее и сохраненного в поле $document->_template_tags объекта текущего документу извлекая данные из этого массива, как выделено полужирным в листинге ниже.
 
Метод renderTemplate из класса JDocumentHTML
private function _renderTemplate () {
$replace = array;
$with = array;
foreach($this->_template_tags AS $jdoc => $args)
{
$replace[] = $jdoc;
$with[] = $this->getBuffer($args['type'], $args['name'],
$args['attribs']);
}
return str_replace($replace, $with, $this->_template);
}
Ключевой в данном метода является следующая строка кода:
 
$with[] = $this->getBuffer($args['type'], $args['name'],
$args['attribs']);
Напомним, что в поле _template_tags объекта текущего документа $document содержится массив элементов с информацией о компонентах, модулях, заголовках, сообщениях и отладке. Каждый из этих элементов обрабатывается в цикле foreach и загружается в массив $with.
Компонент уже воспроизведен, и поэтому он просто копируется из поля $contents. Элементы разметки jdoc:include для модулей обычно обрабатываются по их месту расположения в шаблоне. В таком случае каждый модуль выполняется по месту его назначения для данного пункта меню, а результат размещается в массиве $with. Аналогичным образом обрабатываются элементы head, messages и debug.
 
И в последней строке кода данного метода оператор замены символьных строк вставляет конкретный текст, выводимый для каждого модуля, компонента, сообщения, заголовка и элемента отладки в файл шаблона. На данном этапе элементы страницы форматируются в шаблоне и готовятся для отправки браузеру.
 
Важное следствие такого способа обработки состоит, в частности, в том, что модуль выполняется только в том случае, если он назначен на определенное место в шаблоне. Благодаря этому исключаются потери производительности для тех модулей, которые назначены на другие места или для других пунктов меню.
 
А теперь вернемся к упомянутому выше методу render () из класса JDocumentHTML и вызовем одноименный метод его родительского класса JDocument из файла libraries/joomla/document/document.php. Этот метод просто устанавливает видоизмененную дату и тип содержимого для заголовка документа, а затем возвращает переменную $data, которая содержит файл шаблона index.php с содержимым страницы, заменяющим элементы разметки jdoc:include.
Напомним, что рассмотрение данной части программы мы начинали со следующей строки кода из метода render () класса JSite:
 
JResponse::setBody($document->render($caching, $params));
На данном этапе мы завершили выполнение части document->render ($caching, $params) оператора из приведенной выше строки кода. Осталось лишь передать результат выполнения этой части оператора методу JResponse: : setBody (). В исходном коде данного метода, приведенном в листинге ниже, получающийся в итоге текст просто размещается в поле $body данного класса.
 
Метод setBody () из класса JResponse
public static function setBody($content)
{
self::$body = array((string) $content);
}
И последнее, что требуется сделать в методе render (), — инициировать системное событие onAfterRender. В этот момент мы возвращаемся к файлу index.php из папки верхнего уровня.
 

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


Вам также будет интересно:

 
Похожие новости