Joomla API

JLayout - общая информация и базовая работа с классами

Joomla
JLayout - общая информация и базовая работа с классами

Содержание

Общая информация

Группа классов JLayout является составляющей CMS и доступна для использования начиная с версии Joomla 3.0. Она представляет собой набор классов, помогающих в структуризации и обработке выходных данных. По сути, JLayout – это PHP-рендерер и шаблонизатор в одном лице. Он инкапсулирует в себе разметку (макеты вывода) и выходные данные, таким образом позволяя повторно использовать эти макеты вывода между представлениями и расширениями. В JLayout также заложен механизм переопределения, поэтому все макеты вывода можно легко переопределить.

Классы JLayout расположены в директории /libraries/cms/layout. Ниже представлена диаграмма наследования классов:

Диаграмма наследования классов JLayout

  • Интерфейс JLayout определяет всего два метода: escape() и render(), по аналогии с интерфейсом ViewInterface фреймворка Joomla
  • Класс JLayoutBase реализует интерфейс JLayout и представляет собой простой базовый класс
  • Класс JLayoutFile расширяет класс JLayoutBase и реализует рендеринг макета, сохраненного в файле, при этом проверяя наличие переопределений и предоставляя различные дополнительные опции
  • Класс-помощник (хелпер) JLayoutHelper реализует всего один статический метод render(), в котором инкапсулирует создание экземпляра класса JLayoutFile. Этот класс чаще всего используется для простого рендеринга макетов вывода, когда не нужны дополнительные опции.

Рендеринг макетов вывода

Рендеринг макетов вывода в JLayout осуществляется с помощью метода render(). Вот как выглядит самое простое его использование:

$layout = new JLayoutFile('joomla.content.test');
echo $layout->render();

Это эквивалентно следующему коду:

echo JLayoutHelper::render('joomla.content.test');

В качестве первого параметра мы передаем так называемый идентификатор файла. Его последний сегмент – это название файла, а все что находится до него – это относительный путь до файла. В итоге будет вызван файл /layouts/joomla/content/test.php. Предположим, что в этом файле у нас следующий код:

<?php
 
defined('JPATH_BASE') or die;
?>
<div>
    <h1>Hello JLayout!</h1>
</div>

Тогда код

echo JLayoutHelper::render('joomla.content.test');

просто выведет

Hello JLayout

Более подробно о всех возможностях рендеринга вы можете прочитать в материале "Улучшения JLayout в Joomla 3.2".

Расположение макетов вывода

Обратите внимание, что по умолчанию базовой директорией расположения макетов является директория /layouts, которая находится в корне установки Joomla. Эта директория зарезервирована для CMS.

С помощью аргумента $basePath мы можем задать другой базовый путь расположения макетов. Например, для использования в плагине:

$basePath = JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name . '/layouts';
 
$layout = new JLayoutFile('test', $basePath);
echo $layout->render();

или

echo JLayoutHelper::render('test', null, $basePath);

При использовании JLayoutHelper можно задать статическое свойство $defaultBasePath, чтобы каждый раз не передавать полный путь в качестве параметра:

JLayoutHelper::$defaultBasePath = JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name . '/layouts';
 
// Путь /plugins/{тип_плагина}/{название_плагина}/layouts/default/test.php
echo JLayoutHelper::render('default.test');

В принципе, файлы макетов могут быть расположены где угодно, так как мы можем задать любой путь. Однако хорошей практикой считается следующее расположение:

  • /components/com_{название_компонента}/layouts
  • /plugins/{тип_плагина}/{название_плагина}/layouts
  • /modules/mod_{название_модуля }/layouts

Переопределение макетов вывода

Когда выполняется метод render(), который загружает файл макета, класс JLayoutFile выполняет поиск в следующем порядке (приоритет от низкого к высокому):

  1. {JPATH_ROOT}/layouts
  2. {JPATH_THEMES} /{текущий_шаблон}/html/layouts
  3. {JPATH_SITE}/components/{текущий_компонент}/layouts или {JPATH_ADMINISTRATOR}/components/{текущий_компонент}/layouts
  4. {JPATH_THEMES} /{текущий_шаблон}/html/layouts/{текущий_компонент}
  5. Значение свойства $basePath.

Таким образом, располагая файлы макетов в директории /layouts, мы поддерживаем возможность их переопределения. Кроме того, это позволяет не указывать базовый путь расположения макетов для компонентов, так как JLayoutFile по умолчанию выполняет поиск макетов в директории /layouts компонента.

Исключение составляют модули и плагины, так как для подключения макетов необходимо задавать $basePath. Поэтому на данный момент они не поддерживают переопределения. Остается надеяться, что возможность переопределения для модулей и плагинов будет добавлена в будущих версиях Joomla (на момент написания этого материала версия Joomla была 3.3).

Подробнее о том, как можно переопределять макеты CMS, вы можете прочитать в материале "Переопределение макетов вывода в Joomla 3".

Передача данных в макет

JLayout позволяет нам передавать данные в макет. Давайте немного изменим код в нашем файле /layouts/joomla/content/test.php, чтобы он учитывал переданные ему данные:

<?php
 
defined('JPATH_BASE') or die;
?>
<div>
    <h1>Hello <?php echo $displayData['name']; ?>!</h1>
</div>

Обратите внимание, что в макете для переданных в него данных используется переменная $displayData.

Наш код для вызова макета будет следующим:

// Подготавливаем данные для передачи в макет
$data = array('name' => 'Dmitry');
 
// Отображаем данные
$layout = new JLayoutFile('joomla.content.test');
echo $layout->render($data);

или

$data = array('name' => 'Dmitry');
 
JLayoutHelper::render('joomla.content.test', $data);

Теперь наш код выводит:

Hello Dmitry!

Мы видим, что JLayout является довольно удобным и простым способом рендеринга данных. Все что нужно сделать, это предварительно подготовить массив с данными для отображения, и далее в макете Вы можете получить к ним доступ через перменную $displayData.

Удачной разработки!

Dmitry Rekun
Работаю в банковской сфере, а с веб-разработкой (непосредственно с Joomla) столкнулся в 2007 году. Теперь это моё хобби и время от времени вторая работа. Какое-то время вёл свой блог, но решил попробовать работать в команде. И вот c 2012 года я здесь :)