Bedingungen / Dynamisierung (OGNL)

openforms bietet die Möglichkeit Inhalte und Dokumente dynamisch anhand von Bedingungen zu steuern. Dazu wird die "Object-Graph Navigation Language" kurz OGNL verwendet. 

An unterschiedlichen Stellen in der Oberfläche von openforms befinden sich Felder mit der Bezeichnung "Sichtbar Bedingung" bzw. "Bedingung".

       

Diese Felder können verwendet werden, um eine Formular zu dynamisieren bzw. eine Aktion nur bei Erfüllen einer Bedingung auszuführen.

Z.B.:

  • Dynamisches Einblenden von Fragegruppen (können jede Art von Eingabefeldern und Inhalten enthalten)

    Beispiel: Es gibt eine Auswahl durch einen Radiobutton. Option1: Ich möchte einen Termin vereinbaren, Option2: Ich möchte eine schriftliche Anfrage formulieren. Bei Auswahl von Option 1 öffnen sich Felder zur Auswahl eines Termins also ein Datepicker und zwei Felder zur Angabe einer Zeit von-bis. Bei Auswahl von Option2 werden zwei Textfelder eingeblendet für die Eingabe des Betreffs und für die Eingabe der Nachricht.

  • Bedingung/Regelung für manuell angelegte Fehlermeldungen

    Beispiel: Es gibt auf dem Formular ein Feld für die Angabe der Emailadresse und ein Feld für die Angabe der Telefonnummer. Der Kunde muss eines der beiden Felder ausfüllen um das Formular abschließen zu können.

  • Steuerung von Folgeseiten
    BeispielEine Schnittstelle entscheidet ob der Kunde ein Finanzprodukt erwerben darf. Je nach Antwort der Schnittstelle werden unterschiedliche Folgeseiten im Prozess angezeigt.

  • Dynamische Platzhalter in Texten/Emails, etc.
    Beispiel: Es wird nach Abschluss des Formulars eine Email an den Kunden versendet. Die Email soll personalisiert sein. Der Kunde wird mit dem von ihm im Formular angegebenen Namen angesporchen

  • Steuerung von E-Mails
    Beispiel: Es gibt eine Kundenmail die nach Produktabschluss an den Kunden versendet wird. Inhaltlich unterscheidet sich die Mail wenn sie an einen Bestandskunden bzw. an einen Neukunden geschickt wird. 

 

Beispiele zur Erläuterung von typischen Use Cases:

Dynamisches Einblenden von Fragegruppen (können jede Art von Eingabefeldern und Inhalten enthalten) 
Es soll eine Erklärung (Text) angezeigt werden, die zur Option passt die der Benutzer auswählt:

Es gibt eine Optionenfrage, die den Benutzer danach fragt ob Rot oder Blau lieber mag. Abhängig von der Auswahl soll ein Text eingeblendet werden. Es wurde zunächst eine Optionenfrage mit zwei Optionen und weiterhin zwei Textblöcke angelegt. Die Optionenfrage hat die Absatz-Id "farbe" erhlaten. Die beiden Optionen einmal "blau" und einmal "rot" als ID erhalten. Der jeweilige Textblock wirdmit der "Sichtbar Bedingung": OGNL: value('farbe') == "blau"

Konfiguration

Ansicht

 

Bedingung/Regelung für manuell angelegte Fehlermeldungen.

Ein Formular hat zwei mögliche Angabenfelder (E-Mail und/oder Telefon) für den Kontakt zum Kunden. Eines der beiden Felder muss der Kunde ausfüllen um auf die nächste Seite des Formulars zu gelangen.

Es werden zwei Textfelder (E-Mail und Telefon) angelegt und ein Textblock der als Fehlermeldung konfiguriert wird.

Der verwendetet OGNL Befehl als Sichtbarkeitsbedingung für die Fehlermeldung lautet:

OGNL: !isset('telefon') && !isset('email') 

dabei überprüft isset ob ein Wert gesetzt wurde. Das Ausrufezeichen vor dem isset negiert den Befehl. Es wird also geprüft, dass ein wert nicht gesetzt wurde. Da die Fehlermeldung (Achtung Achtung!!!!) angezeigt werden soll, wenn beide Felder leer sind, so werden die beiden Prüfungen mit logischem UND verknüpft (&&).

Konfiguration

Ansicht

 

oder

 

 

Steuerung von Folgeseiten

Es gibt UseCases in denen dem User aufgrund von Schnittstellen-Resultaten oder auch eigenen Angaben unterschiedliche Folgeseiten angezeigt werden sollen. Prinzipiell lassen sich mit der Funktion "Folgeseite" einzelnen Formularseiten überspringen, abhängig von Bedingungen, die mit OGNL Befehlen formuliert werden.

In unserem Beispiel wird auf Seite 1 des Formulars eine Entscheidung getroffen (rot oder blau), abhängig davon wird auf eine Folgeseite gesprungen. Es gibt also zwei Varianten in der das Formular ausgespielt werden kann:

  1. Seite 1, Seite 2, Abschlussseite
  • Seite 1, Seite 3, Abschlussseite

Ohne die Angabe einer Folgeseite arbeitet Openforms die Reihenfolge der angelegten Seiten ab. Dies bedeutet für Variante 1 wird eine Folgeseite für den Schritt von Seite 2 auf die Abschlussseite angelegt. Diese Folgeseite kann ohne Bedingung angelegt werden, da die Anzeige der Abschlussseite in jedem Fall erfolgen soll. In der Variante 2 muss eine bedingte Folgeseite von Seite 1 auf Seite 3 angelegt werden. Von Seite 3 auf die Abschlussseite wird keine Folgeseite benötigt, da diese in der Reihenfolge der Struktur automatisch folgt.

 

