Bearbeiten von Objekten mit eigenem Editor (ExternalEditor)
Die englische Originalversion dieses Textes von Casey Duncan liegt unter http://www.zope.org/Members/Caseman/ExternalEditor/readme.
Externer Editor für Zope
Der ExternalEditor ist eine neue Art, Zope nahtloser an client-seitige Tools anzupassen. Es hat folgende Eigenschaften:
-
Objekte lokal editieren, direkt aus dem Zope Management Interface (ZMI).
-
Arbeitet mit jeder graphischen Editoren-Anwendung, die eine Datei von der Kommandozeile aus öffnen kann, einschließlich: emacs, gvim, xemacs, nedit, gimp, etc.
-
Speichert automatisch an Zope zurück, ohne den Bearbeitungsprozeß zu unterbrachen.
-
Assoziieren Sie jeden client-seitigen Editor über Meta-Typ oder Content-Typ mit jedem Zope-Objekt.
-
Sperrt Objekte, während Sie bearbeitet werden. Entsperrt sie automatisch, sobald der Bearbeitungsprozeß endet.
-
Kann Dateiendungen automatisch hinzufügen, um Syntaxhervorhebung oder Dateityperkennung zu ermöglichen.
-
Arbeitet mit Basis-Authorisierung, Cookie-Authorisierung und Zope-Versionen. Berechtigungen werden automatisch an die Helfer-Anwendung weitergegeben. Wieder-Authentifizierung unnötig.
-
HTTPS-Support (OpenSSL notwendig)
Ihn benutzen
Die Benutzung dieser Anwendung ist ungefähr genauso einfach wie die des ZMI, wenn ihr Brwoser erst konfiguriert ist (siehe Installationsanweisungen). Um ein Objekt extern zu editieren, klicken sie im ZMI nur auf das Stift-Icon neben dem Objekt. Das Objekt wird heruntergeladen und und mit der Editor-Anwendung geöffnet, die Sie ausgewählt haben (Sie werden beim ersten Mal aufgefordert, einen Editor auszuwählen).
Sie editieren das Objekt genau wie jede andere Datei. Wenn Sie in ihrem Editor die Änderungen speichern, werden sie automatisch im Hintergrund zurück zu Zope hochgeladen. Während das Objekt in ihrem Editor geöffnet ist, ist es in Zope gesperrt, um konkurrierende Bearbeitung zu verhindern. Sobald Sie ihre Bearbeitungssitzung beenden (z.B. indem Sie ihren Editor schließen), wird das Objekt entsperrt.
Wie es funktioniert
Ok, das alles hört sich an, als sei es zu schön, um wahr zu sein? Wie arbeitet das überhaupt? Erstmal gebe ich Ihnen ein Blockdiagramm:
+-------------+ +-------------+ +---------+ +------+ | Editor-Anw. | <-- | Helfer-Anw. | <-- | Browser | <-/ /- | Zope | +-------------+ +-------------+ +---------+ +------+ ^ ^ ^ ^ \ / \ / v v -----------------------/ /---- ------- / Lokale \ \ Datei / -------
Der Schlüssel, um das zum Arbeiten zu bekommen, ist, das Problem zu lösen, daß der Editor nichts über Zope weiß und nur mit lokalen Dateien umgehen kann. Außerdem gibt es keinen Standard-Kommunikationsweg mit Editoren, also kann nur die lokale Datei der Kommunikationsweg sein, die den Inhalt oder Code des Objekts enthält.
Es ist einfach, den Browser zum Starten des Editors zu bekommen, nachdem ein spezieller Datentyp mit dem Browser heruntergeladen wurde. Aber das tut Ihnen wenig Gutes, denn der Browser hat nichts mehr damit zu tun, wenn die Daten heruntergeladen ist. Er legt nur eine temporäre Datei an und startet die registrierte Anwendung mit Übergabe des Dateipfades. Wenn der Editor erst läuft, weiß er nur um die lokale Datei und hat kein Konzept davon, wo sie ursprünglich herkam.
Um dieses Problem zu lösen, habe ich eine Hilfs-Anwendung entwickelt, deren Job grundsätzlich zweierlei ist:
-
Bestimme den korrekten zu startenden Editor für ein bestimmtes Zope-Objekt
-
Bring die Daten zurück zu Zope, wenn die Änderungen gespeichert werden
Lassen Sie uns also Schritt für Schritt nachsehen, wie es funktioniert:
-
Sie klicken auf den Link für den externen Editor (das Stift-Icon) im ZMI.
-
Der Produkt-Code auf dem Server legt eine Antwort an, die die notwendigen Meta-Daten (URL, Meta-Typ, Inhalts-Typ, Cookies etc.) und den Inhalt des Zope-Objekts enthält, der sowohl Text oder Binärdaten enthalten kann. Diese Antwort hat den erfundenen Inhaltstyp "application/x-zope-edit".
-
Der Browser erhält die Anfrage und findet unsere Hilfsanwendung, die für "application/x-zope-edit" registriert ist. Es speichert die Antwort-Daten lokal auf der Festplatte und stößt die Hilfsanwendung zur Verarbeitung an.
-
Die Hilfsanwendung liest seine Konfigurationsdatei und die Antwort-Datei. Die Meta-Daten der Datei werden geparst und der Inhalt wird in eine neue Temporärdatei gespeichert. Das passende Editor-Programm ist auf der Grundlage der Daten-Inhalte und der Konfiguration (alternativ durch Fragen des Benutzers) festgelegt.
-
Der Editor wird als Sub-Prozeß der Hilfsanwendung gestartet und übergibt die Datei mit den Inhaltsdaten.
-
Wenn sie so eingestellt ist, sendet die Hilfsanwendung eine WebDAV-Sperranforderung zurück an Zope, um das Objekt zu sperren.
-
Die Hilfsanwendung überprüft die Inhalts-Datei regelmäßig auf Änderungen (wenn sie so konfiguriert ist). Wenn Änderungen vorliegen, sendet sie eine HTTP-PUT-Anforderung zurück an Zope, die die neuen Daten enthält.
-
Sobald der Editor geschlossen wird, wird die Inhaltsdatei noch einmal überprüft und hochgeladen, wenn sie geändert wurde. Dann wird eine WebDAV-Entsperr-Anforderung an Zope gesendet.
-
Die Hilfsanwendung wird beendet.
Konfiguration
Die Hilfsanwendung unterstützt verschiedene Konfigurationsoptionen, von denen jede in beliebiger Kombination von Meta-Typ, Inhaltstyp oder Domain des Objekts eingestellt werden kann. Das erlaubt Ihnen, ein angemessenes Verhalten für verschiedene Typen von Zope-Objekten und Inhalten oder sogar verschiedene Server festzulegen. Die Konfigurationsdatei wird in der Datei "~/.zope-external-edit" (Unix) oder "~\ZopeEdit.ini" (Windows) abgelegt. Wenn beim Start der Hilfsanwendung keine Konfigurationsdatei gefunden wird, wird in ihrem "home"-Verzeichnis eine Konfigurationsdatei angelegt.
Die Konfigurationsdatei folgt Pythons Standard-ConfigParser-Format, das dem alten *.ini-Datei-Format von Windows ziemlich ähnlich ist. Die Datei besteht aus Abscnitten (sections) und Optionen im folgenden Format:
[section 1] option1 = Wert option2 = Wert [section 2] ...
Optionen
Die verfügbaren Optionen für alle Abschnitte der Konfigurationsdatei sind:
- Editor
-
Kommandozeile, die zum Starten des Editor-Anwendung benutzt wird. Unter Windows wird die Hilfsanwendnung die Dateitypen-Registrierung nach einem passenden Editor für den Inhaltstyp oder die Dateiendung des Objekts (die mit der Endungs-Option unten festgelegt werden kann) suchen, falls keine Editoreneinstellung gefunden wird. Als Voreinstellung wird der Pfad zu der lokalen, zu bearbeitenden Datei an diese Kommandozeile angehängt. Um den Dateipfad in der Mitte ihres Kommandos einzufügen, benutzen Sie "$1" für Unix, respektive "%1" für Windows.
- Speicherintervall (save_interval)
-
(float) Der Intervall, mit dem die Hilfsanwendung die bearbeitete Datei auf Änderungen prüft, in Sekunden
- Benutzung sperren (use_locks)
-
(1 oder 0) Ob WebDAV-Sperrung benutzt werden soll. Der bearbeitende Benutzer muß die notwendigen Berechtigungen für WebDAV haben, damit dies funktioniert.
- Immer Sperrungen ausleihen (always_borrow_locks)
-
(1 oder 0) Falls die Benutzungssperre (use_locks) aktiviert ist, unterdrückt diese Einstellung Warnungen, wennn Sie versuchen, ein Objekt zu bearbeiten, das schon gesperrt ist. Falls eingeschaltet, wird der externe Editor immer den vorhandenen Sperr-Token "ausleihen", anstatt selbst zu sperren. Das ist nützlich, wenn Sie zum Beispiel CMFStaging benutzen. Wenn übergangen, ist die Voreinstellung 0 (neu in Version 0.5)
- Dateien aufräumen (cleanup_files)
-
(1 oder 0) Ob die angelegten Temporär-Dateien gelöscht werden sollen. WARNUNG: Die Temporär-Datei, die vom Browser kommt, enthält Authentifizierungsinformationen und daher ist das Setzen von 0 ein Sicherheitsrisiko, besonders auf Maschinen, die von mehreren benutzt werden. Wenn auf 1 gesetzt, wird die Datei bei der frühesten Gelegenheit gelöscht, sogar noch bevor der Editor aufgerufen wird. Nur für Debugging auf 0 setzen.
- Dateiendung (extension)
-
(Text) Die Dateiendung, die der Inhaltsdatei angefügt werden soll. Erlaubt besseres Handling von Bildern und kann Syntaxhervorhebung verbessern.
- Temporäres Verzeichnis (temp_dir)
-
(Pfad) Der Pfad, unter dem lokale Kopien der zu bearbeitenden Objektdaten gespeichert werden. Als Voreinstellung wird das Temporär-Verzeichnis des Systems verwendet.
Abschnitte
Die Abschnitte der Konfigurationsdatei legen die Typen von Objekten und Inhalten so fest, daß die Optionen darunter auf sie angewendet werden.
Es gibt nur einen obligatorischen Abschnitt [general]
, der alle obigen Optionen definieren sollte, die keinen voreingestellten Wert haben. Wenn kein anderer Abschnitt eine Option für ein bestimmtes Objekt definiert, werden die generellen Einstellungen benutzt.
Zusätzliche Sektionen können auf eine bestimmte Domain, auf Inhaltstypen oder Meta-Typen zutreffen. Da Objekte all diese Eigenschaften haben können, werden die Optionen in der Reihenfolge ihres Erscheinens angewendet.
-
[content-type:text/html]
-- Optionen für den gesamten Inhaltstyp kommen zuerst. -
[content-type:text/*]
-- Optionen nach Haupt-Inhaltstyp kommen als zweites. -
[meta-type:File]
-- Optionen nach Zope-Meta-Typ kommen als drittes. -
[domain:www.mydomain.com]
-- Optionen nach Domains folgen. Verschiedene Sektionen können für jede Domain-Ebene hinzugefügt werden, wenn gewünscht. -
[general]
-- Generelle Optionen kommen zum Schluß.
Dieses Schema erlaubt ihnen, eine Dateierweiterung nach Inhaltstyp, den Editor nach Meta-Typ, die Sperreinstellungen nach Domain und die verbleibenden Optionen für ein bestimmtes Objekt generell festzulegen.
Berechtigungen
Externes Bearbeiten wird über die Berechtigung "Externen Editor benutzen" (Use external editor) geregelt. Benutzer mit dieser Berechtigung können externe Editoren über editierbare Objekte aufrufen. Um Änderungen zu speichern, brauchen Benutzer zusätzliche Berechtigungen, die den zu bearbeitenden Objekten angemessen sind.
Wenn Benutzer die eingebauten Sperrungsunterstützung benutzen wollen, müssen Sie die Berechtigungen "WebDAV-Zugang" (WebDAV access), "Objekte über WebDAV sperren" (WebDAV Lock items) und "Objekte über WebDAV entsperren" (WebDAV Unlock items) für die zu bearbeitenden Objekte haben.
Wenn diese Berechtigungen in Zope nicht gesetzt sind, wird die Hilfsanwendung Authorisierungfehler von Zope zurückbekommen, die sie an den Benutzer weitergibt.
Integration mit External Editor
Das Produkt "External Editor" installiert ein allgemein verfügbares Objekt in Zope, das Objekte zur Benutzung durch die Hilfsanwendung über FTP/DAV verfügbar macht. Sie können diese Funktionalität ganz einfach in ihren eigenen "Content-Management"-Anwendungen nutzen.
Sagen wir, Sie haben ein Objekt namens "dokument" in einem Ordner namens "mein_zeug", das FTP-editierbar ist. Der URL zum Ansehen dieses Objektes wäre:
http://zopeserver/mein_zeug/dokument
Der URL zum Starten des externen Editors auf diesem Dokument wäre:
http://zopeserver/mein_zeug/externalEdit_/dokument
Nun mag dies ein bißchen merkwürdig für Sie sein, wenn Sie es gewohnt sind, Ansichten am Ende des URL anzuflanschen. Weil externalEdit_
auf Python-Skipten und Seitenvorlagen (Page Templates) arbeiten muß, die die verbleibenden Pfadsegmente des URL verschlucken, die nach ihnen kommen, müssen Sie den Aufruf von externalEdit_
direkt vor dem zu bearbeitenden Objekt setzen. Sie können das unter ZPT mit Hilfe von etwas TAL in der Seitenvorlage tun wie etwa:
Edit Locally
External Editor definiert auch ein globales Skript, das Sie aufrufen können, um Stift-Icons bei passenden Objekten einzufügen. Das Skript prüft automatisch, ob das Objekt extern bearbeitet werden kann und ob der Benutzer die Berechtigung "Externen Editor benutzen" (Use external editor) für dieses Objekt hat. Wenn beides zutrifft, gibt es den HTML-Code zum Einfügen des Links zum externen Editor zurück. Andernfalls gibt es einen leeren String zurück.
Das Skript heißt externalEditLink_(object)
. Das Objekt-Argument ist das Objekt, für das im zutreffenden Fall der Link angelegt werden soll. Hier ist ein wenig Beispiel-Code für eine Seitenvorlage, der Objekten im aktuellen Ordner Links und das External-Editor-Icon hinzufügt, wo es passend ist:
Schluß
Ich hoffe, daß Sie die Benutzung dieser Software genießen. Wenn Sie irgendwelche Kommentare, Vorschläge oder einen Bug-Report haben, schicken Sie eine eMail an den Autor:
Casey Duncan
--
(c) 2002, Casey Duncan und Zope Corporation. Alle Rechte vorbehalten.