Plone: Zope3 Viewlets
Was sind Viewlets?
Viewlets sind kleine Snipsel von Funktionen und Templates. Sie können statische Templates oder auch Funktionalitäten enthalten. Viewlets können in Plone für sortierbare ViewletManager registriert und dort angezeigt werden.
Plone Viewlets und ViewletManager
Die vorhandenen Viewlets und Viewletmanager können gut mit der in Plone eingebauten @@manage-viewlets View untersucht werden. In einem gewissen Rahmen können dort auch Veränderungen vorgenommen werden. So können z.B. Viewlets aus oder eingeblendet und innerhalb eines ViewletsManagers umgeordnet werden. Diese Aktionen können aber auch wie unten zu sehen, per GenericSetup in der viewlets.xml konfiguriert werden.
Viewlet code
from plone.app.layout.viewlets.common import ViewletBase class ExampleViewlet(ViewletBase): def update(self): """ """ self.id = self.context.id
Viewlet page template
Als Page Template braucht es nicht viel, jeder ZPT Schnipsel ohne komplettes XHTML-Gerüst reicht. Das Viewlet wird immer in einem anderen Template gerendert und benötigt daher kein eigenes Grundgerüst.
Hier mal ein Beispiel:
<ul id="enl_actions" i18n:domain="EasyNewsletter"> <li><a tal:attributes="href string:${view/enl_url}/easynewsletter_view" i18n:translate="">Archive</a></li> <li><a tal:attributes="href string:${view/enl_url}/enl_drafts_view" i18n:translate="">Drafts</a></li> <li><a tal:attributes="href string:${view/enl_url}/enl_subscribers_view" i18n:translate="">Subscribers</a></li> </ul>
Damit die Lokalisierung funktioniert muss hier die i18n:domain gesetzt werden.
Viewlet per zcml registrieren
<browser:viewlet name="derico.viewlet_example" manager="plone.app.layout.viewlets.interfaces.IBelowContent" template="viewlet_example.pt" layer="derico.viewlet_example.interfaces.IAddOnInstalled" permission="zope2.View" />
Viewlet per GenericSetup konfigurieren
In der Datei viewlets.xml kann man wie folgt die Viewlets konfiguerieren.
<?xml version="1.0"?> <object> <order manager="plone.belowcontent"> <viewlet name="derico.viewlet_example" insert-before="*" /> </order> </object>
Reihenfolge der Viewlets festlegen
<?xml version="1.0"?> <object> <order manager="plone.belowcontent"> <viewlet name="derico.viewlet_example" insert-before="*" /> <viewlet name="derico.viewlet_example2" insert-after="plone.belowcontenttitle.keywords" /> </order> </object>
Viewlets ein- und ausblenden
<?xml version="1.0"?> <hidden manager="plone.portalheader" skinname="*"> <viewlet name="plone.global_sections" /> </hidden>
<?xml version="1.0"?> <object> <hidden manager="plone.portalheader" skinname="*" purge="True" /> </object>
Eigenen Viewletmanager definieren
Wenn man das Viewlet nicht in die bestehenden Viewletmanager von Plone einhängen möchte, kann man sich selbst, in einem Template einen content provider definieren und einen Viewletmanager hierfür definieren.
from zope.viewlet.interfaces import IViewletManager class IExampleViewletmanger(IViewletManager): """ A viewlet manager that sits in the template and render the viewlets """
In einem Template kann man für den Viewletmanager wie folgt einen Platzhalter definieren. Hier werden die Viewlets dann eingefügt.
<div tal:replace="structure provider:derico.example_viewletmanager" />
Eigenen Viewletmanager registrieren
<browser:viewletManager name="derico.exampleviewlet" provides=".manager.IExampleViewletmanager" permission="zope2.View" class="plone.app.viewletmanager.manager.OrderedViewletManager" />