Механизм блокировки полей страницы записи

PDF
Сложный

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

Важно. Механизм блокировки реализован в версиях 7.11.1 и выше.

Важно. Функциональность блокировки полей страницы записи может быть отключена с помощью опции CompleteCardLockout на странице отключения функциональности. Страница отключения функциональности доступна по адресу ../0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage. Например, https://myserver.com/CreatioWebApp/0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage

В результате применения механизма блокировки на странице записи будут заблокированы все поля и детали. Если для поля существует привязка для свойства enabled в элементе массива diff или в бизнес-правиле, то механизм не будет блокировать такое поле. У деталей скрываются кнопки и элементы меню, которые отвечают за выполнение операций над записью. В детали с редактируемым реестром остается возможность перейти на страницу объекта, однако на ней также будут заблокированы все поля с учетом бизнес-правил.

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

Чтобы включить механизм блокировки, необходимо в исходном коде страницы записи установить значение false для атрибута модели IsModelItemsEnabled:

Установка значения false для атрибута модели IsModelItemsEnabled
this.set(“IsModelItemsEnabled”, false);

Или можно установить для атрибута значение по умолчанию:

Установка для атрибута значение по умолчанию
"IsModelItemsEnabled": {
	dataValueType: Terrasoft.DataValueType.BOOLEAN,
	value: true,
	dependencies: [{
		columns: ["PaymentStatus"],
		methodName: "setCardLockoutStatus"
	}]
}

Также для работы механизма блокировки на конкретной странице записи в массиве diff этой страницы необходимо указать генератор DisableControlsGenerator для тех контейнеров, в которых необходимо блокировать поля. Так, для блокировки всех полей страницы записи нужно указать глобальный контейнер CardContentWrapper:

Указание глобального контейнера
diff: /**SCHEMA_DIFF*/[
	{
		"operation": "merge",
		"name": "CardContentWrapper",
		"values": {
			"generator": "DisableControlsGenerator.generatePartial"
		}
	}
]/**SCHEMA_DIFF*/

Важно. При использовании версий системы 7.13.0 и ниже установка значения генератора приводит к ошибке открытия страницы записи в мастере разделов.

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

  1. Узнать название группы всех сотрудников компании. Для этого выполните запрос в базе данных.
    SQL-запрос
    select Name from SysAdminUnit
    
  2. Выполнить в базе данных приведенный ниже скрипт. Обратите внимание что полю @allEmpoyeeGroupName необходимо присвоить название группы всех сотрудников компании.
    SQL-запрос
    DECLARE @allEmpoyeeGroupName nvarchar(max) = 'Все сотрудники компании';
    DECLARE @featureName nvarchar(max) = 'PageDesignerCustomGeneratorFix'
    DECLARE @featureStatus bit = 1;
    
    IF (NOT EXISTS (SELECT NULL FROM Feature WHERE Code = @featureName))
    BEGIN
      INSERT INTO Feature (Name, Description, Code, ProcessListeners) 
      VALUES (@featureName, @featureName, @featureName, 0)
    END
    IF(EXISTS (SELECT NULL FROM AdminUnitFeatureState 
             WHERE FeatureId = (SELECT Id FROM Feature WHERE Code = @featureName) AND
               SysAdminUnitId = (SELECT Id FROM SysAdminUnit WHERE Name = @allEmpoyeeGroupName)) )
    BEGIN
      UPDATE AdminUnitFeatureState SET FeatureState = @featureStatus WHERE FeatureId = (SELECT Id FROM Feature WHERE Code = @featureName) AND
                                  SysAdminUnitId = (SELECT Id FROM SysAdminUnit WHERE Name = @allEmpoyeeGroupName)
    END
    ELSE
    BEGIN
      INSERT INTO AdminUnitFeatureState (ProcessListeners, SysAdminUnitId, FeatureState, FeatureId) VALUES 
                        (
                        0,
                        (SELECT Id FROM SysAdminUnit WHERE Name = @allEmpoyeeGroupName),
                        @featureStatus, 
                        (SELECT Id FROM Feature WHERE Code = @featureName)
                         )
    END
    

    Скрипт добавляет в систему дополнительную функциональность (Feature) PageDesignerCustomGeneratorFix и включает ее для группы пользователей "Все сотрудники компании".

  3. В модуле ViewModelSchemaDesignerViewGenerator проверить метод generateCustomItem(). Он должен иметь следующий вид:

    Метод generateCustomItem() модуля ViewModelSchemaDesignerViewGenerator
    generateCustomItem: function(config) {
        if (Terrasoft.Features.getIsEnabled("PageDesignerCustomGeneratorFix")) {
            if (config) {
                delete config.generator;
            }
            return this.generateStandardItem(config);
        } else {
            return this.generateLabel({
                caption: config.name
            });
        }
    }
    

    На заметку. Если метод generateCustomItem() отличается от вышеуказанного, необходимо заместить класс ViewModelSchemaDesignerViewGenerator и изменить метод generateCustomItem().

  4. На странице дополнительной функциональности FeaturesPage проверить значение опции PageDesignerCustomGeneratorFix. При наведении курсора на должно отобразиться уведомление Функциональность включена для группы пользователей (The feature has enabled state for the group of the users).

Исключение блокировки 

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

Переопределение методов getDisableExclusionsDetailSchemaNames() и getDisableExclusionsColumnTags()
getDisableExclusionsColumnTags: function() {
	return ["SomeField"];
}
getDisableExclusionsDetailSchemaNames: function() {
	return ["SomeDetailV2"]
}

Более сложную логику исключений можно реализовать при помощи переопределения метода isModelItemEnabled() для полей редактирования и метода isDetailEnabled() для деталей. Эти методы вызываются для каждого поля и детали. Они получают на вход имя и возвращают признак доступности поля или детали.

Переопределение методов isModelItemEnabled() и isDetailEnabled()
isModelItemEnabled: function(fieldName) {
	var сondition = this.get("SomeConditionAttribute");
	if (fieldName === "ExampleField" || сondition)) {
		return true;
	}
	return this.callParent(arguments);
}

isDetailEnabled: function(detailName) {   
	if (detailName === "ExampleDetail") {
		var exampleDate = this.get("Date");
		var dateNow = new Date(this.Ext.Date.now());
		var condition = this.Ext.Date.isDate(exampleDate) && exampleDate >= dateNow;
		return condition;
	}
	return this.callParent(arguments);
}