dhtmlxScheduler mit SalesForce LWC
Dieses Tutorial beschreibt, wie man dhtmlxScheduler in eine SalesForce Lightning Web Component integriert.
Prüfen Sie die Online-Demo zur Integration von DHTMLX-Komponenten mit Salesforce LWC (Login: user, Passwort: demo). Der Quellcode der Demo ist auf GitHub verfügbar.
Wenn Sie eine andere Technologie verwenden, schauen Sie sich unten die Liste der verfügbaren Integrationsvarianten an:
- dhtmlxScheduler mit ASP.NET Core
- dhtmlxScheduler mit ASP.NET MVC
- dhtmlxScheduler mit PHP
- dhtmlxScheduler mit PHP:Slim
- dhtmlxScheduler mit PHP:Laravel
- dhtmlxScheduler mit Ruby on Rails
- dhtmlxScheduler mit dhtmlxConnector
Wir verwenden SalesForce CLI, um eine Lightning Web Component zu erstellen und sie in einer Organisation hochzuladen. Siehe dieser Artikel für Installationshinweise. Sie können außerdem Salesforce Extension Pack für Visual Studio Code installieren, um mit Development-Org-Umgebungen zu arbeiten.
Der vollständige Quellcode der in diesem Tutorial erstellten Demo ist auf GitHub verfügbar.
Sie können sich auch die Videoanleitung ansehen, die zeigt, wie man Scheduler mit Salesforce LWC erstellt.
Voraussetzungen
Installieren Sie SalesForce CLI, falls Sie ihn noch nicht besitzen. Siehe dieser Artikel für Installationshinweise.
Schritt 1. Ein Projekt erstellen
Melden Sie sich für ein kostenloses Entwicklerkonto an, falls Sie noch keines haben. Siehe dieser Artikel für Installationshinweise.
In der linken Leiste suchen Sie nach und wählen Sie Dev Hub:

Im neuen Einstellungsfenster wählen Sie Enable Dev Hub:

Lassen Sie uns ein Basisverzeichnis für das Salesforce DX-Projekt erstellen:
$ mkdir ~/salesforce
Erstellen Sie ein Salesforce DX-Projekt über die CLI:
$ cd ~/salesforce
$ sfdx project generate -n scheduler-salesforce-app
target dir = C:UsersUsersalesforce
create scheduler-salesforce-appconfigproject-scratch-def.json
create guides/scheduler-salesforce-appREADME.md
create scheduler-salesforce-appsfdx-project.json
create scheduler-salesforce-app.huskypre-commit
create scheduler-salesforce-app.vscodeextensions.json
create scheduler-salesforce-app.vscodelaunch.json
create scheduler-salesforce-app.vscodesettings.json
create scheduler-salesforce-appforce-appmaindefaultlwc.eslintrc.json
create scheduler-salesforce-appforce-appmaindefaultaura.eslintrc.json
create scheduler-salesforce-appscriptssoqlaccount.soql
create scheduler-salesforce-appscriptsapexhello.apex
create scheduler-salesforce-app.eslintignore
create scheduler-salesforce-app.forceignore
create scheduler-salesforce-app.gitignore
create scheduler-salesforce-app.prettierignore
create scheduler-salesforce-app.prettierrc
create scheduler-salesforce-appjest.config.js
create scheduler-salesforce-apppackage.json
Gehen Sie in das erstellte Projekt:
$ cd scheduler-salesforce-app
Schritt 2. Autorisierung
Org autorisieren mit dem Web Server Flow:
$ sfdx org login web -d
Successfully authorized ...@...com with org ID ...
Aktualisieren Sie Ihre Projektkonfiguration (sfdx-project.json). Setzen Sie den Parameter "sfdcLoginUrl" auf Ihre "My Domain URL". Die "My Domain URL" Ihres Orgs finden Sie auf der Einstellungsseite "My Domain". Zum Beispiel:

"sfdcLoginUrl" : "https://xbs2-dev-ed.my.salesforce.com"
Erstellen Sie eine Scratch Org:
$ sfdx org create scratch -f config/project-scratch-def.json -d
Creating Scratch Org...
RequestId: 2SR8a000000PLf5GAG (https://xbs2-dev-ed.my.salesforce.com/2SR8a000000PLf5GAG)
OrgId: 00D8G000000EEMs
Username: test-3baxo2k0tpej@example.com
✓ Prepare Request
✓ Send Request
✓ Wait For Org
✓ Available
✓ Authenticate
✓ Deploy Settings
Done
Your scratch org is ready.
Schritt 3. Scheduler zu Salesforce hinzufügen
Um die Bibliothek zu verwenden, müssen wir sie in Salesforce als Static Resource hochladen. Öffnen Sie dazu Ihre Scratch-Org:
$ sfdx org open
Öffnen Sie nun die Registerkarte Static Resources und klicken Sie auf die Schaltfläche New

Geben Sie ihm einen aussagekräftigen Namen (wir verwenden dhtmlxscheduler), wählen Sie das ZIP-Archiv mit der Bibliothek selbst (das Archiv muss die Dateien dhtmlxscheduler.js und dhtmlxscheduler.css enthalten) und wählen Sie die Cache-Kontrolle Public, um die Leistung zu verbessern. Drücken Sie die Schaltfläche Save.

Jetzt haben wir dhtmlxScheduler in Salesforce installiert.

Schritt 4. Datenmodell erstellen
Die Kerneinheiten von dhtmlxScheduler sind Ereignisse. Ein sinnvoller Ansatz ist es, alle Eigenschaften der dhtmlxScheduler‑Objekte als reines JSON in Salesforce zu speichern. Erstellen wir also ein Ereignis-Objekt. Öffnen Sie den Objekt-Manager und wählen Sie „Create“, dann „Custom Object“:

Ereignis-Objekt
Geben Sie dem Ereignis-Objekt den Namen, lassen Sie ihn SchedulerEvent/SchedulerEvents heißen.

Der Datensatzname muss dem Objektnamen entsprechen, zum Beispiel:
Objektname: SchedulerEvent ⇒ Datensatzname: SchedulerEvent Name
Drücken Sie die Schaltfläche Save.
Nachdem das Objekt erstellt ist, öffnen Sie die Registerkarte Fields & Relationships. Drücken Sie die Schaltfläche New.

- Start Date
Wählen Sie Date/Time als Datentyp und drücken Sie die Schaltfläche Next.

Benennen Sie es mit Start Date. Es speichert die JSON-serialisierten Task-Eigenschaften.

Drücken Sie die Schaltfläche Next (unter Akzeptieren aller Standard-Einstellungen), bis die Schaltfläche Save & New verfügbar ist.
- End Date
Erstellen Sie das Feld End Date. Wählen Sie Date/Time als Datentyp.

Drücken Sie die Schaltfläche Next (unter Akzeptieren aller Standard-Einstellungen), bis die Schaltfläche Save & New verfügbar ist.
- Text
Erstellen Sie ein Feld Text. Wählen Sie Text als Datentyp.

Drücken Sie die Schaltfläche Next (unter Akzeptieren aller Standard-Einstellungen), bis die Schaltfläche Save verfügbar ist.
Am Ende sollte es so aussehen:

Schritt 5. Erstellen einer Lightning Web Component
Um eine Lightning Web Component zu erstellen, führen Sie folgenden Befehl aus:
$ sfdx lightning generate component --type lwc -n scheduler -d force-app/main/default/lwc
target dir = C:UsersUsersourcesalesforcescheduler-salesforce-appforce-appmaindefaultlwc
create force-appmaindefaultlwcschedulerscheduler.js
create force-appmaindefaultlwcschedulerscheduler.html
create force-appmaindefaultlwcscheduler__tests__scheduler.test.js
create force-appmaindefaultlwcschedulerscheduler.js-meta.xml
Ändern Sie die Komponenten-Definition in scheduler.js-meta.xml, damit sie im Lightning App Builder freigegeben wird:
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>57.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__AppPage</target>
</targets>
<targetConfigs>
<targetConfig targets="lightning__AppPage">
<property name="height" label="Height" type="Integer" default="800" />
</targetConfig>
</targetConfigs>
</LightningComponentBundle>
Öffnen Sie scheduler.html und fügen Sie den folgenden Code ein:
<template>
<div className="thescheduler" lwc:dom="manual" style='width: 100%;'></div>
</template>
Öffnen Sie scheduler.js und fügen Sie den folgenden Code ein:
/* eslint-disable guard-for-in */
/* eslint-disable no-undef */
import { LightningElement, api } from "lwc";
import { ShowToastEvent } from "lightning/platformShowToastEvent";
import { loadStyle, loadScript } from "lightning/platformResourceLoader";
import { createRecord, updateRecord, deleteRecord } from "lightning/uiRecordApi";
// Static resources
import SchedulerFiles from "@salesforce/resourceUrl/dhtmlxscheduler";
// Controllers
import getEvents from "@salesforce/apex/SchedulerData.getEvents";
function unwrap(fromSF) {
const data = fromSF.events.map((a) => ({
id: a.Id,
info: a.Name,
start_date: a.Start_Date__c,
end_date: a.End_Date__c,
text: a.Text__c,
}));
return { data };
}
export default class SchedulerView extends LightningElement {
static delegatesFocus = true;
@api height;
schedulerInitialized = false;
renderedCallback() {
if (this.schedulerInitialized) {
return;
}
this.schedulerInitialized = true;
Promise.all([
loadScript(this, SchedulerFiles + "/dhtmlxscheduler.js"),
loadStyle(this, SchedulerFiles + "/dhtmlxscheduler.css")
])
.then(() => {
this.initializeUI();
})
.catch((error) => {
this.dispatchEvent(
new ShowToastEvent({
title: "Error loading scheduler",
message: error.message,
variant: "error"
})
);
});
}
initializeUI() {
const root = this.template.querySelector(".thescheduler");
root.style.height = this.height + "px";
const scheduler = window.Scheduler.getSchedulerInstance();
scheduler.templates.parse_date = (date) => new Date(date);
scheduler.templates.format_date = (date) => date.toISOString();
scheduler.config.header = [
"day",
"week",
"month",
"date",
"prev",
"today",
"next"
];
scheduler.init(root, new Date(), "week");
getEvents().then((d) => {
const chartData = unwrap(d);
scheduler.parse({
events: chartData.data,
});
});
///↓↓↓ saving changes back to SF backend ↓↓↓
scheduler.createDataProcessor(function (entity, action, data, id) {
switch (action) {
case "create":
console.log("createEvent", data);
const insert = {
apiName: "SchedulerEvent__c",
fields: {
Name: data.info,
Start_Date__c: data.start_date,
End_Date__c: data.end_date,
Text__c: data.text
}
};
scheduler.config.readonly = true; // suppress changes
//until saving is complete
return createRecord(insert).then((res) => {
scheduler.config.readonly = false;
return { tid: res.id, ...res };
});
case "update":
console.log("updateEvent", data);
const update = {
fields: {
Id: id,
Name: data.info,
Start_Date__c: data.start_date,
End_Date__c: data.end_date,
Text__c: data.text
}
};
return updateRecord(update).then(() => ({}));
case "delete":
return deleteRecord(id).then(() => ({}));
}
});
}
}
Schritt 6. Apex-Klasse erstellen
Der nächste Schritt besteht darin, eine Klasse zu erstellen, die die Interaktionen zwischen der Lightning-Komponente und unserem Datenmodell ermöglicht.
$ sfdx apex generate class -n SchedulerData -d force-app/main/default/classes
target dir = C:UsersUsersalesforcescheduler-salesforce-appforce-appmaindefaultclasses
create force-appmaindefaultclassesSchedulerData.cls
create force-appmaindefaultclassesSchedulerData.cls-meta.xml
Nach der Erstellung öffnen Sie SchedulerData.cls und fügen Sie den folgenden Code ein:
public with sharing class SchedulerData {
@RemoteAction
@AuraEnabled(cacheable="true)"
public static Map<String, Object> getEvents() {
// fetching the Records via SOQL
List<SchedulerEvent__c> Events = new List<SchedulerEvent__c>();
Events = [SELECT Id, Name, Start_Date__c, End_Date__c,
Text__c FROM SchedulerEvent__c];
Map<String, Object> result = new Map<String, Object>{'events' => Events };
return result;
}
}
Quellen Sie den Quellcode aus der Scratch Org in Ihr Projekt:
$ sfdx project retrieve start
und pushes Sie dann die Quellen in die Scratch Org:
$ sfdx project deploy start
Schritt 7. Lightning Page erstellen
Öffnen Sie den "Lightning App Builder", erstellen Sie eine neue Lightning Page.

Wählen Sie "App Page" dann Seitenname und Layout.


Sie sollten eine Scheduler‑Benutzerkomponente für die neue Seite sehen. Fügen Sie sie zu einem Bereich hinzu und speichern Sie.

Aktivieren Sie die Seite.

Speichern Sie die Änderungen.



Öffnen Sie die Anwendungsseite. Sie sollte im App Launcher sichtbar sein, wenn Sie darauf klicken und Scheduler eingeben.

Wenn alles gut gelaufen ist, sollten Sie eine einfache Scheduler-Demo sehen, die in der Lightning Page läuft.

Anwendungssicherheit
Scheduler bietet keine Mittel, um eine Anwendung vor verschiedenen Bedrohungen zu schützen, wie z. B. SQL-Injektionen oder XSS- und CSRF-Angriffe. Es ist wichtig, dass die Verantwortung für die Sicherheit einer Anwendung bei den Entwicklern liegt, die die Anwendung implementieren. Lesen Sie die Details im entsprechenden Artikel. Salesforce ist so konzipiert, dass es Ihre Daten und Anwendungen schützt. Sie können auch Ihre eigene Sicherheitsstrategie implementieren, um der Struktur und den Bedürfnissen Ihrer Organisation gerecht zu werden. Für weitere Informationen siehe bitte den Salesforce Security Guide. Hier erfahren Sie, was Sie sicher machen müssen.
Fehlerbehebung
Falls Sie die oben genannten Schritte zur Integration von Scheduler mit Salesforce abgeschlossen haben, Scheduler aber Ereignisse auf einer Seite nicht rendert, werfen Sie einen Blick auf den Artikel Troubleshooting Backend Integration Issues. Dort wird beschrieben, wie man die Ursachen der Probleme identifiziert.
Was kommt als Nächstes
Sie haben nun einen vollständig funktionsfähigen Scheduler. Den vollständigen Code können Sie sich auf GitHub ansehen, klonen oder herunterladen und in Ihren Projekten verwenden.
Sie können die Guides zu den zahlreichen Funktionen von Scheduler oder Tutorials zur Integration von Scheduler mit anderen Backend-Frameworks prüfen.