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

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

Glossary Item Box

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

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

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

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

Описание примера

В Creatio уже реализована схема объекта [Адрес контакта] (ContactAddress), одна из колонок которой ссылается на справочник (схему) [Тип адреса] (AddressType). Колонка [Название] (Name) схемы [Тип адреса] — локализуема.

Поскольку практически каждой схеме объекта в Creatio соответствует своя таблица, то структура связей таблиц будет такой (рис. 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. — Результат проверки в выбранной локализации

© Terrasoft 2002-2020.

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

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