Разработка

Техники быстрой разработки: шаблоны внутри шаблонов

Joomla
Добавление в избранное
Сохранить

Техники быстрой разработки: шаблоны внутри шаблонов Joomla

А вас никогда не расстраивал линейный подход к шаблонам в 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

Оригинальная статья: Jarrod Nettles
Katerina Vorobyova
Переводчик, IT любитель, фотомодель.

Подпишитесь на рассылку новостей CMScafe