пятница, 3 июня 2011 г.

Консольные приложения (9): Группировка элементов в дереве

В предыдущем сообщении, я упомянул XML-элемент DataFolderElements. Он позволяет группировать элементы данных определенного типа, представленные в дереве с помощью XML-элемента DataElements по одному из полей элемента данных.

<DataFolderElements Type="Composite.Community.Blog.Entries" DateFormat="yyyy MMMM" FieldGroupingName="Date" Display="Compact">
  <Children>
    <DataElements Type="Composite.Community.Blog.Entries" Label="${C1:Data:Composite.Community.Blog.Entries:Title}" Display="Auto">
      <!-- остальной XML -->
     </DataElements>
   </Children>
</DataFolderElements>


В нашем примере, он группирует элементы данных типа Composite.Community.Blog.Entries по дате (поле Date).


Соответственно, если этот элемент убрать...

<Element Label="Blog Entries" Id="Root">
  <!-- остальной XML -->
  <Children>
    <DataElements Type="Composite.Community.Blog.Entries" Label="${C1:Data:Composite.Community.Blog.Entries:Title}" Display="Auto">
      <!-- остальной XML -->
    </DataElements>
  </Children>
</Element>

...то записи блога будут представлены без группировки.


DataFolderElements в иерархии является предком для DataElements и должен указывать на тип данных, который представляет DataElements (в нашем примере - это Composite.Community.Blog.Entries.)

Вот какие атрибуты вы должны или можете указать для DataFolderElements:

Обязательные:

  • Type: (“Тип”) Тип данных, элементы которого группируются (такой же какой указан для вложенного DataElements)
  • FieldGroupingName: (“Имя группирующего поля”) Имя поля в типе данных, по которому элементы будут группироваться

Необязательные:

  • DateFormat: ("Формат даты") Формат даты при группировки по полю, содержащего дату (напр., 'yyyy MMMM'). Используйте такие обозначения:
    • Год: y, yy, yyy, yyyy
    • Месяц: M, MM, MMM, MMM.
    • День: d, dd, ddd, dddd.
    • Час: h, H, hh, HH.
    • Минуты: m, mm.
    • Секунды: s, ss
  • Range: ("Диапазон") Диапазон элементов для группировки по буквам/цифрам в названии элемента. Между начальным и конечным значением используйте  ">" и "," между несколькими диапазонами (напр., "0>10, 11>20, 21>" or "А>З, И>Я")
  • FirstLetterOnly: (“Только первая буква”) При значении "true" элементы группируются по первой букве названия элемента (алфавитная группировка).
  • Display: (“Отображение”) Режим отображения элемента группирующей папки в зависимости от наличия дочерних элементов: Lazy, Compact, Auto. (Подробно рассмотрел в предыдущем сообщении.)
  • Icon: (“Иконка”) Иконка для элемента группирующей папки.

Следует отметить, что группировать можно не по одному, а по нескольким полям. В таком случае можно вкладывать DataFolderElements друг в друга, вкладывая в последний  из них - нужный нам DataElements.

Корневой DataFolderElements настраивается при помощи указанных выше атрибутов, а вот любой дочерний (по отношению к корневому) DataFolderElements имеет свои особенности.

Во-первых, для него не нужно указывать тип данных (атрибут Type) - он задан в корневом DataFolderElements.

Во-вторых, у дочернего DataFolderElements можно указать еще один необязательный атрибут (которого нет у корневого):

  • ShowForeignItems: При значении "true" будут показаны все нелокализованные элементы данных  и для них будет добавлено контекстное действие “Локализовать” (Это тот случай, когда некоторые элементы данных созданы в другой языковой версии (локали) сайта, а сам тип данных поддерживает локализацию.)

Мы можем, например, сгруппировать записи блога не только по дате, но и, скажем, по ярлыкам (поле Tags):

<DataFolderElements Type="Composite.Community.Blog.Entries" DateFormat="yyyy MMMM" FieldGroupingName="Date" Display="Compact">
  <Children>
    <DataFolderElements FieldGroupingName="Tags" Display="Compact">
      <Children>
        <DataElements Type="Composite.Community.Blog.Entries" Label="${C1:Data:Composite.Community.Blog.Entries:Title}" Display="Auto">
          <!-- остальной XML -->
        </DataElements>
      </Children>
    </DataFolderElements>
  </Children>
</DataFolderElements>

… чтобы получить вот такую структуру:


Далее мы рассмотрим фильтрацию и сортировку элементов данных.

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



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

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

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