Override di una classe viewlet
medio
Nelle sezioni precedenti ci si è occupati delle viewlet che hanno un template nella propria definizione. Ma in Plone ci sono parecchie viewlet che hanno una classe Python nella loro definizione invece di un semplice template. Vediamo come personalizzarle.
Le operazioni da compiere non differiscono granché da quanto appreso finora.
Introduzione
Si suppone il lettore capace di trovare la viewlet di cui fare l'override utilizzando la vista @@manage-viewlets mostrata nella sezione precedente. Come esempio si farà l'override della viewlet plone.path_bar, gestita dal viewlet manager plone.portaltop. Questa è la viewlet che genera la barra del percorso di navigazione (conosciuto anche come briciole di pane). In questo caso elimineremo la scritta "Tu sei qui:" dalla viewlet.
Il codice che genera la viewlet
Nel configure.zcml del package plone.app.layout.viewlets questa viewlet è dichiarata così:
<!-- The breadcrumbs --> <browser:viewlet name="plone.path_bar" manager=".interfaces.IPortalTop" class=".common.PathBarViewlet" permission="zope2.View" />
Come si vede, la viewlet è generata da una vista Zope 3 definita nella classe common.PathBarViewlet (mostrata qui sotto) del package plone.app.layout.viewlets.class PathBarViewlet(ViewletBase): render = ViewPageTemplateFile('path_bar.pt') def update(self): portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state') self.navigation_root_url = portal_state.navigation_root_url() self.is_rtl = portal_state.is_rtl() breadcrumbs_view = getMultiAdapter((self.context, self.request), name='breadcrumbs_view') self.breadcrumbs = breadcrumbs_view.breadcrumbs()Per rimuovere la scritta "You are here:" dobbiamo modificare il template richiamato dall'espressione render = ViewPageTemplateFile('path_bar.pt').Personalizzare il template della viewlet
La linea render = ViewPageTemplateFile('path_bar.pt') definisce il template per la viewlet plone.path_bar. Il template path_bar.pt si trova nel package plone.app.layout.viewlets. Questo template deve essere copiato, senza cambiargli il nome, nella cartella browser/ di MyTheme.
Si può ora modificare il template eliminando il testo che non desideriamo:
<div id="portal-breadcrumbs" i18n:domain="plone"> <!-- Commentiamo la parte da rimuovere <span id="breadcrumbs-you-are-here" i18n:translate="you_are_here"> You are here: </span> --> <a i18n:translate="tabs_home" tal:attributes="href view/navigation_root_url">Home</a> <span tal:condition="view/breadcrumbs" class="breadcrumbSeparator"> <tal:ltr condition="not: view/is_rtl">→</tal:ltr> <tal:rtl condition="view/is_rtl">»</tal:rtl> </span> <span tal:repeat="crumb view/breadcrumbs" ... </span> </div>
Ora è sufficiente far sì che la viewlet plone.path_bar usi questo template.Fare l'override della classe che utilizza il template
La dichiarazione di plone.path_bar in lib/python/plone/app/layout/viewlets/configure.zcml usa una classe invece di un semplice template, dobbiamo perciò modificare anche quella. Per fare ciò è sufficiente subclassare la classe di default della viewlet ed effetturare i cambiamenti richiesti per far sì che faccia l'override di quella originale. La sottoclasse PathBarViewlet sarà contenuta nel file viewlets.py in MyTheme/browser/:
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from plone.app.layout.viewlets import common class PathBarViewlet(common.PathBarViewlet): """A custom version of the path bar class """ render = ViewPageTemplateFile('path_bar.pt')La sola cosa di cui si fa l'override è il template path_bar.pt, già modificato in MyTheme/browser/. Qualora servisse, potremmo modificare più profondamente la classe. Ora che abbiamo la nostra classe e template personalizzati possiamo registrare queste modifiche in MyTheme/browser/configure.zcml.Registrare la viewlet personalizzata in configure.zcml
Per registrare la nuova classe con la viewlet plone.path_bar si può semplicemente copiare il codice ZCML da lib/python/plone/app/layout/viewlets/configure.zcml in MyTheme/browser/configure.zcml e modificarlo assicurandosi che utilizzi la classe e l'interfacccia giusti per il manager e lo skin layer Zope 3:
<!-- The customized breadcrumbs --> <browser:viewlet name="plone.path_bar" manager="plone.app.layout.viewlets.interfaces.IPortalTop" class=".viewlets.PathBarViewlet" layer=".interfaces.IThemeSpecific" permission="zope2.View" />Il significato di layer=".interfaces.IThemeSpecific" è stato spiegato nel precedente capitolo e name e permission rimagono gli stessi della dichiarazione originale della viewlet, sebbene convenga usare un altro name per rendere evidente che questa non è la viewlet standard, ad esempio "MyTheme.path_bar". Come manager utilizziamo il percorso dell'interfaccia IPortalTop implementata dal viewlet manager plone.portaltop. La parte principale della modifica consiste nell'uso come class di quella modificata in MyTheme/browser/viewlets.py.Punto facoltativo (Solo se si è cambiato il nome per la viewlet nello ZCML)
Se si è cambiato il nome della viewlet in "MyTheme.path_bar" viene creata una nuova viewlet che deve essere registrata nel profilo di Generic Setup; per evitare di avere le briciole di pane raddoppiate bisogna nascondere la viewlet plone.path_bar originale (come spiegato nelle sezioni precedenti).
Fine
Ora è possibile riavviare Zope e, se non è stato ancora installato il tema, lo si può fare Configurazione del sito > Prodotti aggiuntivi
Finalmente non dovrebbe più esserci la scritta "Tu sei qui:".
