![]() ![]() |
Sie sind hier: ZWikiSeiten > ZBDTML Zopebuch: Inhaltsverzeichnis Kapitel 4: Dynamische Inhalte mit DTMLDTML (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:
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:
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:
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:
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 sollDTML 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-SyntaxDie 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:
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 benutzenAlle 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 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 einsetzenDas 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:
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:
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 verarbeitenFormularverarbeitung 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:
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:
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. 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:
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 InhaltZope 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:
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. 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. 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 benutzenBis 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: Ausdr�cke machen DTML ziemlich m�chtig. Indem Sie Python-Ausdr�cke benutzen, k�nnen Sie zum Beispiel ganz einfach Bedingungen testen:
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�ckenDer 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 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-TagDas 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-AttributeSie 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.
Syntax von var-Tag-Ausdr�ckenZope 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-TagEiner 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:
Genau wie beim var-Tag k�nnen Sie hier Namens- und Ausdrucks-Syntax verwenden. Hier sind einihe Bedingungen als DTML-Ausdr�cke dargestellt.
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:
Im obigen Beispiel werden Sie den ersten und zweiten HTML-Absatz sehen, wenn der Python-Ausdruck if-Tags k�nnen zu jeder Tiefe verschachtelt werden, zum Beispiel k�nnten Sie folgendes haben:
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-SyntaxDie Namens-Syntax pr�ft sowohl gegen die Existenz eines Namens als auch gegen seinen Wert. Zum Beispiel:
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:
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-TagsDas 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:
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:
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 benutzenLassen 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:
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-TagDas 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 iterierenHier 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. 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:
W�hrend der zweiten Iteration werden die Variablen des zweiten Objekts - absolute_url und title_or_id - in die Ausgabe eingef�gt:
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-TagsDas 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. 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 Als Ergebnis wird abwechselnd je ein tr-Tag mit entweder grauem oder ohne Hintergrund in das Dokument eingef�gt. Wie erwartet, gibt es eine Es gibt viele spezielle Variablen, die ein in-Tag f�r Sie definieren kann. Hier sind die gebr�uchjlichsten und n�tzlichsten:
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. |