Правило BINDPARAMETER. Как скрыть поле на странице редактирования по определенному условию
Glossary Item Box
Описание кейса
Добавить на страницу редактирования активности новое поле [Место встречи], которое будет отображаться только для активностей категории [Встреча].
К СВЕДЕНИЮ Добавление поля на страницу редактирования может быть реализовано двумя способами — с помощью Мастера разделов и вручную. Процесс добавления поля на страницу редактирования описан в статье "Добавление нового поля". |
Алгоритм реализации кейса
1. Создать замещающий объект [Активность] и добавить в него новую колонку [Место встречи]
Для этого необходимо перейти в раздел [Конфигурация], выбрать пользовательский пакет и на вкладке [Схемы] выполнить команду меню [Добавить] — [Замещающий объект] (рис. 1).
Рис. 1. — Создание замещающей схемы объекта
Затем нужно заполнить свойства нового объекта, указав в качестве родительского объекта [Активность] (рис. 2).
Рис. 2. — Свойства замещающего объекта [Активность]
После этого добавить в замещающий объект новую колонку [Место встречи] строкового типа (рис. 3.).
Рис. 3. — Добавление пользовательской колонки в замещающий объект
Затем нужно сохранить и опубликовать объект.
2. Создать замещающий клиентский модуль страницы редактирования активности
Для этого необходимо создать замещающий клиентский модуль, в котором в качестве родительского объекта указать схему ActivityPageV2 (рис. 4). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".
Рис. 4. — Свойства замещающей страницы редактирования
3. Добавить поле [Место встречи] на страницу редактирования активности.
Для этого в массив diff нужно добавить конфигурационный объект с настройками расположения поля [Место встречи] на странице. Добавление поля подробно рассмотрено в статье "Добавление нового поля".
Для возможности локализации приложения, необходимо создать локализируемую строку (рис. 5) и связать ее с заголовком поля.
Рис. 5. — Свойства локализируемой строки
4. Добавить правило с типом BINDPARAMETER для колонки [UsrMeetingPlace]
В свойство rules модели представления страницы добавить правило BindParametrVisibilePlaceByType с типом BusinessRuleModule.enums.RuleType.BINDPARAMETER для колонки [UsrMeetingPlace]. Свойство property правила необходимо проинициализировать значением BusinessRuleModule.enums.Property.VISIBLE. В массив conditions нужно добавить условие выполнения правила — значение колонки [ActivityCategory] модели должно быть равно идентификатору категории [Встреча] из справочника категорий активностей.
Для определения идентификатора категории [Встреча] нужно использовать запрос к содержимому справочника с помощью EntitySchemaQuery. Однако, вследствие асинхронной природы методов этого класса, для сохранения результата запроса необходимо создать атрибут MeetingId, а сам запрос выполнять во время инициализации схемы. Для этого необходимо переопределить метод Init() базовой схемы страницы редактирования активности.
К СВЕДЕНИЮ Идентификатор категории встречи также |
Полностью код замещающей страницы:
// В список зависимостей модуля добавить модуль BusinessRuleModule. define("ActivityPageV2", ["BusinessRuleModule"], function(BusinessRuleModule) { return { // Название схемы объекта страницы редактирования. entitySchemaName: "Activity", // Атрибут для хранения идентификатора нужной категории активности. attributes: { "MeetingId": { "dataValueType": Terrasoft.DataValueType.TEXT, "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, "value": "" } }, methods: { // Метод инициализации схемы. init: function() { this.callParent(arguments); this.initMeetingId(); }, // Метод определения идентификатора категории активности. initMeetingId: function() { var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "ActivityCategory"}); // Сохранение контекста модуля в переменную. var scope = this; esq.addColumn("Name", "Name"); // Выполнение запроса. esq.getEntityCollection(function(result) { if (result.success) { // Перебор значений справочника [Категория активности]. result.collection.each(function(item) { // Если значение колонки [Name] — [Встреча]. if (item.get("Name") === "Встреча") { // Получение идентификатора для категории [Встреча]. var Id = item.get("Id"); // Установка значения атрибута. scope.set("MeetingId", Id); } }); } }, this); } }, // Настройка визуализации дополнительного поля на странице редактирования. diff: /**SCHEMA_DIFF*/[ { // Метаданные для добавления поля [Место встречи]. "operation": "insert", "parentName": "Header", "propertyName": "items", "name": "UsrMeetingPlace", "values": { "caption": {"bindTo": "Resources.Strings.MeetingPlaceCaption"}, "layout": { "column": 0, "row": 6, "colSpan": 12 } } } ]/**SCHEMA_DIFF*/, // Объект правил модели представления страницы редактирования. rules: { // Набор правил для колонки [UsrMeetingPlace] модели представления. "UsrMeetingPlace": { // Настройка правила видимости поля [UsrMeetingPlace] по колонке [ActivityCategory]. "BindParametrVisibilePlaceByType": { // Тип правила BINDPARAMETER. "ruleType": BusinessRuleModule.enums.RuleType.BINDPARAMETER, // Правило регулирует свойство VISIBLE поля. "property": BusinessRuleModule.enums.Property.VISIBLE, // Массив условий, при выполнении которых отрабатывает правило. В данном // случае массив содержит одно условие для сравнения значения колонки [ActivityCategory] с // идентификатором категории активности [Встреча]. "conditions": [{ // Выражение левой части условия. "leftExpression": { //Тип выражения ATTRIBUTE указывает на то, что в качестве выражения выступает // аттрибут (колонка) модели представления. "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE, // Название колонки модели представления, значение которой сравнивается в выражении. "attribute": "ActivityCategory" }, // Тип операции сравнения. "comparisonType": Terrasoft.ComparisonType.EQUAL, // Выражение правой части условия. "rightExpression": { "type": BusinessRuleModule.enums.ValueType.ATTRIBUTE, // Значение, с которым сравнивается выражение левой части. В данном случае идентификатор // типа [Активности] задается атрибутом MeetingId. "attribute": "MeetingId" } }] } } } }; });
После сохранения схемы и обновления веб-страницы системы на странице редактирования активности поле [Место встречи] будет отображаться только в том случае, если категория активности — встреча (рис. 5, 6).
Рис. 5. — Результат выполнения кейса. Тип активности — "Выполнить", поле [Место встречи] скрыто
Рис. 6. — Результат выполнения кейса. Тип активности — "Встреча", поле [Место встречи] отображено