Bookmark and Share
Document Actions

Layer di tipo browser
medio

Customizzazione in stile Zope 3

Quando Zope 3 fu progettato, molti elementi importati dal CMF vi sono stati incorporati e la tecnologia è stata raffinata. L'idea di un unico, globale namespace in cui la customizzazione era possibile solo attraverso l'id è stata soppiantata dalla nozione di risorse identificate da una nome, che vengono registrate per un tipo di contesto (così che la vista @@view richiamata su una pagina appare in modo differente rispetto alla vista con lo stesso nome richiamata su una cartella, per esempio), e possibilmente registrate per un layer di tipo browser. Un layer di tipo browser Zope 3 è simile in quanto a scopo a uno skin layer del CMF, ma è implementato in modo diverso.

Un layer di tipo browser non è altro che un'interfaccia marcatore applicata alla request mediante attraversamento. Una risorsa di tipo browser Zope 3 è flessibile e adattabile a seconda del contesto e della request, e quando una request è marcata con una particolare interfaccia, il Component Architecture può trovare un adapter specifico in una visualizzazione registrata in quel layer particolare. Se tutto ciò ti sembra non abbia molto senso, non ti preoccupare. Ciò che ti serve sapere è:

  • Definiamo un'interfaccia marcatore (ovvero una semplice classe, senza corpo, derivata da zope.interface.Interface) che rappresenta il layer di tipo browser.
  • Ci assicuriamo che l'interfaccia sia applicabile al request automaticamente, in modo che attivi il layer browser nel nostro sito.
  • Registriamo (usando ZCML) le risorse di tipo browser, le visualizzazioni, i viewlets e i portlets per questo nuovo layer, lasciando che si sovrascrivano a quelle di default (che sono implicitamente registrate per il layer di tipo browser di default).

In Plone ci sono due modi principali con cui attivare un'interfaccia layer di tipo browser personalizzata. Il primo è usare i meccanismo di plone.theme. Questo pacchetto, distribuito con Plone di default, ci permette di collegare un layer di tipo browser con un tema particolare (una skin) in portal_skins (da non confondere con uno skin layer). Quando il tema viene attivato in portal_skin, il layer è abilitato. Ciò è utile per prodotti che installano un intero nuovo tema in Plone. E' invece meno utile per prodotti generici, dato che viene attivato solo un plone.theme alla volta. L'importante è che l'installazione del layer sia cumulabile, in modo da poter installare una qualsiasi quantità di prodotti, ognuno con il suo proprio layer.

Per far ciò, bisogna utilizzare il pacchetto plone.browserlayer. Non fa parte di Plone 3.0 (ma le sue funzionalità faranno parte di Plone 3.1). Perciò, bisogna installarlo assieme al resto.

Dato che example.customization è un prodotto egg-based, possiamo ottenere plone.browserlayer semplicemente richiedendolo in setup.py. Ciò è possibile modificando la definizione install_requires in quel file:

install_requires=[
'setuptools',
'plone.browserlayer',
],

In questo modo, il buildout (o easy_install) scaricherà e installerà plone.browserlayer from PyPI.

Dobbiamo anche installare plone.browserlayer come prodotto. In assenza del supporto per le dipendenze di GenericSetup (pianificato per Plone 3.1), possiamo farlo usando un file Extensions/Install.py all'interno del nostro prodotto, con il seguente codice:

import transaction
from Products.CMFCore.utils import getToolByName

PRODUCT_DEPENDENCIES = ('plone.browserlayer',)

EXTENSION_PROFILES = ('example.customization:default',)

def install(self, reinstall=False):
portal_quickinstaller = getToolByName(self, 'portal_quickinstaller')
portal_setup = getToolByName(self, 'portal_setup')

for product in PRODUCT_DEPENDENCIES:
if reinstall and portal_quickinstaller.isProductInstalled(product):
portal_quickinstaller.reinstallProducts([product])
transaction.savepoint()
elif not portal_quickinstaller.isProductInstalled(product):
portal_quickinstaller.installProduct(product)
transaction.savepoint()

for extension_id in EXTENSION_PROFILES:
portal_setup.runAllImportStepsFromProfile('profile-%s' % extension_id, purge_old=False)
product_name = extension_id.split(':')[0]
portal_quickinstaller.notifyInstalled(product_name)
transaction.savepoint()

In questo modo, plone.browserlayer ("Local browser layer support") sarà installato quando viene installato example.customization.

 
by Fabrizio Reale last modified 2008-02-04 18:31
Contributors: Alice Narduzzo