Инструменты пользователя

Инструменты сайта


limb3:ru:packages:wact:data_transfer

Передача данных внутри шаблонов

WACT предоставляет средства по перемещению данных внутри шаблона.

Допустим, у нас есть контейнер с данными по автору, и нам необходимо вывести список всех книг этого автора (при помощи <list:list>). Конечно, можно отдельно передать данные сначала в первый контейнер, а затем во второй, но эти операции можно делать непосредственно в шаблоне.

Другой пример: вам нужно вывести одни и те же данные в разных местах шаблона. Конечно, можно выставить данные в эти места явно, но WACT предоставляет способ просто копировать содержимое контейнеров данных.

Передача данных внутри шаблонов активно используется в шаблонах при работе с пакетом ACTIVE_RECORD. См. раздел "Использование ACTIVE_RECORD в шаблонах WACT".

Использование атрибута from

Самый простой способ - это использование атрибута 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>

Если при передаче данных вам необходимо модифицировать передаваемый итератор, например, ограничить его размер, отсортировать, разбить на страницы, можно использовать тег <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>.

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   ___    _  __  _   __   __   ____ 
  / _ )  | |/_/ | | / /  / /  / __ \
 / _  | _>  <   | |/ /  / /__/ /_/ /
/____/ /_/|_|   |___/  /____/\___\_\
 
limb3/ru/packages/wact/data_transfer.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)