Serverseitige Integration
Die beste Methode, um dhtmlxScheduler mit einem Backend zu verbinden, ist die Einrichtung einer RESTful API auf dem Server und die Verwendung von dhtmlxDataProcessor auf der Client-Seite.
DataProcessor ist eine clientseitige Bibliothek, die in dhtmlxScheduler.js enthalten ist. Sie verfolgt Datenänderungen und verwaltet Serveranfragen vom Client.
Sie können dhtmlxScheduler mithilfe einer REST API mit dem Server verbinden - und das in verschiedenen Frameworks und Programmiersprachen. Nachfolgend finden Sie eine Liste serverseitiger Implementierungen, die für die Scheduler-Backend-Integration verfügbar sind:
- dhtmlxScheduler mit PHP:Slim
- dhtmlxScheduler mit ASP.NET Core
- dhtmlxScheduler mit ASP.NET MVC
- dhtmlxScheduler mit Node.js
- dhtmlxScheduler mit PHP
- dhtmlxScheduler mit PHP:Laravel
- dhtmlxScheduler mit Ruby on Rails
- dhtmlxScheduler mit PHP: Slim 3
Vorgehensweise
Um Daten vom Server über eine REST API zu laden, gehen Sie im Allgemeinen wie folgt vor:
Clientseite
-
Verwenden Sie die Methode load und geben Sie die URL an, die Scheduler-Daten im JSON-Format zurückgibt.
-
Verwenden Sie die Methode createDataProcessor und übergeben Sie ein Objekt mit Konfigurationsoptionen:
const dp = scheduler.createDataProcessor({
url: "apiUrl",
mode: "REST"
});
Alternativ können Sie einen dataProcessor mit dem Konstruktor erstellen und an das dhtmlxScheduler-Objekt anhängen. Der scheduler.DataProcessor()-Konstruktor akzeptiert den Pfad zum serverseitigen Skript:
scheduler.init("scheduler_here", new Date(), "month");
scheduler.load("apiUrl");
const dp = new scheduler.DataProcessor("apiUrl");
dp.init(scheduler);
Ausführlichere Informationen finden Sie im folgenden Abschnitt.
DataProcessor erstellen
Beim Erstellen eines DataProcessor über die API-Methode createDataProcessor haben Sie mehrere Möglichkeiten, Parameter zu übergeben.
- Verwenden Sie einen der vordefinierten Request-Modi, zum Beispiel:
const dp = scheduler.createDataProcessor({
url: "/api",
mode: "REST"
});
wobei gilt:
- url - die serverseitige URL
- mode - die Methode, mit der Daten an den Server gesendet werden: "JSON" | "REST-JSON" | "JSON" | "POST" | "GET"
- Übergeben Sie ein benutzerdefiniertes router-Objekt:
const dp = scheduler.createDataProcessor(router);
wobei der Router eine Funktion sein kann:
const server = "/api";
// entity - "event"
// action - "create"|"update"|"delete"
// data - ein Objekt mit Eventdaten
// id – die ID des bearbeiteten Objekts (Event)
const dp = scheduler.createDataProcessor(function(entity, action, data, id) {
switch(action) {
case "create":
return scheduler.ajax.post(
`${server}/${entity}`,
data
);
break;
case "update":
return scheduler.ajax.put(
`${server}/${entity}/${id}`,
data
);
break;
case "delete":
return scheduler.ajax.del(
`${server}/${entity}/${id}`
);
break;
}
});
oder ein Objekt, das wie folgt aufgebaut ist:
const dp = scheduler.createDataProcessor({
event: {
create: function(data) {},
update: function(data, id) {},
delete: function(id) {}
}
});
Alle Router-Funktionen sollten entweder ein Promise oder ein Datenantwort-Objekt zurückgeben. Dadurch kann der dataProcessor die Datenbank-ID zuweisen und das onAfterUpdate-Event auslösen.
const router = function(entity, action, data, id) {
return new Promise(function(resolve, reject) {
// … Logik
return resolve({tid: databaseId});
});
}
So kann DataProcessor verwendet werden, um Daten in localStorage oder einem beliebigen Speicher, der nicht an eine bestimmte URL gebunden ist, zu speichern oder wenn unterschiedliche Server (URLs) für das Erstellen und Löschen von Objekten zuständig sind.
Details zu Request und Response
Die URL folgt diesem Muster:
- api/eventId
wobei "api" die in der dataProcessor-Konfiguration angegebene URL ist.
REST-Modus
Um den REST-Modus zu verwenden, setzen Sie die Eigenschaft mode des createDataProcessor-Konfigurationsobjekts auf "REST":
const dp = scheduler.createDataProcessor({
url: "apiUrl",
mode: "REST"
});
Hier sind die typischen Anfragen und Antworten:
| Aktion | HTTP-Methode | URL | Antwort |
|---|---|---|---|
| Daten laden | GET | /apiUrl | JSON-Format |
| Neues Event hinzufügen | POST | /apiUrl | ("action":"inserted","tid":"eventId") |
| Event aktualisieren | PUT | /apiUrl/:id | ("action":"updated") |
| Event löschen | DELETE | /apiUrl/:id | ("action":"deleted") |
REST-JSON-Modus
Um den REST-JSON-Modus zu verwenden, setzen Sie die Eigenschaft mode des createDataProcessor-Konfigurationsobjekts auf "REST-JSON":
const dp = scheduler.createDataProcessor({
url: "apiUrl",
mode: "REST-JSON"
});
In diesem Modus sendet der Scheduler POST/PUT/DELETE-Anfragen mit dem Content-Type application/json.
Die Anfragen und Antworten sehen folgendermaßen aus:
| Aktion | HTTP-Methode | URL | Request Body | Antwort |
|---|---|---|---|---|
| Daten laden | GET | /apiUrl | JSON-Format | |
| Neues Event hinzufügen | POST | /apiUrl | ( "start_date":"2019-12-18 00:00", "end_date":"2019-12-18 00:05", "text":"New event", ... ) | ( "action":"inserted", "tid":"eventId" ) |
| Event aktualisieren | PUT | /apiUrl/:id | ( "start_date":"2024-12-18 00:00", "end_date":"2024-12-18 00:05", "text":"New event", ... ) | ("action":"updated") |
| Event löschen | DELETE | /apiUrl/:id | ("action":"deleted") |
POST-Modus
Um den POST-Modus zu verwenden, setzen Sie die Eigenschaft mode des createDataProcessor-Konfigurationsobjekts auf "POST":
const dp = scheduler.createDataProcessor({
url: "apiUrl",
mode: "POST"
});
So funktionieren die Anfragen und Antworten:
| Aktion | HTTP-Methode | URL | Antwort |
|---|---|---|---|
| Daten laden | GET | /apiUrl | JSON-Format |
| Event aktualisieren | POST | /apiUrl | ("action":"inserted|updated|deleted", "tid":"eventId") |
JSON-Modus
Um den JSON-Modus zu verwenden, setzen Sie die Eigenschaft mode des createDataProcessor-Konfigurationsobjekts auf "JSON":
const dp = scheduler.createDataProcessor({
url: "apiUrl",
mode: "JSON"
});
In diesem Modus sendet der Scheduler nach jeder Datenänderung eine POST-Anfrage an den Server (ähnlich wie im POST-Modus, aber mit anderem Anfrageformat).
Die Anfragen und Antworten sehen wie folgt aus:
| Aktion | HTTP-Methode | Request Body | Antwort |
|---|---|---|---|
| Daten laden | GET | JSON-Format | |
| Neues Event hinzufügen | POST | ( "id": temporaryId, "action":"inserted", "data":( "start_date":"2019-12-18 00:00", "end_date":"2019-12-18 00:05", "text":"New event", ... ) ) | ( "action":"inserted", "tid":"eventId" ) |
| Event aktualisieren | POST | ( "id": id, "action":"updated", "data":( "start_date":"2019-12-18 00:00", "end_date":"2019-12-18 00:05", "text":"New event", ... ) ) | ("action":"updated") |
| Event löschen | POST | ( "id": id, "action":"deleted", "data":( "start_date":"2019-12-18 00:00", "end_date":"2019-12-18 00:05", "text":"New event", ... ) ) | ("action":"deleted") |
Dynamisches Laden
Die Anfragen und Antworten für das dynamische Laden sind wie folgt:
| Aktion | HTTP-Methode | URL | Antwort |
|---|---|---|---|
| Daten laden | GET | /apiUrl?from=minDate&to=maxDate | JSON-Format |
Anfrage-Parameter
Create/Update/Delete-Anfragen beinhalten alle öffentlichen Eigenschaften des clientseitigen Event-Objekts:
- id: 71
- start_date: 2024-11-04 15:00
- end_date: 2024-11-04 18:00
- text: Recinto Ferial - Valencia
- details: Details für Recinto Ferial - Valencia
- !nativeeditor_status: updated
Der Parameter !nativeeditor_status gilt nur für den POST-Modus.
Serverseite
Immer wenn im Scheduler eine Aktion ausgeführt wird, wie das Hinzufügen, Aktualisieren oder Löschen von Ereignissen, reagiert dataProcessor, indem eine AJAX-Anfrage an den Server gesendet wird.
Jede Anfrage enthält alle notwendigen Daten, um Änderungen in der Datenbank zu speichern. Da dataProcessor im REST-Modus eingerichtet ist, werden je nach Operationstyp unterschiedliche HTTP-Methoden verwendet.
Wenn Sie aus irgendeinem Grund die REST API nicht verwenden möchten, ist eine gute Alternative die Verwendung der dhtmlxConnector-Bibliothek.
Wiederkehrende Ereignisse
Wiederkehrende Ereignisse werden in der Datenbank als Datensätze gespeichert, die alle Felder eines regulären Ereignisses sowie mehrere zusätzliche Felder enthalten: rrule, duration, recurring_event_id, original_start und deleted.
Weitere Details finden Sie im Artikel Wiederkehrende Ereignisse.
Neben diesen zusätzlichen Feldern benötigt der serverseitige Controller eine spezielle Logik:
- Für die insert-Aktion:
- wenn event.deleted === true, sollte die Antwort einen 'deleted'-Status anzeigen
- Für die update-Aktion:
- wenn event.rrule nicht leer ist und event.recurring_event_id leer ist, müssen alle Ereignisse mit recurring_event_id == event.id gelöscht werden
- Für die delete-Aktion:
- wenn event.rrule nicht leer ist und event.recurring_event_id leer ist, müssen alle Ereignisse mit recurring_event_id == event.id gelöscht werden
- wenn event.recurring_event_id nicht leer ist, sollte das Ereignis mit event.deleted = true aktualisiert werden, anstatt gelöscht zu werden
Ein ausführliches Beispiel zum Bearbeiten und Löschen wiederkehrender Ereignisse finden Sie im entsprechenden Abschnitt des Artikels zu wiederkehrenden Ereignissen.