среда, 6 июля 2011 г.

Консольные приложения (12): Использование фильтра по полю

В одном из предыдущих сообщений на тему консольных приложений в C1, я уже рассказал об использовании ParentIdFilter - фильтра по идентификатору родительского элемента. И вы уже знаете, что для целей фильтрования элементов в дереве консольного приложения существует 3 типа фильтра.

Сейчас я хочу рассмотреть еще один фильтр - FieldFilter, т. е. фильтр по полю.


Для примера, создадим суперпростой глобальный тип данных Demo.Task, в котором мы будем хранить свои задачи - с двумя полями:
  • Title (строка): заголовок задачи
  • Done (булево): статус - выполнено (True) или не выполнено (False)
... и добавим несколько элементов данных (т.е. задач).

Что будет делать наше приложение?

Оно представит элементы типа Demo.Task отдельно - как выполненные и как невыполненные. 



Для этого мы два раза добавим эти элементы при помощи известного нам XML-элемента DataElements. Только в одном случае мы отфильтруем их по полю Done со значением False, а в другом - со значением True.

И для этого мы как раз и воспользуемся фильтром по полю. 
  1. Для это в качестве дочернего XML-элемента DataElements мы добавим Filters
  2. ... и уже внутри Filters добавим FieldFilter.
  3. У FilterFilter зададим такие атрибуты:
  • FieldName: название поля типа данных по которому мы фильтруем элементы (в нашем случае "Done")
  • FieldValue: значение поля, по которому отфильтровываем элементы (у нас "False" и "True")
  • Operator: оператор фильтра по полю. По умолчанию "equal" и если это подходит, то атрибут можно не указывать (но я указал для наглядности).
Вот как можно отобрать все невыполненные задачи:

<DataElements Type="Demo.Task">
  <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>

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

Комментариев нет:

Отправить комментарий