Предотвращение двойных событий в одном временном слоте
Во многих сценариях важно ограничить количество событий, которые могут быть запланированы в одном времен ном слоте. Например, может потребоваться запретить добавление второго события, если на это время уже запланировано другое.
Активация контроля коллизий
Для управления количеством событий, разрешённых в одном временном слоте, можно использовать расширение collision.
scheduler.plugins({
collision: true
});
После активации этого расширения на странице включается функциональность, предотвращающая размещение двух событий в одном временном слоте - как при создании новых событий, так и при перемещении существующих.
Управление допустимым количеством событий в одном слоте
По умолчанию в одном временном слоте разрешено только одно событие. Чтобы изменить этот лимит, используйте свойство collision_limit:
scheduler.config.collision_limit = 2; //разрешает создание 2 событий в одном временном слоте
Controlling the number of events in a time slot
При активном расширении 'collision', когда пользователь пытается добавить или переместить событие во временной слот, в котором уже есть события, планировщик вызывает событие onEventCollision. Это событие проверяет лимит, заданный в свойстве collision_limit.
Обратите внимание, что событие onEventCollision не срабатывает при загрузке данных. Чтобы обеспечить соблюдение лимита событий при загрузке данных, код необходимо немного доработать:
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 перебирает все события и сравнивает их даты, поэтому при очень большом количестве событий эта операция может занять некоторое время.
Полный чек-лист по предотвращению двойных бронирований/событий
Вот краткое описание шагов, которые нужно выполнить, чтобы предотвратить коллизии событий в одном временном слоте:
- Подключите расширение collision на страницу:
scheduler.plugins({
collision: true
});
- Запретите пользователям создавать новые события во время загрузки данных с сервера.
Это гарантирует, что события не будут добавлены до полной загрузки календаря. Используйте обработчики событий onLoadEnd и onLoadStart вместе со свойством readonly, например:
// сделать планировщик только для чтения
// до начала загрузки данных из источника
scheduler.attachEvent("onLoadStart", function(){
scheduler.config.readonly = true;
});
// сделать планировщик редактируемым
// только после завершения загрузки данных из источника
scheduler.attachEvent("onLoadEnd", function(){
scheduler.config.readonly = false;
});
- Включите динамическую загрузку для повышения производительности при работе с большим количеством записей, которые иначе загружались бы одновременно.
Чтобы активировать динамическую загрузку, вызовите метод setLoadMode до загрузки данных:
scheduler.setLoadMode("month");
scheduler.load("/some");
- Валидируйте конфликтующие события на сервере с помощью проверки через PHP connector. Подробнее смотрите в статье о data validation.
Если валидация не пройдена, можно перезагрузить данные на клиенте.
Для обработки ошибок валидации используйте события DataProcessor onValidationError и onAfterUpdate, а также методы планировщика clearAll и load:
Вызывается после возникновения ошибки валидации, до отправки данных:
dp.attachEvent("onValidationError", function(id, details){
//перезагрузить актуальные данные с сервера
scheduler.clearAll();
scheduler.load("/data");
});
Параметры:
- id - (string) id элемента с ошибкой
- details - (object) детали ошибки
Вызывается после обработки ответа сервера:
dp.attachEvent("onAfterUpdate", function(id, action, tid, response){
if(action == "invalid" || action == "error"){
//перезагрузить актуальные данные с сервера
scheduler.clearAll();
scheduler.load("/data");
}
});
Параметры:
- id - (string) id обновлённого элемента
- action - (string) статус ответа (тип операции), см. детали ниже
- tid - (string) новый id (актуально только для операций вставки)
- response - (mixed) xml node/json объект с разобранным ответом
Возможные статусы ответа:
- updated;
- inserted;
- deleted;
- invalid;
- error.