Tool-Funktionen in WebTML
Es gibt typische Operationen in WebTML die immer wieder benötigt werden: Testen ob Items leer oder gefüllt sind, ob Variablen definiert sind, ob sie "true" oder "false" sind. WebTML bietet für diese Operationen Tool-Funktionen an, die mehrere Vorteile gegenüber einer manuellen Programmierung bieten, und deswegen bevorzugt verwendet werden sollten:
- Sie sind "sprechender"
- Sie fassen mehrteilige Operationen komfortabel zusammen
- Sie funktionieren auf allen WGA Content Stores und unter allen WGA-Kompatibilitätseinstellungen (falls z.B..ein Design das Verhalten von WGA 3.3 benötigt)
- Sie besitzen teilweise gewisse optimierte Verhaltensweisen
Leere und gefüllte Items
In jedem WGA Design wird wohl an irgendeiner Stelle geprüft ob ein Item "leer" ist. Meist findet man Konstrukte wie die folgenden:<tml:case condition="myItem == null">
...oder...
<tml:case condition="myItem == '' ">
Aus diesen Varianten wird schon ein entscheidendes Problem dieses Ansatzes deutlich: "Leer" ist nicht immer gleich "leer". Je nach Füllmethode dieses Items oder nach Einstellung der WGA-Kompatibilität liefert ein "leeres" Item null, einen leeren String oder eine leere Liste. Dies alles manuell abzuprüfen ist natürlich nicht erstrebenswert, weswegen WebTML eine "one size fits all"-Methode anbietet:
<tml:case isempty="myItem">
Das Attribut "isempty" prüft das Item, dessen Namen übergeben wurde, auf alle oben angesprochenen Varianten von "leer".Darüber hinaus wirkt es im Code natürlich auch sehr "sprechend", d.h. der Sinn der Operation ist direkt ersichtlich.
Anstelle des Attributes kann in TMLScript auch eine gleichnamige TMLContext-Methode verwendet werden:
Der Name des zu prüfenden Items wird hier als String übergeben. Will man kein Item oder eine WebTML-Variable abprüfen so kann stattdessen die Methode "isEmptyValue()" benutzt werden um beliebige TMLScript-Objekte zu prüfen, deren Wert per Parameter übergeben wird:
Als Umkehrschluss zu "isEmpty" existiert auch ein Attribut/eine Methode "isfilled" die nur dann wahr ist, wenn das entsprechende Item "nicht leer" ist. Dies eignet sich besonders für Ausgabeblöcke die nur dann sichtbar sein sollen wenn ein entsprechendes Item gefüllt ist.
Die Funktion "isfilled" besitzt eine Spezialfunktion die nicht sofort offensichtlich wird. Mal angenommen das oben demonstrierte Kommentar-Item soll über den WGA Content Manager gefüllt werden und erhält deswegen ein Attribut "editor":
In dieser - sicherlich wünschenswerten - Kombination von "isfilled" und "editor" steckt ein simples logisches Problem. Bei neuen Dokumenten wird das Feld "comment" niemals direkt gefüllt sein und deswegen der Block auch nie angezeigt werden. Dies verhindert jedoch gleichzeitig auch die Erfassung des Kommentar-Items da hierüber natürlich auch der Editor niemals verfügbar sein wird.
Um diese Anwendung zu ermöglichen ist die Funktion "isfilled" immer dann automatisch wahr wenn die Seite im WGA Content Manager oder Browser Interface dargestellt wird.
<tml:script>
if (isEmpty('myItem')) {
...
}
</tml:script>
if (isEmpty('myItem')) {
...
}
</tml:script>
Der Name des zu prüfenden Items wird hier als String übergeben. Will man kein Item oder eine WebTML-Variable abprüfen so kann stattdessen die Methode "isEmptyValue()" benutzt werden um beliebige TMLScript-Objekte zu prüfen, deren Wert per Parameter übergeben wird:
<tml:script>
var myObj = "";
if (isEmptyValue(myObj)) {
...
}
</tml:script>
var myObj = "";
if (isEmptyValue(myObj)) {
...
}
</tml:script>
Als Umkehrschluss zu "isEmpty" existiert auch ein Attribut/eine Methode "isfilled" die nur dann wahr ist, wenn das entsprechende Item "nicht leer" ist. Dies eignet sich besonders für Ausgabeblöcke die nur dann sichtbar sein sollen wenn ein entsprechendes Item gefüllt ist.
<tml:case isfilled="comment">
Kommentar: <tml:item name="comment"/>
</tml:case>
<tml:script>
if (isFilled('comment')) {
...
}
</tml:script>
Kommentar: <tml:item name="comment"/>
</tml:case>
<tml:script>
if (isFilled('comment')) {
...
}
</tml:script>
Die Funktion "isfilled" besitzt eine Spezialfunktion die nicht sofort offensichtlich wird. Mal angenommen das oben demonstrierte Kommentar-Item soll über den WGA Content Manager gefüllt werden und erhält deswegen ein Attribut "editor":
<tml:case isfilled="comment">
Kommentar: <tml:item name="comment" editor="rtf"/>
</tml:case>
Kommentar: <tml:item name="comment" editor="rtf"/>
</tml:case>
In dieser - sicherlich wünschenswerten - Kombination von "isfilled" und "editor" steckt ein simples logisches Problem. Bei neuen Dokumenten wird das Feld "comment" niemals direkt gefüllt sein und deswegen der Block auch nie angezeigt werden. Dies verhindert jedoch gleichzeitig auch die Erfassung des Kommentar-Items da hierüber natürlich auch der Editor niemals verfügbar sein wird.
Um diese Anwendung zu ermöglichen ist die Funktion "isfilled" immer dann automatisch wahr wenn die Seite im WGA Content Manager oder Browser Interface dargestellt wird.
Weiter zur nächsten Seite ...