Во многих сценариях важно ограничить количество событий, которые могут быть запланированы в одном временном слоте. Например, может потребоваться запретить добавление второго события, если на это время уже запланировано другое.
Для управления количеством событий, разрешённых в одном временном слоте, можно использовать расширение collision.
Активация расширения 'collision'
scheduler.plugins({
collision: true
});
После активации этого расширения на странице включается функциональность, предотвращающая размещение двух событий в одном временном слоте — как при создании новых событий, так и при перемещении существующих.
По умолчанию в одном временном слоте разрешено только одно событие. Чтобы изменить этот лимит, используйте свойство collision_limit:
Запрет создания более 2 событий в одном временном слоте
scheduler.config.collision_limit = 2; //разрешает создание 2 событий в одном временном слоте
Related sample: Controlling the number of events in a time slot
При активном расширении 'collision', когда пользователь пытается добавить или переместить событие во временной слот, в котором уже есть события, планировщик вызывает событие onEventCollision. Это событие проверяет лимит, заданный в свойстве collision_limit.
Обратите внимание, что событие onEventCollision не срабатывает при загрузке данных. Чтобы обеспечить соблюдение лимита событий при загрузке данных, код необходимо немного доработать:
Запрет создания/загрузки более 2 событий в одном временном слоте
scheduler.config.collision_limit = 2; //разрешает создание 2 событий в одном временном слоте
scheduler.attachEvent("onEventLoading", function(ev){ return scheduler.checkCollision(ev); });
Метод checkCollision проверяет, пересекается ли событие с уже существующими, и при необходимости вызывает событие onEventCollision.
Чтобы узнать, сколько событий запланировано в определённом временном слоте, можно использовать метод getEvents:
Получение количества событий в временном слоте
var count = scheduler.getEvents(ev.start_date, ev.end_date).length;
Обратите внимание, что метод getEvents перебирает все события и сравнивает их даты, поэтому при очень большом количестве событий эта операция может занять некоторое время.
Вот краткое описание шагов, которые нужно выполнить, чтобы предотвратить коллизии событий в одном временном слоте:
1) Подключите расширение collision на страницу:
scheduler.plugins({
collision: true
});
2) Запретите пользователям создавать новые события во время загрузки данных с сервера.
Это гарантирует, что события не будут добавлены до полной загрузки календаря. Используйте обработчики событий onLoadEnd и onLoadStart вместе со свойством readonly, например:
// сделать планировщик только для чтения
// до начала загрузки данных из источника
scheduler.attachEvent("onLoadStart", function(){
scheduler.config.readonly = true;
});
// сделать планировщик редактируемым
// только после завершения загрузки данных из источника
scheduler.attachEvent("onLoadEnd", function(){
scheduler.config.readonly = false;
});
3) Включите динамическую загрузку для повышения производительности при работе с большим количеством записей, которые иначе загружались бы одновременно.
Чтобы активировать динамическую загрузку, вызовите метод setLoadMode до загрузки данных:
Включение динамической загрузки
scheduler.setLoadMode("month");
scheduler.load("/some");
4) Валидируйте конфликтующие события на сервере с помощью проверки через PHP connector. Подробнее смотрите в статье о data validation.
Если валидация не пройдена, можно перезагрузить данные на клиенте.
Для обработки ошибок валидации используйте события DataProcessor onValidationError и onAfterUpdate, а также методы планировщика clearAll и load:
Вызывается после возникновения ошибки валидации, до отправки данных:
dp.attachEvent("onValidationError", function(id, details){
//перезагрузить актуальные данные с сервера
scheduler.clearAll();
scheduler.load("/data");
});
Параметры:
Вызывается после обработки ответа сервера:
dp.attachEvent("onAfterUpdate", function(id, action, tid, response){
if(action == "invalid" || action == "error"){
//перезагрузить актуальные данные с сервера
scheduler.clearAll();
scheduler.load("/data");
}
});
Параметры:
Возможные статусы ответа: