====== Контейнеры данных WACT. Какие данные можно передавать в WACT-шаблоны ====== Под **контекстом** в WACT шаблоне мы понимаем такой активный компонент откомпилированного шаблона, который предоставляет для остальных доступ к некоторым данным. Контексты в откомпилированном шаблоне формируют дерево. Это должно быть вам знакомо по материалам разделов: * [[limb3:ru:packages:wact:important_details|Компиляция и выполнение шаблона. Активные компоненты шаблона. Дерево контекстов]], * [[limb3:ru:packages:wact:dbe|Data Binding Expressions]]. **Контейнер данных** - это объект или массив, который передается в контекст в качестве **источника данных**. Различают 2 типа контейнеров данных: * Обычный контейнер данных, из которого берутся данные для выражений вида {$title}. В WACT их называют datasource. * Списковые контейнеры данных, из которых берутся данных для вывода списков (например для тега ). Списковые контейнеры данных обычно называются итераторами (**Iterator**) или в терманах WACT-а наборами данных (**Dataset**). ===== Обычные контейнеры данных (datasource) ===== В качестве обычного контейнера данных WACT может использовать следующие объекты: * ассоциативный массив * объект, который поддерживает интерфейс get()/set() (содержит методы get($field) и set($field, $value)) * объект, который поддерживает интерфейс %%ArrayAccess%%

{$title}

{$content}
тег - это тег, который является контекстом. В примере ниже, в этот контекст мы будет передавать различные контейнеры данных. $template = new WactTemplate('my_template.html'); $article = $template->findChild('article'); // Вариант 1. Контейнер данных - обычный массив. $data = array('title' => 'Item1', 'content' => 'Super article'); $article->registerDatasource($data); // Вариант 2. Контейнер данных - объект класса lmbSet $data = new lmbSet(array('title' => 'Item1', 'content' => 'Super article')); $article->registerDatasource($data); // Вариант 3. Контейнер данных - запись из базы данных $items = lmbDBAL :: fetch('SELECT * FROM item'); $items->rewind(); $data = $items->current(); $article->registerDatasource($data); Если в WACT пришел контейнер данных в виде объекта, то он проверяет, поддерживает ли тот методы get. Если да, поддерживает, тогда всегда будет использоваться $datasource->get(’title’) вместо datasource[’title’]. Приоритетность использования интерфейса get()/set() активно используется в пакете WEB_APP для интеграции пакетов ACTIVE_RECORD и WACT. Подробнее об этом см. раздел [[limb3:ru:packages:active_record:in_wact_templates|"Использование ACTIVE_RECORD в шаблонах WACT"]]. Теги, которым соответствуют обычные контейнеры данных: * [[limb3:ru:packages:wact:tags:core_tags:core_datasource_tag|]] * [[limb3:ru:packages:wact:tags:form_tags:form_tag|
]] * [[limb3:ru:packages:wact:tags:list_tags:list_item_tag|]] ===== Итераторы (dataset) ===== В качестве спискового контейнера данных WACT может использовать обычные массивы, а также любые объекты, которые поддерживают интерфейс итератора (Iterator). Основное условие - чтобы метод current() возвращал нечто, что можно назвать обычным источником данных (datasource-ом). Поэтому вполне подходят: * массивы ассоциативных массивов * любые итераторы из Limb3, которые поддерживают интерфейс [[limb3:ru:packages:core:lmb_collection_interface|lmbCollectionInterface]] Например:
  • {$title}
$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 lmbCollection(array(array('title' => 'Item1'), array('title' => 'Item2'))); $list->registerDataset($data); // Вариант 3. Контейнер данных - итератор c данными из базы данных. $data = lmbDBAL :: fetch('SELECT * FROM item'); $list->registerDataset($data); Таким образом WACT может работать одинаково с объектами класса lmbCollection, c объектами lmbMySqlRecordSet и с обычными многомерными массивами. Мы рекомендуем вам также взглянуть на [[limb3:ru:packages:core:data_containers|Контейнеры данных Limb3]] чтобы ознакомиться с классами, которые используются в Limb3 в качестве контейнеров данных. Теги, в которые передаются списковые контейнеры данных: * [[limb3:ru:packages:wact:tags:list_tags:list_list_tag|]]