Einführung in die Programmierung von Zope ----------------------------------------- (C) netEstate GmbH, www.netestate.de 1. Zopilot-Module Folgende, separat dokumentierte, Module sind von netEstate erhältlich: -Python-Modul common.py Allgemeine Hilfsfunktionen, u.a. für die Formularbehandlung. -Produkt Zopilot - DTML Document Ein vom Typ DTML-Dokument abgeleiteter Objekttyp, welcher die automatische Ergänzung um einen Seitenkopf und einen Seitenfuss sowie Schnittstellen zur Realisierung anmelde- und kostenpflichtiger Dokumente realisiert. -Produkt Zopilot - File Ein vom Typ File abgeleiteter Objekttyp, welcher Schnittstellen zur Realisierung anmelde- und kostenpflichtiger Dateien realisiert. -Das netEstate Datenbankinterface für Zope Ein allgemeines, WWW-basiertes Interface für SQL-Datenbanken dar. Besondere Features sind: -Möglichkeit der Individualisierung von Eingabemasken -Rechtevergabe -Zuordnung von Dateien zu Datensätzen. Die Dateien können in Ausgabetemplates eingebunden werden. -Python-Modul banner.py Stellt Schnittstellen zur Realisierung eines Bannerservers bereit. -Produkt RelativeURL Korrigiert ein Fehlverhalten von Zope bei der Einbindung von Bildern. Die Dokumentationen der einzelnen Module richten sich in erster Linie an Zope-Programmierer, enthalten aber auch für Menschen mit Basiskenntnissen von Zope nützliche Informationen. 2. Struktur des Servers Bitte lesen Sie nun die Dokumentation "Programmierrichtlinien für Zope". Dadurch sollte klar werden wie Ihr Server grob aufgebaut ist, warum er so aufgebaut ist und was beim Webdesign zu beachten ist. 3. DTML-Programmierung Die diversen Techniken werden am Beispiel eines Newstickers erklärt. 3.1. Anlegen von Tabellen und Feldern Gehen Sie im Datenbankinterface auf "Tabelle Anlegen". Wählen Sie als Tabellenname "newsticker" (Tabellen- und Feldnamen sind gemäß der Richtlinien von netEstate mit Kleinbuchstaben zu schreiben) und als Primärschlüsselname "meldungsid" sowie als Primärschlüsseltyp "ganzzahl". Die Checkbox "Unterstützung für Dateien" muß aktiviert werden. Der Primärschlüssel einer Tabelle ist dasjenige Feld, welches einen Datensatz eindeutig kennzeichnet. Ein bestimmter Primärschlüsselwert darf in einer Tabelle also nur einmal vorkommen. Bei der Tabelle newsticker wird die meldungsid später dazu benutzt, Meldungen zu identifizieren. Gehen Sie in der Tabellenübersicht bei der Tabelle newsticker auf "Feld anlegen". Legen Sie nun folgende Spalten an: Spaltenname Typ ------------------------------------- titel_de Textfeld meldung_de Mehrzeiliges Textfeld erstellung Datum+Uhrzeit Datumsfelder haben immer das Format YYYY-MM-DD und Felder des Typs Datum+Uhrzeit haben das Format YYYY-MM-DD HH:MM:SS - es kann jedoch auch nur "YYYY-MM-DD" für "YYYY-MM-DD 00:00:00" angegeben werden. Geben Sie nun über das Datenbankinterface zwei Testmeldungen ein. 3.2. Syntax von SQL-select-Abfragen Moderne Datenbanken werden über die Abfragesprache SQL gesteuert. Damit wir in der Lage sind Daten von der Datenbank abzufragen, müssen wir die Syntax des dazu verwendeten SQL-Befehls "select" lernen. In seiner einfachsten Form hat der Befehl das Format select from Feldliste kann hierbei eine durch Kommas getrennte Liste von Feldnamen oder '*' für alle Felder sein. Es existieren verschiedene Zusätze mit denen das Verhalten des Befehls verändert werden kann. Einschränkende Bedingungen: select from where Es werden nur die Datensätze zurückgeliefert für die die Bedingungen gelten. Bedingungen kann dabei eine einfache Bedingung wie = 'Wert', > 'Wert', <= 'Wert' sein, oder mehrere durch logische Verknüpfungen und Klammerung zusammengesetzte einfache Bedinungen. Beispiele: -start <= NOW() AND ende >= NOW() NOW() ist eine SQL-Funktion die das aktuelle Datum bzw. die aktuelle Zeit zurückliefert. -start <= NOW() AND ( ende >= NOW() OR unbefristet='Ja' ) -lower(titel) like 'breaking news:%' Das in Kleinbuchstaben konvertierte Feld titel fängt mit 'breaking news:' an. '%' ist bei like ein Platzhalter für beliebigen Inhalt. Sortierung der Datensätze: select from order by ist hierbei eine durch Komma getrennte Liste von Feldern. Das Ergebnis wird zuerst nach dem ersten Feld sortiert, dann nach dem zweiten u.s.w. Hinter jedem Feldnamen können die Schlüsselwörter "desc" für absteigend, und "asc" für aufsteigend angegeben werden. Voreingestellt ist aufsteigende Sortierung. Sofern "where " und "order by " verwendet wird muß "order by " am Schluß der Abfrage stehen. 3.3. Erstellen einer Datenbankabfrage Legen Sie im Startverzeichnis einen Ordner "NewsTicker" an und darin den Ordner "De". Legen Sie in De das Python-Skript "Sprache" mit dem Inhalt "return container.id" an. Legen Sie nun im Verzeichnis NewsTicker eine Z-SQL-Methode "SqlHoleMeldungen" mit folgendem Inhalt an: select meldungsid, titel_ as titel, meldung_ as meldung, erstellung from newsticker order by erstellung desc Gehen Sie nun auf den Reiter "Test". Da die SQL-Methode keine Argumente (=Parameter) hat, erscheint "This query requires no input" und nach dem Klick auf "Submit Query" erscheinen die zwei Meldungen sowie die Bemerkung SQL used: select meldungsid, titel_De as titel, meldung_De as meldung, erstellung from newsticker order by erstellung desc Wir sehen also dass das DTML-Tag "" durch die Zeichenkette "De" ersetzt wurde - die Defaultsprache für den gesamten Webauftritt. dient zum Einfügen von Variablen und Ergebnissen von Funktionen. In diesem Fall wird das Python-Skript Sprache aufgerufen. Das Attribut sql_quote sollte immer verwendet werden, wenn variable Werte in eine SQL-Abfrage eingebaut werden. Es verhindert dass Benutzerdefinierte Werte von Hackern verwendet werden können, um beliebige SQL-Abfragen zu generieren. Das Ergebnis von "Sprache" ist in diesem Fall zwar nicht kritisch, da nicht Benutzerdefiniert, aber es ist besser man gewöhnt sich an, sql_quote immer in SQL-Abfragen zu benutzen. Wichtige Attribute von sind: -expr="Ausdruck" Falls anstatt einer einfachen Variablen oder eines Funktionsaufrufs ohne Argumente das Ergebnis einer Berechnung oder eines Funktionsaufruf mit Argumenten eingefügt werden soll. -fmt="Formatstring" Dient dazu Daten wie z.b. Datumsangaben, Uhrzeitangaben oder Fliesskommanzahlen in bestimmter Weise zu formattieren. -html_quote Bei HTML-Input-Feldern notwendiges Escapen von Sonderzeichen wie " -url_quote Bei Datenübergabe via URL notwendiges Escapen von nicht alphanumerischen Zeichen. -newline_to_br Zeilenumbrüche werden automatisch durch
ersetzt. Weitere Attribute entnehmen Sie bitte dem Zope Book. 3.4. Erstellen eines Ausgabetemplates für mehrere Datensätze Wir wollen zuerst eine Übersicht der Meldungen erzeugen, in der nur Titel und Uhrzeit erscheint. Erstellen Sie ein DTML Document "NewsTicker" mit folgendem Inhalt: ()
Hier wird as DTML-Tag verwendet, welches Schleifen über beliebige Listen bildet. In diesem Fall ist die Liste das Ergebnis von SqlHoleMeldungen - also die Liste der Meldungen. Innerhalb von kann über auf die selektierten Felder zugegriffen werden. Das Feld erstellung wird hier mit fmt formattiert (Platzhalter für Zeitangaben: %Y = Jahr, %m = Monat, %d = Tag, %H = Stunde, %M = Minute, %S = Sekunde). 3.5. Erstellen eines Ausgabetemplates für einen Datensatz Nun wollen wir ein Template bauen mit dem die Meldung dargestellt wird. Zuerst brauchen wir eine SQL-Methode, die uns eine über die meldungsid spezifizierte Meldung holt. Folgende SQL-Methode mit dem Argument "meldungsid" ist in 'De' als HoleMeldung anzulegen: select meldungsid, titel_De as titel, meldung_De as meldung, erstellung from newsticker where meldungsid='' Testen Sie die SQL-Methode mit dem Reiter "Test". Zope verlangt nun eine Meldungsid von Ihnen, bevor die Abfrage ausgeführt wird. Sofern Sie eine gültige Meldungsid angegeben haben, erhalten Sie ein nichtleeres Ergebnis. Nun brauchen wir ein Ausgabetemplate für die Meldung. Legen Sie folgendes Webdocument als "Meldung" an: ()

