Plugin CreateRowOnEmptyTablePlugin im Jitterbit App Builder
Zusammenfassung
Erstellt eine neue Zeile und speichert sie im Datenobjekt, wenn das Filterereignis keine Zeilen zurückgibt.
Registrierung
Das CreateRowOnEmptyTablePlugin ist ein Aktionsplugin für ein tabellenbasiertes Ereignis. Es muss registriert werden, um nach dem Filterereignis ausgeführt zu werden. Da das Plugin das Verhalten des intrinsischen Filterereignisses ändert, sollte es auf einem Datenobjekt und nicht auf einer physischen Tabelle registriert werden.
Parameter
Keine
Anmerkungen
Das CreateRowOnEmptyTablePlugin bestimmt, ob das Filterereignis Zeilen zurückgegeben hat. Wenn das Filterereignis eine oder mehrere Zeilen zurückgegeben hat, verlässt das Plugin ohne weitere Verarbeitung. Andernfalls erstellt das Plugin eine neue Zeile und speichert sie im Datenobjekt.
Das Plugin erstellt eine Zeile, indem es das Neue Ereignis aufruft. Das Neue Ereignis ist dafür verantwortlich, Bindungskriterien anzuwenden sowie die Standardregeln des Datenobjekts aufzurufen. Im Kontext einer Webseitenanfrage stammen die Bindungskriterien aus den URL-Abfragezeichenfolgenparametern. Mit anderen Worten, die neue Zeile wird mit Werten aus den Abfragezeichenfolgenparametern gefüllt, deren Namen mit den Spaltennamen des Datenobjekts übereinstimmen.
Nach dem Aufruf des Neuen Ereignisses ruft das Plugin das Einfügeereignis des Datenobjekts auf, um die Zeile in die Zieltabelle zu speichern. Entwickler können Aktionen im Einfügeereignis registrieren, um zusätzliche Verarbeitungen durchzuführen. Dies ist wichtig, da das Filterereignis ein tabellenbasiertes Ereignis ist und daher keine zeilenbasierten Aktionen wie CRUD-Regeln unterstützt. Im Gegensatz dazu ist das Einfügeereignis ein zeilenbasiertes Ereignis. Zeilenbasierte Ereignisse unterstützen die meisten Aktionen, einschließlich CRUD-Regeln.
Wenn das Einfügeereignis aufgrund eines oder mehrerer fehlgeschlagener Validierungsregeln nicht erfolgreich ist, verlässt das Plugin ohne weitere Verarbeitung. Andernfalls überprüft das Plugin den Änderungsbereich des Einfügeereignisses, um festzustellen, ob die Zeile aktualisiert werden sollte. Wenn der Änderungsbereich auf einen Wert ungleich "None" gesetzt ist, aktualisiert das Plugin die Zeile. Der Aktualisierungsvorgang ruft das Filterereignis für die neue Zeile auf.
Hinweis
Entwickler sollten in Betracht ziehen, den Änderungsbereich des Einfügeereignisses so einzustellen, 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 Filterereignis aufgelöst.
Schließlich verlässt das Plugin und gibt die neu erstellte Zeile zurück. Da dies alles im Kontext des Filterereignisses geschieht, bleibt der Web-Client uninformiert. Soweit der Web-Client betroffen ist, hat die Zeile immer existiert.
Verwendung
Stellen Sie sich vor, ein Entwickler möchte einen Link erstellen, der automatisch ein Produkt zum Einkaufswagen des Benutzers hinzufügt. Der Link könnte ungefähr so aussehen:
https://example.com/Vinyl/app/Shop/AddToCart?ProductId=1234
In diesem Beispiel öffnet der Link die Seite "AddToCart" und übergibt die ProductId als Bindungskriterium.
Angenommen, die Datenquelle enthält eine Tabelle namens Cart, die ungefähr so aussieht:
- CartId - Eindeutiger Identifikator, Primärschlüssel, automatisch generiert.
- ProductId - Ganzzahl, Fremdschlüssel zur Produkttabelle.
- Quantity - Ganzzahl.
- SessionId - Eindeutiger Identifikator, identifiziert die Benutzersitzung.
Der Entwickler beginnt damit, ein AddToCart-Datenobjekt zu erstellen, das auf die Cart-Tabelle abzielt. Das AddToCart-Datenobjekt wählt alle Spalten aus der Cart-Tabelle aus. Obwohl dies technisch nicht erforderlich ist, kennzeichnet der Entwickler die ProductId als Bindungsspalte. Dadurch wird sichergestellt, dass die ProductId vorhanden ist, bevor das Ereignis ausgeführt wird. Das AddToCart-Datenobjekt ist so eingeschränkt, dass Benutzer nur die Artikel im Einkaufswagen sehen können, die zu ihrer aktuellen Sitzung gehören. Die resultierende mvSQL-Anweisung könnte ungefähr so 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 standardisiert werden muss, da sie automatisch generiert wird. Die ProductId wird nicht standardisiert, da sie aus den Bindungskriterien stammen wird.
Zusätzlich zum AddToCart-Datenobjekt erstellt der Entwickler ein Datenobjekt namens MyCart. Wie das AddToCart-Datenobjekt zielt das MyCart-Datenobjekt auf die Cart-Tabelle ab und wählt alle Spalten aus. Das MyCart-Datenobjekt ist ebenfalls auf die aktuelle Sitzung beschränkt. Das MyCart-Datenobjekt hat jedoch kein explizites Filterereignis. Es nutzt nicht das CreateRowOnEmptyTablePlugin-Plugin.
Der Entwickler erstellt dann eine Seite namens AddToCart und registriert das AddToCart-Datenobjekt als das Seiten-Datenobjekt. Der Entwickler fügt dann ein Mehrzeilenpanel zur Seite AddToCart hinzu. Das Mehrzeilenpanel wählt aus dem MyCart-Datenobjekt aus. Darüber hinaus ist das Mehrzeilenpanel an das Seiten-Datenobjekt gebunden.
Hinweis
Binding eines Panels an die Seite stellt sicher, dass das Panel nicht gerendert wird, bis das Filterereignis des Seiten-Datenobjekts ausgeführt wird.
Das Mehrzeilen-Panel enthält zwei Steuerelemente:
- Produkt - Liste, gebunden an die Spalte ProductId. Wählt aus der Produkttabelle unter Verwendung der ProductId als Schlüssel und ProductName als Titel.
- Menge - Numerisch, gebunden an die Spalte Quantity.
Das Anzeigen der Seite ohne Bereitstellung von Bindungskriterien führt zu einem Fehler.
Hinweis
Zum Zeitpunkt des Schreibens werden Ausnahmen, die beim Ausführen des Filterereignisses des Seitenobjekts ausgelöst werden, nicht auf dem Bildschirm angezeigt. Sie erscheinen jedoch im Protokoll.
Wenn der Abfrage-String einen Parameter namens ProductId mit einem gültigen Wert enthält, wird App Builder das Filterereignis des AddToCart-Datenobjekts ausführen, das wiederum das Plugin CreateRowOnEmptyTablePlugin ausführt. Das Plugin erstellt eine neue Zeile und fügt sie in die Cart-Tabelle ein. Nachdem das Filterereignis des AddToCart-Datenobjekts ausgeführt wurde, wird App Builder das Filterereignis des MyCart-Datenobjekts ausführen. Dies gibt die neu erstellte Zeile zurück und zeigt sie im Mehrzeilen-Panel an.
Der Entwickler könnte zusätzliche Aktionen durchführen, wenn die neue Zeile in die Cart-Tabelle eingefügt wird. Zum Beispiel könnte der Entwickler eine CRAM-Regel registrieren, die eine Zeile in die Session-Tabelle einfügt, wenn sie nicht existiert. Die mvSQL-Anweisung könnte folgendermaßen 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 Warenkörbe löscht, die zu abgelaufenen Sitzungen gehören.
Fehler
Unendliche Schleifen
Da das CreateRowOnEmptyTablePlugin das Filterereignis rekursiv aufruft, besteht die Möglichkeit einer unendlichen Schleife. Dies würde auftreten, wenn der Entwickler das Datenobjekt so gestaltet, dass es die neu erstellte Zeile nicht zurückgibt. Zum Beispiel:
SELECT *
FROM Table
WHERE 1 = 0
App Builder schützt vor dieser Situation. Wenn das Filterereignis die neue Zeile beim Durchführen einer Aktualisierung nicht findet, wird die folgende Ausnahme ausgelöst:
Unendliche Schleife erkannt beim Erstellen einer Zeile in einer leeren Tabelle.
Sicherheit
Wenn ein Browser einem Link folgt, wird eine HTTP GET-Anfrage gesendet. Im Allgemeinen sollte eine HTTP GET-Anfrage sowohl sicher als auch idempotent sein. Eine HTTP-Anfrage ist sicher, wenn sie keine Nebenwirkungen hat. Eine HTTP-Anfrage ist idempotent, wenn die erneute Durchführung derselben Anfrage das gleiche Ergebnis zurückgibt.
Das CreateRowOnEmptyTablePlugin-Plugin ist idempotent: Das Aktualisieren des Browserfensters erstellt keine zweite Zeile. Das CreateRowOnEmptyTablePlugin-Plugin ist jedoch nicht sicher: Das Plugin erstellt eine persistente Zeile in der Datenbank. Dies ist per Definition eine Nebenwirkung.
Entwickler sollten dies im Hinterkopf behalten, da eine unsichere GET-Anfrage in einem Cross-Site-Request-Forgery-Angriff ausgenutzt werden kann. Aus diesem Grund sollten Entwickler potenziell destruktive Operationen vermeiden, wie das Registrieren einer Löschregel, die ausgeführt wird, wenn die Seite geladen wird. Entwickler sollten auch vermeiden, Regeln oder Plugins zu registrieren, die mit externen Systemen interagieren, wie das Senden einer E-Mail oder das Tätigen einer Zahlung.