|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ISBN: 3540210121 ISBN: 3540210121 ISBN: 3540210121 ISBN: 3540210121 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Wir empfehlen: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Zope - ein einfaches Content Management System[ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] Übersicht: Erstellung dynamischer InhalteDTML Grundlegende DTML-Tags Zuerst wird der standard_html_header
und -footer erfolglos im aktuellen Objekt (DTML-Skript Preisliste)
und in dessen Behälter (Ordner Futtertaschen) gesucht.
Erst im Root-Ordner wird Zope fündig und fügt
die Ergebnisse der Skriptausführung ein. Die Variable title
wird im Ordner "Futtertaschen" gefunden und eingesetzt.
Das in-Tag: In den meisten Web-Anwendungen wird Iteration
angewandt. Das in-Tag von DTML iteriert über eine Folge von Objekten
und führt für jedes Objekt einen Prozess-Block aus. Die allgemeine
Syntax ist wie folgt: <dtml-in expr="..."> Die Arbeitsweise des
in-Tags und ein Beispiel finden sich im Anhang. Das if-Tag:
Das if-Tag wertet eine Bedingung aus und führt aufgrund des
Ergebnisses verschiedene Aktionen aus, was die Anpassung von Web-Seiten
ermöglicht (Beispiels-Bedingung im Anhang). Der Block innerhalb des if-Tags
wird ausgeführt, wenn die Bedingung wahr ist. if-Tags sind
beliebig tief schachtelbar und arbeiten genauso wie if-Statements
in Python. Else-
und Elif-Tags: Der if-Block kann auch ein else- oder elif-Singleton-Tag
enthalten. Hinter einem else-Tag steht eine Aktion, die bei einer unwahren
Bedingung aufgerufen wird. Mit Hilfe des elif-Tags können mehrere
Bedingungen in einem Block dargestellt werden können. Elif-Tags können Bedingungen sowohl
mit Namens- als auch mit Ausdrucks-Syntax prüfen.
Suchen von Variablen Der DTML-Namensraum ist eine Sammlung von Objekten, die in einem Stack angeordnet sind. Ein Stack ist eine Liste von Objekten, die durch die Befehle push (Element auf den Stack schieben) und pop (Element vom Stack nehmen) manipuliert werden. Kann ein Name im obersten Objekt des Namensraum-Stacks nicht gefunden werden, wird im nächsten Objekt nachgeschaut usw. Gelingt dies nicht, wird ein Fehler ausgegeben. DTML-Namensräume werden dynamisch für jeden Request in Zope erzeugt, z.B. beim Aufruf einer DTML-Methode oder -Dokuments:
Abb. 8: Anfänglicher DTML-Namensraum-Stack Das Client-Objekt ist das oberste Element, und der Request das unterste Element im Namensraum-Stack, und daher das letzte Element, wo nach Namen gesucht wird. DTML Client-Objekt: Die Art des Client-Objekts in DTML ist davon abhängig, ob eine DTML-Methode oder ein DTML-Dokument ausgeführt wird. Ein DTML-Dokument ist ihr eigenes Client-Objekt und kann verschiedene Arten von Client-Objekten haben, abhängig von ihrem Aufruf. So ist z.B. bei einer DTML-Methode, die alle Inhalte eines Ordners anzeigt, das Client-Objekt der anzuzeigende Ordner. Es liege z.B. folgende DTML-Methode im Root-Ordner vor: ..<dtml-in objectValues> <li><dtml-var title_or_id></li> </dtml-in>.. Bei Anwendung dieser Methode auf einen Ordner "Reptilien" (das Client-Objekt) mit der URL http://localhost:8080/Reptiles/list wird folgendes ausgegeben:
DTML Request-Objekt: Das Request-Objekt enthält spezifische Informationen über den aktuellen Web-Request und ist das unterste Objekt auf dem DTML-Namensraum-Stack. Bei der Suche nach Variablen im Request werden folgende Informationsquellen nacheinander zu Rate gezogen: CGI-Umgebung, Formulardaten, Cookies, Zusätzliche Variablen Veränderung des DTML-Namensraums: Einige DTML-Tags verändern den DTML-Namensraum während ihrer Ausführung. Zu diesen Tags gehören das in-Tag, das with-Tag und das let-Tag. Das in-Tag: Wenn das in-Tag über eine Sequenz iteriert, wird das aktuelle Element in der Sequenz für die Ausführungsdauer der Anweisungen im Block auf die oberste Stelle des Namensraum-Stacks geschoben und nach Ablauf wieder herunter genommen:
Das with-Tag: Das with tag schiebt ein anzugebendes Objekt für die Ausführungsdauer des with-Blocks an die oberste Position des Namensraum-Stacks. Hierdurch wird angegeben, wo Variablen zuerst nachgeschaut werden sollen. Die Namen eines Ordners "Reptilien" könnten über Python-Ausdrücke wie folgt zugegriffen werden:
Das with-Tag verbessert die
Lesbarkeit:
Ein anderer Einsatzzweck für das with-Tag ist, das Request-Objekt oder einen Teil davon auf die oberste Stelle des Namensraum-Stacks zu schieben. Es liege z.B. ein Formular mit einem Input namens "id" vor. Der Zugriff <dtml-var id> liefert nicht die id-Variable des Formulars, sondern die des Client-Objekts. Auf folgende Weise wird sichergestellt, dass man die Formular-id erhält: <dtml-with expr="REQUEST.form"> <dtml-var id> </dtml-with> Das let-Tag: Das Let-Tag befördert einen neuen Namensraum auf den Namensraum-Stack. Dieser Namensraum ist definiert durch die Tag-Attribute des let-tags: <dtml-let person="'Bob'" relation="'uncle'"> <p><dtml-var person>'s your <dtml-var relation>.</p> => Das würde anzeigen: <p>Bob's your uncle.</p> </dtml-let> Fortgeschrittene DTML-Tags Der Vollständigkeit halber werden an dieser Stelle weitere wichtige DTML-Tags zusammengestellt:
DTML-Dokumente vs. DTML-Methoden Eine Quelle für Missverständnisse ist die Frage, wann ein DTML-Dokument und wann eine DTML-Methode zu verwenden ist. Beide enthalten DTML und anderen Inhalt, beide führen DTML-Code aus, und beide haben eine ähnliche Benutzerschnittstelle und ein ähnliches API. Die folgenden allgemeinen Hinweise helfen bei der Entscheidung: DTML-Dokumente
speichern Dokument-ähnliche Inhalte, z.B. könnten
Kapitel eines Buchs in einem DTML-Dokument gespeichert werden.
Allgemein gilt: Ist der Inhalt hauptsächlich Dokument-orientiert
und soll er auf einer Site von anderen Objekten dargestellt werden,
dann sollte er in ein DTML-Dokument kommen (oder eine Datei, wenn kein DTML-Scripting benötigt wird).
Zope-Skript-Objekte enthalten Code, der in Python oder Perl geschrieben ist und werden zum Schreiben von Programm-Logik verwendet. Python und Perl sind sehr beliebte und leistungsfähige Open-Source Programmiersprachen mit den gemeinsamen Merkmalen: leistungsfähige, rasche Entwicklung, einfache Syntax, viele Add-On-Bibliotheken, starke Unterstützung durch Benutzergemeinde und ein reichhaltiges Angebot an kostenloser Online-Dokumentation. Skripte aus dem Web aufrufen: Ein Skript kann direkt aus dem Web über seine URL aufgerufen werden. Durch Benutzung verschiedener URLs können einem Skript verschiedene Kontexte übergeben werden. Dadurch kann Logik auf Objekte angewendet werden, ohne dass der Code dazu im Objekt eingebettet sein muss. Um ein Skript auf einem Objekt aus dem Web aufzurufen, wird einfach die URL des Objekts besucht, gefolgt vom Skriptnamen. Angenommen, es liegt folgende Sammlung von Objekten und Skripten vor:
Abb. 9: Eine Sammlung von Objekten und Skripten Über die URL Zoo/GroßeTiere/Giraffe/füttern wird das Skript füttern auf dem Objekt Giraffe aufgerufen, über Zoo/KleineTiere/Springmaus/füttern auf dem Objekt Springmaus. Zope zerlegt die URL und vergleicht sie mit der Objekthierarchie, indem es sich rückwärts durcharbeitet, bis es eine Übereinstimmung für jeden Teil findet. Dieser Prozess wird URL-Traversierung (URL traversal) genannt. Im Falle der URL Zoo/GroßeTiere/Giraffe/füttern beginnt es beim Root-Ordner und sucht nach dem Objekt 'Zoo', darin nach 'GroßeTiere' und dann nach 'Giraffe'. Im Objekt Giraffe wird das Objekt füttern nicht gefunden, aber durch Erwerbung (acquisition) im Ordner Zoo. Der Vorgang der acquisition läuft wie folgt ab: Wird das gesuchte Objekt nicht gefunden, erfolgt ein Rückzug entlang des URL-Pfades. Im Beispiel ist der Suchweg für das Objekt füttern: Giraffe - GroßeTiere - Zoo, wo schließlich füttern am Ende der URL gefunden und in seinem Kontext aufgerufen wird, der auf dem vorletzten gefundenen Objekt beruht, dem Objekt Giraffe. Soll in einer komplexeren Anordnung das Skript impfen auf dem Objekt Nilpferd aufgerufen werden, muss der Pfad zum Skript als Teil der URL eingegeben werden. Die URL zur Impfung des Nilpferds ist Zoo/Tierarzt/GroßeTiere/Nilpferd/impfen, die wie folgt durchlaufen wird: 1. Suche Objekt Zoo im Root-Ordner - Wechsel in Ordner Zoo 2. Suche Objekt Tierarzt im Ordner Zoo - Wechsel in Ordner Tierarzt 3. Suche Objekt GroßeTiere -> GroßeTiere wird in Ordner Tierarzt nicht gefunden 4. Wechsel in den Ordner GroßeTiere über den Behälter Zoo, 5. Suche Objekt Nilpferd im Ordner GroßeTiere - Wechsel zum Objekt Nilpferd, 6. Suche Objekt impfen im Objekt Nilpferd -> Objekt impfen in Objekt Nilpferd und seinen Behältern nicht gefunden, 7. Suche Objekt impfen im Ordner Tierarzt - Objekt impfen gefunden. Damit ist das Ende der URL erreicht und impfen wird im Kontext des Objekts Nilpferd angewandt. Skripte von anderen Objekten aufrufen: Üblicherweise werden Skripte aus DTML-Skripten heraus mit dem call-Tag: <dtml-call SkriptName> aufgerufen. Hierbei braucht nicht angegeben werden, wie das Skript implementiert ist (genauso gut können andere DTML-Objekte oder SQL-Skripte auf diese Art aufgerufen werden). Benötigt ein Skript Parameter, muss entweder ein Name für die DTML-Namensraum-Bindung ausgewählt werden oder die Parameter in einem Ausdruck übergeben werden: <dtml-call expr="aktualisiereInfo(farbe='braun', muster='gefleckt')"> In Python lautet der Aufruf desselben Skriptes mit Parametern: context.aktualisiereInfo(farbe='braun', muster='gefleckt'); Und in Standard-Perl-Semantik: $self->aktualisiereInfo(farbe => 'braun', muster => 'gefleckt'); Skripte von anderen Skripten aus zu benutzen, ist dem Aufrufen von Skripten aus dem Web sehr ähnlich. Die Semantik ist etwas anders, aber die Erwerbungs-Regeln bleiben die gleichen. Liegt z.B. das impfen-Skript als Python-Skript vor (impfeNilpferd.py), erfolgt der Aufruf von impfen auf dem Objekt Nilpferd In Python wie folgt: context.Tierarzt.GroßeTiere.Nilpferd.impfen(); In Perl: $self->Tierarzt->GroßeTiere->Nilpferd->impfen(); Python-basierte Skripte werden durch Auswahl von "Script (Python)" in der Produktauswahlliste angelegt. Unter "Edit" können Parameter eingegeben und Inhalte des Skriptes kontrolliert werden. Unter "Test" können Skripte durch Vorgabe von Paramtern und Überprüfung der Rückgabewerte getestet werden. Für weitergehende Details und ein Tutorial siehe http://www.python.org verwiesen.
Beispiel:
Verarbeitung von Formulareingaben Die Parameter werden in
das Feld Parameters List und der Code in das Haupttextfeld eingegeben. Die
Kommentare sind beim Bearbeiten über das Web nicht nötig, aber
hilfreich beim Bearbeiten von Skripten über FTP. Dies gibt
den Saldo oder die Schulden zurück, der über Zeitraum
"jahre" verzinst wurde. Eine Seitenvorlage namens zinsDarstellung
ruft berechneZinseszins auf und gibt das Ergebnis zurück: [ Inhaltsverzeichnis ] ... [ zurück ] ... [ weiter ] |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Back to the topic site: StudyPaper.com/Startseite/Computer/Informatik/Programmieren External Links to this site are permitted without prior consent. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home | deutsch | Set bookmark | Send a friend a link | Copyright © | Impressum | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||