Sie werden bemerken dass hier kein verwendet wird - als ob wir innerhalb eines und wären. Aktivieren Sie nun bei HoleMeldung im Reiter Advanced die Checkbox 'Allow "simple" direct traversal' und rufen Sie folgende URL auf: /NewsTicker/De/HoleMeldung//Meldung ist hierbei durch eine gültige Meldungsid zu ersetzen. Sie sehen daß die Daten der angegebenen Meldung ins Template Meldung eingefügt wurden. Diese Technik ein Template an das Ergebnis einer SQL-Methode zu binden nennen wir "Traversal-Technik für Z-SQL-Methoden". Die entsprechende Checkbox 'Allow "simple" direct traversal' darf bei SQL-Methoden nur aktiviert werden wenn diese Technik auch verwendet wird. Nun kann die SQL-Methode HoleMeldung ins Verzeichnis NewsTicker bewegt werden. Die vorher genannte URL funktioniert wegen der besonderen Eigenschaften von Zope trotzdem weiterhin. Wir verlinken nun die beiden Templates indem wir NewsTicker wie folgt abändern: ()
3.6. Speicherung und Ausgabe von Bildern Wir wollen es nun ermöglichen zu jedem Datensatz ein Bild hochzuladen, welches auf der Meldungsseite gezeigt wird. Dies ist im Datenbankinterface bereits möglich. Es muß lediglich sichergestellt werden, daß das Bild immer die gleiche id erhält, über die wir es dann in die Meldungsseite einbauen können. Wir wählen für unsere Zwecke die id 'bild'. Wir spezifizieren bewußt keine Dateiendung damit wir Bilder verschiedener Formate hochladen können. Laden Sie ein beliebiges Bild zu einer der Meldungen hoch und spezifizieren Sie dabei die id "bild". Fügen Sie folgenden Code an geeigneter Stelle im Webdocument Meldung ein: Die Methode dr(Tabellenname,Datei) des sog. "pluggable Brains" DBBrain im Modul db.py bindet die Datei mit der genannten id über ein, sofern eine entsprechende Datei für den Datensatz existiert. Im Falle von Bildern erzeugt bzw. ein entsprechendes IMG-Tag. Sofern ein voreingestelltes Bild erscheinen soll wenn zum Datensatz keines hochgeladen wurde, ist folgender Aufruf zu verwenden: Die Defaultdatei ist dabei unter /www.detail.de/Db/DbFiles/newsticker abzulegen. Das pluggable Brain DBBrain muß noch für die SQL-Methode HoleMeldung aktiviert werden. Gehen Sie innerhalb von HoleMeldung auf den Reiter Advanced und geben sie bei "Class Name" "DBBrain" an sowie bei "Class File" "db.py". Testen Sie nun den NewsTicker erneut. 3.7. Von-Bis- und Freischaltfunktionen Erweitern Sie im Datenbankinterface die Tabelle newsticker um folgende Felder: Feldname Typ Dropdownwerte Defaultwert ----------------------------------------------------------- start Datum ende Datum freigeschaltet Dropdown Ja,Nein Nein Ändern Sie die SQL-Methode SqlHoleMeldungen wie folgt ab: select meldungsid, titel_ as titel, meldung_ as meldung, erstellung from newsticker where start<=NOW() AND ende>=NOW() AND freigeschaltet='Ja' order by erstellung desc Das Webdocument NewsTicker zeigt nun keine Meldungen mehr an. Aktivieren Sie einige Datensätze durch Ändern der Felder start,ende,freigeschaltet und rufen Sie den NewsTicker erneut auf. 3.8. Ausgabetemplates zum Einbinden in andere Ausgabetemplates Wir legen nun eine DTML-Methode TickerMeldung mit folgendem Inhalt an: ()

