На предыдущем шаге мы добавили к интерфейсу необходимые для работы примера данные и прикрепили их к пакету разработки.
Теперь реализуем бизнес-логику примера.
Условие примера.
Ежедневная групповая секция добавляется в расписание только при наличии свободного зала.
Количество залов в фитнес-центре задано системной настройкой и равно 4.
При добавлении или редактировании ежедневной групповой секции необходимо выполнять проверку: если в результате изменений общее число активных ежедневных секций в системе будет превышать значение системной настройки, то сохранение запрещается и выводится сообщение "Нет свободных залов, допускается не более N секций", где N — значение системной настройки.
Для этого необходимо изменить исходный код клиентского модуля, который отвечает за работу страницы раздела.
В результате работы мастеров в пакете уже содержатся схемы разных типов. С помощью сортировки по типу схем выберите для отображения только схемы с типом [ Клиентский модуль ] ([ Client module ]).
Двойным нажатием мыши откройте схему "UsrGroupSections1Page" и отредактируйте исходный код.
UsrGroupSections1Page.js
Code copied
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*/};});
Сохраните схему, нажав на кнопку [ Сохранить ] ([ Save ]).
Результат внесенных изменений:
В результате мы реализовали необходимую бизнес-логику страницы. На следующем шаге необходимо реализовать автоматическое заполнение расписания групповых занятий.