Verhindern von doppelten Ereignissen in einem Zeitfenster

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.

Aktivieren der Überwachung auf Kollisionen

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.

Verwalten der zulässigen Anzahl von Ereignissen in einem Zeitfenster

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.

Ermitteln der Anzahl der Ereignisse in einem Zeitfenster

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.

Vollständige Checkliste zur Verhinderung von Doppelbuchungen/Ereignissen

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:

a. onValidationError

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:

  • id - (string) ID des Elements mit dem Fehler
  • details - (object) Fehlerdetails

b. onAfterUpdate

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:

  • id - (string) ID des aktualisierten Elements
  • action - (string) Status der Antwort (Operationstyp), siehe unten für Details
  • tid - (string) Neue ID (nur relevant bei Insert-Operationen)
  • response - (mixed) XML-Knoten/JSON-Objekt mit der geparsten Antwort

Mögliche Antwort-Status sind:

  • updated;
  • inserted;
  • deleted;
  • invalid;
  • error.
Nach oben