Перейти к основному содержимому

Предотвращение двойных событий в одном временном слоте

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

Активация контроля коллизий

Для управления количеством событий, разрешённых в одном временном слоте, можно использовать расширение collision.

Активация расширения 'collision'
scheduler.plugins({
collision: true
});

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

Управление допустимым количеством событий в одном слоте

По умолчанию в одном временном слоте разрешено только одно событие. Чтобы изменить этот лимит, используйте свойство collision_limit:

Запрет создания более 2 событий в одном временном слоте
scheduler.config.collision_limit = 2;      //разрешает создание 2 событий в одном временном слоте

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
});
  1. Запретите пользователям создавать новые события во время загрузки данных с сервера.

Это гарантирует, что события не будут добавлены до полной загрузки календаря. Используйте обработчики событий onLoadEnd и onLoadStart вместе со свойством readonly, например:

// сделать планировщик только для чтения
// до начала загрузки данных из источника
scheduler.attachEvent("onLoadStart", function(){
scheduler.config.readonly = true;
});

// сделать планировщик редактируемым
// только после завершения загрузки данных из источника
scheduler.attachEvent("onLoadEnd", function(){
scheduler.config.readonly = false;
});
  1. Включите динамическую загрузку для повышения производительности при работе с большим количеством записей, которые иначе загружались бы одновременно.

Чтобы активировать динамическую загрузку, вызовите метод setLoadMode до загрузки данных:

Включение динамической загрузки
scheduler.setLoadMode("month");
scheduler.load("/some");
  1. Валидируйте конфликтующие события на сервере с помощью проверки через PHP connector. Подробнее смотрите в статье о data validation.

Если валидация не пройдена, можно перезагрузить данные на клиенте.

Для обработки ошибок валидации используйте события DataProcessor onValidationError и onAfterUpdate, а также методы планировщика clearAll и load:

a. onValidationError

Вызывается после возникновения ошибки валидации, до отправки данных:

dp.attachEvent("onValidationError", function(id, details){
//перезагрузить актуальные данные с сервера
scheduler.clearAll();
scheduler.load("/data");
});

Параметры:

  • id - (string) id элемента с ошибкой
  • details - (object) детали ошибки

b. onAfterUpdate

Вызывается после обработки ответа сервера:

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.
Need help?
Got a question about the documentation? Reach out to our technical support team for help and guidance. For custom component solutions, visit the Services page.