Zope External Editor
tratto da un documento di Casey Duncan
L'editor esterno per Zope è un modo nuovo per integrare Zope con maggior continuità agli strumenti lato-client. Ha le seguenti caratteristiche:
- Modifica locale degli oggetti direttamente dalla ZMI.
- Lavora con tutti gli editor grafici che sono in grado di aprire un file dalla linea di comando inclusi: emacs, gvim, xemacs, nedit, gimp, etc.
- Salvataggio automatico delle modifiche in Zope senza chiudere la sessione di modifica.
- Associazione di qualsiasi applicazione lato-client con qualsiasi oggetto Zope tramite i meta-tipi o i tipi di contenuto. Possono essere modificati sia oggetti formato testo che oggetti in formato binario.
- Blocco degli oggetti mentre questi sono in modifica. Sblocco automatico quando la sessione finisce.
- Può aggiungere l'estensione dei file automaticamente per realizzare l'evidenziazione della sintassi o per riconoscere il tipo di file.
- Lavora con autenticazione base, via cookie e le versioni di Zope. Le credenziali utente sono passate direttamente dall'applicazione aiuto. Non richiede la ri-autenticazione.
- supporta il protocollo https (è richiesto Openssl)
Uso
L'uso di questa applicazione una volta configurato il browser è altrettanto facile che usare la ZMI (vedi le istruzioni di installazione). Per modificare un oggetto tramite una applicazione esterna clicca sull'icona a forma di matita accanto all'oggetto dentro la ZMI. L'oggetto verrà scaricato ed aperto utilizzando l'applicazione che hai scelto (la prima volta ti sarà richiesto di scegliere un editor).
Puoi modificare l'oggetto come qualsiasi altro file. Quando salvi le modifiche nel tuo editor, queste saranno automaticamente caricate in Zope (in background). Mentre l'oggetto è aperto nella tua applicazione, in Zope è bloccato in modo da prevenire modifiche concorrenti. Quando termini la tua sessione di modifica (p.es. chiudi l'editor) l'oggetto viene sbloccato.
Ok, così sembra che tutto vada bene, no? Come diamine lavora comunque? Per primo ti faccio un diagramma:
+------------+ +------------+ +---------+ +------+
| App Editor | <-- | App Aiuto | <-- | Browser | <-/ /- | Zope |
+------------+ +------------+ +---------+ +------+
^ ^ ^ ^
\ / \ /
v v -----------------------/ /----
-------
/ File \
\locale /
-------
Ora la chiave per farlo funzionare è quella di risolvere il problema che l'applicazione non sa nulla di Zope e può operare solo su file locali. inoltre non ci sono standard di comunicazione tra applicazioni (editor), così l'unico canale di comunicazione può essere il file locale che contiene il contenuto dell'oggetto o codice.
E' banale ottenere che il browser chiami la tua applicazione quando scarica un tipo particolare di dati. Ma questo può andare bene per un po', finchè il browser non sia coinvolto dopo che i dati sono scaricati. Egli semplicemente genera un file temporaneo ed avvia l'applicazione (pre)registrata passandogli il path del file. Una volta che l'applicazione è avviata essa è consapevole solo del file locale e non ha il concetto di dove sia stato generato.
Per risolvere questo problema ho sviluppato una applicazione di aiuto il cui compito è in due parti:
- Determinare il corretto programma da lanciare per un determinato oggetto Zope
- Ritornare i dati in Zope quando le modifiche vengono salvate
Quindi vediamo passo passo come lavora:
- Tu clicchi sul collegamento all'external editor (l'icona matita) nella interfaccia di sviluppo ZMI (anche in Plone - ndt).
- Il codice del prodotto nel server genera una risposta che incapsula i meta-dati necessari (URL, meta-tipo, tipo-contenuto, cookie, etc) ed il contenuto dell'oggetto Zope che può essere in formato testo o binario. La risposta ha il tipo (contrived content-type) "application/x-zope-edit".
- Il browser riceve la richiesta e trova la tua applicazione aiuto registrata per "application/x-zope-edit". Salva i dati della risposta nel disco locale e impegna l'applicazione aiuto a processarli.
- L'applicazione aiutante legge il file di configurazione e poi il file (con i dati risposti). I meta-dati del file sono interpretati ed il contenuto viene copiato in un nuovo file temporaneo. L'applicazione appropriata viene determinata in base ai dati del file ad alla configurazione (o, alternativamente, chiedendo all'utente).
- L'applicazione viene lanciata come sotto-processo dell'applicazione di aiuto passandogli il file contenente i dati del contenuto (originale - ndt).
- Se così configurato, l'applicazione aiuto invia una richiesta di blocco WebDAV di ritorno a Zope per bloccare l'oggetto.
- Altrettanto spesso (se così configurato), l'applicazione di aiuto controlla il file del contenuto per vedere se è stato modificato. Se così è. essa ritorna a Zope una richiesta HTTP "PUT" contenente i nuovi dati.
- Quando l'applicazione viene chiusa il file viene controllato ancora una volta e caricato se è cambiato. Poi viene inviata una richiesta di sblocco WebDAV a Zope.
- L'applicazione di aiuto esce.
Configurazione
L'applicazione di aiuto supporta svariate opzioni di configurazione ognuna delle quali può essere regolata in qualsiasi combinazione con i meta-tipi dell'oggetto, il tipo di contenuto o il dominio. Questo permette di creare le caratteristiche appropriate per i differenti tipi di oggetti e di contenuti Zope o anche in base a server differenti. Il file di configurazione è immagazzinato nel file "~/.zope-external-edit" (Unix) oppure in "~ZopeEdit.ini" (Windows). Se non viene trovato nessun file di configurazione, quando l'applicazione di aiuto parte, un file di default verrà creato nella tua home directory.
Il file di configurazione segue il formato standard ConfigParser di Python che è molto simile al vecchio file di configurazione .ini di windows. Il file consiste di sezioni ed opzioni nel seguente formato:
[sezione 1] opzione1 = valore opzione2 = value [sezione 2] ...
Opzioni
Le opzioni disponibili per ogni sezione del file di configurazione sono:
- editor
- Comando in linea o nome del plugin usato per invocare l'applicazione. In Windows, se non viene trovata alcuna impostazione per l'oggetto che vuoi modificare, l'applicazione di aiuto cercherà il file di registro dei tipi per un editor appropriato basandosi sul tipo di contenuto o all'estensione dell'oggetto (che può essere specificata usando l'opzione di estensione spiegata sotto). Per default l'indirizzo del file che sta per essere modificato viene aggiunto a questa riga di comando. Per inserire l'indirizzo in mezzo al tuo comando usa rispettivamente "$1" in Unix e "%1" in Windows.
- save_interval
- (float) L'intervallo in secondi tra ogni controllo dell'applicazione di aiuto delle eventuali modifiche effettuate al file.
- use_locks
- (1 o 0) Uso del bloccaggio WebDAV. L'utente che vuole modificare deve avere i permessi relativi perchè questo funzioni.
- always_borrow_locks
- (1 or 0) Quando è abilitato use_locks questa opzione sopprime gli avvisi quando provi a modificare un oggetto che hai già bloccato. Quando abilitata, l'applicazione esterna considererà sempre il blocco esistente piuttosto che fare un bloccaggio essa stessa. Questo è particolarmente utile quando per esempio si usa CMFStaging. Se omessa il default è 0.
- cleanup_files
- (1 or 0) Cancellazione del file temporaneo creato. ATTENZIONE il file temporaneo che arriva dal browser contiene le informazioni di autenticazione e qualora questa opzione sia impostata a 0 questo è un rischio per la sicurezza soprattutto per le macchine condivise. Se è impostata a 1, quel file verrà cancellato alla prima occasione, anche prima che l'applicazione sia chiusa. Impostalo a 0 solo per il debug.
- extension
- (text) L'estensione del file da aggiugere al nome del file contenuto. Consente la miglior manipolazione di immagini e l'evidenziazione della sintassi.
- temp_dir
- (path) Indirizzo di dove immagazzinare le copie locali dell'oggetto che sarà modificato. L'impostazione di default è la cartella temp del sistema operativo.
Sezioni
Le sezioni del file di configurazione specificano i tipi di oggetti e di contenuto a cui saranno applicate le opzioni.
L'unica sezione obbligatoria è la sezione [general], che può definire tutte le opzioni descritte che non abbiano un valore dei default. Se nessuna sezione definisce una opzione per un dato oggetto verranno usate le impostazioni "general".
Per particolari domini possono essere aggiunte ulteriori sezioni, tipi di contenuto o meta-tipi. In modo che quando gli oggetti avranno tutte quelle proprietà le opzioni saranno applicate nell'ordine indicato.
- [content-type:text/html]
- Le opzioni per un content-type completo vengono prima
- [content-type:text/*]
- Le opzioni per un tipo principale (major content-type) vengono dopo.
- [meta-type:File]
- Le opzioni per il meta-tipo Zope sono al terzo posto.
- [domain:www.mydomain.com]
- Seguono le opzioni per i domini. Se interessa possono essere aggiunte svariate sezioni per ogni livello di dominio.
- [general]
- Le opzioni generali sono alla fine.
Questo schema ti permette di specificare per ogni oggetto dato una estensione per tipo di contenuto, l'applicazione per meta-tipo, le opzioni di blocco e le altre opzioni nelle opzioni generali.
Plugin dell'applicazione
Per una stretta integrazione lato-client l'external editor utilizza un sistema a plugin che gli consente di interagire direttamente con le applicazioni supportate.
In Windows questo significa generalmente usare COM per invocare l'applicazione, aprire il file dei contenuti ed attendere che l'utente salvi o chiuda il file. Poichè ogni applicazione ha differenti possibilità di scripting da remoto e differenti API, devono essere utilizzati specifici plugin disegnati per ciascuna applicazione e piattaforma.
Questo sistema permette all'external editor di connettersi in modo efficente con le applicazioni attive senza dover rilanciarle e con il completo supporto dell'ambiente MDI. Le seguenti applicazioni hanno attualmente il plugin di supporto
Applicazione Piattaforma Nomi dei moduli plugin =================================================== HomeSite Windows homesite5, homesite Photoshop Windows photoshp, photoshop MS Word Windows winword, word MS Excel Windows excel MS Powerpoint Windows powerpnt, powerpoint
L'external editor tenterà di leggere il plugin per ogni applicazione prima di utilizzare il metodo di controllo degli editor generale. Questo lo fa confrontando il nome del file eseguibile dell'applicazione (senza estensione) della linea di comando dell'applicazione con i plugin disponibili.
Siccome i plugin non necessitano per funzionare del path dell'applicazione, se desideri puoi semplicemente specificare il nome del modulo nel file di configurazione. Per esempio, per specificare Photoshop come visualizzatore di tutti i file immagini, aggiungi le seguenti sezioni al tuo file di configurazione (in Windows ZopeEdit.ini):
[content-type:image/*] editor=photoshop
Questa è una scorciatoia e specificando l'intero path dell'applicazione userà sempre il plugin dove possibile.
Plugin Notes
Photoshop
Photoshop's COM API is quite limited, and external editor cannot detect that you have closed a file until you exit the entire application (it can still detect saves). Therefore you may want to turn off DAV locking (use_locks=0) or borrow locks (always_borrow_locks=1) when using it.
If your favorite editor needs a plugin because the general support is not good enough, please let me know. Keep in mind that I must be able to run a copy of the application in order to develop a plugin for it. So, unless the application is free, or a full demo is available for download I won't be able to help much. Plugins are not difficult to write, and I encourage you to write one for your favorite editor, start by reading one of the existing ones. I am happy to include third-party plugins with the distribution.
Permessi
Le modifiche tramite l'external editor sono sottoposte al permesso "Use external editor". gli utenti con questo permesso potranno lanciare l'applicazione esterna per gli oggetti modificabili. Per salvare le modifiche egli deve avere gli ulteriori appropriati permessi per l'oggetto che sta modificando.
Se l'utente desidera utilizzare il sistema di blocco precostruito, egli deve avere i permessi "WebDAV access", "WebDAV Lock items" e "WebDAV Unlock items" per gli oggetti che sta modificando.
Se questi permessi non sono configurati in Zope l'applicazione di aiuto riceverà gli errore di "non autorizzazione" da Zope che saranno resi all'utente.
Integrazione dell' External Editor
Il prodotto External Editor installa in Zope un oggetto completamente disponibile che può formattare oggetti accessibili tramite FTP/DAV per usarli con l'applicazione di aiuto (esterna - ndt). Puoi approfittare di questa funzionalità facilmente all'interno delle tue applicazioni di gestione dei contenuti.
Pensa di avere un oggetto "documento" modificabile via FTP in una cartella Zope chiamata "cose_mie". L'Url a cui vedere l'oggetto sarà:
http://zopeserver/cose_mie/documento
L'indirizzo dove rintracciare l'applicazione esterna di questo documento sarà:
http://zopeserver/cose_mie/externalEdit_/documento
Ora questo ti sembrerà alquanto singolare se sei abituato ad aggiungere 'views' alla fine della URL. Siccome externalEdit_`è necessario per lavorare con gli Script Python e con i modelli di pagina (Page Template), che girano la rimanente parti della Url facendo seguire se stessi (il proprio nome ???), devi mettere la chiamate a `externalEdit_ proprio prima dell'oggetto da modificare. Puoi far questo in uno ZPT usando un po' di TAL in un modello come segue:
<a href='edit'
attributes='href
string:${here/aq_parent/absolute_url}/externalEdit_/${here/getId}'>
Modifica localmente
</a>
In alternativa puoi anche passare il path dell'oggetto che vuoi modificare direttamente all'oggetto externalEdit_ quando chiami il suo metodo 'index_html'. Può essere chiamato anche direttamente dalla URL o da uno script Python. L' externalEdit_ ritornerà i dati esatti per l'oggetto da modificare come risposta. Seguono alcuni esempi:
http://zopeserver/externalEdit_?path=/cose_mie/documento
return context.externalEdit_.index_html(
context.REQUEST, context.RESPONSE, path='/cose_mie/documento')
Utilizzando una applicazione esterna con un CMS che utilizza il blocco DAV, gli utenti potranno mantenere per default il blocco fatto sul server dopo aver visualizzato un box con un dialogo di conferma. Anche se puoi farlo fare automaticamente specificando always_borrow_locks = 1 nel file di configurazione dell'External Editor, sarebbe preferibile impostarla come caratteristica di default usando quel server. Per facilitare questo puoi specificare che i bloccaggi siano automaticamente conservati nalla URL (Novità 0.7):
http://zopeserver/cose_mie/externalEdit_/documento?borrow_lock=1
L'external Editor definisce anche un metodo globale che puoi chiamare per inserire il collegamento icona matita per l'oggetto appropriato. Il metodo controlla automaticamente se l'oggetto supporta la modifica esterna ed anche se l'utente ha il permesso "Use external editor" per quell'oggetto. Se le due cose sono vere ritorna il codice HTML che inserisce l'icona di collegamento dell'applicazione esterna. Altrimenti ritorna una stringa vuota.
Il metodo è 'externalEditLink_(object)'. L'argomento 'object' è l'oggetto con cui creare il collegamento appropriato. Qui c'è qualche esempio di codice per un modello di pagina che inserisce collegamenti a oggetti nella cartella corrente e l'icona dell'applicazione esterna dove appropriato:
<div tal:repeat="object here/objectValues">
<a href="#"
tal:attributes="href object/absolute_url"
tal:content="object/title_or_id">Titolo oggetto</a>
<span tal:replace="structure python:here.externalEditLink_(object)" />
</div>
Conclusion
I hope you enjoy using this software. If you have any comments, suggestions or would like to report a bug, send an email to the author:
Casey Duncan
(c) 2003, Casey Duncan and Zope Corporation. All rights reserved.
Created by Caseman. Last modified on 2003/04/01.