Plugin CreateRowOnEmptyTablePlugin im Jitterbit App Builder
Zusammenfassung
Erstellt eine neue Zeile und speichert sie im Datenobjekt, wenn das Filterereignis keine Zeilen zurückgibt.
Anmeldung
Das CreateRowOnEmptyTablePlugin ist ein Aktions-Plugin für ein Ereignis auf Tabellenebene. Es muss registriert werden, um nach dem Filterereignis ausgeführt zu werden. Da das Plugin das Verhalten des intrinsischen Filterereignisses ändert, sollte es für ein Datenobjekt und nicht für eine physische Tabelle registriert werden.
Parameter
Keine
Bemerkungen
Das CreateRowOnEmptyTablePlugin ermittelt, ob das Filterereignis Zeilen zurückgegeben hat. Wenn das Filterereignis eine oder mehrere Zeilen zurückgegeben hat, wird das Plugin ohne weitere Verarbeitung beendet. Andernfalls erstellt das Plugin eine neue Zeile und speichert sie im Datenobjekt.
Das Plugin erstellt eine Zeile durch Aufruf des Ereignisses „Neu“. Das Ereignis „Neu“ ist für die Anwendung der Bindungskriterien sowie für den Aufruf der Standardregeln des Datenobjekts verantwortlich. Im Kontext einer Webseitenanforderung werden die Bindungskriterien aus den Parametern der URL Abfrage abgeleitet. Anders ausgedrückt: Die neue Zeile wird mit allen Abfrage gefüllt, deren Namen mit den Spaltennamen des Datenobjekts übereinstimmen.
Nach dem Aufruf des New-Ereignisses ruft das Plugin In das Insert-Ereignis des Datenobjekts auf und speichert die Zeile in der Zieltabelle. Entwickler können Aktionen für das Insert-Ereignis registrieren, um zusätzliche Verarbeitungsvorgänge durchzuführen. Dies ist wichtig, da das Filter-Ereignis ein Ereignis auf Tabellenebene ist und daher keine Aktionen auf Zeilenebene wie CRUD-Regeln unterstützt. Im Gegensatz dazu ist das Insert-Ereignis ein Ereignis auf Zeilenebene. Ereignisse auf Zeilenebene unterstützen die meisten Aktionen, einschließlich CRUD-Regeln.
Wenn das Insert-Ereignis aufgrund einer oder mehrerer fehlgeschlagener Validierungsregeln nicht erfolgreich ist, wird das Plugin ohne weitere Verarbeitung beendet. Andernfalls prüft das Plugin den Änderungsbereich des Insert-Ereignisses, um festzustellen, ob die Zeile aktualisiert werden soll. Ist der Änderungsbereich auf einen anderen Wert als „Keine“ eingestellt, aktualisiert das Plugin die Zeile. Der Operation löst das Filter-Ereignis für die neue Zeile aus.
Notiz
Entwickler sollten den Änderungsbereich des Insert-Ereignisses so einstellen, dass eine Aktualisierung ausgelöst wird, wenn das Datenobjekt berechnete Spalten enthält oder aus mehreren Tabellen ausgewählt wird. Solche Werte werden nur durch das Filter-Ereignis aufgelöst.
Schließlich wird das Plugin beendet und gibt die neu erstellte Zeile zurück. Da dies alles im Kontext des Filter-Ereignisses geschieht, ist der Webclient davon nichts mitbekommen. Für den Webclient war die Zeile schon immer vorhanden.
Verwendung
Stellen Sie sich vor, ein Entwickler möchte einen Link erstellen, der automatisch ein Produkt in den Warenkorb des Benutzers legt. Der Link könnte etwa so aussehen:
https://example.com/App Builder/app/Shop/AddToCart?ProductId=1234
In diesem Beispiel öffnet der Link die Seite „AddToCart“ und übergibt „ProductId“ als Bindungskriterium.
Angenommen, die Datenquelle enthält eine Warenkorbtabelle, die ungefähr so aussieht:
- CartId - Eindeutige Kennung, Primärschlüssel, automatisch generiert.
- ProductId - Integer, Fremdschlüssel zur Produkttabelle.
- Menge - Ganzzahl.
- SessionId - Eindeutige Kennung, identifiziert die Benutzersitzung.
Der Entwickler erstellt zunächst ein AddToCart-Datenobjekt, das auf die Tabelle „Warenkorb“ abzielt. Das AddToCart-Datenobjekt wählt alle Spalten der Tabelle „Warenkorb“ aus. Obwohl technisch nicht erforderlich, markiert der Entwickler die ProductId als Bindungsspalte. Dadurch wird sichergestellt, dass die ProductId vor der Ausführung des Ereignisses vorhanden ist. Das AddToCart-Datenobjekt ist so eingeschränkt, dass Benutzer nur die Warenkorbartikel ihrer aktuellen Sitzung sehen können. Die resultierende mvSQL-Anweisung könnte beispielsweise wie folgt aussehen:
SELECT
C.CartId AS CartId,
C.ProductId AS ProductId,
C.Quantity AS Quantity,
C.SessionId AS SessionId
FROM Cart AS C
WHERE C.SessionId = session()
Beachten Sie, dass die CartId nicht explizit als Standard festgelegt werden muss, da sie automatisch generiert wird. Die ProductId wird nicht als Standard festgelegt, da sie aus Bindungskriterien stammt.
Zusätzlich zum Datenobjekt „AddToCart“ erstellt der Entwickler ein Datenobjekt namens „MyCart“. Wie das Datenobjekt „AddToCart“ zielt auch das Datenobjekt „MyCart“ auf alle Spalten der Tabelle „Cart“ ab und wählt sie aus. Das Datenobjekt „MyCart“ ist ebenfalls auf die aktuelle Sitzung beschränkt. Das Datenobjekt „MyCart“ verfügt jedoch nicht über ein explizites Filterereignis. Es verwendet nicht das Plugin„CreateRowOnEmptyTablePlugin“.
Der Entwickler erstellt dann eine Seite mit dem Namen „AddToCart“ und registriert das Datenobjekt „AddToCart“ als Seitendatenobjekt. Anschließend fügt Entwickler der Seite „AddToCart“ ein mehrzeiliges Panel hinzu. Das mehrzeilige Panel wählt aus dem Datenobjekt „MyCart“ aus. Darüber hinaus ist das mehrzeilige Panel an das Seitendatenobjekt gebunden.
Hinweis
Durch die Bindung eines Panels an die Seite wird sichergestellt, dass das Panel erst gerendert wird, wenn das Filterereignis des Seitendatenobjekts ausgeführt wird.
Das mehrzeilige Panel enthält zwei Steuerelemente:
- Produkt - Liste, gebunden an die Spalte „Produkt-ID“. Wählt aus der Produkttabelle mit der Produkt-ID als Schlüssel und dem Produktnamen als Titel aus.
- Menge - Numerisch, gebunden an die Spalte „Menge“.
Das Anzeigen der Seite ohne Angabe von Bindungskriterien führt zu einem Fehler.
Notiz
Zum Zeitpunkt des Schreibens werden Ausnahmen, die während der Ausführung des Filterereignisses des Seitenobjekts ausgelöst werden, nicht auf dem Bildschirm angezeigt. Sie erscheinen jedoch im Protokoll.
Enthält die Abfrage einen Parameter namens „ProductId“ mit einem gültigen Wert, führt App Builder das Filter-Ereignis des Datenobjekts „AddToCart“ aus, das wiederum das Plugin „CreateRowOnEmptyTablePlugin“ ausführt. Das Plugin erstellt eine neue Zeile und fügt sie in die Tabelle „Cart“ ein. Nach der Ausführung des Filter-Ereignisses des Datenobjekts „AddToCart“ führt App Builder das Filter-Ereignis des Datenobjekts „MyCart“ aus. Dadurch wird die neu erstellte Zeile zurückgegeben und im mehrzeiligen Bereich angezeigt.
Der Entwickler könnte zusätzliche Aktionen ausführen, wenn die neue Zeile in die Tabelle „Warenkorb“ eingefügt wird. Beispielsweise könnte Entwickler eine CRAM-Regel registrieren, die eine Zeile in die Tabelle „Sitzung“ einfügt, falls diese nicht existiert. Die mvSQL-Anweisung könnte wie folgt aussehen:
INSERT INTO Session
(
SessionId,
DateCreated
)
SELECT
SessionId,
DateCreated
FROM
(
SELECT
session() AS SessionId,
now() AS DateCreated
) AS SOURCE
WHERE NOT EXISTS
(
SELECT 1
FROM Session
WHERE
Session.SessionId = SOURCE.SessionId
AND Session.DateCreated = SOURCE.DateCreated
)
Dies würde es dem Entwickler ermöglichen, ein Ereignis zu planen, das Einkaufswagen löscht, die zu abgelaufenen Sitzungen gehören.
Fehler
Endlosschleifen
Da das CreateRowOnEmptyTablePlugin das Filter-Ereignis rekursiv aufruft, besteht die Gefahr einer Endlosschleife. Dies würde passieren, wenn der Entwickler das Datenobjekt so gestaltet hat, dass es die neu erstellte Zeile nicht zurückgibt. Beispiel:
SELECT *
FROM Table
WHERE 1 = 0
App Builder schützt vor dieser Situation. Wenn das Filterereignis beim Aktualisieren die neue Zeile nicht findet, wird die folgende Ausnahme ausgelöst:
Beim Erstellen einer Zeile in einer leeren Tabelle wurde eine Endlosschleife erkannt.
Sicherheit
Wenn ein Browser einem Link folgt, sendet er eine HTTP-GET-Anfrage. Eine HTTP-GET-Anfrage sollte grundsätzlich sowohl sicher als auch idempotent sein. Eine HTTP-Anfrage ist sicher, wenn sie keine Nebenwirkungen hat. Eine HTTP-Anfrage ist idempotent, wenn die gleiche Anfrage beim zweiten Mal dasselbe Ergebnis liefert.
Das Plugin CreateRowOnEmptyTablePlugin ist idempotent: Beim Aktualisieren des Browserfensters wird keine zweite Zeile erstellt. Das Plugin CreateRowOnEmptyTablePlugin ist jedoch nicht sicher: Es erstellt eine persistente Zeile in der Datenbank. Dies ist per Definition ein Nebeneffekt.
Entwickler sollten dies berücksichtigen, da eine unsichere GET-Anfrage für einen Cross-Site-Request-Forgery-Angriff ausgenutzt werden kann. Aus diesem Grund sollten Entwickler potenziell destruktive Operation vermeiden, wie z. B. die Registrierung einer Löschregel, die beim Laden der Seite ausgeführt wird. Entwickler sollten außerdem die Registrierung von Regeln oder Plugins vermeiden, die mit externen Systemen interagieren, wie z. B. beim Senden von Email oder Ausführen einer Zahlung.