Creatio development guide
PDF

Создание детали со страницей добавления

Glossary Item Box

Общие положения

Детали — это элементы страницы редактирования раздела. Детали предназначены для отображения записей, связанных с текущей записью раздела по справочной колонке. Это могут быть, например, записи другого раздела, в основном объекте которого есть справочная колонка, ссылающаяся на основной объект текущего раздела. Детали отображаются во вкладках страницы редактирования раздела.

Подробнее детали описаны в статье "Деталь" раздела "Основные элементы интерфейса и их структура".

ВАЖНО

Деталь со страницей добавления является стандартной деталью приложения bpm'online. Рекомендуется добавлять этот тип детали в раздел при помощи мастера деталей.

Ниже будет рассмотрен способ добавления детали со страницей добавления без использования мастера деталей.

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

  1. Создать схему объекта детали.
  2. Создать схему реестра детали.
  3. Создать схему страницы редактирования записи детали.
  4. Выполнить настройку детали в замещающей схеме страницы редактирования раздела.
  5. Зарегистрировать связи между схемами объекта, реестра детали и страницы редактирования записи детали при помощи специальных SQL-запросов в системные таблицы.
  6. Выполнить настройку полей детали.

ВАЖНО

Чтобы связать пользовательские схемы создаваемой детали, необходимо внести изменения в системные таблицы SysModuleEdit, SysModulentity и SysDetail базы данных bpm’online при помощи SQL-запросов.

Однако при составлении и выполнении SQL-запроса к базе данных следует быть предельно внимательным. Выполнение неправильно составленного SQL-запроса может привести к повреждению существующих данных и нарушению работы системы.

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

Создать пользовательскую деталь [Курьеры] ([Couriers]) для раздела [Заказы] ([Orders]). Деталь должна отображать список курьеров для текущего заказа.

Исходный код

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера

1. Создать схему объекта детали

В разделе [Конфигурация] на вкладке [Схемы] выполните пункт меню [Добавить] — [Объект] ([Add] — [Object]) (рис. 1).

Рис. 1. — Добавление схемы объекта детали

Для схемы объекта детали в открывшемся дизайнере объектов заполните ее свойства как на рисунке 2.

Рис. 2. — Настройка свойств схемы объекта детали

В схему объекта добавьте справочную колонку [Заказ] ([Order]), по которой будет осуществляться связь с разделом [Заказ], и справочную колонку [Контакт] ([Contact]), в которой будет храниться контакт курьера. Для обеих колонок установите признак обязательности для заполнения, чтобы избежать добавления пустых записей. Настройки свойств колонок показаны на рисунках 3 и 4.

Рис. 3. — Настройка свойств колонки [Заказ] ([Order])

Рис. 4. — Настройка свойств колонки [Контакт] ([Contact])

Схему объекта сохраните и опубликуйте.

2. Создать схему реестра детали

В разделе [Конфигурация] на вкладке [Схемы] выполните пункт меню [Добавить] — [Схема модели представления карточки] ([Add] — [Schema of the Edit Page View Model]) (рис. 1).

Созданный модуль должен наследовать функциональность базовой схемы детали с реестром BaseGridDetailV2, которая определена в пакете NUI. Для этого укажите эту схему в качестве родительской для создаваемой схемы реестра детали (рис. 5). Остальные свойства установите так, как показано на рисунке 5.

Рис. 5. — Свойства схемы детали

Установите значение [Курьеры] ([Couriers]) для локализуемой строки [Caption] схемы реестра детали (рис. 6). В локализуемой строке [Caption] хранится заголовок детали, отображаемый на странице редактирования.

Рис. 6. — Установка значения локализуемой строки [Caption]

Ниже исходный код схемы реестра детали, который нужно добавить в секцию [Исходный код] дизайнера клиентского модуля. Здесь определяется название схемы реестра детали и ее связь со схемой объекта.

