Creatio development guide
Это документация Creatio версии 7.9.0. Мы рекомендуем использовать новую версию документации.

Локализация представлений

Glossary Item Box

Общие сведения

Часто для выборки данных используются представления (View). Представления, в свою очередь, могут выбирать данные из локализуемых колонок. Соответственно, для выборки локализуемых данных через представления необходимо дополнительно настраивать локализуемые представления.

Для локализации представления необходимо выполнить следующие действия:

  1. Создать схему объекта для представления. Установить признак мультиязычия для локализуемых колонок.
  2. Добавить новое представление локализации в базе данных.

Описание кейса

В 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. Создание схемы объекта для представления

Как создать схему объекта и добавить в нее колонки подробно описано в статье "Создание схемы объекта".

Для реализации кейса необходимо создать схему объекта со следующими значениями свойств:

  • [Название] — "UsrVwContactAdress". Префикс Usr устанавливается системной настройкой [Префикс названия объекта]. Префикс Vw (сокращение от View) показывает, что схема является представлением в базе данных.
  • [Заголовок] — "Представление адреса контакта".
  • [Пакет] — название пользовательского пакета, в котором ведется разработка (см. "Создание пользовательского пакета").
  • [Родительский объект] — "Базовый объект".
  • [Представление в базе данных] — признак должен быть обязательно отмечен  (рис. 2).

Рис. 2. — Признак представления в базе данных

После заполнения значений свойств рекомендуется сохранить метаданные схемы или предварительно опубликовать объект.

В созданную схему необходимо добавить две строковые колонки.

Первая колонка будет содержать нелокализованные значения адреса в культуре по умолчанию. Для нее следует установить следующие значения свойств:

  • [Название] — "UsrAddress". Префикс Usr устанавливается системной настройкой [Префикс названия объекта].
  • [Заголовок] — "Адрес".
  • [Тип данных] — "Строка (50 символов)". Строка может содержать разное количество символов. От количества символов зависит занимаемый в базе данных объем памяти.

Вторая колонка будет содержать локализованные значения типа адреса. Для нее следует установить следующие значения свойств:

  • [Название] — "UsrAddressType". Префикс Usr устанавливается системной настройкой [Префикс названия объекта].
  • [Заголовок] — "Тип адреса".
  • [Тип данных] — "Строка (50 символов)". 
  • [Локализуемый текст] — признак должен быть обязательно отмечен (рис. 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;
}

Результат работы этого метода представлен на рисунке 4.

Рис. 5. — Результат проверки в выбранной локализации

 

© Terrasoft 2002-2017.

Был ли данный материал полезен?

Как можно улучшить эту статью?