Anhang


... [ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ]

DTML

var-Tag


html_quote
lässt die eingesetzten Werte als HTML-Zitate erscheinen (<, > und & werden nicht dargestellt)
missing
erlaubt die Angabe eines Standardwertes, der benutzt wird, wenn Zope die Variable nicht finden kann, z.B: <dtml-var bananen missing="Bananen haben wir nicht">
fmt
- erlaubt die Beeinflussung des Formates der var-Tag-Ausgabe.
- Nutzen: Formatierung von Währungs-Werten. Beispiel: Anlegen einer float-Eigenschaft namens erwachsenen_preis im Root-Ordner (Kosten eines Zoobesuches für einen  
  Erwachsenen) und Zuweisung des Wertes 2.2.

  Ausgabe dieser Kosten in einem DTML-Dokument oder -Skript:  Eine Erwachsenen-Karte: <dtml-var erwachsenen_preis fmt=dollars-and-cents>
=> Damit wird ausgegeben: "$2.20". Genauere Werte werden kaufmännisch auf zwei Nachkommastellen gerundet

Syntax von var-Tag-Ausdrücken

Als Singleton kann das var-Tag durch eine verkürzte Syntax ähnlich einem HTML-Ausdruck dargestellt werden: &dtml-cockatiel; - das entspricht: <dtml-var name="cockatiel" html_quote>

Der Hauptgrund, Ausdruckssyntax zu verwenden, ist das Vermeiden von DTML-Tags innerhalb von HTML-Tags:
Anstatt z.B. zu schreiben:                    <input type="text" value="<dtml-var name="defaultValue">">
ist die Ausdruckssyntax besser lesbar: <input type="text" value="&dtml-defaultValue;">

Allerdings ist die var-Tag-Ausdruckssyntax sehr begrenzt. Python-Ausdrücke können nicht zusammen mit einigen Tag-Attributen verwendet werden. 

Python-Ausdrücke

Mit Hilfe
von Tag-Attributen können auch Python-Ausdrücke benutzt werden. Zum Beispiel kann ein Ausdruck benutzt werden, um ein Skript "getNilpferd"  mit exakten Argumenten aufzurufen: <dtml-var expr="getNilpferd('mit einem großen Netz')">

Oder es können auch einfach Bedingungen getestet werden:   <dtml-if expr="foo < bar">
                                                                                              Foo ist weniger als bar.
                                                                                          </dtml-if>


Der Umgang mit Python-Ausdrücken kann haarig sein. Ein verbreiteter Fehler ist die Verwechslung von Ausdrücken mit grundsätzlicher Tag-Syntax. Zum Beispiel können <dtml-var objectValues> und <dtml-var expr="objectValues"> zwei völlig verschiedene Ergebnisse liefern. Im ersten Beispiel wird die Variable automatisch interpretiert. Ist die Variable ein Skript, wird es mit den entsprechenden Argumenten aufgerufen. Im zweiten Beispiel wird nur versucht, das Skript einzufügen, mit einem Ergebnis-String wie <Python Method object at 8681298>

 
Um ein Skript über einen Ausdruck aufzurufen, muss die Standard-Aufruf-Syntax von Python mit Klammern benutzt werden: <dtml-var expr="objectValues()">
Beim Benutzen von Python-Ausdrücken sollte Klarheit darüber bestehen, was für eine Art Variable eingesetzt wird und die passende Python-Syntax benutzt werden, damit die Variable entsprechend interpretiert werden kann. Der Teil "expr=" in einem Ausdrucks-Tag für eine Variable kann, sollte aber nicht weggelassen werden, weil dabei folgendes verwechselt werden könnte:

      <dtml-var aName>     mit:
      <dtml-var "aName">

mit völlig verschiedenen Resultaten. Diese "Abkürzungen" wurden vor langer Zeit in DTML eingebaut, und diese subtilen Syntaxunterschiede können zu Schwierigkeiten führen.
Ausführlicheres zum Thema Python-Skripting findet sich im Abschnitt "Python/Perl" und zu Pythons Syntax im Python-Tutorial unter http://www.Python.org.


in-Tag

Beispiel: Das folgende Beispiel iteriert über die Inhalte eines Ordners und zeigt in einer Tabelle einen Link zu jedem gefundenen "File"-Objekt an, wobei jede zweite Tabellenzeile in einer anderen Farbe dargestellt wird (durch je ein tr-Tag mit entweder grauem oder ohne Hintergrund):


<dtml-var standard_html_header>
      <table>
        <dtml-in expr="objectValues('File')">
          <dtml-if sequence-even>
            <tr bgcolor="grey">
          <dtml-else>
            <tr>
          </dtml-if>
            <td><a href="&dtml-absolute_url;"><dtml-var title_or_id></a></td>
          </tr>
        </dtml-in>
      </table>
<dtml-var standard_html_footer>

 
Dieser Code zeigt die folgende Datei-Liste:


Dateiliste    
Abb. Dateilistung mit wechselnden Zeilenfarben

Hier wird ein if-Tag benutzt, um gegen eine spezielle Variable zu prüfen, die sequence-even heißt. Wenn die aktuelle Iterationszahl ungerade ist, gilt sie als unwahr.
Innerhalb des in-Blocks wird über ein Attribut das Zope-API-Skript "objectValues" aufgerufen (<dtml-in expr="objectValues('File')">), welches eine Sequenz von Objekten im aktuellen Ordner zurückgibt, die bestimmte Kriterien erfüllen. In diesem Fall müssen die Objekte Dateien (Files) sein.
Anstelle des Skriptaufrufes könnte z.B. auch ein SQL-Skript aufgerufen werden: <dtml-in SQL-Query>, wobei nicht spezifiziert werden muss, dass eine Datenbank abgefragt wird und auch nicht, wo sich die Argumente zur Datenbankabfrage befinden. Es muss lediglich angegeben werden, welches Objekt aufgerufen werden soll, und dieses wird selbst die Weise des Aufrufs und die zu übergebenden Argumente herausfinden. Wird das objectValues-Skript durch ein anderes Objekt wie etwa ein SQL-Skript, ein ZCatalog oder ein anderes DTML-Skript ausgetauscht, müssen die Formatierungsvorgaben nicht geändert werden. Diese Fähigkeit der Datenformatierung erlaubt die Änderung von Geschäftslogik ohne Änderung der Präsentation.

Es gibt viele spezielle Variablen, die ein in-Tag definieren kann. Zu den gebräuchlichsten gehören: sequence-item, sequence-index, sequence-number, sequence-start und -end.



if-Tag

Beispiels-Bedingung: objectValues: Wahr, wenn die Variable objectValues existiert und wahr ist, d.h. wenn nach Auffinden und Auswertens objectValues nicht 0, Nichts, eine leere Sequenz oder ein leerer String ist. Genau wie beim var-Tag kann hier Namens- und Ausdrucks-Syntax verwendet werden. Hier sind einige Bedingungen als DTML-Ausdrücke dargestellt:

expr="1"
Immer wahr
expr="Nashorn"
Wahr, wenn die Variable "Nashorn" wahr ist
expr="x < 5"
Wahr, wenn x kleiner als 5 ist
expr="objectValues('File')"
Wahr, wenn der Aufruf des Skripts objectValues mit dem Argument File einen wahren Wert zurückgibt

Das if-Tag ist ein Block-Tag, und der Block innerhalb des if-Tags wird ausgeführt, wenn die Bedingung wahr ist. if-Tags können beliebig tief verschachtelt werden.


... [ Seminar "Java und Werkzeuge für das Web" ] ... [ Inhaltsverzeichnis ] ... [ zurück ]