Локализация представлений
Glossary Item Box
Общие сведения
Часто для выборки данных используются представления (View). Представления, в свою очередь, могут выбирать данные из локализуемых колонок. Соответственно, для выборки локализуемых данных через представления необходимо дополнительно настраивать локализуемые представления.
Для локализации представления необходимо выполнить следующие действия:
- Создать схему объекта для представления. Установить признак мультиязычия для локализуемых колонок.
- Добавить новое представление локализации в базе данных.
Описание примера
В bpm'online уже реализована схема объекта [Адрес контакта] (ContactAddress), одна из колонок которой ссылается на справочник (схему) [Тип адреса] (AddressType). Колонка [Название] (Name) схемы [Тип адреса] — локализуема.
Поскольку практически каждой схеме объекта в bpm'online соответствует своя таблица, то структура связей таблиц будет такой (рис. 1):
- ContactAddress — таблица адресов контакта. Связана с таблицей AddressType по колонке AddressTypeId.
- AddressType — таблица типов адресов. Колонка Name содержит значения, соответствующие культуре пользователя, установленной по умолчанию. Значения, соответствующие другим культурам, содержатся в таблице SysAddressTypeLcz.
- SysAddressTypeLcz — автоматически генерируемая системная таблица локализованных значений типов адресов. Связана с таблицей AddressType по колонке RecordId, а с таблицей SysCulture — по колонке SysCultureId. В колонке Name содержатся локализованные значения типов адресов для культуры, указанной в колонке SysCultureId.
- SysCulture — системная таблица с перечнем культур.
Рис. 1. — Структура и связи таблиц для схем [Адрес контакта], [Тип адреса] и таблиц локализации
Необходимо создать представление, которое выбирает следующие поля:
- ContactAddress.Address — адрес контакта;
- AddressType.Name — локализуемое название типа адреса.
Исходный код
Пакет с реализацией примера можно скачать по ссылке.
Реализация примера
1. Создание схемы объекта для представления
Создайте схему объекта со следующими значениями свойств:
- [Название] ([Name]) — "UsrVwContactAdress". Префикс Usr устанавливается системной настройкой [Префикс названия объекта]. Префикс Vw (сокращение от View) показывает, что схема является представлением в базе данных.
- [Заголовок] ([Titlie]) — "Представление адреса контакта" ("Contact address view").
- [Родительский объект] ([Parent object]) — "Базовый объект" ("Base object").
- [Представление в базе данных] ([Represent Structure of Database View]) — признак должен быть обязательно отмечен (рис. 2).
Как создать схему объекта и добавить в нее колонки подробно описано в статье "Создание схемы объекта".
Рис. 2. — Признак представления в базе данных
В созданную схему добавьте две строковые колонки.
Первая колонка будет содержать нелокализованные значения адреса в культуре по умолчанию. Для нее следует установить следующие значения свойств:
- [Название] ([Name]) — "UsrAddress".
- [Заголовок] ([Title]) — "Адрес" ("Address").
- [Тип данных] ([Data type]) — "Строка (50 символов)" ("Text (50 characters)").
Вторая колонка будет содержать локализованные значения типа адреса. Для нее следует установить следующие значения свойств:
- [Название] ([Name]) — "UsrAddressType".
- [Заголовок] ([Title]) — "Тип адреса" ("").
- [Тип данных] ([Data type]) — "Строка (50 символов)" ("Text (50 characters)").
- [Локализуемый текст] ([Localizable text]) — признак должен быть обязательно отмечен (рис. 3) Подробнее о признаке мультиязычия можно узнать из статьи "Добавление признака мультиязычия в схему объекта".
Рис. 3. — Признак мультиязычия в колонке
К СВЕДЕНИЮ
Свойства [Тип данных] и [Локализуемый текст] отображаются в расширенном режиме отображения свойств колонки (см. "Дизайнер объектов").
Сохраните и опубликуйте схему объекта.
2. Создание представления в базе данных
Для создания представления UsrVwContactAddress в базе данных выполните следущий SQL-скрипт:
-- Название представления должно совпадать с названием таблицы схемы. CREATE VIEW dbo.UsrVwContactAddress AS SELECT ContactAddress.Id, -- Колонки представления должны соответствовать колонкам схемы. ContactAddress.Address AS UsrAddress, AddressType.Name AS UsrAddressType FROM ContactAddress INNER JOIN AddressType ON ContactAddress.AddressTypeId = AddressType.Id;
Для создания локализуемого представления UsrVwContactAddress в базе данных выполните следущий SQL-скрипт:
-- Название представления должно совпадать с названием таблицы локализации схемы. CREATE VIEW dbo.SysUsrVwContactAddressLcz AS SELECT SysAddressTypeLcz.Id, ContactAddress.id AS RecordId, SysAddressTypeLcz.SysCultureId, -- Колонки представления должны соответствовать колонкам схемы. SysAddressTypeLcz.Name AS UsrAddressType FROM ContactAddress INNER JOIN AddressType ON ContactAddress.AddressTypeId = AddressType.Id INNER JOIN SysAddressTypeLcz ON AddressType.Id = SysAddressTypeLcz.RecordId;
Колонки у локализуемого представления UsrVwContactAddress должны соответствовать колонкам таблиц локализации. Детальная информация о таблицах локализации доступна в статье "Таблицы локализации".
В результате выполнения кейса при чтении данных с помощью EntitySchemaQuery из колонки UsrAddressType представления UsrVwContactAddress будут отображены корректные значения для разных языков.
Проверка результатов выполнения кейса
Для проверки результатов можно воспользоваться одним из примеров, приведенных в статье "Чтение мультиязычных данных с помощью EntitySchemaQuery". Для проверки результатов запросов можно, например, создать пользовательский конфигурационный сервис (см. "Как создать свой конфигурационный сервис").
В созданном классе сервиса необходимо реализовать метод, который с помощью запроса EntitySchemaQuery вернет перечень адресов и их типов из созданного нелокализованного представления UsrVwContactAddress.
[OperationContract] [WebInvoke(Method = "GET", UriTemplate = "Ex01")] public string Ex01() { // Пользовательское подключение. var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"]; // Формирование запроса. var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "UsrVwContactAddress"); // Добавление колонок в запрос. esqResult.AddColumn("UsrAddress"); esqResult.AddColumn("UsrAddressType"); // Выполнение запроса к базе данных и получение всей результирующей коллекции объектов. var entities = esqResult.GetEntityCollection(userConnection); // Вывод результатов. var s = ""; foreach (var item in entities) { s += item.GetTypedColumnValue<string>("UsrAddress") + Environment.NewLine; s += item.GetTypedColumnValue<string>("UsrAddressType") + Environment.NewLine; } return s; }
Результат работы этого метода представлен на рисунке 4.
Рис. 4. — Результат проверки в локализации по умолчанию
Для проверки работы локализованного представления в созданном классе сервиса необходимо реализовать второй метод:
[OperationContract] [WebInvoke(Method = "GET", UriTemplate = "Ex01")] public string Ex01() { var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"]; // Получение Id нужной культуры, например, английской. var sysCulture = new SysCulture(userConnection); if (!sysCulture.FetchPrimaryInfoFromDB("Name", "en-US")) { return "Культура не найдена"; } Guid CultureId = sysCulture.Id; var esqResult = new EntitySchemaQuery(userConnection.EntitySchemaManager, "UsrVwContactAddress"); esqResult.AddColumn("UsrAddress"); esqResult.AddColumn("UsrAddressType"); // Установка необходимой локализации. esqResult.SetLocalizationCultureId(CultureId); var entities = esqResult.GetEntityCollection(userConnection); var s = ""; foreach (var item in entities) { s += item.GetTypedColumnValue<string>("UsrAddress") + Environment.NewLine; s += item.GetTypedColumnValue<string>("UsrAddressType") + Environment.NewLine; } return s; }
Результат работы этого метода представлен на рисунке 5.
Рис. 5. — Результат проверки в выбранной локализации