define("UsrCourierDetail", [], function() {
    return {
        // Название схемы объекта детали.
        entitySchemaName: "UsrCourierInOrder",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        methods: {},
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

Для применения внесенных изменений сохраните созданную схему реестра детали.

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

В разделе [Конфигурация] на вкладке [Схемы] выполните пункт меню [Добавить] — [Схема модели представления карточки] ([Add] — [Schema of the Edit Page View Model]) (рис. 1).

Создаваемая схема страницы редактирования записи детали должна наследовать функциональность базовой схемы карточки BasePageV2, которая определена в пакете NUI. Для этого укажите эту схему в качестве родительской (рис. 7). Остальные свойства установите как показано на рисунке 7.

Рис. 7. — Свойства схемы страницы редактирования детали

Для настройки полей, отображаемых на странице редактирования записи детали, в секцию [Исходный код] дизайнера клиентского модуля добавьте следующий код. Здесь в массиве модификаций diff указываются конфигурационные объекты метаданных для добавления, определения местоположения и привязки полей ввода значений заказа и контакта курьера.

define("UsrCourierDetailPage", [], function() {
    return {
        // Название схемы объекта детали.
        entitySchemaName: "UsrCourierInOrder",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
            // Метаданные для добавления поля [Заказ].
            {
                "operation": "insert",
                //Название поля.
                "name": "Order",
                "values": {
                    // Настройка расположения поля на странице редактирования.
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 0,
                        "row": 0,
                        "layoutName": "Header"
                    },
                    // Привязка к колонке [Order] схемы объекта.
                    "bindTo": "Order"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 0
            },
            // Метаданные для добавления поля [Контакт].
            {
                "operation": "insert",
                //Название поля.
                "name": "Contact",
                "values": {
                    // Настройка расположения поля на странице редактирования.
                    "layout": {
                        "colSpan": 12,
                        "rowSpan": 1,
                        "column": 12,
                        "row": 0,
                        "layoutName": "Header"
                    },
                    // Привязка к колонке [Contact] схемы объекта.
                    "bindTo": "Contact"
                },
                "parentName": "Header",
                "propertyName": "items",
                "index": 1
            }
        ]/**SCHEMA_DIFF*/,
        methods: {},
        rules: {}
    };
});

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

Чтобы отобразить деталь на странице редактирования заказа, создайте замещающий клиентский модуль, в котором в качестве родительского объекта укажите [Страница редактирования заказа] ([Order edit page], OrderPageV2) (рис. 8). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".

Рис. 8. — Свойства замещающей схемы страницы редактирования заказа

Для отображения детали [Курьеры] ([Couriers]) на вкладке [Доставка] ([Delivery]) страницы редактирования заказа добавьте следующий исходный код. Здесь в секции details определяется новая деталь CourierDetail, а ее расположение на странице редактирования раздела задается в секции массива модификаций diff.

define("OrderPageV2", [], function() {
    return {
        // Название схемы объекта страницы редактирования.
        entitySchemaName: "Order",
        // Перечень добавляемых деталей страницы редактирования.
        details: /**SCHEMA_DETAILS*/{
            // Настройка детали [Курьеры].
            "CourierDetail": {
                // Название схемы детали.
                "schemaName": "UsrCourierDetail",
                // Название схемы объекта детали.
                "entitySchemaName": "UsrCourierInOrder",
                // Фильтрация отображения контактов только для текущего заказа.
                "filter": {
                    // Колонка схемы объекта детали.
                    "detailColumn": "UsrOrder",
                    // Колонка схемы объекта раздела.
                    "masterColumn": "Id"
                }
            }
        }/**SCHEMA_DETAILS*/,
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
            // Метаданные для добавления детали [Курьеры].
            {
                "operation": "insert",
                // Название детали.
                "name": "CourierDetail",
                "values": {
                    "itemType": 2,
                    "markerValue": "added-detail"
                },
                // Родительский контейнер (Вкладка [Доставка]).
                "parentName": "OrderDeliveryTab",
                // Контейнер, в котором размещена деталь.
                "propertyName": "items",
                // Индекс в списке добавляемых элементов.
                "index": 3
            }
        ]/**SCHEMA_DIFF*/,
        methods: {},
        rules: {}
    };
});

Уже на этом этапе деталь отображается на странице редактирования раздела [Заказы] ([Orders]), однако добавить новую запись в деталь нельзя до тех пор, пока не будут зарегистрированы связи между схемами детали.

5. Зарегистрировать связи между схемами при помощи SQL-запросов в системные таблицы

Чтобы зарегистрировать связь между схемой объекта детали и схемой реестра детали, выполните SQL-запрос.

DECLARE
-- Название схемы создаваемой детали.
@DetailSchemaName NCHAR(100) = 'UsrCourierDetail',
-- Заголовок детали.
@DetailCaption NCHAR(100) = 'Couriers',
--Название схемы объекта, к которому привязывается деталь.
@EntitySchemaName NCHAR(100) = 'UsrCourierInOrder'

INSERT INTO SysDetail(
    ProcessListeners,
    Caption,
    DetailSchemaUId,
    EntitySchemaUId
)
VALUES (
    0,
    @DetailCaption,
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE name = @DetailSchemaName),
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE name = @EntitySchemaName)
)

Для регистрации связи между схемой объекта детали и схемой страницы редактирования записи детали выполните следующий SQL-запрос.

DECLARE
-- Название схемы страницы детали.
@CardSchemaName NCHAR(100) = 'UsrCourierDetailPage',
-- Название схемы объекта, к которому привязывается деталь.
@EntitySchemaName NCHAR(100) = 'UsrCourierInOrder',
-- Заголовок страницы детали.
@PageCaption NCHAR(100) = '"Courier in order" detail edit page',
-- Пустая строка.
@Blank NCHAR(100) = ''

-- Добавление записи в таблицу SysModuleEntity.
INSERT INTO SysModuleEntity(
    ProcessListeners,
    SysEntitySchemaUId
)
VALUES(
    0,
    (SELECT TOP 1 UId
    FROM SysSchema
    WHERE Name = @EntitySchemaName
    )
)

-- Добавление записи в таблицу SysModuleEdit
INSERT INTO SysModuleEdit(
    SysModuleEntityId,
    UseModuleDetails,
    Position,
    HelpContextId,
    ProcessListeners,
    CardSchemaUId,
    ActionKindCaption,
    ActionKindName,
    PageCaption
)
VALUES (
    (SELECT TOP 1 Id
    FROM SysModuleEntity
    WHERE SysEntitySchemaUId = (
        SELECT TOP 1 UId
        FROM SysSchema
        WHERE Name = @EntitySchemaName
        )
    ),
    1,
    0,
    @Blank,
    0,
    (SELECT TOP 1 UId
     FROM SysSchema
     WHERE name = @CardSchemaName
    ),
    @Blank,
    @Blank,
    @PageCaption
)

ВАЖНО

Чтобы эти изменения применились на уровне приложения, перезапустите сайт в IIS или скомпилируйте приложение в разделе [Конфигурация].

6. Выполнить настройку колонок реестра детали

На этом этапе деталь уже полностью работоспособна, однако записи контактов на детали не отображаются, поскольку не указаны колонки для отображения. Вызовите меню действий детали и настройте отображаемые колонки (рис. 9).

Рис. 9. — Меню действий детали

Смотрите также:

© Terrasoft 2002-2019.

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

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