Nahezu jede Programmier- und Script-Sprache verfügt über verschiedene Möglichkeiten um bedingte Aneisungen in den Programmcode einfließen zu lassen. Auch VIO.Matrix unterstützt dieses Feature - jedoch etwas anders als man es von anderen Sprachen kennt.
Zunächst folgender Hinweis: es geht um die if-Bedingung. Manchmal werden diese auch if-Anweisungen genannt, was auch noch richtig ist. Eine if-Schleife ist jedoch fachlich falsch und beschreibt etwas was es nicht gibt. Hier geht es also um die if-Bedingung #IF.
Eine if-Bedingung ist in VIO.Matrix folgendermaßen aufgebaut:
#IF( [Bedingung] )[Wahr]#ELSE[Falsch]#ENDIF
Der Platzhalter [Bedingung] ist dabei meist ein Vergleich. Das kann ein Zahlenvergleich, aber auch ein Textvergleich sein. Möglich sind auch String-Vergleich, z.B. ob ein Satz ein bestimmtes Wort enthält.
Der Platzhalter [Wahr] steht für die Quellcodes die verwendet werden, wenn die Bedingung zutrifft. Bei [Falsch] wird genau das Gegenteil abgearbeitet.
Ein ganz einfaches Beispiel ist folgendes:
#IF ( 1 > 0 )
Ja, 1 ist größer 0
#ELSE
Aus welchem Universum kommst Du?
#ENDIF
Diese Bedingung wird in der Ausgabe "Ja, 1 ist größer 0" ergeben.
In VIO.Matrix definierte Variablen können an jeder Stelle der if-Bedingung verwendet werden. Beispiel:
#SET zahl = 1 #ENDSET
#IF ( #INSERT_SP_VAR_zahl! > 0 )
Ja, 1 ist größer 0
#ELSE
Aus welchem Universum kommst Du?
#ENDIF
Der Wert der vorher definierten Variable zahl wird mit der 0 verglichen. In der Ausgabe wird man folglich wieder "Ja, 1 ist größer 0" sehen.
Neben dem oben stehenden > sind auch folgende Operatoren in Bezug auf Zahlen möglich:
Operator | Beispiel | Bedeutung |
---|---|---|
> | #IF ( #INSERT_SP_VAR_zahl! > 0 )wahr#ELSEfalsch#ENDIF | größer als |
< | #IF ( #INSERT_SP_VAR_zahl! < 0 )wahr#ELSEfalsch#ENDIF | kleiner als |
== | #IF ( #INSERT_SP_VAR_zahl! == 0 )wahr#ELSEfalsch#ENDIF | gleich |
!= | #IF ( #INSERT_SP_VAR_zahl! != 0 )wahr#ELSEfalsch#ENDIF | ungleich |
<> | #IF ( #INSERT_SP_VAR_zahl! != 0 )wahr#ELSEfalsch#ENDIF | ungleich |
Operator | Beispiel | Bedeutung |
---|---|---|
!= | #IF ( "#INSERT_SP_VAR_wort!" != "hallo" )wahr#ELSEfalsch#ENDIF | Die Wörter sind ungleich. |
== | #IF ( "#INSERT_SP_VAR_wort!" == "hallo" )wahr#ELSEfalsch#ENDIF | Die Wörter sind gleich. |
IN | #IF ( "#INSERT_SP_VAR_wort!" IN "hallo welt" )wahr#ELSEfalsch#ENDIF | Das Wort ist in "hallo welt" enthalten. |
NOT IN | #IF ( "#INSERT_SP_VAR_wort!" NOT IN "hallo welt" )wahr#ELSEfalsch#ENDIF | Das Wort ist nicht in "hallo welt" enthalten. |
keiner | #IF ( "#INSERT_SP_VAR_wort!" )wahr#ELSEfalsch#ENDIF | Die Variable enthält etwas. |
Was in VIO.Matrix generell nicht möglich ist sind Verknüpfte Bedingungen wie z.B. diese hier:
#IF ( #INSERT_SP_VAR_wert! > 0 AND #INSERT_SP_VAR_wert2! > 0 )
Alternativ sollte man mit Verschachtelungen arbeiten, also:
#IF ( #INSERT_SP_VAR_wert! > 0 )
#IF( #INSERT_SP_VAR_wert2! > 0 )
#ELSE#ENDIF
#ELSE#ENDIF
Folgende komplexere Beispiele sollen zum besseren Verständnis dienen:
Hier wird geprüft, ob die Länge des Strings in der Variable "wort" größer 0 ist:
#IF ( #INSERT_SP_VAR_wort*length! > 0 )wahr#ELSEfalsch#ENDIF
Hier wird geprüft, ob ein Ordner innerhalb des aktuellen Ordnerpfades enthalten ist:
#IF ( ",#INSERT_OR_ID," IN "#INSERT_OR_#{#INSERT_SP_VAR_or!}_HIERARCHYIDS" )Ja, ist enthalten.#ELSENein, ist nicht enthalten.#ENDIF
Hier wird geprüft, ob in einem Elemente-Formularfeld des Content-Managers etwas eingegeben wurde:
#IF ( #INSERT_EL_VAR_wort*length! > 0 )wahr#ELSEfalsch#ENDIF
Um zu wissen wie man die Bedingung richtig formuliert, sollte man wissen was in der Variablen die man vergleichen will tatsächlich enthalten ist und enthalten sein kann. In den meisten Fällen kann man mit der Sternchen-Variablen length prüfen, ob der Wert der Variablen überhaupt etwas enthält.
Aus dem gleichen Grund sollte man auch wissen wie man den Vergleich korrekt formuliert. Wenn man bspw. die Ausgabe einer multiselect.dll prüfen möchte, dann sollte man es nicht so machen:
#IF ( "#INSERT_SP_PRINT_{{codec:text}#INSERT_OR_VAR_var!}!" )wahr#ELSEfalsch#ENDIF
Warum falsch? In der Standardausgabe einer multiselect.dll, wie man sie hier sieht, stehen auch Beginn- und Ende-Zeichen in der Ausgabe. Somit ist die Bedingung immer wahr. Richtig wäre:
#IF ( "#INSERT_SP_PRINT_{{codec:text}#INSERT_OR_VAR_var*id!}!" )wahr#ELSEfalsch#ENDIF
Dabei wird nun die XML-Ausgabe mit ID-Listen geprüft. Der Codec text entfernt die XML-Struktur und lässt nur IDs übrig. Wenn kein Wert ausgewählt ist, ergibt diese Bedingung auch "falsch", ansonsten "wahr".
Man sollte außerdem vermeiden zuviele und vor allem zu tief verschachtelte Bedingungen in ein Layout zu schreiben. Das wird mit der Zeit unübersichtlich und führt zu Fehlern in der Eingabe des VIO.Matrix-Codes.