3.5.3.4.1. Декларативное создание компонентов данных
Самый простой способ создать компоненты данных - это определить их в XML-дескрипторе экрана внутри элемента <data>
.
Рассмотрим для примера модель данных, содержащую сущности Customer
, Order
и OrderLine
. Дескриптор экрана редактирования сущности Order
может иметь следующее определение:
<data> (1)
<instance id="orderDc" class="com.company.sales.entity.Order"> (2)
<view extends="_local"> (3)
<property name="lines" view="_minimal">
<property name="product" view="_local"/>
<property name="quantity"/>
</property>
<property name="customer" view="_minimal"/>
</view>
<loader/> (4)
<collection id="linesDc" property="lines"/> (5)
</instance>
<collection id="customersDc" class="com.company.sales.entity.Customer" view="_minimal"> (6)
<loader> (7)
<query><![CDATA[select e from sales_Customer e]]></query>
</loader>
</collection>
</data>
В этом случае будут созданы следующие компоненты данных:
1 | - Экземпляр DataContext . |
2 | - Контейнер InstanceContainer для сущности Order . |
3 | - Встроенное описание представления экземпляра сущности, находящегося в контейнере. Встроенные представления могут расширять общие (заданные в views.xml ). |
4 | - InstanceLoader загружающий экземпляры сущности Order . |
5 | - Контейнер CollectionPropertyContainer для сущности OrderLines . Этот контейнер привязан к атрибуту-коллекции Order.lines . |
6 | - Контейнер CollectionContainer для сущности Customer . Атрибут view может указывать на общее представление. |
7 | - CollectionLoader , загружающий экземпляры сущности Customer по определённому запросу. |
Контейнеры данных используются в визуальных компонентах следующим образом:
<layout>
<dateField dataContainer="orderDc" property="date"/> (1)
<form id="form" dataContainer="orderDc"> (2)
<column>
<textField property="amount"/>
<lookupPickerField id="customerField" property="customer"
optionsContainer="customersDc"/> (3)
</column>
</form>
<table dataContainer="linesDc"> (4)
<columns>
<column id="product"/>
<column id="quantity"/>
</columns>
</table>
1 | Отдельные поля имеют атрибуты dataContainer и property . |
2 | Элемент form распространяет свой dataContainer на все вложенные поля, поэтому они требуют только указания атрибута property . |
3 | Поля выбора имеют атрибут optionsContainer . |
4 | У таблиц есть только атрибут dataContainer . |