Portlet mit Site Actions erstellen
Für dieses Portlet erstellen wir ein Unterpaket entsprechend den Konventionen in plone.app.portlets. Für unser Site-Actions-Portlet wird das Page Template siteactions.pt im Ordner portlets erstellt:
<dl class="portlet portletSiteActions" i18n:domain="vs.theme"> <dt class="portletHeader"> <span class="portletTopLeft"></span> Site Actions <span class="portletTopRight"></span> </dt> <tal:actions tal:define="accesskeys python: {'sitemap' : '3', 'accessibility' : '0', 'contact' : '9'};" tal:condition="view/site_actions"> <dd class="portletItem" tal:repeat="saction view/site_actions" tal:attributes="id string:siteaction-${saction/id}"> <a href="" tal:define="title saction/title; id saction/id; accesskey python: accesskeys.get(id, '');" i18n:attributes="title" i18n:translate="" tal:content="title" tal:attributes="href saction/url; target saction/link_target|nothing; title title; accesskey accesskey;" >Site action</a> </dd> </tal:actions> </dl>
Dies entspricht dem Aufbau der meisten Plone-Portlets. Dabei ist die Darstellungslogik, welche siteactions angezeigt werden, in den View siteactions.py ausgelagert worden.
Auch der Aufbau von siteactions.py entspricht der üblichen Konvention. Zunächst wird einiges importiert, darunter auch das base-Modul von plone.app.portlets, das verschiedene Basisklassen wie Assignment und Renderer zum Erstellen eines neuen Portlets bereitstellt:
from zope import schema from zope.component import getMultiAdapter from zope.formlib import form from zope.interface import implements from plone.app.portlets.portlets import base from plone.portlets.interfaces import IPortletDataProvider from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile from vs.theme import VsThemeMessageFactory as _ class ISiteActionsPortlet(IPortletDataProvider): """A portlet which shows the available site actions. """ class Assignment(base.Assignment): implements(ISiteActionsPortlet) @property def title(self): return _(u"Site actions") class Renderer(base.Renderer): render = ViewPageTemplateFile('siteactions.pt') title = _('box_siteactions', default=u"Site actions") def site_actions(self): context_state = getMultiAdapter((self.context, self.request), name=u'plone_context_state') self.siteactions = context_state.actions('site_actions') return self.siteactions
Schließlich werden noch Klassen für AddForm definiert, die Nutzern das Erstellen des Site-Action-Portlets erlauben:
class AddForm(base.NullAddForm): form_fields = form.Fields(ISiteActionsPortlet) label = _(u"Add Site Actions Portlet") description = _(u"This portlet lists the available site actions.") def create(self): return Assignment()
Konfigurieren und Registrieren neuer Portlet-Typen
Um neue Portlet-Typen zu konfigurieren, wird die Datei portlets/configure.zcml mit folgendem Inhalt erstellt:
<configure xmlns="http://namespaces.zope.org/zope" xmlns:plone="http://namespaces.plone.org/plone"> <include package="plone.app.portlets" /> <plone:portlet name="vs.theme.SiteActionsPortlet" interface=".siteactions.ISiteActionsPortlet" assignment=".siteactions.Assignment" renderer=".siteactions.Renderer" addview=".siteactions.AddForm" /> </configure>
Damit werden einige Hilfsmethoden, Adapter und Views registriert, Und falls Sie ein editierbares Portlet erstellen wollen, können Sie das editview-Attribut hinzufügen und statt NullAddForm die AddForm-Klasse angeben. Ein solches Portlet ist beschrieben in Portlet erstellen.
Registrieren von Portlets
Ab Plone 3.1 muss das Portlet zusätzlich in src/vs.theme/vs/theme/profiles/default/portlets.xml angegeben werden:
<?xml version="1.0"?> <portlets> <portlet addview="vs.theme.SiteActionsPortlet" title="Site Actions" description="A portlet which can show the available site actions." /> </portlets>
Dabei entspricht die Angabe für addview dem Namen des Portlets, der in portlets/configure.zcml angegeben wurde.