Сейчас я хочу рассмотреть еще один фильтр - FieldFilter, т. е. фильтр по полю.
Для примера, создадим суперпростой глобальный тип данных Demo.Task, в котором мы будем хранить свои задачи - с двумя полями:
- Title (строка): заголовок задачи
- Done (булево): статус - выполнено (True) или не выполнено (False)
... и добавим несколько элементов данных (т.е. задач).
Что будет делать наше приложение?
Оно представит элементы типа Demo.Task отдельно - как выполненные и как невыполненные.
Для этого мы два раза добавим эти элементы при помощи известного нам XML-элемента DataElements. Только в одном случае мы отфильтруем их по полю Done со значением False, а в другом - со значением True.
И для этого мы как раз и воспользуемся фильтром по полю.
- Для это в качестве дочернего XML-элемента DataElements мы добавим Filters
- ... и уже внутри Filters добавим FieldFilter.
- У FilterFilter зададим такие атрибуты:
- FieldName: название поля типа данных по которому мы фильтруем элементы (в нашем случае "Done")
- FieldValue: значение поля, по которому отфильтровываем элементы (у нас "False" и "True")
- Operator: оператор фильтра по полю. По умолчанию "equal" и если это подходит, то атрибут можно не указывать (но я указал для наглядности).
Вот как можно отобрать все невыполненные задачи:
<DataElements Type="Demo.Task">
<Filters>
<FieldFilter FieldName="Done" FieldValue="False" Operator="equal"/>
</Filters>
</DataElements>
<Filters>
<FieldFilter FieldName="Done" FieldValue="False" Operator="equal"/>
</Filters>
</DataElements>
Соответственно для выполненных задач FieldValue будет True.
В общем итоге, у вас может получится такое определение:
<?xml version="1.0" encoding="UTF-8"?>
<ElementStructure xmlns="http://www.composite.net/ns/management/trees/treemarkup/1.0" xmlns:f="http://www.composite.net/ns/function/1.0">
<ElementStructure.AutoAttachments>
<NamedParent Name="PerspectivesRoot" Position="Top"/>
</ElementStructure.AutoAttachments>
<ElementRoot>
<Children>
<Element Id="TasksPerspective" Label="Задачи">
<Children>
<Element Id="TasksOpen" Label="Невыполненные">
<Children>
<DataElements Type="Demo.Task">
<Filters>
<FieldFilter FieldName="Done" FieldValue="False" Operator="equal"/>
</Filters>
</DataElements>
</Children>
</Element>
<Element Id="TasksClosed" Label="Выполненные">
<Children>
<DataElements Type="Demo.Task">
<Filters>
<FieldFilter FieldName="Done" FieldValue="True" Operator="equal"/>
</Filters>
</DataElements>
</Children>
</Element>
</Children>
</Element>
</Children>
</ElementRoot>
</ElementStructure>
<ElementStructure xmlns="http://www.composite.net/ns/management/trees/treemarkup/1.0" xmlns:f="http://www.composite.net/ns/function/1.0">
<ElementStructure.AutoAttachments>
<NamedParent Name="PerspectivesRoot" Position="Top"/>
</ElementStructure.AutoAttachments>
<ElementRoot>
<Children>
<Element Id="TasksPerspective" Label="Задачи">
<Children>
<Element Id="TasksOpen" Label="Невыполненные">
<Children>
<DataElements Type="Demo.Task">
<Filters>
<FieldFilter FieldName="Done" FieldValue="False" Operator="equal"/>
</Filters>
</DataElements>
</Children>
</Element>
<Element Id="TasksClosed" Label="Выполненные">
<Children>
<DataElements Type="Demo.Task">
<Filters>
<FieldFilter FieldName="Done" FieldValue="True" Operator="equal"/>
</Filters>
</DataElements>
</Children>
</Element>
</Children>
</Element>
</Children>
</ElementRoot>
</ElementStructure>
Вы наверное обратили внимание, что я создаю приложение как отдельный раздел в админке. О том, как это сделать правильно мы поговорим в следующем сообщении.
Комментариев нет:
Отправить комментарий