Deutsche Zope User Group
Gast 2 Benutzer online
DZUG-News

Zopebuch: Inhaltsverzeichnis

Kapitel 4: Dynamische Inhalte mit DTML

DTML (Document Template Markup Language) ist Zopes Tag-basierte Pr�sentations- und Scripting-Sprache. DTML dynamisiert das Generieren, Kontrollieren und Formatieren von Inhalten. DTML wird allgemein benutzt, um modulare und dynamische Web-Schnittstellen f�r ihre Applikationen herzustellen.

DTML ist eine serverbasierte Scripting-Sprache wie SSI, PHP, ASP und JSP. Das bedeutet, da� DTML-Kommandos durch Zope auf dem Server ausgef�hrt werden und das Ergebnis der Ausf�hrung zu ihrem Web-Browser gesendet wird. Demgegen�ber werden clientseitige Scripting-Sprachen wie JavaScript nicht vom Server ausgef�hrt, sondern zum Browser gesendet und auch dort ausgef�hrt.

Sie k�nnen DTML-Scripting mit zweien der Zope-Objekte verwenden, n�mlich DTML-Dokumente und DTML-Skripte.

F�r wen ist DTML?

DTML wurde f�r Leute geschaffen, die mit HTML und grundlegendem Web-Skripting vertraut sind, nicht f�r Anwendungsprogrammierer. Wenn Sie mit Zope programmieren wollen, sollten Sie DTML tats�chlich nicht benutzen. In Kapitel 9 (Fortgeschrittenes Zope-Skripting) besch�ftigen wir uns mit fortgeschrittenem Programmieren unter Python und Perl.

DTML ist f�r die Pr�sentation und sollte von Web-Designern verwaltet werden. Zope hilft Ihnen dabei, Pr�sentation und Logik getrennt zu halten, indem es verschiedene Objekte f�r Pr�sentation (DTML) und Logik (Python, Perl und andere) bereith�lt. Sie werden eine Menge Vorteile darin finden, ihre Pr�sentation in DTML zu halten und ihre Logik in anderen Typen von Zope-Objekten. Einige dieser Vorteile beinhalten:

  • Logik und Pr�sentation getrennt zu halten, macht es leicht, jede Komponente zu ver�ndern, ohne die andere zu st�ren.
  • Sie werden oft verschiedene Leute damit besch�ftigen, Logik und Pr�sentation zu warten. Mit der Benutzung verschiedener Objekte f�r diese Aufgaben machen Sie es leichter f�r Leute, zusammenzuarbeiten, ohne sich gegenseitig zu st�ren.
  • Es ist einfacher, bestehende Pr�sentationen und logische Komnponenten zu nutzen, wenn sie nicht vermischt sind.

Wozu taugt DTML?

DTML taugt zum Anlegen dynamischer Web-Schnittstellen. Es unterst�tzt die Wiederbenutzung von Inhalten und Layout, die Formatierung heterogener Daten und trennt Pr�sentation von Logik und Daten.

Sie k�nnen mit DTML beispielsweise vorgegebene Header und Footer mehrfach benutzen:

      

      

Hello world.

Diese Web-Seite mischt HTML und DTML miteinwander. DTML-Kommandos werden als Tags geschrieben, die mit dtml- beginnen. Dieses Beispiel baut eine Web-Seite auf, indem Standard-Header und -Footer in eine HTML-Seite eingef�gt werden. Die entstandene HTML-Seite k�nnte etwa so aussehen:

      
      

      

Hello world.


Last modified 2000/10/16 by AmosL

Wie Sie sehen k�nnen, definiert der Standard-Header eine wei�e Hintergrundfarbe und der Standard-Footer hat am Fu� eine Zeile eingef�gt, die mitteilt, wann und von wem die Seite das letzte Mal ge�ndert wurde.

Zus�tzlich zur Wiederverwendung von Inhalten l��t DTML Sie einfach und m�chtig alle Arten von Daten formatieren. Sie k�nnen DTML benutzen, um Skripte und Suchanfragen aufzurufen, Zope-Objekte zu untersuchen, Formulare zu verarbeiten und mehr.

Wenn Sie zum Beispiel eine Datenmbank mit einem SQL-Skript abfragen, gibt sie typischerweise eine Liste von Resultaten zur�ck. Hier sehen Sie, wie Sie DTML benutzen k�nnen, um jedes Ergebnis einer Datenbank-Abfrage zu formatieren:

      

Das Tag DTML in iteriert durch das Ergebnis der Datenbank-Abfrage und formatiert jedes Ergebnis. Angenommen, es werden vier Ergebnisse von der frogQuery zur�ckgegeben. Hier sehen Sie, wie das abschlie�ende HTML aussehen k�nnte:

      
  • Feuerbauchkr�te
  • Afrikanischer Klauenfrosch
  • Nabu-Schilffrosch
  • Chilenischer Vieraugenfrosch

Die Ergebnisse der Datenbankabfrage werden als Punktliste in HTML formatiert.

Beachten Sie: Sie m�ssen DTML nicht sagen, da� Sie eine Datenbank abfragen und auch nicht, wo es die Argumente findet, um die Datenbankabfrage aufzurufen. Sie sagen ihm nur, welches Objekt aufgrufen werden soll und es wird selbst herausfinden, auf welche Weise das Objekt aufgerufen werden und welche passenden Argumente �bergeben werden m�ssen. Wenn Sie die das frogQuery-SQL-Skript mit einer anderen Art von Objekt wie etwa ein andere Skript, einen ZCatalog oder sogar ein anderes DTML-Skript austauschen, werden Sie die Formatierungsvorgaben nicht �ndern m�ssen.

Diese F�higkeit, alle Arten von Daten zu formatieren, macht DTML zu einem m�chtigen Pr�sentationswerkzeug und l��t Sie ihre Gesch�ftslogik �ndern, ohne ihre Pr�sentation �ndern zu m�ssen.

Wann DTML nicht benutzt werden soll

DTML ist keine Allzweck-Programmiersprache. Zum Beispiel erlaubt es Ihnen nicht, sehr einfach Variablen anzulegen. Auch wenn es m�glich sein mag, komplexe Algorythmen in DTML zu implementieren, ist es doch sehr aufwendig und nicht empfehlenswert. Wenn Sie logische Programmierung implementieren wollen, benutzen Sie Python oder Perl (f�r mehr Informationen zu diesen Themen siehe Kapitel 9 (Fortgeschrittene Zope-Programmierung)).

Lassen Sie uns zum Beispiel annehmen, da� Sie eine einfache Web-Seite f�r Mathematik-Sch�ler geschrieben haben, und Sie auf dieser Seite eine einfache Berechnung illustrieren wollen. Sie w�rden das Programm, das diese Berechnung anstellt, nicht in DTML schreiben wollen. Es k�nnte in DTML gemacht werden, w�re aber schwer zu verstehen. DTML w�re perfekt zum Beschreiben der Seite, in die ebendiese Berechnung eingef�gt wird, aber es w�re schrecklich, die Berechnung in DTML auszuf�hren, dagegen w�re es schlicht und einfach in Python oder Perl.

Die Verarbeitung von Strings ist ein anderes Gebiet, wo DTML nicht die erste Wahl ist. Wenn Sie den Input eines Benutzers auf komplexe Weise manipulieren wollen, aber Funktionen nutzen, die Strings m,anipulieren, tun Sie das besser in Python oder Perl, die beide sehr viel bessere Sting-Verarbeitungsf�higkeiten haben als DTML.

DTML ist ein Werkzeug von vielen, die in Zope verf�gbar sind. Wenn Sie feststellen, da� Sie sich bei der Ausarbeitung eines komplexen DTML-Konstruktes am Kopf kratzen m�ssen, ist es wahrscheinlich, da� die Dinge besser laufen, wenn Sie ihr DTML-Skript auftrennen und inm eine Sammluung von DTML- und Python- oder Perl-Skripts umwandeln.

DTML-Tag-Syntax

Die Syntax von DTML ist der von HTML �hnlich. DTML ist eine Tag-basierte Markup-Sprache. In anderen Worten: DTML benutzt Tags, um seine Arbeit zu machen. Here ist ein kleiner Schnipsel DTML:

      

      

Hello World!

Dieser DTML-Code enth�lt zwei DTML-var-Tags und etwas HTML. Die h1-Tags sind HTML, nicht DTML. Typischerweise mischen Sie DTML mit anderen Markup-Sprachen wie HTML. DTML wird normalerweise benutzt, um HTML zu generieren, aber nichts hindert Sie, andere Text-Typen zu generieren. Wie Sie sp�ter sehen werden, k�nnen Sie DTML genausogut eMail-Nachrichten oder andere textliche Informationen generieren lassen.

DTML enth�lt zwei Arten von Tags, n�mlich singleton- und block-Tags. Singleton-Tags bestehen aus einem Tag, das von gr��er-als- (<) und kleiner-als-Symbolen (>) umschlossen werden. Das var-Tag ist ein Beispiel f�r ein Singleton-Tag:

      

Es ist nicht n�tig, das var-Tag zu schlie�en.

Block-Tags bestehen aus zwei Tags (eins �ffnet den Block und eins schlie�t den Block) und Inhalt zwischen ihnen:

      

        

      

Das �ffnungs-Tag beginnt den Block und das Schlu�-Tag beendet ihn. Das Schlu�-Tag hat denselben Namen wie das �ffnungs-Tag mit einem "Slash" am Anfang. Das ist dieselbe Konvention, die HTML und XML benutzen.

DTML-Tag-Attribute benutzen

Alle DTML-Tags haben Attribute. Ein Attribut stellt Informationen dar�ber zur Verf�gung, wie das Tag arbeiten soll. Manche Attribute sind optional. Das var-Tag setzt beispielsweise den Wert einer Variablen ein. Es hat ein optional fehlendes Attribut, das einen Vorgabewert f�r den Fall definiert, da� die Variable nicht gefunden werden kann:

      

Wenn die Variable Spannweite nicht gefunden werden kann, wird Spannweite unbekannt eingestzt.

Manche Attribute haben keine Werte. Zum Beispiel k�nnen Sie eine eingesetzte Variable mit dem upper-Attribut in Versalien konvertieren:

      

Beachten Sie, da� das upper-Attribut - anders als das missing-Attribut - keinen Wert braucht.

Verschiedene Tags haben verschiedene Attribute. Siehe auch Anhang A (DTML-Referenz) f�r mehr Informationen �ber die Syntax der verschiedenen DTML-Tags.

Variablen mit DTML einsetzen

Das Einsetzen von Variablen ist die grunds�tzlichste Aufgabe, die Sie mit DTML durchf�hren k�nnen. Sie haben schon gesehen, wie DTML mit dem var-Tag einen Header und einen Footer in eine Web-Seite einsetzt. Viele DTML-Tags setzen Variablen einund sie tun das alle auf �hnliche Weise. Lassen Sie uns genauer betrachten, wie Zope Variablen einsetzt.

Angenommen, Sie haben einen Ordner, dessen "id" Futtertaschen ist und der den "title" "Roberts Lustige Futtertaschen" hat. Legen Sie in dem Ordner ein DTML-Skript mit der "id" Preisliste an. Dann �ndern Sie den Inhalt des DTML-Skripts auf Folgendes:

      

      

Preisliste f�r

Hanftasche EUR 2.50

Seidentasche EUR 5.00

Sehen Sie sich nun das DTML-Skript an, indem Sie auf die Registerkarte View klicken. Sie sollten eine HTML-Seite sehen, deren Quelltext etwa wie dies aussieht:

      
      

      

Preisliste f�r Roberts Lustige Futtertaschen

Hanftasche EUR 2.50

Seidentasche EUR 5.00

GHrunds�tzlich ist das, was Sie erwarten w�rden. Zope f�gt einen Header, einen Footer und einen Titel in die Web-Seite ein. DTML holt die Werte f�r diese Variablen von einer Anzahl verschiedener Orte. Zuerst versucht das var-Tag eine Variable im aktuellen Objekt zu finden. Dann sieht es in den Beh�ltern des aktuellen Objekts nach. Dann schaut es in der Web-Anfrage nach (Formulare und Cookies). Wenn Zope eine Variable nicht finden kann, gibt es eine Ausnahme aus und h�lt die Ausf�hrung von DTML an.

Lassen Sie uns diesen DTML-code Schritt f�r Schritt folgen, um zu sehen, wo die Variablen gefuinden werden. Zuerst schaut Zope nach dem standard_html_header im aktuellen Objekt, dem DTML-Skript Preisliste. Als n�chstes sieht Zope im Beh�lter des aktuellen Objekts nach. Der Ordner Futtertaschen hat auch keine Skripte oder Eigenschaften oder Unter-Objekte mit diesem Namen. Als n�chstes untersucht Zope den Beh�lter des Ordners Futtertasche und so weiter, bis es zum Root-Ordner kommt. Der Root-Ordner hat ein Unter-Objekt namens standard_html_header. Das Header-Objekt ist ein DTML-Skript. Also ruft Zope das Header-Skript auf und f�gt die Ergebnisseein.

Als n�chstes sucht Zope nach der Variablen title. Zuerst sieht es im DTML-Skript Preisliste nach, die keinen Titel hat, also sucht Zope weiter, findet des Titel des Ordners Futtertasche und setzt ihn ein.

Schlie�lich sucht Zope nach der Variable standard_html_footer. Es mu� den ganzen Weg bis hinauf zum Root-Ordner nachsehen, genau wie bei der Suche nach dem standard_html_header.

Diese �bung mag ein wenig weitschweifig erscheinen, aber zu verstehen, wie Zope Variablen findet, ist sehr wichtig. Manche wichtigen Implikationen davon, wie Zope Variablen auffindet beziehen ein, wie Zope-Objekte Inhalte und Verhalten von ihren �bergeordneten Objekten �bernehmen und wie Inhalte, die an einem Ort definiert sind, von vielen Objekten wieder benutzt werden k�nnen.

Eingaben aus Formularen verarbeiten

Formularverarbeitung mit Zope ist einfach. DTML sucht nach Variablen, um sie an einer Anzahl von Orten abzulegen, einschlie�lich Informationen aus �bertragenen HTML-Formularen. Sie brauchen keinerlei spezielle Objekte, DTML-Dokumente und DTML-Skripte werden ausreichen.

Legen Sie zwei DTML-Dokumente an, eine mit der "id" infoForm, die andere mit der "id" infoAction. Bearbeiten Sie nun die Inhalte der Dokumente. Hier sind die Inhalte des Dokuments infoForm:

      

      

Bitte senden Sie mir Informationen �ber ihr Erdferkel-Adoptionsprogramm

Name:
eMail:

Sehen Sie sich dieses Dokument nun an. Es ist ein Web-Formular, das um Informationen bittet und an das Dokument infoAction sendet, wenn Sie das Formular abschicken.

Bearbeiten sie nun den Inhalt des Dokuments infoAction, damit es das Formular verarbeiten kann:

      

      

Vielen Dank, .

Wir haben ihre Anfrage nach Informationen erhalten und werden Ihnen eine eMail an schicken, in der unser Erdferkel-Adoptionsprogramm beschrieben wird, sobald es die abschlie�ende Regierungsgenehmigung erhalten hat.

Dieses Dokument zeigt eine Dankes-Nachticht an, die den Namens- und eMail-Informationen enthalten, die aus dem Web-Formular stammen.

Gehen Sie nun zur�ck zum infoForm-Dokument, sehen Sie es sich an, f�llen Sie das Formular aus und senden Sie es ab. Wenn alles klargeht, sollten Sie eine Dankes-Nachricht sehen, die ihrenn Namen und ihre eMail-Adresse enth�lt.

Das infoAction-Dokument hat die Formular-Informationen aus der Web-Anfrage gefunden, die gestellt wurde, als Sie den "Absenden"-Button in infoForm geklickt haben. Wie wir im letzten Abschnitt erw�hnten, sucht DTML an einer Reihe von Orten nach Variablen, von denen einer die Web-Anfrage ist, es gibt also nichts besonderes zu tun, um ihre Dokumente zur Verarbeitung von Web-Formularen zu bef�higen.

Lassen Sie uns ein Experiment machen. Was passiert, wenn Sie das infoAction-Dokument direkt ansehen, im Gegensatz dazu, es �ber das infoForm-Dokument zu bekommen? Klicken Sie auf das infoAction-Dokument und dann auf die Registerkarte "View", wie in Bild 4.1 gezeigt.

DTML-Fehler aus einer gescheiterten Variablen-Suche.

Bild 4.1 DTML-Fehler aus einer gescheiterten Variablen-Suche.

