여러 상황에서 동일한 시간대에 예약할 수 있는 이벤트 수를 제한하는 것이 중요할 수 있습니다. 예를 들어, 이미 해당 시간대에 하나의 이벤트가 예약되어 있다면 두 번째 이벤트 추가를 막고 싶을 수 있습니다.
하나의 시간대에 허용되는 이벤트 수를 관리하려면 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 커넥터의 유효성 검사를 사용하여 서버 측에서 충돌 이벤트를 검증하세요. 자세한 내용은 data validation 문서를 참고하세요.
유효성 검사에 실패하면 클라이언트에서 데이터를 다시 로딩할 수 있습니다.
유효성 검사 실패를 처리하려면 DataProcessor 이벤트 onValidationError와 onAfterUpdate를 사용하고, Scheduler의 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");
}
});
파라미터:
가능한 응답 상태는 다음과 같습니다: