Le interfacce e la loro importanza
Up one level
Interfacce come Marcatori
Gli attributi ZCML spesso si riferiscono ad interfacce piuttosto che a vere e proprie classi – l'esempio riportato qui sotto mostra come collegare la presentation viewlet per content types aventi un'interfaccia IATDocument.
<browser:viewlet
name="plone.presentation"
for="Products.ATContentTypes.interface.IATDocument"
manager="plone.app.layout.viewlets.interfaces.IAboveContentBody"
class=".presentation.PresentationViewlet"
permission="zope2.View"
/>
In questo esempio si nota appunto che la presentation viewlet è disponibile per ogni content type che assomigli ad un documento AT o che si comporti come tale (ovvero è disponibile per tutti quelle classi che implementano l'interfaccia IATDocument n.d.r.). Di conseguenza in questo caso l'interfaccia svolge la funzione di marcatore.
Il vantaggio di tutto ciò è che un content type ha la possibilità di avere una o più interfacce, e che più content types possono condividere una stessa interfaccia. Se si sviluppa un nuovo content type e lo si marca con l'interfaccia IATDocument sarà possibile far uso di questa presentation viewlet con l'interfaccia, senza bisogno di ulteriori collegamenti.
Componenti e Interfacce
È possibile marcare i componenti stessi con un'interfaccia – il termine tecnico è “provides”. Da notare che nell'esempio della presentation viewlet ci si riferisce al viewlet manager tramite la sua interfaccia, non il suo nome.
manager="plone.app.layout.viewlets.interfaces.IAboveContentBody"
Per rintracciare il componente esatto, controllare nel file configure.zcml nella stessa directory delle interfacce. Ad esempio, in plone/app/layout/viewlets/configure.zcml è possibile vedere che l'interfaccia è stata collegata ad una classe Python così da creare un componente viewlet manager:
Come riconoscere un'interfaccia
In genere è abbastanza semplice riconoscere un riferimento ad un'interfaccia, in quanto i loro nomi sono per convenzione preceduti da una “I” e si trovano in un'interfaccia o in namespace di interfacce. Se si ricercano i file interfaces.py o interface.py in ogni egg o prodotto non si troverà all'interno dei file molto codice, ma ci si imbatterà spesso in utili informazioni – di fatto si tratta di una documentazione su cosa un componente, marcato da tale interfaccia è in grado di fare.
Ad esempio:
class IAboveContentBody(IViewletManager):
"""A viewlet manager that sits above the content body in view templates """
Usando il template di paster plone3_theme ci si accorgerà che c'è un file interfaces.py già pronto a cui si possono aggiungere le proprie interfacce qualora lo si desiderasse.