Zope konnte die Variable user_name nicht finden, weil sie nicht im aktuellen Objekt, seinen Beh�ltern oder der Web-Anfrage enthalten war. Das ist ein Error, den Sie gelegentlich sehen werden, wenn Sie Zope erlernen. Keine Angst, es hei�t nur, da� Sie versucht haben, eine Variable einzuf�gen, die Zope nicht finden konnte. In diesem Beispiel m�ssen Sie entweder eine Variable einsetzen, die von Zope gefunden werden kann oder - wie oben beschrieben - im var-Tag das missing-Attribut verwenden:

      

Vielen Dank,

Zu verstehen, wo Zope nach Variablen sucht, wird ihnen helfenProbleme solcher Art zu l�sen. In diesem Fall haben Sie ein Dokument angesehen, das eigentlich erst von einem HTML-Formular wie infoForm aufgerufen werden mu�, um die Variablen zur Verf�gung zu stellen, die in die Ausgabe eingef�gt werden sollen.

Dynamisch erworbener Inhalt

Zope sucht in den Beh�ltern des aktuellen Objekts nach DTML-Variablen, wenn es die Variable nicht im aktuellen Objekt finden kann. Dieses Verhalten erlaubt ihren Objekten, Inhalte und Verhaltensregeln zu finden und zu benutzen, die in den �bergeordneten Objekten definiert sind. Zope benutzt den Begriff des Erwerbens (acquisition), um sich auf diesen dynamischen Gebrauch von Inhalten und Verhaltensregeln zu beziehen.

W�hrend Sie nun sehen, wie die Site-Struktur zum dem Weg pa�t, auf dem Namen nachgeschlagen werden, k�nnen Sie beginnen zu verstehen, da� es sehr wichtig ist, wo Sie Objekte plazieren, nach denen Sie suchen.

Ein Beispiel f�r Erwerben, das Sie schon kennen, ist, wie Web-Seiten Standard-Header und -Footer benutzen. Um den Standard-Header zu erwerben, bitten Sie Zope nur, es mit dem var-Tag einzusetzen:

      

Es spielt keine Rolle, wo ihr DTML-Skript oder -Dokument liegt. Zope wird aufw�rts suchen, bis es de standard_html_header findet, der im Root-Ordner definiert ist.

Sie k�nnen die Art nutzen, wie Zope Variablen findet, um ihren Header f�r verschiedene Bereiche ihrer Site einzurichten. Legen Sie nur einen neuen standard_html_header in einem Ordner an und er wird den allgemeinen Header f�r diesen Ordner und alle darunter ersetzen.

Legen Sie einen Ordner im Root-Ordner mit der "id" Gr�n an. �ffnen Sie den Ordner Gr�n und legen Sie ein DTML-Dokument mit der "id" Willkommen an. Bearbeiten Sie das Willkommen-Dokument, bis es die folgenden Inhalte hat:

      

      

Willkommen

Sehen Sie sich das Willkommen-Dokument nun an. Es sollte wie eine einfache Web-Seite mit dem Wort Willkommen aussehen, wie in Bild 4.2.

Willkommen-Dokument.

Bild 4.2 Willkommen-Dokument.

Lassen Sie uns nun den Header f�r den Ordner Gr�n einrichten. Legen Sie ein DTML-Skript mit der "id" standard_html_header im Ordner Gr�n an. Dann bearbeiten Sie den Inhalt dieses Headers folgenderma�en:

      
      
        
      
      

Beachten Sie, da� dies keine komplette Web-Seite ist. Es ist nur ein HTML-Fragment, das als Header benutzt werden soll. Dieser Header benutzt CSS (Cascading Style Sheets), um einige �nderungen in Aussehen und Verhalten von Web-Seiten vorzunehmen.

Gehen Sie nun zur�ck zum Willkommen-Dokument und sehen Sie es sich - wie in Bild 4.3 gezeigt - noch einmal an.

Willkommen-Dokument mit eingerichtetem Header.

Bild 4.3 Willkommen-Dokument mit eingerichtetem Header.

Das Dokument sieht nun ganz anders aus. Das kommt daher, da� es nun den neuen Header benutzt, den wir dem Ordner Gr�n hinzugef�gt haben. Dieser Header wird von allen Web-Seiten im Ordner Gr�n und seinen Unterordnern benutzt werden.

Sie k�nnen diesen Proze� weiterf�hren, indem Sie im Ordner Gr�n einen weiteren Ordner und darin ein weiteres DTML-Skript standard_html_header anlegen. Nun werden Web-Seiten in dem Unterordner ihren lokalen Header benutzen, anstelle des Headers im Ordner Gr�n. Mit diesem Muster k�nnen Sie Aussehen und Verhalten ihrer Web-Site schnell �ndern. Wenn Sie sp�ter beschlie�en, da� ein Bereich der Site einen anderen Header braucht, legen Sie einfach einen an. Sie m�ssen keinerlei �nderungen im DTML von einer der Web-Seiten vornehmen; sie werden automatisch den n�chsten Header finden und benutzen.

Python-Ausdr�cke in DTML benutzen

Bis hierher haben wir einfache DTML-Tags betrachtet. Hier ist ein Beispiel:

      

Dies wird den Wert der Variable mit der Benennung getNilpferd einsetzen, was auch immer das sein mag. DTML wird sich automatisch um die Details wie Finden der Variable und ihren Aufruf k�mmern. Wir nennen diese grundlegende Tag-Syntax Namens-Syntax, im Unterschied zu Ausdrucks-Syntax.

DTML-Ausdr�cke erlauben Ihnen, genauer damit zu sein, wie Variablen gefunden und aufgerufen werden. Ausdr�cke sind Tag-Attribute, die Code-St�ckchen in der Python-Sprache enthalten. Zum Beispiel k�nnen wir - anstatt DTML getNilpferd finden und aufrufen zu lassen - auch einen Ausdruck benutzen, um exakte Argumente zu �bergeben:

      

