А вас никогда не расстраивал линейный подход к шаблонам в Joomla!? Я разработал несколько веб-приложений, в которые не помешало бы включить шаблон внутри шаблона – внутреннюю систему меню, особый футер для специфических компонентов и т.д. Раньше для этого я использовал старый добрый PHP с функцией include()
. Хотя этот способ и работает, мы можем использовать более подходящий и удобный код, расширяя Joomla! класс JView
.
Эта статья предназначена для тех людей, которые занимаются разработкой для своих собственных установок Joomla!. Если вы занимаетесь разработкой сторонних расширений, то вам придется применить более креативный подход. Недавно я написал статью о расширении внутренних классов Joomla! для того, чтобы облегчить постоянно повторяющиеся действия. Советую прочитать ее, если вы этого ещё не сделали. Я не буду пересказывать, почему нужно расширять стандартные классы, а лучше приведу реальный пример из жизни, который принесет некоторую пользу для вашей разработки.
В упаомянутой выше статье Расширение MVC архитектуры Joomla! мы создавали в папке библиотек новую библиотеку под названием «Custom», а также класс CustomView, расширяющий JView
. Сегодня мы возьмем как раз этот класс и создадим новый метод под названием loadSubTemplate
, в котором мы будем отталкиваться от метода JView loadTemplate
.
Итак, что же нам необходимо сделать внутри нового метода loadTemplate
? Нужно добиться подгрузки отдельных файлов шаблона и сбора выходных данных вместо применения echo
- такой способ хорош по ряду причин, но это означает, что вы должны явно использовать echo
везде, где захотите вывести суб-шаблон.
Эти шаблоны будут использоваться во всем компоненте, поэтому я обычно храню суб-шаблоны собранными в отдельной папке под названием shared внутри моей папки представлений. В этом нем особой нужды, но мне нравится, так как все упорядочено и логично: если вы разрабатываете несколько расширений, то этот порядок поможет вам в будущем, особенно если нужно будет расширить фрейморк Joomla!
Вот код метода loadSubTemplate
:
<?php
class CustomView extends JView
{
public function loadSubTemplate($name)
{
jimport( 'joomla.filesystem.path' );
// Ищем файл суб-шаблона.
$fileToFind = $this->_createFileName('template', array('name' => $name));
$subTemplate = JPath::find($this->_basePath.DS.'views'.DS.'shared', $fileToFind);
if($this->_subTemplate)
{
// Подготавливаемся к перехвату выходных данных.
ob_start();
// Подключаем суб-шаблон.
include($subTemplate);
// Получаем выходные данные.
$output = ob_get_contents();
// Очищаем буфер выходных данных.
ob_end_clean();
// Возвращаем выходные данные.
return $output;
}
else
{
return JError::raiseError( 500, 'Sub-Template "' .$name. '" not found.' );
}
}
//.....
}
?>
Теперь убедитесь, что для своего представления вы расширяете класс CustomView
, а не JView
, иначе наш прием просто не будет работать. В структуре каталогов вашего компонента (внутри views), создайте папку под названием shared, а внутри файл subpage1.php. Считайте, что это обычный шаблон и у него будет доступ к тем же методам и переменным, что и у нормального шаблона. Вот код для подключения суб-шаблона:
<?php echo $this->loadSubTemplate('subpage1'); ?>
Важно понимать, что мы загружаем отдельные классы представления для каждого суб-шаблона – мы загружаем только шаблоны. Это означает, что класс представления, который вы создадите, будет являться главным представлением для всего процесса, включая все суб-шаблоны. Можно будет использовать любые переменные, которые вы назначили шаблону с помощью функций assign() и assignRef().
Вы наверняка заметили, что мой код не поддерживает переопределение шаблона. Это легко исправить, но я оставлю это для вас в качестве нерешенной задачи. Все! Вы успешно разместили шаблон внутри другого шаблона или другими словами создали простенький шаблонизатор!
Редакция статьи: b2z