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

Элемент управления [Профиль связанной сущности]

Glossary Item Box

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

Элемент управления [Профиль связанной сущности] (класс Profile) — это конфигурационный модуль, который по умолчанию представляет собой информационный блок, наполняемый при загрузке страницы редактирования информацией о связанной Entity-сущности. В системе этот элемент используется как профиль связанной записи на странице редактирования записи раздела. Например, при открытии страницы редактирования [Контакт] в элементе [Профиль] (рис. 1) отобразится профиль контакта и информация о связанном контрагенте (связь по колонке [Контрагент] объекта [Контакт], рис. 2). Подробнее о профилях записи и связанной записи можно узнать из статьи "Страница записи раздела".

Родительским классом для класса Profile является BaseProfileSchema — базовая схема для создания любых профилей связанных записей в системе.

Рис. 1. — Профиль объекта [Контакт]

Рис. 2. — Связанный с контактом профиль связанной сущности [Контрагент]

Родительским классом для класса Profile является BaseProfileSchema — базовая схема для создания любых профилей связанных записей в системе.

Все профили должны наследоваться от BaseProfileSchema.

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

Способ описания представления ничем не отличается от страницы редактирования, т.е. описывается свойством diff. При встраивании модуля в страницу редактирования в атрибутах модуля необходимо указать параметр masterColumnName, в котором хранится название колонки, по которой происходит связь профиля с основной схемой страницы редактирования. Опираясь на значение этой колонки, Profile будет загружать данные.

На этапе инициализации объекта профиля, для того чтобы получить дополнительную информацию о колонке, по которой он связан (фильтры, заголовок и т.п.), он отправляет сообщение GetColumnInfo. Затем он запрашивает значение колонки, по которой он связан, и, если она заполнена, инициализируются данные по этой записи. При очистке поля или смене значения происходит переинициализация данных в объекте профиля.

Если профиль пуст, т.е. не выбрана запись в поле связи, то в нем отображается название поля, по которому происходит связь, и два действия (рис. 3):

  • [Добавить контрагента] — создать новую запись в справочнике поля связи.
  • [Выбрать ] — выбрать существующую запись из списка доступных.

Рис. 3. — Пустой профиль связанной сущности

При выборе существующей связанной сущности на справочник накладывается вся бизнес-логика, которая была была определена в странице редактирования и была связана с атрибутом, ссылающимся на эту сущность. Т.е. сохраняется фильтрация, настройки колонок запроса и прочее.

Если атрибут удалить из схемы страницы редактирования, вся логика потеряется вместе с ним.

Устройство BaseProfileSchema

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

  • OpenCard — инициирует открытие страницы добавления записи, используя стандартный механизм.
  • UpdateCardProperty — обновляет значение атрибута страницы редактирования.
  • GetColumnInfo — возвращает информацию о поле связи.
  • GetColumnsValues — возвращает значения запрошенных колонок страницы редактирования.
  • GetEntityColumnChanges — подписка на изменение данных на странице редактирования.
  • CardModuleResponse — результат добавления новой записи через профиль.

Визуальное содержание профиля (кнопки, ссылки, модули) определяется в массиве модификаций diff.

Пример конфигурации схемы профиля

define("ContactProfileSchema", ["ProfileSchemaMixin"],
function () {
    return {
        // Название схемы объекта.
        entitySchemaName: "Contact",
        // Миксины.
        mixins: {
            // Миксин, содержащий функции для получения иконок и картинок профиля.
            ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
        },
        // Массив модификаций diff.
        diff: /**SCHEMA_DIFF*/[
            {
                // Операция вставки.
                "operation": "insert",
                // Имя сущности.
                "name": "Account",
                // Имя родительского элемента, в который производится вставка.
                "parentName": "ProfileContentContainer",
                // Свойство элемента родителя, с которым производится операция.
                "propertyName": "items",
                // Значения вставляемого элемента.
                "values": {
                    // Привязка к значению свойства Account объекта Contact.
                    "bindTo": "Account",
                    // Конфигурация разметки. Позиционирование элемента.
                    "layout": {
                        "column": 5,
                        "row": 1,
                        "colSpan": 19
                    }
                }
            }
            // ...Другие конфигурационные объекты массива модификаций.
        ]/**SCHEMA_DIFF*/
    };
});

Пример встраивания профиля в страницу редактирования