Wir haben hier einen Python-Ausdruck benutzt, um das getNilpferd-Skript explizit mit einem String-Argument aufzurufen: mit einem grossen Netz. Um mehr �ber Pythons Syntax herauszufinden, sehen Sie sich das Python Tutorial auf der Website der Python.org an. Viele DTML-Tags k�nnen Ausdrucks-Attribute benutzen.

Ausdr�cke machen DTML ziemlich m�chtig. Indem Sie Python-Ausdr�cke benutzen, k�nnen Sie zum Beispiel ganz einfach Bedingungen testen:

      
        Foo ist weniger als bar.
      

Ohne Ausdr�cke w�rde diese sehr einfache Aufgabe in ein separates Skript aufgebrochen werden m�ssen und w�rde eine Menge �bergewicht f�r etwas produzieren, das derartig simpel ist.

Bevor Sie sich in Ausdr�cken verlieren, seien Sie vorsichtig. Ausdr�cke k�nnen es schwer machen, ihr DTML zu verstehen. Code, der schwierig zu verstehen ist, kann eher Fehler enthalten und ist schwieriger zu warten. Ausdr�cke k�nnen auch zu vermischter Logik in ihrer Pr�sentation f�hren. Wenn Sie bemerken, da� Sie einen Ausdruck l�nger als f�nf Sekunden anstarren m�ssen, halten Sie an. Schreiben Sie das DTML ohne den Ausdruck neu und benutzen Sie ein Skript, um ihre Logik umzusetzen. Nur weil es m�glich ist, komplexe Dinge mit DTML tun, sollten Sie das noch lange nicht machen.

Fallstricke in DTML-Ausdr�cken

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

      

und:

      

zwei v�llig verschiedene Ergebnisse liefern. Das erste Beispiel des DTML-var-Tags wird die Variablen automatisch interpretieren. In anderen Worten: Es wird versuchen, das Richtige zu tun, um ihre Variable einzuf�gen, egal was diese Variable sein mag. Generell hei�t das, da� wenn die Variable ein Skript ist, sie mit den entsprechenden Argumenten aufgerufen wird. Dieser Proze� wird tiefer in Kapitel 8 (Variablen und fortgeschrittenes DTML) behandelt.

In einem Ausdruck haben Sie v�llige Kontrolle �ber die Interpretation einer Variablen. Im Fall unseres Beispiels ist objectValues ein Skript. Also:

      

wird ein Skript aufrufen. Aber

      

wird kein Skript aufrufen, sondern einfach versuchen, es einzuf�gen. Das Ergebnis wird keine Liste von Objekten sein, sondern ein String wie etwa . Wann immer Sie Ergebnisse wie dieses sehen, es es gut m�glich, da� ein Skript zur�ckgegeben anstatt aufgerufen wird.

Um ein Skript �ber einen Ausdruck aufzurufen, mu� die Standard-Aufruf-Syntax von Python mit Klammern benutzt werden:

      

Die Lektion besteht darin, da� Sie beim Benutzen von Python-Ausdr�cken wissen sollten, was f�r eine Art Variable Sie einsetzen und die passende Python-Syntax benutzen, damit die Variable entsprechend interpretiert werden kann.

Bevor wir das Thema der Ausdrucks-Variablen verlassen, sollten wir erw�hnen, da� es eine abzulehnende Form der Ausdruckssyntax gibt. Sie k�nnen den Teil "expr=" in einem Ausdrucks-Tag f�r eine Variable weglassen. Aber bitte tun Sie das nicht. Es ist viel zu leicht, dabei folgendes zu verwechseln, n�mlich:

      

mit:

      

und dabei v�llig verschiedene Resultate zu bekommen. Diese "Abk�rzungen" wurden vor langer Zeit in DTML eingebaut, aber wir best�rken Sie nicht darin, Sie zu benutzen, wenn Sie nicht bereit sind, das Durcheinander und die Bereinigungsprobleme in Kauf zu nehmen, die aus diesem subtilen Unterschied der Syntax kommen k�nnen.

Das var-Tag

Das var-Tag setzt Variable in DTML-Skripts und -Dokumente ein. Wir haben schon viele Beispiele gesehen, wie das var-Tag benutzt werden kann, um Strings in Web-Seiten einzuf�gen.

Wie Sie gesehen haben, sucht das var-Tag zuerst im aktuellen Objekt, dann in seinen Beh�lternm und schlie�lich in der Web-Anfrage nach den Variablen.

Das var-Tag kann auch Python-Ausdr�cke benutzen, um mehr Kontrolle �ber das Auffinden und Aufrufen von Variablen zu gew�hren.

var-Tag-Attribute

Sie k�nnen das Verhalten des var-Tags �ber seine Attribute beeinflussen. Das var-Tag hat viele Attribute, die Ihnen in h�ufigen Formatierungssituationen helfen. Die Attribute sind in Anhang A zusammengefa�t. Hier ist eine Zusammenstellung von var-Tag-Attributen.

html_quote
Dieses Attribut l��t die eingesetzten Werte als HTML-Zitate erscheinen. Das bedeutet, da� <, > und & nicht dargestellt werden.
missing
Das Attribut "missing" erlaubt Ihnen die Spezifizierung eines vorgegebenen Wertes, der benutzt wird, wenn Zope die Variable nicht finden kann. Zum Beispiel:
      
fmt
Das Attribut "fmt" erlaubt Ihnen, das Format der var-Tag-Ausgabe zu beeinflussen. Es gibt viele verschiedene Formate, die genauer im Anhang A beschrieben sind.

