Viste browser in stile Zope 3
medio
Le viste browser sono analoghe alle page template (i file .pt) degli skin layers. Tuttavia, sono registrati in ZCML per un particolare tipo di contesto. Ecco un esempio, da plone.app.content.browser:
<browser:page
for="*"
class=".reviewlist.FullReviewListView"
name="full_review_list"
template="full_review_list.pt"
permission="cmf.ReviewPortalContent" /> Ciò ci dice che la vista è chiamata @@full_review_list (il disambiguatore @@ non è strettamente necessario, ma rende chiaro il fatto che si tratta di una vista e non, per esempio, di un elemento di contenuto). E' disponibile per gli utenti che hanno il permesso di Revisionare i contenuti del portale, e per qualsiasi contesto (for="*"). L'implementazione è eseguita in una classe chiamata FullReviewListView in reviewlist.py nella directory corrente, che è implicitamente riscritta da una template chiamata full_review_list.pt.
Un modo di personalizzare ciò che abbiamo visto è di fare un overriding per un contesto più specifico (o differente). Il contesto "*" è il più generale (ciò significa zope.interface.Interface). Se avessimo una nostra implementazione per una pagina standard (identificata dall'interfaccia Products.ATContentTypes.interface.document.IATDocument), potremmo far ciò con la seguente dichiarazione nel ZCML del nostro pacchetto:
<browser:page
for="Products.ATContentTypes.interface.document.IATDocument"
class="plone.app.content.browser.reviewlist.FullReviewListView"
name="full_review_list"
template="document_full_review_list.pt"
permission="cmf.ReviewPortalContent" /> Abbiamo scelto in quest'esempio di usare il layer di default (ovvero, non abbiamo specificato un layer), ma un tipo di contesto nuovo (l'attributo for, che si riferisce al tipo di contesto in questione). Avremmo potuto inserire una nuova classe (o nessuna), ma qui usiamo la classe di visualizzazione di default da plone.app.content. Da notare che abbiamo convertito il path del modulo da relativo ad assoluto, dato che ora ci troviamo in un pacchetto diverso! Cambiamo il template, che di nuovo è relativo alla directory in cui il file ZCML è stato trovato. Avremmo potuto scegliere di usare solo una classe, o solo un template, se avesse avuto più senso.
Alternativamente, potremmo effettuare queste modifiche con i layer (e così assicurarci che la customizzazione abbia effetto solo quando il prodotto è installato). Ecco un altro esempio, questa volta rimpiazziamo la visualizzazione di default con una nuova, utilizzando la vecchia classe con un nuovo template.
<browser:page
for="*"
class="plone.app.content.browser.reviewlist.FullReviewListView"
name="full_review_list"
template="standard_full_review_list.pt"
layer=".interfaces.IExampleCustomization"
permission="cmf.ReviewPortalContent" /> Da notare che queste due dichiarazioni possono coesistere. In questo caso, di default si userà standard_full_review_list.pt, ma la visualizzazione in una pagina userà document_full_review_list.pt, dato che è più specifico. Ovviamente, si potrebbero usare entrambi modi - un'operazione di override per un contesto e un layer. Il risultato sarebbe che l'override del contesto sarebbe attivo solo quando il layer viene installato.
Trovare le viste
Dato che le viste sono sparse tra i vari elementi dei pacchetti, può essere a volte difficile identificare da dove provengano. Spesso, fare una ricerca tra i file nei propri egg è una soluzione veloce ma pericolosa. Oppure, puoi anche agire nei seguenti modi:
- Vai in portal_view_customizations nel ZMI, dove troverai viste, viewlet e portlet, raggruppati assieme in base al tipo di contesto. Posiziona il cursore sul titolo della visualizzazione e dovresti vedere il nome di un pacchetto e di un template in un piccolo riquadro.
- Aggiungi /@@zptviews.html al fondo di un particolare URL, per esempio, http://localhost:8080/plone/@@zptviews.html. Ciò mostra le viste (ma non viewlet o portlet) assieme con i loro templates, interfaccia del contesto e file sorgente ZCML.