среда, 18 мая 2011 г.

Консольные приложения (5): Представление данных

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

Как я уже писал ранее, элементы данных всегда добавляются внутри элемента Children.

<Children>
<!-- элементы данных -->
</Children>

Для вывода элементов определенного типа данных в консольном приложении, необходимо воспользоваться XML элементом <DataElements/>.

Допустим, у нас есть глобальный тип данных “Demo.Country” (страна), в котором только одно поле Name (название).

При помощи <DataElements/> мы выведем все элементы этого типа. Для этого нужно в обязательном атрибуте Type (тип) указать полное название этого типа данных.

<?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="Content" Position="Bottom"/>
</ElementStructure.AutoAttachments>
<ElementRoot>
<Children>
<DataElements Type="Demo.Country">
</DataElements>
</Children>
</ElementRoot>
</ElementStructure>

Кроме обязательного атрибута Type, можно указать еще необязательные атрибуты:
  • Label: Надпись для элементов данного типа в дереве приложения
  • ToolTip: Всплывающая подсказка для элементов данного типа в дереве приложения
  • ShowForeignItems: При значении "true", не локализованные элементы данных появятся в дереве приложения с действием “Локализовать”.
  • Display: Режим показа элемента у которого могут быть дочерние элементы (Auto, Lazy, Compact)
  • Icon: Иконка для свернутого элемента
  • OpenedIcon: Иконка для развернутого элемента
Однако если мы посмотрим в админке что получилось, то увидим, что элементы были добавлены сразу как дочерние элементы корневого элемента.



Это нас не очень устраивает. Гораздо лучше будет, если мы покажем эти элементы под общим родительским элементом.

Для этого воспользуемся еще одним XML элементом, который позволяет добавлять один элемент с произвольным названием: <Element/>. У элемента <Element/> обязательные атрибуты Id (идентификатор) и Label (надпись).

Перепишем наш пример так:

<ElementRoot>
<Children>
<Element Id="CountriesRoot" Label="Страны">
<Children>
<DataElements Type="Demo.Country">
</DataElements>
</Children>
</Element>
</Children>
</ElementRoot>

В консоли получится так:



Так-то лучше.

Вы обратили внимание, что <Element/> я поместил внутри тегов <Children></Children> и <DataElements/> в свою очередь тоже. Это обязательный синтаксис. Дочерние элементы необходимо помещать в эти теги.

Данные представленные при помощи <DataElements/> можно группировать, сортировать и фильтровать. (Об этом в других сообщениях.)

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

Например, если бы у нас тип данных Demo.Country имел два поля: EnglishName (название по-английски) и NativeName (самоназвание на родном языке), и заголовочным полем было бы EnglishName, то оно бы и выводилось по умолчанию. Но если бы мы захотели вместо поля по умолчанию выводить самоназвание страны на родном языке или даже комбинацию из этих двух полей, то можно было бы воспользоваться синтаксисом динамических полей.

Самоназвание

<DataElements Type="Demo.Country" Label="${C1:Data:Demo.Country:NativeName}">
</DataElements>


Комбинация: По-английски (самоназвание)

<DataElements Type="Demo.Country" Label="${C1:Data:Demo.Country:EnglishName} (${C1:Data:Demo.Country:NativeName})">
</DataElements>


И еще. Забегая вперед скажу, что в качестве типа данных можно указывать не только встроенные типы (напр., Composite.Data.Types.IPage) или добавленные вручную в разделе “Данные”(напр., Demo.Country). Дело в том, что вы можете программно создавать свои типы данных и добавлять их в C1 при помощи провайдеров данных, (напр., интегрируя свое решение интернет-магазина в C1.)

(Создание своих типов данных и провайдеров данных программно - достаточно обширная тема, заслуживающая отдельной темы и нескольких сообщений. Самые нетерпеливые могут ознакомится с материалами на английском языке: Custom Data Providers.

В этом случае вы указываете тип данных для представления его элементов другим способом:

<DataElements Type="Demo.DataProvider.IVCard, Demo.DataProvider" >
</DataElements>

Тут все просто для тех, кто знаком с C#. Demo.DataProvider.IVCard - это название интерфейса (который представляет данные в формате принятом в C1, напр., из карточек vCard), после запятой - Demo.DataProvider - имя сборки (assembly), где этот интерфейс определен и имплементирован.

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

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

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

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

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