Ein Nutzen des fmt-Attributs liegt in der Formatierung von W�hrungs-Werten. Legen Sie zum Beispiel eine float-Eigenschaft namens erwachsen_preis in ihrem Root-Ordner an. Diese Eigenschaft stellt die Kosten f�r den Zoobesuch eines Erwachsenen dar. Geben Sie dieser Eigenschaft den Wert 2.2.

Sie k�nnen diese Kosten in einem DTML-Dokument oder -Skript etwa so ausgeben:

      Eine Erwachsenen-Karte: 

Damit wird ausgegeben: "$2.20". Genauere Werte werden kaufm�nnisch auf zwei Hinter-Komma-Stellen gerundet.

Syntax von var-Tag-Ausdr�cken

Zope bietet f�r das einfache var-Tag eine verk�rzte Syntax an. Weil das var-Tag ein Singleton ist, kann es durch eine Syntax �hnlich einem HTML-Ausdruck dargestellt werden:

      &dtml-cockatiel;

Das entspricht:

      

Der Hauptgrund, Ausdruckssyntax zu verwenden, ist das Vermeiden von DTML-Tags innerhalb von HTML-Tags. Anstatt beispielsweise zu schreiben:

      ">

k�nnen Sie die Ausdruckssyntax verwenden, um die Dinge f�r Sie und ihren Text-Editor besser lesbar zu machen:

      

Die var-Tag-Ausdruckssyntax ist sehr begrenzt. Sie k�nnen Python-Ausdr�cke nicht zusammen mit einigen Tag-Attributen verwenden. In Anahng A finden Sie mehr Informationen zur var-Tag-Ausdruckssyntax.

Das if-Tag

Einer der gro�en Vorteile von DTML ist die M�glichkeit, ihre Web-Seiten anzupassen. Oft bedeutet "Anpassung", da� die Pr�fabfragen angemessen laufen. Dieses if-Tag l��t Sie eine Bedingung auswerten und aufgrund des Ergebnisses verschiedene Aktionen ausf�hren.

Was ist eine Bedingung? Eine Bedingung ist ein Wert, der entweder wahr oder falsch ist. Generell gelten alle Objekte als wahr, es sei denn sie w�ren 0, Nichts, eine leere Sequenz oder ein leerer String.

Hier ist eine Beispiels-Bedingung:

objectValues
Wahr, wenn die Variable objectValues existiert und wahr ist. Das hei�t: Wenn nach Auffinden und Auswertens objectValues nicht 0, Nichts, eine leere Sequenz oder ein leerer String ist.

Genau wie beim var-Tag k�nnen Sie hier Namens- und Ausdrucks-Syntax verwenden. Hier sind einihe 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. Dieses Skript wird im Kapitel genauer erl�utert.

Das if-Tag ist ein Block-Tag. Der Block innerhalb des ist if-Tags wird ausgef�hrt, wenn die Bedingung wahr ist.

Hier sehen Sie, wie Sie einen Variablen-Ausdruck mit dem if-Tag benutzen k�nnen, um eine Bedingung zu pr�fen:

      

Wie viele Affen gibt es?

Es gibt zu viele Affen!

Im obigen Beispiel werden Sie den ersten und zweiten HTML-Absatz sehen, wenn der Python-Ausdruck Affen > Affen_limit wahr ist. Wenn die Bedingung unwahr ist, werden Sie nur den ersten sehen.

if-Tags k�nnen zu jeder Tiefe verschachtelt werden, zum Beispiel k�nnten Sie folgendes haben:

      

Gibt es zu viele blaue Affen?

Es gibt zu viele blaue Affen!

Verschachtelte if-Tags arbeiten sich durch die Auswertung der ersten Bedingung, und wenn diese Bedingung wahr ist, werten sie die n�chste aus. Im Allgmeinen arbeiten if-Tags in DTML genauso wie if-Statements in Python.

Unterschiede zwischen Namens- und Ausdrucks-Syntax

Die Namens-Syntax pr�ft sowohl gegen die Existenz eines Namens als auch gegen seinen Wert. Zum Beispiel:

      
        

Da ist ein Affenhaus, Mama!

Wenn die Variable Affen_haus nicht existiert, ist die Bedingung unwahr. Wenn es eine Variable Affen_haus gibt, aber sie unwahr ist, ist diese Bedingung ebenso unwahr. Die Bedingung ist nur dann wahr, wenn es die Variable Affen_haus gibt und sie weder 0 noch Nichts, eine leere Sequenz oder ein leerer Sting ist.

Die Python-Ausdrucks-Syntax pr�ft nicht gegen die Existenz einer Variablen. Das kommt daher, da� der Ausdruck g�ltiges Python sein mu�. Zum Beispiel:

      
        

Da ist ein Affenhaus, Mama!

Das wird solange wie erwartet arbeiten, wie Affen_haus existiert. Wenn die Variable Affen_haus nicht existiert, wird Zope eine KeyError-Ausnahme zur�ckgeben, sobald es versucht, die Variable zu finden.

Else- und Elif-Tags

Das if-Tag l��t nur dann eine Aktion zu, wenn eine Bedingung wahr ist. Sie m�gen auch bei einer unwahren Bedingung eine andere Aktion aufrufen wollen. Das kann mit Hilfe des DTML-else-Tags geschehen. Der if-Block kann auch ein else-Singleton-Tag enthalten. Zum Beispiel:

      
         

Es gibt zuviele Affen!

Die Affen sind fr�hlich!

Das else-Tag spaltet den if-Tag-Block in zwei B�cke, der erste wird ausgef�hrt, wenn die Bedingung wahr ist, der zweite wird ausgef�hrt, wenn die Bedingung nicht wahr ist.

