WGA 2.1 Einführung in WebTML-Aktionen

Seit der Version 2.1 unterstützt WebGate Anywhere sogenannte "TML-Actions".

TML-Actions sind dafür entwickelt worden, um interaktive Komponenten in eine WebSite oder ein Unternehmensportal einzubinden.

Mit Hilfe von TML-Action können Action-Links erzeugt werden. Beim Klick auf einen solchen Link wird ein im Design hinterlegtes TMLScript ausgeführt. Entscheidend ist dabei, daß das Script auf dem Server ausgeführt wird und dies, bevor das HTML (bzw. das Ausgabeformat) der Seite erzeugt wird.

TML-Actions werden in TMLScript programmiert.

Um eine Link-Action in ein Design einzubinden, wird der <tml:url> Tag mit dem zusätzlichen Attribut type="action" verwendet.
Es gibt zwei Möglichkeiten, die auszuführende TMLScript-Action anzugeben:

TMLScript-Action innerhalb des <tml:url>-Tags.
Die einfachste Möglichkeit zur Definition von TMLScript-Actions ist die Angabe des Scripts innerhalb des Bodys des <tml:url>-Tags:

    <tml:url type="action">... TMLScript ...</tml:url>
Beispiel:
    <a href="<tml:url type="action">
      this.setSessionVar("test", "Hier wurde geklickt");
    </tml:url>">Hier klicken</a>
Das Beispiel setzt eine Session-Variable auf einen bestimmten Wert und läd die gleiche Seite erneut.
Auf dieser Seite kann nun die Variable abgefragt und entsprechend reagiert werden.
Ausführlicheres Beispiel:
    <h1>Beispiel</h1>
    <tml:if condition="this.details =='True'">
      <tml:then>
        Anzeige von irgendwelchen Details
      </tml:then>
      <tml:else>
        <a href="<tml:url type="action">
          this.setSessionVar("details", "True");
        </tml:url>">Details anzeigen</a>
      </tml:else>
    </tml:if>

TMLScript-Actions über separaten <tml:action>-Block aufrufen.
Bei umfangreichen Scripts oder bei Scripts, die an verschiedenen Stellen einer Seite aufgerufen werden sollen, kann das Script als separte Action-Definition angegeben werden. Dazu dient der Tag <tml:action>:
    <tml:action id="details">
      this.setSessionVar("details", "True");
    </tml:action>
    ...
    <a href="<tml:url type="action" action="details"/>">Hier klicken</a>
Der <tml:action>-Tag benötigt zwingend ein id-Attribut. Über dieses Attribit kann die Action im <tml:url>-Tag referenziert werden.

<tml:action> mit Parametern
Häufig ist es notwendig, der auszuführenden Action einen oder mehrere Parameter zu übergeben. Dazu können die Parameter über die Attribute param1 bis param4 innerhalb der <tml:url>-Tags übergeben werden (es können maximal 4 Parameter übergeben werden):
    <a href="<tml:url type="action" action="details" param1="teilweise"/>">Hier klicken</a>
    <a href="<tml:url type="action" action="details" param1="vollständig"/>">Hier klicken</a>
Zur Auswertung der Parameter kann innerhalb des Action-Scripts this.tmlparam1 bis this.tmlparam4 verwendet werden:
    <tml:action id="details">
      this.setSessionVar("details", this.tmlparam1);
    </tml:action>
    <tml:select>
      <tml:case condition=""this.details=='teilweise'"
        zeige Teile der Informationen an
      </tml:case>
      <tml:case condition=""this.details=='vollständig'"
        zeige alle Informationen an.
      </tml:case>
    </tml:select>

Verwendung von TML-Actions in Formularen
Besonders sinnvoll sind TML-Actions innerhalb von Formularen in Zusammenarbeit mit dem <tml:form>-Tag:
    <tml:form id="myform" source="profile">
      Name: <tml:input name="name"/><br>
      E-Mail: <tml:input name="mail"/><br>
      <a href="<tml:url type="action">this.tmlform.storeInProfile()</tml:url>">speichern</a>
    </tml:form>
Dieses Beispiel stellt die Möglichkeit zur Verfügung, Name und Mailadresse des augenblicklichen Users im Benutzerprofil zu speichern

Der "Context" innerhalb von TML-Actions
Es ist wichtig zu beachten, daß TML-Actions vor dem Rendern der Seite ausgeführt werden.
WGA sorgt dabei dafür, daß das Action-Script stets innerhalb des passenden Contexts ausgeführt wird. Das this-Objekt zeigt immer auf den Context, in dem die Action referenziert wurde, also der Context des <tml:url>-Tags der Action.
Ebenso stehen die Objekte this.portlet und this.profile innerhalb von TML-Actions zur Verfügung.

Zu Beachten ist aber, daß temporär gesetzte Content-Variablen in den Actions nicht bekannt sind. Folgendes Beispiel für zu einem Fehler:
    <tml:eval var="test">return "Dies ist eine temporäre Varibale"</tml:eval>
    <a href="<tml:url type="action">this.profile.setItem("test", this.test);this.profile.save()</tml:url>">speichern</a>
Während der Ausführung des Action (also bevor die Seite gerendert wird) hat this.test (noch) nicht den gewünschten Wert. Daher wird im Profil hier stets ein leerer Sting abgespeichert.
Zur Lösung der Aufgabe kann jedoch eine TML-Action mit Parametern verwendet werden:
    <tml:action id="save">
      this.profile.setItem("test", this.tmlparam1);
      this.profile.save()
    </tml:action>
    ...
    <tml:eval var="test">return "Dies ist eine temporäre Varibale"</tml:eval>
    <a href="<tml:url type="action" param1="{this.test}"/>">speichern</a>
Diesen Beispiel funktioniert, weil der Wert this.test während des Renderns der Seite korrekt gesetzt wird. Zur Ausführungszeit der TML-Action steht der Wert dann als Paremater zur Verfügung.