Под контейнером данных в WACT шаблоне мы понимаем такой активный компонент откомпилированного шаблона, который предоставляет для остальных доступ к некоторым данным. Контейнеры данных в откомпилированном шаблоне формируют дерево. Это должно быть вам знакомо по материалам разделов:
Различают 2 вида контейнеров данных:
В качестве обычного контейнера данных WACT может использовать следующие объекты:
<core:datasource id='article'> <h1>{$title}</h1> {$content} </core:datasource>
$template = new WactTemplate('my_template.html'); $article = $template->findChild('article'); // Вариант 1. Контейнер данных - обычный массив. $data = array('title' => 'Item1', 'content' => 'Super article'); $article->registerDatasource($data); // Вариант 2. Контейнер данных - объект класса lmbDataspace $data = new lmbDataspace(array('title' => 'Item1', 'content' => 'Super article')); $article->registerDatasource($data); // Вариант 3. Контейнер данных - запись из базы данных $connection = lmbToolkit :: instance()->getDefaultDbConnection(); $stmt = $connection->newStatement('SELECT * FROM item'); $items = $stmt->getRecordSet(); $items->rewind(); $data = $items->current(); $article->registerDatasource($data);
Если в WACT пришел контейнер данных в виде объекта, то он проверяет, поддерживает ли тот методы get. Если да, поддерживает, тогда всегда будет использоваться $datasource→get(’title’) вместо datasource[’title’].
Приоритетность использования интерфейса get()/set() активно используется в пакете WEB_APP для интеграции пакетов ACTIVE_RECORD и WACT. Подробнее об этом см. раздел "Использование ACTIVE_RECORD в шаблонах WACT".
Теги, которым соответствуют обычные контейнеры данных:
В качестве источника данных для спискового контейнера данных WACT может использовать обычные массивы, а также любые объекты, которые поддерживают интерфейс итератора (Iterator). Основное условие - чтобы метод current() возвращал нечто, что можно назвать обычным источником данных.
Например:
<list:list id='items'> <ul> <list:item><li>{$title}</li></list:item> </ul> </list:list>
$template = new WactTemplate('my_template.html'); $list = $template->findChild('items'); // Вариант 1. Контейнер данных - обычный массив. $data = array(array('title' => 'Item1'), array('title' => 'Item2')); $list->registerDataset($data); // Вариант 2. Контейнер данных - итератор. $data = new lmbArrayDataset(array(array('title' => 'Item1'), array('title' => 'Item2'))); $list->registerDataset($data); // Вариант 3. Контейнер данных - итератор c данными из базы данных. $connection = lmbToolkit :: instance()->getDefaultDbConnection(); $stmt = $connection->newStatement('SELECT * FROM item'); $data = $stmt->getRecordSet(); $list->registerDataset($data);
Таким образом WACT может работать одинаково с объектами класса lmbArrayDataset, c объектами lmbMySQLRecordSet и с обычными многомерными массивами.
Мы рекомендуем вам также взглянуть на описание пакета DATASOURCE чтобы ознакомиться с классами, которые используются в Limb в качестве контейнеров данных.
Теги, которым соответствуют списковые контейнеры данных:
Обсуждение