Diese Methode kann mit in andere Ausgabetemplates oder Dokumente eingebunden werden, sofern die Variable meldungsid definiert ist. Dies ist automatisch der Fall sofern man sich innerhalb eines befindet, bei dem SQL-Methode das Feld meldungsid enthält. Ansonsten kann auch eine entsprechende DTML-Variable definiert werden: Legen Sie ein Webdocument "TestMeldung" mit folgendem Inhalt an und ersetzen sie durch eine gültige Meldungsid: 4. Nutzer- und Rechteverwaltung für Zope Über das Nutzerverzeichnis acl_users im Startverzeichnis können neue Zope-Nutzer definiert werden. Hierbei dürfen keine Rollen vergeben werden. Falls jedoch voller Zugriff wie beim Login funk gewünscht wird kann hier die Rolle "Manager" aktiviert werden. Über den Punkt "local roles" (Lokale Rollen) im Reiter "Security" eines beliebigen Verzeichnisses lassen sich den Benutzern lokal gültige Rollen zuweisen. So kann z.B. ein Login über die Zuweisung der Rolle "Manager" im Unterverzeichnis "test" den vollen Zugriff über test und seine Unterverzeichnisse erhalten, während er auf den Rest der Zope-Installation keinerlei Zugriff hat. Der Zugriff auf das Zope-Interface muß dann direkt über das freigeschaltete Verzeichnis erfolgen. Im Fall test wäre das die URL http://ZopeServer:Zopeport/Servername/test/manage 6. Nutzer- und Rechteverwaltung für das Datenbankinterface Damit ein Nutzer Zugriff auf das Datenbankinterface unter Db/TabellenErgebnis erhält, muß er erstmal als Nutzer in acl_users angelegt werden. Dann muß er im Verzeichnis Db die entsprechenden lokalen Rollen zugewiesen bekommen. Nach der Installation des Datenbankinterface existiert nur die Rolle "DBAdmin", welche den vollen Zugriff auf das Datenbankinterface erlaubt. Über den Reiter Security von Db können weitere lokale Rollen, z.B. "Autor", definiert werden. Für diese muß dann über die Tabelle tabellenzugriff und ggf. feldzugriff ein Berechtigungsprofil erstellt werden (näheres in der Dokumentation des Datenbankinterface). Durch die Zuweisung der Rolle zum Benutzer erhält dieser entsprechenden Zugriff auf das Datenbankinterface.