Локализовать представление в базе данных

Сложный

Пример. Создать представление, которое формирует выборку, состоящую из локализованных значений адресов контактов (колонка [Name] таблицы [AddressType] базы данных) и значений адресов контактов (колонка [Address] таблицы [ContactAddress] базы данных).

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

diagram.png
  • [ContactAddress] — таблица базы данных, которая содержит перечень значений адресов контактов. Связана с таблицей [AddressType] по колонке [AddressTypeId].
  • [AddressType] — таблица базы данных, которая содержит перечень типов адресов контактов. Колонка [Name] таблицы содержит перечень значений типов адресов на основном языке. Значения на дополнительных языках содержатся в таблице [SysAddressTypeLcz].
  • [SysAddressTypeLcz] — автоматически генерируемая системная таблица базы данных, которая содержит перечень локализованных значений типов адресов контактов. Связана с таблицей [AddressType] по колонке [RecordId] и с таблицей [SysCulture] по колонке [SysCultureId]. Колонка [Name] таблицы содержит перечень локализованных значений типов адресов контактов для языковой культуры, которая указана в колонке [SysCultureId] текущей таблицы.
  • [SysCulture] — системная таблица базы данных, которая содержит перечень языковых культур.

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

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Объект (Add —> Object).

    scr_add_entity_schema.png
  3. В дизайнере объекта заполните свойства схемы:

    • Код (Code) — "UsrVwContactAddress".
    • Заголовок (Title) — "ContactAddressView".
    • Родительский объект (Parent object) — выберите "BaseEntity".
  4. В блоке свойств Поведение (Behavior) установите признак Представление в базе данных (Represent Structure of Database View).

2. Добавить колонки 

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

    1. В контекстном меню узла Колонки (Columns) структуры объекта нажмите add_button.
    2. В выпадающем меню нажмите Строка —> Строка (50 символов) (Text —> Text (50 characters)).

    3. В дизайнере объекта заполните свойства добавляемой колонки:

      • Код (Code) — "UsrAddress".
      • Заголовок (Title) — "Address".
  2. Добавьте колонку, которая будет содержать перечень типов адресов контактов на дополнительном языке.

    1. В контекстном меню узла Колонки (Columns) структуры объекта нажмите add_button.
    2. В выпадающем меню нажмите Строка —> Строка (50 символов) (Text —> Text (50 characters)).

    3. В дизайнере объекта заполните свойства добавляемой колонки:

      • Код (Code) — "UsrAddressType".
      • Заголовок (Title) — "AddressType".
      • Установите признак Локализуемый текст (Localizable text).
    4. На панели инструментов дизайнера объектов нажмите Сохранить (Save), а затем Опубликовать (Publish).

3. Создать представления в базе данных 

  1. Создайте представление [UsrVwContactAddress] в базе данных. Для этого выполните SQL-запрос.

    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;
    
  2. Создайте локализуемое представление [SysUsrVwContactAddressLcz] в базе данных. Для этого выполните SQL-запрос.

    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;
    

В результате при чтении данных с помощью EntitySchemaQuery из колонки [UsrAddressType] представления [UsrVwContactAddress] будут отображены корректные значения для разных языков.

Результат выполнения примера 

Для проверки результата выполнения примера создайте пользовательский веб-сервис с аутентификацией на основе cookies.

1. Создать схему Исходный код 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Исходный код (Add —> Source code).

  3. В дизайнере схем заполните свойства схемы:

    • Код (Code) — "UsrViewLocalizationService".
    • Заголовок (Title) — "UsrViewLocalizationService".

    Для применения заданных свойств нажмите Применить (Apply).

2. Создать класс сервиса 

  1. В дизайнере схем добавьте пространство имен Terrasoft.Configuration.
  2. C помощью директивы using добавьте пространства имен, типы данных которых будут задействованы в классе.
  3. Добавьте название класса, которое соответствует названию схемы (свойство Код (Code)).
  4. В качестве родительского класса укажите System.Web.SessionState.IReadOnlySessionState.
  5. Для класса добавьте атрибуты [ServiceContract] и [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)].

3. Реализовать методы класса 

  1. Реализуйте метод, который вернет перечень типов адресов контактов и значений адресов контактов из созданного нелокализуемого представления [UsrVwContactAddress]. В дизайнере схем добавьте в класс метод public string GetNonLocalizableView(), который реализует конечную точку пользовательского веб-сервиса. С помощью EntitySchemaQuery метод отправит запрос к базе данных.

  2. Реализуйте метод, который вернет перечень типов адресов контактов и значений адресов контактов из созданного локализуемого представления [UsrVwContactAddress]. В дизайнере схем добавьте в класс метод public string GetLocalizableView(), который реализует конечную точку пользовательского веб-сервиса. С помощью EntitySchemaQuery метод отправит запрос к базе данных.

Исходный код пользовательского веб-сервиса UsrViewLocalizationService представлен ниже.

UsrViewLocalizationService
namespace Terrasoft.Configuration
{
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Web;
    using Terrasoft.Core;
    using Terrasoft.Core.Entities;
    using System;
    using System.Collections.Generic;

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrViewLocalizationService : System.Web.SessionState.IReadOnlySessionState
    {

        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "GetNonLocalizableView")]
        public string GetNonLocalizableView()
        {
            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>("UsrAddressType") + ": ";
                s += item.GetTypedColumnValue<string>("UsrAddress") + "; ";
            }
            return s;
        }

        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "GetLocalizableView")]
        public string GetLocalizableView()
        {
            var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
            var sysCulture = new SysCulture(userConnection);
            if (!sysCulture.FetchPrimaryInfoFromDB("Name", "ru-ru"))
            {
                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>("UsrAddressType") + ": ";
                s += item.GetTypedColumnValue<string>("UsrAddress") + "; ";
            }
            return s;
        }
    }
}

На панели инструментов дизайнера нажмите Сохранить (Save), а затем Опубликовать (Publish).

Результат работы пользовательского веб-сервиса 

В результате выполнения примера в Creatio появится пользовательский веб-сервис UsrViewLocalizationService с конечными точками GetLocalizableView и GetNonLocalizableView.

Авторизуйтесь в приложении и из браузера обратитесь к конечной точке GetLocalizableView веб-сервиса.

Строка запроса
http://mycreatio.com/0/rest/UsrViewLocalizationService/GetLocalizableView

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

Из браузера обратитесь к конечной точке GetNonLocalizableView веб-сервиса.

Строка запроса
http://mycreatio.com/0/rest/UsrViewLocalizationService/GetNonLocalizableView

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