Итак, фильтрация элементов. В этом сообщении мы рассмотрим один из фильтров, тот который используется в пакете Блог, остальные - мы рассмотрим в других сообщениях на других примерах.
Всего в консольных приложениях - 3 типа фильтров:
Фильтр любого типа вставляется внутри XML-элемента <Filters></Filters>, который в свою очередь размещается внутри XML-элемента <DataElements></DataElements> (элементы, которые мы фильтруем) и только в нем:
В пакете Блог используется фильтр по идентификатору родительского элемента - ParentIdFilter. При помощи этого фильтра можно отобрать элементы данных, которые имеют общий родительский элемент.
Соответственно, когда вы используете это фильтр вам нужно указать тип данных родительского элемента (атрибут ParentType), а также имя поля, в котором хранится ссылка или идентификатор конкретного родительского элемента (атрибут ReferenceFieldName). Оба атрибута обязательны.
Например, в Блоге, каждая запись блога привязана к какой-то странице. Если у вас только одна страница для блога на сайте, то у всех элементов будет один и тот же родительский элемент. Но если у вас два и более блогов на сайте, то несмотря на то, что записи из всех блогов хранятся в одном и том же типе данных Composite.Community.Blog.Entries, они различаются по идентификатору страницы, на которой их добавляли. Система саму указывает этот идентификатор при создании новой записи - в поле PageId.
Вот как это реализовано в нашем примере:
То же самое и с комментариями. Комментарии к любой записи хранятся в типе данных Composite.Community.Blog.Comments. У комментариев может быть общим родительским элементов конкретная запись блога. Идентификатор такой записи система сохраняет в поле BlogEntry в типе данных Composite.Community.Blog.Comments.
Соответственно, в качестве родительского типа данных мы укажем Composite.Community.Blog.Entries, а в качестве поля с идентификатором родительского элемента - поле BlogEntry:
Обычно, этот тип фильтра удобно использовать с такими типами данных, в которых имеется поле типа "Ссылка на тип данных" (DataReference), и каждый элемент которого ссылается на какой-нибудь элемент другого типа данных, выстраивая таким образом иерархию элементов, что-то вроде: страна > город > улица > дом
Следует обратить внимание на то, что внутри XML-элемента Filters, может быть только один XML-элемент ParentIdFilter.
На этом введение в фильтры, пожалуй, я закончу. Об двух других типах фильтра я расскажу позже. А далее мы рассмотрим сортировку элементов в дереве.
(продолжение следует...)
Всего в консольных приложениях - 3 типа фильтров:
- ParentIdFilter (фильтр по идентификатору родительского элемента)
- FieldFilter (фильтр по полю)
- FunctionFilter (фильтр с помощью функции)
Фильтр любого типа вставляется внутри XML-элемента <Filters></Filters>, который в свою очередь размещается внутри XML-элемента <DataElements></DataElements> (элементы, которые мы фильтруем) и только в нем:
<DataElements>
<Filters>
<ParentIdFilter/>
</Filters>
</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>
<!-- остальной 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>
<!-- остальной XML -->
<Filters>
<ParentIdFilter ParentType="Composite.Community.Blog.Entries" ReferenceFieldName="BlogEntry" />
</Filters>
<!-- остальной XML -->
</DataElements>
Обычно, этот тип фильтра удобно использовать с такими типами данных, в которых имеется поле типа "Ссылка на тип данных" (DataReference), и каждый элемент которого ссылается на какой-нибудь элемент другого типа данных, выстраивая таким образом иерархию элементов, что-то вроде: страна > город > улица > дом
Следует обратить внимание на то, что внутри XML-элемента Filters, может быть только один XML-элемент ParentIdFilter.
На этом введение в фильтры, пожалуй, я закончу. Об двух других типах фильтра я расскажу позже. А далее мы рассмотрим сортировку элементов в дереве.
(продолжение следует...)
Предыдущие сообщения по теме:
- Консольные приложения (1): Введение
- Консольные приложения (2): Определение приложения. Тип подключения
- Консольные приложения (3): Определение приложения. Древовидная структура
- Консольные приложения (4): Динамические поля
- Консольные приложения (5): Представление данных
- Консольные приложения (6): Стандартные действия
- Консольные приложения (7): Ручное подключение
- Консольные приложения (8): Пример древовидной структуры элементов
- Консольные приложения (9): Группировка элементов в дереве
Комментариев нет:
Отправить комментарий