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:
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 ]