WACT предоставляет средства по перемещению данных внутри шаблона.
Допустим, у нас есть контейнер с данными по автору, и нам необходимо вывести список всех книг этого автора (при помощи <list:list>). Конечно, можно отдельно передать данные сначала в первый контейнер, а затем во второй, но эти операции можно делать непосредственно в шаблоне.
Другой пример: вам нужно вывести одни и те же данные в разных местах шаблона. Конечно, можно выставить данные в эти места явно, но WACT предоставляет способ просто копировать содержимое контейнеров данных.
Передача данных внутри шаблонов активно используется в шаблонах при работе с пакетом ACTIVE_RECORD. См. раздел "Использование ACTIVE_RECORD в шаблонах WACT".
Самый простой способ - это использование атрибута from тега <list:list> или <core:datasource>, в зависимости от того, что нам необходимо - список объектов или только один объект.
Допустим, что нам нужно отобразить данные во автору и список его книг:
<core:datasource id='author'> Имя автора: {$full_name} <br /> <list:list from='{$books}'> Все книги автора:<br/> <ul> <list:item> <li>{$title}</li> </list:item> </ul> </list:list> </core:datasource>
Обратите внимание на конструкцию <list:list from='{$books}'>. {$books} - это выражение, которое указывает на поле «books» внутри текущего контекста, которым является тег <core:datasource id='author'> Что бы все работало, нам необходимо подготовить следующие данные для шаблона:
$data = array('full_name' => 'Vasa Pupkin', 'books' => array(array('title' => 'Book1'), array('title' => 'Book2'))); $template = new WactTemplate('author.html'); $template->setChildDataSource('author', $data);
Значение атрибута from - это DBE (Data Binding Expression), другими словами - путь до переменной. В нашем примене мы использовали переменную books из текущего контейнера данных, которым являлся для нас тег <core:datasource id='author'>.
Начиная с версии WACT 0.3 DBE поддерживают точное указание источника данных из любого места (до этого поддерживалось только указание какого-либо родительского контейнера). Поэтому мы могли бы, в принципе, вынести тег <list:list> из-под <core:datasource> вот так:
<core:datasource id='author'> Имя автора: {$full_name} <br /> </core:datasource> list:list from='{$#[author]books}'> Все книги автора:<br/> <ul> <list:item> <li>{$title}</li> </list:item> </ul> </list:list>
Возможно, что в данном примере это и не совсем правильно делать, но мы решили продемонстрировать эту возможность DBE.
Атрибут from можно использовать и в <core:datasource> теге, например:
<core:datasource id='article'> Статья: {$title} <core:datasource from='{$author}'> Имя автора : {$full_name}<br/> </core:datasource> </core:datasource>
Правда мы могли бы написать данный пример немного короче:
<core:datasource id='article'> Статья: {$title} Имя автора : {$author.full_name}<br/> </core:datasource>
Эти два примера требуют следующих данных:
$data = array('title' => 'Super Article', 'author' => array('full_name' => 'Vasa Pupkin')); $template = new WactTemplate('article.html'); $template->setChildDataSource('article', $data);
Атрибут from тегов <list:list>, <core:datasource>, <iterator:transfer> и других, где он может использовать поддерживает краткую форму, когда знак выражения можно убрать, то есть вместо <core:datasource from='{$author}'> можно записать просто <core:datasource from='author'>. В версиях до 0.5 использование атрибута from был именно таким, и мы его будем в дальшейшем.
Если при передаче данных вам необходимо модифицировать передаваемый итератор, например, ограничить его размер, отсортировать, разбить на страницы, можно использовать тег <iterator:transfer>, который находится в пакете WEB_APP.
<core:datasource id='author'> Имя автора: {$full_name} <iterator:transfer from='books' target='books' order='title=ASC' limit='2'/> <list:list id='books'> Последние 2 книги автора:<br/> <ul> <list:item> <li>{$title}</li> </list:item> </ul> </list:list> </core:datasource>
Для примера потребуются следующие данные:
$data = array('full_name' => 'Vasa Pupkin', 'books' => array(array('title' => 'Book1'), array('title' => 'Book2'), array('title' => 'Book3'))); $template = new WactTemplate('author.html'); $template->setChildDataSource('author', $data);
WACT по-умолчанию поддерживает лимитирование для массивов.
Источник данных указывается атрибутом from тега <iterator:transfer> (кстати, здесь мы использовали краткую форму записи атрибута from), а компонент, куда пойдут данные - target. Значение атрибута from - это такой же DBE, как и для тегов <list:list> и <core:datasource>. Остальные параметры тега <iterator:transfer> имеют смысл, аналогичный как при использовании тега <fetch>.
Обсуждение