Ein if-Tag-Block kann auch ein elif-Singleton-Tag enthalten. Das elif-Tag spezifiziert - wie ein zus�tzlichs if-Tag eine weitere Bedingung. Das l��t Sie mehrere Bedingungen in einem Block darstellen:

      
        

Es gibt zuviele Affen!

Es gibt nicht genug Affen!

Es gibt gerade genug Affen.

Ein if-Tag-Block kann jede Anzahl von elif-Tags enthalten, aber nur ein else-Tag. Das else-Tag mu� immer hinter den elif-Tags stehen. elif-Tags k�nnen k�nnen Bedingungen sowohl mit Namens- als auch mit Ausdrucks-Syntax pr�fen.

Cookies im if-Tag benutzen

Lassen Sie uns ein etwas gehaltvolleres if-Tag-Beispiel betrachten. Wenn Sie Besucher auf ihrer Site haben, werden Sie ihnen oft ein Cookie geben wollen, um sie mit irgendeiner Art speziellem Wert zu identifizieren. Cookies werden �berall im Internet gelegentlich verwendet und wenn sie richtig benutzt werden, sind sie sehr n�tzlich.

Nehmen Sie an, wir wollen neue Besucher von Leuten unterscheiden, die schon auf unserer Site waren. Wenn ein Benutzer die Site besucht, k�nnen wir einen Cookie setzen. Dann k�nnen wir bei der Seitenanzeige gegen den Cookie pr�fen. Wenn der Benutzer schon auf der Site war, wird er diesen Cookie haben. Wenn er den Cookie noch nicht hat, bedeutet es, da� er neu ist.

Angenommen wir haben etwas Besonderes. Erstbesucher kommen zum halben Preis in den Zoo. Hier ist ein DTML-Fragment, das mit Hilfe der Variablen warSchonImZoo gegen einen Cookie pr�ft und den Eintrittspreis gemessen daran anzeigt, ob der Benutzer schonmal im Zoo war oder nicht:

      
        

Zoo-Eintritt .

Zoo-Eintritt f�r Erstbesucher

Dieses Fragment pr�ft gegen die Variable warSchonImZoo. Wenn der Benutzer den Zoo schon besucht hat, gibt es den normalen Eintrittspreis aus. Wenn der Besucher zum ersten Mal hier ist, kommt er zum halben Preis rein.

Nur der Vollst�ndigkeit halber ist hier noch eine Ausf�hrung des warSchonImZoo-Skripts auf Python-Basis:

      ## Script(Python) "warSchonImZoo"
      ## parameters=REQUEST, RESPONSE
      ##
      """
      Gibt wahr zur�ck, wenn der Benutzer den Zoo schon benutzt hat
      Benutzt Cookies, um Zoo-Besuche zu verfolgen.
      """
      if REQUEST.has_key('zooBesuchCookie'):
          return 1
      else:
          RESPONSE.setCookie('zooBesuchCookie', '1')
          return 0

In Kapitel 10 (Fortgeschrittenes Zope-Scripting) werden wir einen genaueren Blick darauf werfen, wie Gesch�ftslogik mit Python oder Perl umgesetzt wird. Bis hierher reicht es, zu sehen, da� das Skript nach einem Cookie sucht und - abh�ngig vom Auffinden des Cookies - einen wahren oder unwahren Wert zur�ckgibt. Beachten Sie, wie Python if- und else-Statements benutzt, genau wie DTML if- und else-Tags. if- und else-Tags in DTML basieren auf denen von Python. Tats�chlich hat Python auch ein elif-Statement, genau wie DTML.

Das in-Tag

Das in-Tag von DTML iteriert durch eine Folge von Objekten und f�hrt f�r jeden Gegenstand in der Folge einen Proze�-Block aus. Beim Programmieren wird das oft Iteration oder Looping genannt.

Das in-Tag ist ein Block-Tag wie das if-Tag. Der Inhalt des in-Tags wird f�r jede Iteration des in-Tag-Kreises einmal ausgef�hrt. Zum Beispiel:

      
        

Dieses Beispiel kreist durch eine Liste von Objekten, die Aufgaben_liste hei�t. F�r jeden Gegenstand f�gt es einen HTML-Absatz mit einer Beschreibung des Aufgaben-Gegenstandes ein.

In vielen Web-Aufgaben ist Iteration sehr n�tzlich. Stellen Sie sich eine Web-Site vor, wo H�user zum Kauf angeboten werden. Die Benutzer werden auf ihrer Site nach H�usern suchen, die verschiedene Kriterien erf�llen. Sie werden all diese Ergebnisse in konsitenter Weise auf ihrer Seite fomatieren wollen, weil Sie �ber jedes einzelne Suchergebnis iterieren m�ssen und einen �hnlichen HTML-Block f�r jedes Ergebnis ausgeben wollen.

Die Inhalte eines in-Tag-Blocks sind eine Art von Template, das einmal auf jeden Gegenstand der Sequenz angewendet wird.

Durch Ordnerinhalte iterieren

Hier ist ein Beispiel davon, durch die Inhalte eines Ordners zu iterieren. Dieses DTML wird durch alle Dateien in einem Ordner kreisen und einen Link zu jedem einzelnen anzeigen. Dieses Beispiel zeigt Ihnen, wie alle "File"-Objekte in einem Ordner angezeigt werden, also werden Sie eine Dateien in Zope laden m�ssen wie im vorherigen Kapitel besachrieben:

      
      

Dieser Code zeigt die folgende Datei-Liste, wie in Bild 4.4.

�ber eine Liste von Dateien iterieren.

Bild 4.4 �ber eine Liste von Dateien iterieren.

