Direkt zum Inhalt | Direkt zur Navigation

Benutzerspezifische Werkzeuge

Sie sind hier: Startseite / Tech-Blog / Plone: Zope3 Viewlets

Plone: Zope3 Viewlets

Seit Plone3 finden Zope3-Viewlets immer häufiger Verwendung in Plone. Im folgenden wird gezeigt, wie ein eigenes Viewlet erstellt und dieses an die gewünschte Stelle in Plone eingebaut werden kann.

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"
 />
abgelegt unter: ,