Zum Inhalt springen

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

Hinweise

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, indem es das Ereignis „Neu“ aufruft. Das Ereignis „Neu“ ist für die Anwendung von Bindungskriterien sowie für den Aufruf der Standardregeln des Datenobjekts verantwortlich. Im Kontext einer Webseitenanforderung werden Bindungskriterien aus URL Abfrage abgeleitet. Mit anderen Worten: Die neue Zeile wird mit allen Abfrage gefüllt, deren Namen mit den Spaltennamen des Datenobjekts übereinstimmen.

Nach dem Aufrufen des neuen Ereignisses ruft das Plug-In das Einfügeereignis des Datenobjekts auf und speichert die Zeile in der Zieltabelle. Entwickler können Aktionen für das Einfügeereignis registrieren, um zusätzliche Verarbeitungsvorgänge durchzuführen. Dies ist wichtig, da das Filterereignis ein Ereignis auf Tabellenebene ist und daher keine Aktionen auf Zeilenebene wie CRUD-Regeln unterstützt. Im Gegensatz dazu ist das Einfügeereignis ein Ereignis auf Zeilenebene. Ereignisse auf Zeilenebene unterstützen die meisten Aktionen, einschließlich CRUD-Regeln.

Wenn das Insert-Ereignis nicht erfolgreich ist, weil eine oder mehrere Validierungsregeln fehlgeschlagen sind, wird das Plugin ohne weitere Verarbeitung beendet. Andernfalls überprüft das Plugin den Änderungsbereich des Insert-Ereignisses, um festzustellen, ob die Zeile aktualisiert werden soll. Wenn der Änderungsbereich auf einen anderen Wert als „Keine“ eingestellt ist, aktualisiert das Plugin die Zeile. Der Operation ruft das Filterereignis für die neue Zeile auf.

Hinweis

Entwickler sollten erwägen, den Änderungsbereich des Insert-Ereignisses so einzustellen, dass eine Aktualisierung ausgelöst wird, wenn das Datenobjekt berechnete Spalten enthält oder aus mehreren Tabellen auswählt. 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 sich der Webclient dessen nicht bewusst. Für den Webclient existierte die Zeile schon immer.

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 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 - Ganze Zahl.
  • SessionId - Eindeutige Kennung, identifiziert die Benutzersitzung.

Der Entwickler beginnt mit der Erstellung eines AddToCart-Datenobjekts, das auf die Cart-Tabelle abzielt. Das AddToCart-Datenobjekt wählt alle Spalten aus der Cart-Tabelle aus. Obwohl es technisch nicht erforderlich ist, kennzeichnet 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 Warenkorbartikel anzeigen können, die zu ihrer aktuellen Sitzung gehören. Die resultierende mvSQL-Anweisung könnte etwa 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 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 mit dem Namen MyCart. Wie das Datenobjekt AddToCart zielt das Datenobjekt MyCart auf alle Spalten der Tabelle Cart 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 AddToCart-Datenobjekt als Seitendatenobjekt. Der Entwickler fügt dann der AddToCart-Seite ein mehrzeiliges Panel hinzu. Das mehrzeilige Panel wählt aus dem MyCart-Datenobjekt aus. Darüber hinaus ist das mehrzeilige Panel an das Seitendatenobjekt gebunden.

Hinweis

Durch das Binden 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 ProductId. Wählt aus der Produkttabelle mit der ProductId 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.

Wenn die Abfrage einen Parameter namens ProductId mit einem gültigen Wert enthält, App Builder führt das Filterereignis des AddToCart-Datenobjekts aus, 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, App Builder führt das Filterereignis des MyCart-Datenobjekts aus. Dadurch wird die neu erstellte Zeile zurückgegeben und im mehrzeiligen Bedienfeld angezeigt.

Der Entwickler könnte zusätzliche Aktionen ausführen, wenn die neue Zeile in die Tabelle „Cart“ eingefügt wird. Beispielsweise könnte der Entwickler eine CRAM-Regel registrieren, die eine Zeile in die Tabelle „Session“ 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
)

Auf diese Weise könnte der Entwickler ein Ereignis planen, das Einkaufswagen löscht, die zu abgelaufenen Sitzungen gehören.

Fehler

Endlosschleifen

Da das CreateRowOnEmptyTablePlugin das Filter-Ereignis rekursiv aufruft, besteht die Möglichkeit 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:

Endlosschleife beim Erstellen einer Zeile in einer leeren Tabelle erkannt.

Sicherheit

Wenn ein Browser einem Link folgt, stellt er eine HTTP-GET-Anfrage. In der Regel 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 das zweite Stellen derselben Anfrage dasselbe Ergebnis liefert.

Das Plugin CreateRowOnEmptyTablePlugin ist idempotent: Durch Aktualisieren des Browserfensters wird keine zweite Zeile erstellt. Das Plugin CreateRowOnEmptyTablePlugin ist jedoch nicht sicher: Das Plugin 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. das Registrieren einer Löschregel, die ausgeführt wird, wenn die Seite geladen wird. Entwickler sollten auch das Registrieren von Regeln oder Plugins vermeiden, die mit externen Systemen interagieren, wie z. B. beim Senden einer Email oder Ausführen einer Zahlung.