In vielen Szenarien ist es wichtig, die Anzahl der Ereignisse zu begrenzen, die im selben Zeitfenster geplant werden können. Beispielsweise möchten Sie möglicherweise verhindern, dass ein zweites Ereignis hinzugefügt wird, wenn bereits eines für diesen Zeitpunkt geplant ist.
Um die Anzahl der zulässigen Ereignisse in einem einzelnen Zeitfenster zu steuern, kann die collision Erweiterung verwendet werden.
Aktivieren der 'collision'-Erweiterung
scheduler.plugins({
collision: true
});
Sobald diese Erweiterung auf der Seite aktiviert ist, verhindert sie, dass Benutzer zwei Ereignisse im selben Zeitfenster platzieren – sowohl beim Erstellen neuer Ereignisse als auch beim Verschieben bestehender.
Standardmäßig ist nur ein Ereignis pro Zeitfenster erlaubt. Um dieses Limit anzupassen, verwenden Sie die Eigenschaft collision_limit:
Verhindern, dass mehr als 2 Ereignisse pro Zeitfenster erstellt werden
scheduler.config.collision_limit = 2; // erlaubt das Erstellen von 2 Ereignissen pro Zeitfenster
Related sample: Controlling the number of events in a time slot
Mit der aktivierten 'collision'-Erweiterung löst der Scheduler jedes Mal das Ereignis onEventCollision aus, wenn ein Benutzer versucht, ein Ereignis in ein bereits belegtes Zeitfenster hinzuzufügen oder zu verschieben. Dieses Ereignis prüft das durch die Eigenschaft collision_limit gesetzte Limit.
Beachten Sie, dass das Ereignis onEventCollision während des Ladens der Daten nicht ausgelöst wird. Um das Ereignislimit auch beim Laden von Daten zu erzwingen, ist eine kleine Ergänzung im Code erforderlich:
Verhindern, dass mehr als 2 Ereignisse pro Zeitfenster erstellt/geladen werden
scheduler.config.collision_limit = 2; // erlaubt das Erstellen von 2 Ereignissen pro Zeitfenster
scheduler.attachEvent("onEventLoading", function(ev){ return scheduler.checkCollision(ev); });
Die Methode checkCollision prüft, ob ein Ereignis mit bestehenden Ereignissen überlappt, und löst gegebenenfalls das Ereignis onEventCollision aus.
Um herauszufinden, wie viele Ereignisse in einem bestimmten Zeitfenster geplant sind, kann die Methode getEvents verwendet werden:
Ermitteln der Anzahl der Ereignisse in einem Zeitfenster
var count = scheduler.getEvents(ev.start_date, ev.end_date).length;
Beachten Sie, dass die Methode getEvents alle Ereignisse durchsucht und deren Daten vergleicht. Bei einer sehr großen Anzahl von Ereignissen kann dieser Vorgang etwas Zeit in Anspruch nehmen.
Hier ist eine Zusammenfassung der Schritte, die Sie befolgen sollten, um Kollisionen von Ereignissen in einem Zeitfenster zu verhindern:
1) Fügen Sie die collision-Erweiterung auf der Seite ein:
scheduler.plugins({
collision: true
});
2) Verhindern Sie, dass Benutzer neue Ereignisse erstellen, während Daten noch vom Server geladen werden.
Dies stellt sicher, dass keine Ereignisse hinzugefügt werden können, bevor der Kalender vollständig geladen ist. Verwenden Sie dazu die Event-Handler onLoadEnd und onLoadStart zusammen mit der Eigenschaft readonly, wie folgt:
// Scheduler schreibgeschützt machen
// bevor das Laden der Daten aus der Datenquelle begonnen hat
scheduler.attachEvent("onLoadStart", function(){
scheduler.config.readonly = true;
});
// Scheduler wieder bearbeitbar machen
// erst nachdem das Laden der Daten abgeschlossen ist
scheduler.attachEvent("onLoadEnd", function(){
scheduler.config.readonly = false;
});
3) Aktivieren Sie das dynamische Laden, um die Leistung zu verbessern, wenn viele Datensätze geladen werden müssten.
Um das dynamische Laden zu aktivieren, rufen Sie die Methode setLoadMode vor dem Laden der Daten auf:
Aktivieren des dynamischen Ladens
scheduler.setLoadMode("month");
scheduler.load("/some");
4) Validieren Sie kollidierende Ereignisse serverseitig mit der PHP Connector Validierung. Weitere Informationen finden Sie im Artikel zur Datenvalidierung.
Falls die Validierung fehlschlägt, können Sie die Daten auf der Client-Seite neu laden.
Um einen Validierungsfehler zu behandeln, verwenden Sie die DataProcessor Events onValidationError und onAfterUpdate und laden Sie die Daten mit den Scheduler-Methoden clearAll und load neu:
Wird ausgelöst, nachdem ein Validierungsfehler aufgetreten ist, bevor die Daten gesendet werden:
dp.attachEvent("onValidationError", function(id, details){
//aktuelle Daten vom Server neu laden
scheduler.clearAll();
scheduler.load("/data");
});
Parameter:
Wird ausgelöst, nachdem die Serverantwort verarbeitet wurde:
dp.attachEvent("onAfterUpdate", function(id, action, tid, response){
if(action == "invalid" || action == "error"){
//aktuelle Daten vom Server neu laden
scheduler.clearAll();
scheduler.load("/data");
}
});
Parameter:
Mögliche Antwort-Status sind: