Bookmark and Share
Document Actions

Registrazione delle viewlet in Plone 3.0
medio

Come registrare le viewlet in una installazione standard di Plone

Così come tutti i template di Plone 3 che generano codice HTML da componenti Zope 3, anche il main template non richiama direttamente le viewlet bensì i viewlet manager.

Il vantaggio di questo approccio è che ora si possono gestire le varie sezioni delle pagine di Plone senza modificare il main_template.pt.

I viewlet manager del main_template.pt e le relative viewlet sono definite nel package plone.app.layout, nel modulo viewlets. Questo package, presente in ogni installazione di Plone, si trova in $INSTANCE_HOME/lib/python/plone/app/layout/.

Nel file configure.zcml del modulo viewlets ($INSTANCE_HOME/lib/python/plone/app/layout/viewlets/configure.zcml) vi sono le definizioni dei viewlet manager, seguite dalla registrazione delle loro viewlets.

Per esempio il viewlet manager plone.portaltop fornisce l'interfaccia IPortalTop:

<browser:viewletManager
    name="plone.portaltop"
    provides=".interfaces.IPortalTop"
    permission="zope2.View"
    class="plone.app.viewletmanager.manager.OrderedViewletManager"
    />

IPortalTop è un'intefaccia marker (marcatore) per i componenti che gestiscono le viewlet plone.header, plone.personal_bar e plone.path_bar.

Nella dichiarazione di browser:viewlet vengono definite le associazioni tra le viewlet e i viewlet manager, per esempio:

<!-- The portal header -->
<browser:viewlet
  name="plone.header"
  manager=".interfaces.IPortalTop"
  template="portal_header.pt"
  permission="zope2.View"
  />

...

<!-- The personal bar -->
<browser:viewlet
    name="plone.personal_bar"
    manager=".interfaces.IPortalTop"
    class=".common.PersonalBarViewlet"
    permission="zope2.View" 
    />

<!-- The breadcrumbs -->
<browser:viewlet
    name="plone.path_bar"
    manager=".interfaces.IPortalTop"
    class=".common.PathBarViewlet"
    permission="zope2.View" 
    />

Da questo ZCML si nota che la definizione della viewlet plone.header richiama direttamente un template (portal_header.pt), mentre le altre viewlet gestite da IPortalTop sono associate a classi.

In quel template vi è semplicemente la chiamata di un altro viewlet manager, il plone.portalheader:

<div id="portal-header">
    <div tal:replace="structure provider:plone.portalheader" />
</div>

Sempre dal configure.zcml si può notare che plone.portalheader, che implementa l'interfaccia IPortalHeader, gestisce le viewlet plone.skip_links, plone.site_actions, plone.searchbox, plone.logo e plone.global_sections.

Tutte le viewlet elencate finora sono associate con le classi Python definite in plone/app/layout/viewlets/common.py. Queste classi sono delle viste browser di Zope 3 che implementano zope.viewlet.interfaces.IViewlet: ciò significa che hanno un metodo render() che genera i pezzi di codice HTML, i quali saranno inseriti nella pagina.

Si può inoltre notare nel configure.zcml che tutti i viewlet manager sono istanze di OrderedViewletManager (definita in manager.py in plone.app.viewletmanager). Questo significa che le viewlet saranno richiamate con un ordine specifico.

L'ordine delle viewlet è definita in una utility che implementa IViewletSettingsStorage.
Questa utility memorizza l'ordine delle viewlet di un viewlet manager per uno specifico skin. La sua configurazione è demandata ad un profilo di Generic Setup chiamato viewlets.xml.

Per lo skin di default di Plone, l'ordine delle viewlet è definito in Products/CMFPlone/profiles/default/viewlets.xml:

<?xml version="1.0"?>
<object>
    <order manager="plone.portaltop" skinname="Plone Default">
        <viewlet name="plone.header" />
        <viewlet name="plone.personal_bar" />
        <viewlet name="plone.app.i18n.locales.languageselector" />
        <viewlet name="plone.path_bar" />
    </order>
    <order manager="plone.portalheader" skinname="Plone Default">
        <viewlet name="plone.skip_links" />
        <viewlet name="plone.site_actions" />
        <viewlet name="plone.searchbox" />
        <viewlet name="plone.logo" />
        <viewlet name="plone.global_sections" />
    </order>
</object>

Ora che sappiamo come Plone 3.0 imposta i viewlet manager e le relative viewlet per lo skin Plone Default, possiamo vedere come personalizzare tale configurazione sia per lo skin di default che per uno nuovo con un prodotto Python nel filesystem.

Nei seguenti paragrafi si farà riferimento ad un prodotto chiamato MyTheme. Si può sostituire MyTheme con il nome del prodotto Python che si vuole sviluppare.

Nota

Per generare velocemente un prodotto per uno skin per Plone 3.0 (un prodotto Python da mettere nella cartella Products dell'istanza Zope), si può utilizzare lo script generator di DIYPloneStyle (da svn trunk fino a che non esce la version 3.0). Se invece si desidera creare velocemente un python egg o un package da installare in $INSTANCE_HOME/lib/python/ o altrove nel path del Python, si può usare il template plone3_theme di ZopeSkel (da svn trunk).

 
by Fabrizio Reale last modified 2008-12-12 17:04