четверг, 9 июня 2011 г.

Консольные приложения (10): Фильтрация элементов

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

Всего в консольных приложениях - 3 типа фильтров:
  • ParentIdFilter (фильтр по идентификатору родительского элемента)
  • FieldFilter (фильтр по полю)
  • FunctionFilter (фильтр с помощью функции)
(Самые нетерпеливые могут почитать про все фильтры на английском How to Filter Data Elements.)

Фильтр любого типа вставляется внутри XML-элемента <Filters></Filters>, который в свою очередь размещается внутри XML-элемента <DataElements></DataElements> (элементы, которые мы фильтруем) и только в нем:



<DataElements>
  <Filters>
    <ParentIdFilter/>
  </Filters>
</DataElements>

В пакете Блог используется фильтр по идентификатору родительского элемента - ParentIdFilter. При помощи этого фильтра можно отобрать элементы данных, которые имеют общий родительский элемент.

Соответственно, когда вы используете это фильтр вам нужно указать тип данных родительского элемента (атрибут ParentType), а также имя поля, в котором хранится ссылка или идентификатор конкретного родительского элемента (атрибут ReferenceFieldName). Оба атрибута обязательны.

<ParentIdFilter ParentType="Composite.Data.Types.IPage" ReferenceFieldName="PageId" />

Например, в Блоге, каждая запись блога привязана к какой-то странице. Если у вас только одна страница для блога на сайте, то у всех элементов будет один и тот же родительский элемент. Но если у вас два и более блогов на сайте, то несмотря на то, что записи из всех блогов хранятся в одном и том же типе данных Composite.Community.Blog.Entries, они различаются по идентификатору страницы, на которой их добавляли. Система саму указывает этот идентификатор при создании новой записи - в поле PageId.

Вот как это реализовано в нашем примере:

<DataElements Type="Composite.Community.Blog.Entries" Label="${C1:Data:Composite.Community.Blog.Entries:Title}" Display="Auto">
  <!-- остальной XML -->
    <Filters>
      <ParentIdFilter ParentType="Composite.Data.Types.IPage" ReferenceFieldName="PageId" />
    </Filters>
  <!-- остальной XML -->
</DataElements>

Вы видите, что в качестве типа данных родительского элемента указан тип страниц Composite.Data.Types.IPage, а в качестве ссылочного поля - поле PageId в типе данных, где хранятся записи блога: Composite.Community.Blog.Entries.

То же самое и с комментариями. Комментарии к любой записи хранятся в типе данных Composite.Community.Blog.Comments. У комментариев может быть общим родительским элементов конкретная запись блога. Идентификатор такой записи система сохраняет в поле BlogEntry в типе данных Composite.Community.Blog.Comments.

Соответственно, в качестве родительского типа данных мы укажем  Composite.Community.Blog.Entries, а в качестве поля с идентификатором родительского элемента - поле BlogEntry:

<DataElements Type="Composite.Community.Blog.Comments" Label="${C1:Data:Composite.Community.Blog.Comments:Title}" Display="Compact">
  <!-- остальной XML -->
  <Filters>
    <ParentIdFilter ParentType="Composite.Community.Blog.Entries" ReferenceFieldName="BlogEntry" />
  </Filters>
  <!-- остальной XML -->
</DataElements>

Обычно, этот тип фильтра удобно использовать с такими типами данных, в которых имеется  поле типа "Ссылка на тип данных" (DataReference), и каждый элемент которого ссылается на какой-нибудь элемент другого типа данных, выстраивая таким образом иерархию элементов, что-то вроде: страна > город > улица > дом

Следует обратить внимание на то, что внутри XML-элемента Filters, может быть только один XML-элемент ParentIdFilter.

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

(продолжение следует...)


Предыдущие сообщения по теме:

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

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