//Определение схемы страницы редактирования и ее зависимостей.
define("ContactPageV2", ["BaseFiltersGenerateModule", "BusinessRuleModule", "ContactPageV2Resources",
            "ConfigurationConstants", "ContactCareer", "DuplicatesSearchUtilitiesV2"],
function (BaseFiltersGenerateModule, BusinessRuleModule, resources, ConfigurationConstants, ContactCareer) {
    return {
        entitySchemaName: "Contact",
        // Используемые модули.  
        modules: /**SCHEMA_MODULES*/{
            // Модуль профиля контрагента.
            "AccountProfile": {
                // Конфигурация профиля.
                "config": {
                    // Название схемы.
                    "schemaName": "AccountProfileSchema",
                    // Признак, сообщающий о том, что конфигурация схемы проинициализирована.
                    "isSchemaConfigInitialized": true,
                    // Признак, сообщающий о том, что не используется HistoryState.
                    "useHistoryState": false,
                    // Параметры профиля.
                    "parameters": {
                        // Конфигурация модели представления.
                        "viewModelConfig": {
                            // Название колонки связанной сущности.
                            masterColumnName: "Account"
                        }
                    }
                }
            }
        }/**SCHEMA_MODULES*/,
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "parentName": "LeftModulesContainer",
                "propertyName": "items",
                // Название профиля.
                "name": "AccountProfile",
                // Значения.
                "values": {
                    // Тип элемента — модуль.
                    "itemType": Terrasoft.ViewItemType.MODULE
                }
            }
        ]/**SCHEMA_DIFF*/
    };
});

Схема профиля BaseMultipleProfileSchema

Кроме схемы базового профиля BaseProfileSchema, имеются также дополнительные схемы, реализующие специфическую функциональность для пользовательских профилей.

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

Профили BaseMultipleProfileSchema должны наследоваться от BaseRelatedProfileSchema — базовой схемы для профиля, который может быть зависимым или встроенным в другие профили.

Пример модуля клиентского профиля BaseMultipleProfileSchema

// Определение профиля.
define("ClientProfileSchema", ["ProfileSchemaMixin"],
function () {
    return {
        // Миксины.
        mixins: {
            ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
        },
        // Атрибуты.
        attributes: {
            // Видимость профиля контакта.
            "IsVisibleContactProfile": {
                dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
                value: true
            }
        },
        // Методы.
        methods: {
            // Дата-маркер. Нужен для автотестов.
            getProfileModuleContainerDataMarker: function () {
                return "client-profile-module-container";
            },
            // Возвращает заголовок.
            getBlankSlateHeaderCaption: function () {
                return this.get("Resources.Strings.Client");
            },
            // Возвращает иконку-предупреждение.
            getWarningIcon: function () {
                return this.getImageUrlByResourceKey("Resources.Images.WarningIcon");
            },
            // Проверка для отображения предупреждения.
            getIsVisibleWarning: function () {
                var masterColumnNames = this.get("MasterColumnNames");
                if (!masterColumnNames) {
                    return false;
                }
                var masterColumnValues = masterColumnNames.filter(function (columnName) {
                    var value = this.get(columnName);
                    return !this.Ext.isEmpty(value);
                }, this);
                return masterColumnValues.length > 1;
            },
            // Обработчик события изменения колонки профиля. 
            onProfileColumnChanged: function () {
                this.set("IsVisibleContactProfile", !this.getIsVisibleWarning());
                return this.callParent(arguments);
            },
            // Обработчик события изменения колонки.
            onColumnChanged: function () {
                this.callParent(arguments);
                this.set("IsVisibleContactProfile", !this.getIsVisibleWarning());
            },
            // Подсказка для кнопки [Очистить].
            getClearButtonHint: function () {
                var clearActionCaption = this.get("Resources.Strings.ClearButtonCaption");
                var masterColumnCaption = this.get("Resources.Strings.Client");
                return this.Ext.String.format("{0} {1}", clearActionCaption, masterColumnCaption);
            }
        },
        // Модули схемы.
        modules: /**SCHEMA_MODULES*/{
            // Встраиваемый клиентский профиль контрагента.
            "AccountClientProfile": {
                // Конфигурация профиля.
                "config": {
                    "schemaName": "ClientAccountProfileSchema",
                    "isSchemaConfigInitialized": true,
                    "useHistoryState": false,
                    "parameters": {
                        "viewModelConfig": {
                            masterColumnName: "Account"
                        }
                    }
                }
            },
            // Встраиваемый клиентский профиль контакта.
            "ContactClientProfile": {
                "config": {
                    "schemaName": "ClientContactProfileSchema",
                    "isSchemaConfigInitialized": true,
                    "useHistoryState": false,
                    "parameters": {
                        "viewModelConfig": {
                            masterColumnName: "Contact"
                        }
                    }
                }
            }
        }/**SCHEMA_MODULES*/,
        // Модификации отображения профиля.
        diff: /**SCHEMA_DIFF*/[
           {
               "operation": "remove",
               "name": "ProfileIcon"
           },
           {
               "operation": "remove",
               "name": "ProfileHeaderContainer"
           },
           {
               "operation": "insert",
               "name": "ClientProfilesContainer",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                   "items": [],
                   "layout": {
                       "column": 0,
                       "row": 0,
                       "colSpan": 24,
                       "rowSpan": 24
                   }
               }
           },
           {
               "operation": "insert",
               "name": "WarningIcon",
               "parentName": "ClientProfilesContainer",
               "propertyName": "items",
               index: 0,
               "values": {
                   "getSrcMethod": "getWarningIcon",
                   "readonly": true,
                   "generator": "ImageCustomGeneratorV2.generateSimpleCustomImage",
                   "visible": { "bindTo": "getIsVisibleWarning" },
                   "classes": {
                       "wrapClass": ["warning-icon"]
                   },
                   "hint": { "bindTo": "Resources.Strings.WarningMessage" }
               }
           },
           {
               "operation": "insert",
               "parentName": "ClientProfilesContainer",
               "propertyName": "items",
               "name": "AccountClientProfile",
               "values": {
                   "itemType": this.Terrasoft.ViewItemType.MODULE
               }
           },
           {
               "operation": "insert",
               "parentName": "ClientProfilesContainer",
               "propertyName": "items",
               "name": "ContactClientProfile",
               "values": {
                   "itemType": this.Terrasoft.ViewItemType.MODULE,
                   "visible": { "bindTo": "IsVisibleContactProfile" }
               }
           }
        ]/**SCHEMA_DIFF*/
    };
}
);

Пример встраиваемого клиентского профиля BaseRelatedProfileSchema

define("ClientContactProfileSchema", ["ProfileSchemaMixin"],
function () {
    return {
        // Название схемы объекта.
        entitySchemaName: "Contact",
        // Миксины.
        mixins: {
            ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin"
        },
        // Методы.
        methods: {
            getProfileHeaderCaption: function () {
                return this.get("Resources.Strings.ProfileHeaderCaption");
            }
        },
        // Массив модификаций.
        diff: /**SCHEMA_DIFF*/[
           {
               "operation": "insert",
               "name": "Account",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Account",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 1,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Job",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Job",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 2,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Type",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Type",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 3,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "MobilePhone",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "MobilePhone",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 4,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Phone",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Phone",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 5,
                       "colSpan": 19
                   }
               }
           },
           {
               "operation": "insert",
               "name": "Email",
               "parentName": "ProfileContentContainer",
               "propertyName": "items",
               "values": {
                   "bindTo": "Email",
                   "enabled": false,
                   "layout": {
                       "column": 5,
                       "row": 6,
                       "colSpan": 19
                   }
               }
           }
        ]/**SCHEMA_DIFF*/
    };
});

Пример встраивания модуля клиентского профиля в страницу редактирования

// Модули страницы редактирования.
modules: /**SCHEMA_MODULES*/{
    // Название модуля.
    "ClientProfile": {
        // Конфигурация.
        "config": {
            // Признак,сообщающий о том, что конфигурация схемы проинициализирована.
            "isSchemaConfigInitialized": true,
            // Признак, сообщающий о том, что не используется HistoryState.
            "useHistoryState": false,
            // Имя схемы.
            "schemaName": "ClientProfileSchema",
            // Параметры.
            "parameters": {
                // Конфигурация модели представления.
                "viewModelConfig": {
                    // Название колонки связанной сущности.
                    "masterColumnName": "Client"
                }
            }
        }
    }
}/**SCHEMA_MODULES*/,
// Массив модификаций diff.
diff: /**SCHEMA_DIFF*/[
   {
       "operation": "insert",
       // Название профиля.
       "name": "ClientProfile",
       "parentName": "LeftModulesContainer",
       "propertyName": "items",
       // Значения.
       "values": {
           // Тип элемента — модуль.
           "itemType": Terrasoft.ViewItemType.MODULE
       }
   }
]/**SCHEMA_DIFF*/

© Terrasoft 2002-2020.

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

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