Lassen Sie uns dieses DTML-Beispiel Schritt f�r Schritt ansehen. Zuerst wird das var-Tag benutzt, um ihren gewohnten Header in das Dokument einzuf�gen. Als n�chstes haben Sie das ul-HTML-Tag, um anzuzeigen, da� der Browser eine Punktliste anzeigen soll.

Dann gibt es das in-Tag. Das Tag hat einen Ausdruck, der das Zope-API-Skript objectValues aufruft. Dieses Skript gibt eine Sequenz von Objekten im aktuellen Ordner zur�ck, die bestimmte Kriterien erf�llen. In diesem Fall m�ssen die Objekte Dateien (Files) sein. Es wird durch alle Gegenst�nde im aktuellen Ordner kreisen.

Das in-Tag wird durch jeden Gegenstand in dieser Sequenz kreisen. Wenn es vier Datei-Objekte im aktuellen Ordner gibt, , wird das in-Tag den Code in seinem Block viermal ausf�hren; einmal f�r jedes Objekt in der Sequenz.

W�hrend jeder Iteration sucht das in-Tag nach Variablen, zuerst im aktuellen Objekt. In Kapitel 8 (Variablen und fortgeschrittenes DTML) werden wir uns n�her damit befassen, wie DTML Variablen findet.

Zum Beispiel iteriert dieses in-Tag durch eine Sammlung von Datei-Objekten und benutzt das var-Tag zum Auffinden der Variablen in jeder Datei:

      
        
  • Das erste var-Tag ist ein Ausdruck und das zweite ein normales DTML-var-Tag. Sobald das in-Tag �ber das erste Objekt kreist, werden seine Variablen absolute_url und title_or_id in den ersten Gegenstand der Punktliste eingef�gt:

          
    • FirstFile
    • W�hrend der zweiten Iteration werden die Variablen des zweiten Objekts - absolute_url und title_or_id - in die Ausgabe eingef�gt:

          
    • FirstFile
    • SecondFile
    • Dieser Proze� wird weitergehen, bis das in-Tag �ber jede Datei im aktuellen Ordner iteriert ist. Nach dem in-Tag beenden Sie schlie�lich ihre HTML-Punktliste mit einem schlie�enden /ul-HTML-Tag und der standard_html_footer wird eingef�gt, um das Dokument zu schlie�en.

      Besondere Variablen des in-Tags

      Das in-Tag versorgt Sie mit erinigen n�tzlichen Informationen, die Ihnen die Anpassung ihrer HTML-Inhalte w�hrend des Iterierens �ber eine Sequenz erm�glichen. Sie k�nnen zum Beispiel ihr Dateiverzeichnis leichter lesbar machen, indem Sie es in eine HTML-Tabelle einf�gen und jede zweite Tabellenzele in einer anderen Farbe anzeigen lassen, wie die in Bild 4.5 gezeigte.

      Dateilistung mit wechselnden Zeilenfarben.

      Figure 4.5 Dateilistung mit wechselnden Zeilenfarben.

      Das in-Tag macht das einfach. �ndern Sie ihr Dateiverzeichnis-Skript ein bi�chen, damit es so aussieht:

          
    
          
    
              
                
                

    Hier wird ein if-Tag benutzt, um gegen eine spezielle Variable zu pr�fen, die sequence-even hei�t. Das in-Tag setzt diese Variable bei jedem Loop auf einen wahren oder unwahren Wert. Wenn die aktuelle Iterationszahl ungerade ist, gilt sie als unwahr.

    Als Ergebnis wird abwechselnd je ein tr-Tag mit entweder grauem oder ohne Hintergrund in das Dokument eingef�gt. Wie erwartet, gibt es eine sequence-odd, die immer den entgegengesetzten Wert wie sequence-even hat.

    Es gibt viele spezielle Variablen, die ein in-Tag f�r Sie definieren kann. Hier sind die gebr�uchjlichsten und n�tzlichsten:

    sequence-item
    Diese Spezial-Variable ist der aktuelle Gegenstanmd der Iteration.
    Im Fall des Dateiverzeichnis-Beispiels wird jedesmal beim Loop die aktuelle Datei der Iteration als sequence-item betrachtet. Es ist oft n�tzlich, eine Referenz auf das aktuelle Objekt der Iteration zu haben.
    sequence-index
    steht f�r die aktuelle Zahl von abgeschlossenen Iterationen, beginnend bei 0. Wenn diese Zahl gerade ist, ist sequence-even wahr und sequence-odd ist unwahr.
    sequence-number
    Die aktuelle Zahl von abgeschlossenen Iterationen, beginnend bei 1. Dies kann als die kardinale Position (erste, zweite, dritte etc.) des aktuellen Objekts im Loop betrachtet werden. Wenn diese Zahl gerade ist, gilt sequence-even als unwahr und sequence-odd als wahr.
    sequence-start
    Diese Variable ist f�r die erste Iteration wahr.
    sequence-end
    Diese Variable ist f�r die Schlu�-Iteration wahr.

    Diese Spezial-Variablen werden detaillierter im Anhang A dargestellt.

    DTML ist ein m�chtiges Werkzeug zur Schaffung dynamischer Inhalte. Es erlaubt Ihnen, ziemlich komplexe Berechnungen anzustellen. In Kapitel 8 (Variablen und fortgeschrittenes DTML) werden Sie etwas �ber viel mehr DTML-Tags und m�chtigere Wege herausfinden, die Tags zu benutzen, die Sie schon kennengelernt haben. Unabh�ngig von den M�glichkeiten sollten Sie der Versuchung widerstehen, DTML f�r komplexe Skripte zu benutzen. In Kapitel 10 (Fortgeschrittenes Zope-Sktipting) werden Sie herausfinden, wie Sie Python und Perl f�r das Sktipting von Gesch�ftslogik verwenden k�nnen.