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

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


limb3_2007_2:ru:usage: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'>. Что бы все работало, нам необходимо подготовить следующие данные для шаблона:

 $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);

Использование тега <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>

Для примера потребуются следующие данные:

 lmb_require('limb/datasource/src/lmbPagedArrayDataset.class.php');
 $data = array('full_name' => 'Vasa Pupkin', 'books' => new lmbPagedArrayDataset(array(array('title' => 'Book1'), array('title' => 'Book2'))));
 $template = new lmbWactTemplate('author.html');
 $template->setChildDataSource('author', $data);

Обратите внимание на использование класса lmbWactTemplate из пакета WEB_APP. Мы хотели подчеркнуть, что функциональность тега <iterator:transfer> доступна именно при использовании пакета WEB_APP и классов из других пакетов Limb. Например, если бы мы передали в качестве books простой массив, атрибуты limit, offset, order - игнорировались бы. Класс lmbPagedArrayDataset - содержит необходимые расширения для такого использования.

Источник данных указывается атрибутом from тега <iterator:transfer>, а контейнер данных, куда пойдут данные - target. Значение атрибута from - это такой же DBE, как и для тегов <list:list> и <core:datasource>. Остальные параметры тега <iterator:transfer> имеют смысл, аналогичный как при использовании тега <fetch>.

Обсуждение

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