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

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


limb3:ru:packages:wact:dbe

DBE. Data Binding Expressions

Data Binding Expressions - это термин, который используется в WACT для точного указания пути, откуда следует взять то или иное значение. К сожалению, мы не стали вырабатывать русский термин для этого понятия, поэтому используем просто - DBE.

В разделе Выражения мы показывали примеры выражений, содержащих одно или несколько DBE.

Приведем еще несколько примеров:

{$content|nl2br}
{$author.full_name}
{$#request.id}
{$^article.author.full_name}
{$#(current_object)node.url_path}
{$$my_ratio}
{$item1.count * my_ratio} 

DBE состоят из нескольких частей:

  • модификаторы, которые дают путь до контекста или указывают, что используется php-переменная,
  • путь до переменной относительно найденного контекста или php-переменной, где элементы пути разделяются точкой.

Текущий контекст для DBE - это как бы верхняя точка, начиная с которой будет искаться нужная переменная.

Возьмем простой случай выражения: {$content} - это текущий контекст и одно-составный путь до переменной.

В DBE может применяться сложный путь до переменной, например {$author.full_name}. В этом случае, из текущего контейнера данных будет получена переменная author. Если эта переменная также может считаться контейнером данных (например, это ассоциативный массив), из нее будет взята переменная full_name и именно эта переменная будет выведена.

Поясним, к какому php-коду приводит выражение вида {$author.full_name}:

  $a001 = $component['0001']->get('author');
  echo $a001->get('full_name'); 

Вот как бы выглядел бы наш шаблон и php-скрипт для демонстрации использования {$author.full_name} и {$title}:

<code:datasource id='article'>
  Статья: {$title}
  Автор статьи: {$author.full_name}
</code:datasource>
  $article_data = array('title' => 'Super Article',
                        'author' => array('full_name' => 'Vasa Pupkin', 'age' => '19'));  
  $template->setChildDatasource('article', $article_data);

Если же к DBE применяется модификатор контекста, то сначала выясняется, к какому контексту применяется DBE, а затем уже происходит непосредственное получение данных.

Кстати, для php-переменных также поддерживаются пути через точку, например:

{$$article.title} - вывести title из php-переменной $article. Необходимо, чтобы $article поддерживал метод get('title').

Модификаторы контекста в DBE

Контексты формируют дерево контекстов в откомпилированном шаблоне. При работе с контейнерами данных используются следующие понятия:

  • текущий контекст
  • родительский контекст
  • глобальный контекст, или контекст шаблона
  • дочерний контекст (непосредственный дочерний элемент или же на несколько уровней ниже).

DBE по-умолчанию относятся к текущему контекст. То есть:

<h1>{$title}</h1>

Выведет заголовок из глобального контекста, так как он и является текущим для данного выражения.

Однако здесь текущим контекст будет уже другой:

<code:datasource id='title'>
<h1>{$title}</h1>
</code:datasource>

То, из какого контекст выражение берет свойства, можно изменить:

  • префикс # означает использование глобального контекста.
  • префикс ^ означает использование родительского контекстаданных. Данный префикс можно использовать несколько раз.
  • в квадратных скобках можно указать имя (идентификатор) дочернего контекста (поддерживается с версии WACT 0.5, с версии 0.3 до версии 0.4 включительно для этих целей использовались круглые скобки).
  • префикс $ означает использование PHP-переменной.

Примеры:

{$#TodaysDate} - взять TodaysDate из корневого контекста
{$^UserName} - взять UserName из родительского контекста
{$^^UserName} - взять UserName из контекста на 2 уровня вверх
{$#[user]name} - взять из корневого контекста дочерний контекста user и взять из последнего переменную name
{$$login} - вывести php-переменную $login. Можно этот пример воспринимать как  {$ $login } для наглядности.

Поясним некоторые моменты, связанные с применением модификатора в квадратных скобках:

  • дочерний элемент с указанным идентификатором должен обязательно существовать и быть знаком компилятору еще до использования в DBE. Это как бы говорит - нельзя передавать данные наверх.
  • дочерний элемент ищется с указанного уровня (в зависимости от использования # и ^) и ниже на всю глубину дерева.
  • можно указывать несколько модификаторов в скобках, как бы уточняя их, например, {$#[content][node]title}
  • после модификатора в скобках запятая не используется. Запятые могут использовать уже для разделения элементов пути до значения, например: {$#[content][node]object.content}

Дополнительная информация

  • В разделе "Контейнеры данных WACT" можно найти информацию о том:
    • какие контейнеры данных можно и лучше всего использовать в WACT-шаблонах,
    • как наиболее эффективно использовать WACT для вывода данных из Модели приложения,
    • как передавать данные из одного контекста в другой, используя DBE.
  • В разделе "Передача данных внутри шаблонов" рассказано о том, как при помощи DBE и некоторых тегов можно передавать данные внутри шаблона из одного контекста в другой.

Эти разделы позволят вам намного лучше понять, каким образом осуществляется интеграция пакетов WACT, ACTIVE_RECORD и WEB_APP.

Обсуждение

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