====== DBE. Data Binding Expressions ====== **Data Binding Expressions** - это термин, который используется в WACT для точного указания пути, откуда следует взять то или иное значение. К сожалению, мы не стали вырабатывать русский термин для этого понятия, поэтому используем просто - **DBE**. В разделе [[.expressions|Выражения]] мы показывали примеры выражений, содержащих одно или несколько 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}: Статья: {$title} Автор статьи: {$author.full_name} $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 по-умолчанию относятся к текущему контекст. То есть:

{$title}

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

{$title}

То, из какого контекст выражение берет свойства, можно изменить: * префикс **#** означает использование **глобального** контекста. * префикс **^** означает использование **родительского** контекстаданных. Данный префикс можно использовать несколько раз. * **в квадратных скобках** можно указать имя (идентификатор) **дочернего** контекста (поддерживается с версии 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} ===== Дополнительная информация ===== * В разделе [[data_containers|"Контейнеры данных WACT"]] можно найти информацию о том: * какие контейнеры данных можно и лучше всего использовать в WACT-шаблонах, * как наиболее эффективно использовать WACT для вывода данных из Модели приложения, * как передавать данные из одного контекста в другой, используя DBE. * В разделе [[data_transfer|"Передача данных внутри шаблонов"]] рассказано о том, как при помощи DBE и некоторых тегов можно передавать данные внутри шаблона из одного контекста в другой. Эти разделы позволят вам намного лучше понять, каким образом осуществляется интеграция пакетов WACT, ACTIVE_RECORD и WEB_APP.