Шаг 3. Добавьте валидацию страницы

Основы

На предыдущем шаге мы добавили к интерфейсу необходимые для работы примера данные и прикрепили их к пакету разработки.

Теперь реализуем бизнес-логику примера.

Условие примера.

  • Ежедневная групповая секция добавляется в расписание только при наличии свободного зала.
  • Количество залов в фитнес-центре задано системной настройкой и равно 4.
  • При добавлении или редактировании ежедневной групповой секции необходимо выполнять проверку: если в результате изменений общее число активных ежедневных секций в системе будет превышать значение системной настройки, то сохранение запрещается и выводится сообщение "Нет свободных залов, допускается не более N секций", где N — значение системной настройки.

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

  1. Перейдите в раздел Конфигурация (Configuration).
  2. В списке пакетов выберите пакет "TryItPackage".
  3. В результате работы мастеров в пакете уже содержатся схемы разных типов. С помощью сортировки по типу схем выберите для отображения только схемы с типом Клиентский модуль (Client module).
    scr_Client_Module.png
  4. Двойным нажатием мыши откройте схему "UsrGroupSections1Page" и отредактируйте исходный код.
    UsrGroupSections1Page.js
    define("UsrGroupSections1Page", [], function() {
        return {
            entitySchemaName: "UsrGroupSections",
            messages: {},
            attributes: {
                /* Атрибут, который хранит текущее количество активных ежедневных секций. */
                "responseCollectionTrainings": {
                    "dataValueType": Terrasoft.DataValueType.INTEGER,
                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                },
                /* Атрибут, который хранит значение системной настройки. */
                "maximumDailyActiveSections": {
                    "dataValueType": Terrasoft.DataValueType.INTEGER,
                    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                }
            },
            methods: {
                /* Запускается при загрузке схемы страницы и вызывает метод подсчета текущего количества активных ежедневных секций и метод считывания значения системной настройки. */
                onEntityInitialized: function(){
                    this.callParent(arguments);
                    this.getPeriodicityActiveNumber();
                    this.getMaximumDailyActiveSections();
                },
                /* Вычисляет текущее количество активных ежедневных секций и записывает полученное значение в атрибут "responseCollectionTrainings". */
                getPeriodicityActiveNumber: function() {
                    var periodicity = "Ежедневно";
                    var esqPeriodicity = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                        rootSchemaName: "UsrGroupSections"
                    });
                    esqPeriodicity.addColumn("UsrName");
                    var groupFilters = this.Ext.create("Terrasoft.FilterGroup");
                    var filterPerodicity = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "UsrPeriodicity.Name", periodicity);
                    var thisId = this.get("Id");
                    var filterId = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.NOT_EQUAL, "Id", thisId);
                    var filterIsActive = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "UsrIsActive", true);
                    groupFilters.addItem(filterPerodicity);
                    groupFilters.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                    groupFilters.addItem(filterIsActive);
                    groupFilters.logicalOperation = this.Terrasoft.LogicalOperatorType.AND;
                    groupFilters.addItem(filterId);
                    esqPeriodicity.filters.add(groupFilters);
                    esqPeriodicity.getEntityCollection(function(result) {
                        if (!result.success) {
                            this.showInformationDialog("Request error");
                            return;
                        }
                        else {
                            var lengthCollection = result.collection.collection.length;
                            this.set("responseCollectionTrainings", lengthCollection);
                        }
                    }, this);
                },
                /* Добавляет валидацию к полю "Периодичность". При изменении данного поля либо сохранении записи будет вызываться метод-валидатор. */
                setValidationConfig: function() {
                    this.callParent(arguments);
                    this.addColumnValidator("UsrPeriodicity", this.periodicityValidator);
                },
                /* Метод-валидатор — если секция ежедневная, сравнивает текущее количество активных ежедневных секций с системной настройкой "GymsNumber" и в случае превышения добавляет в поле "Периодичность" предупреждающее сообщение. Сохранение записи в таком случае невозможно. */
                periodicityValidator: function() {
                    var invalidMessage= "";
                    var periodicity = this.get("UsrPeriodicity").displayValue;
                    if (periodicity==="Daily") {
                        var isActive = this.get("UsrIsActive");
                        var myVariable = this.get("maximumDailyActiveSections");
                        var lengthCollection = this.get("responseCollectionTrainings");
                        if (lengthCollection >= myVariable && isActive) {
                            invalidMessage = "The number of gyms is limited. No more than " + myVariable + " daily trainings.";
                        }
                    }
                    else {
                        invalidMessage = "";
                    }
                    return {
                        invalidMessage: invalidMessage
                    };
                },
                /* Получает значение системной настройки "GymsNumber". */
                getMaximumDailyActiveSections: function() {
                    var myVariable;
                    var callback = function(value) {
                        myVariable = value;
                    };
                    this.Terrasoft.SysSettings.querySysSettingsItem("GymsNumber", callback, this);
                    if (myVariable === undefined) {
                        return;
                    }
                    else {
                        this.set("maximumDailyActiveSections", myVariable);
                    }
                }
            },
            modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
            /* Без изменений. */
            details: /**SCHEMA_DETAILS*/{
                 
            // …
            
            }/**SCHEMA_DETAILS*/,
            businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
            dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
            /* Без изменений. */
            diff: /**SCHEMA_DIFF*/[
            
            // …
            
            ]/**SCHEMA_DIFF*/
        };
    });
    
  5. Сохраните схему, нажав на кнопку Сохранить (Save).
    scr_SourceCode_ClientModule.png

Результат внесенных изменений:

scr_Result_Validation.png

В результате мы реализовали необходимую бизнес-логику страницы. На следующем шаге необходимо реализовать автоматическое заполнение расписания групповых занятий.