Eine Folgeseite kann oberhalb der Inhalte auf jeder Seite (außer Abschlussseite) angelegt werden:

Bereits angelegte Folgeseiten werden in dem Bereich aufgelistet und können über das Stiftsymbol bearbeitet werden. Das Mülleimer-Symbol entfernt die ausgewählte Folgeseite. Die Pfeile positionieren die Abarbeitung der Folgeseiten bzw. deren Bedingungsprüfung.

Bei Klick auf "Verweis setzen" öffnet sich ein Fenster. Hier kann auf der linken Seite die Folgeseite annavigiert werden. Auf der rechten Seiten kann unter "Weitere Eigenschaften" im Feld "Bedingung" der OGNL Befehl angeben werden.

 Seite 1  

   

                                                        

Seite 2                               oder                                                                    Seite 3

                                                             

Abschlussseite     

Dynamische Platzhalter in Texten/Emails, etc.

In allen inhaltlichen Elementen die ein Feld zur Eingabe von einem Text haben, ist es möglich Platzhalter zu setzen, die dann dynamisch während der Laufzeit die entsprechenden Daten in den Text einsetzen.

Platzhalter werden im laufenden Text mit %% begonnen und mit %% beendet. Zwischen den Prozentzeichen kann ein OGNL Befehl stehen der Textbausteine in den Fließtext einsetzt.

Neben normalen Fließtexten kann auch beispielsweise ein Emailempfänger durch einen Platzhalter ersetzt werden:

 

Das Wort "email" gibt dabei die Absatz-Id des Emailfeldes auf der Antragsstrecke wieder. Somit kann automatisch eine Email an die im Formular angegeben Email versendet werden, z.B. als Auftragsbestätigung an den Kunden.

Im Beispiel unten wurde eine personalisierte Zusammenfassungsseite in der Antragsstrecke eingebaut. Der Befehl "%%OGNL: value('anrede') == "Herr" ? "Sehr geehrter Herr " : "Sehr geehrte Frau " + value('vorname') + " " + value('nachname')%% folgende Angaben haben Sie im Formular angegeben:" 

Anrede: Es wird geprüft ob Herr oder Frau angeklickt wurde. Entsprechend gibt der Befehl "Sehr geehrtere Frau" bzw. "Sehr geehrter Herr" aus.

Vor und Nachnamen: Es werden anhand der Absatz-Id die in den Feldern eingetragenen Werte eingesetzt

 

Wichtigste OGNL Befehle:

 

Befehl 
!Jeder OGNL Befehl kann negiert werden d.h. genau das Gegenteil der formulierten Bedingung muss erfüllt werden. Z.B: OGNL: !isset('Absatz-Id') > solange der Wert in Absatz-ID nicht gesetzt wurde, ist die Bedingung erfüllt
OGNL: value('Absatz-Id')

Gibt den Wert der Absatz-Id aus

OGNL: formattedValue('Absatz-Id')Gibt den "sichtbaren" Inhalt aus. Damit ist gemeint das beispielsweise bei einem Länder-Auswahlfeld in der Regel eine Liste mit Länderkürzel = Länderbezeichnung hinterlegt ist. In die ID wird dann das Kürzel geschrieben. Wenn aber die Bezeichnung ausgegeben werden soll wird dieser Befehl verwendet
OGNL: isset('Absatz-Id')Prüft ob ein Wert gesetzt wurde
OGNL: valueForMappingAndKey('Kontext', 'Anker')Gibt den Wert von Anker aus. Der Wert wird aus dem Dokument (im Apple plist Format) mit dem 'Kontext' gezogen

OGNL: otDiffYearsBetweenDates(Ankerdatum2,AnkerDatum1)

Gibt die Jahresdifferenz (mit einer Kommastelle, sprich Monat) aus. Der Befehl kann mit einem Vergleich beliebig erweitert werden z.B.<= oder ==
OGNL: value('anrede') == "Herr" ? "Sehr geehrter Herr " : "Sehr geehrte Frau " + value('vorname') + " " + value('nachname')Prüft ob im Feld Anrede "Herr" ausgewählt wurde und gibt dann Sehr geehrter Herr Vorname Nachname aus. Wurde nicht "Herr" ausgewählt wird Sehr geehrte Frau Vorname Nachname ausgegeben
OGNL: datenuebertragen.response.checkStatus.statusCode == "3"Es wird geprüft ob in der Antwort einer Schnittstelle für den Key "statusCode" im Dictionary der Wert 3 zurückgegeben wurde
OGNL:formattedValue('geburtsDatum', '%Y%m%d')Gibt den angegeben Wert in der Absatz-ID "geburtsDatum" im gewünschten Format aus
OGNL:isset('aktTitel')?"Titel : "+value('aktTitel'): ""Wenn ein Wert in "aktTitel gesetzt wurde wird dieser in der Form Titel: Dipl. Ing.. Wurde kein wert gesetzt so wird nichts ausgegeben

OGNL Befehle verknüpfen

  • && wenn beide Bdingungen erfüllt sein müssen
  • || wenn nur eine der beiden Bedingungen erfüllt sein müssen
  • <OGNL Befehl> ? <OGNL Befehl oder "Text"> :  <OGNL Befehl oder "Text">  Ergibt eine "Wenn, dann" Beziehung