Portlet-Manager hinzufügen
Zunächst wird ein Viewlet erstellt, das auf einen Portlet-Manager verweist – in unserem Fall vs.abovecontentportlets – und für den Viewlet-Manager IContentViews registriert wird. Anschließend wird dieser Viewlet-Manager und anschließend noch ein Management-View für diesen erstellt.
Viewlet erstellen
Fügen Sie in browser/templates die Datei abovecontentportlets.pt mit folgendem Inhalt hinzu:
<tal:block replace="structure provider:vs.abovecontentportlets" />
Dieses Viewlet wird nun registriert in browser/configure.zcml:
<browser:viewlet
name="vs.abovecontentportlets"
manager="plone.app.layout.viewlets.interfaces.IContentViews"
layer=".interfaces.IThemeSpecific"
template="templates/abovecontentportlets.pt"
permission="zope2.View"
/>
Browserlayer registrieren
Das Viewlet steht nur zur Verfügung sofern das Interface IThemeSpecific in der Site zur Verfügung steht. Durch das plone3_theme-Template sollte dieses Marker-Interface bereits in browser/interfaces.py erstellt worden sein:
from plone.theme.interfaces import IDefaultPloneLayer
class IThemeSpecific(IDefaultPloneLayer):
"""Marker interface that defines a Zope 3 browser layer.
If you need to register a viewlet only for the
"vs.theme" theme, this interface must be its layer.
"""
Nun wird dieses Interface als paketspezifischer Browserlayer registriert in profiles/default/browserlayer.xml:
<?xml version="1.0"?>
<layers>
<layer name="vs.theme.layer"
interface="vs.theme.browser.interfaces.IThemeSpecific" />
</layers>
Dieser Browserlayer steht nun jenen Sites zur Verfügung, in denen dieses Profil importiert wurde.
Portlet-Manager erstellen
Zunächst wird ein Marker-Interface in browser/interfaces.py erstellt:
from plone.portlets.interfaces import IPortletManager
class IVsAboveContent(IPortletManager):
"""Portlet manager above the content area.
"""
Anschließend wird in der Datei profiles/default/portlets.xml der neue Portlet-Manager registriert:
<?xml version="1.0"?>
<portlets>
<portletmanager
name="vs.abovecontentportlets"
type="vs.theme.browser.interfaces.IVsAboveContent"
/>
</portlets>
Erstellen eines Management-Views für den Portlet-Manager
Um die Portlets des vs.abovecontentportlets zu verwalten, wird ein neuer View erstellt und hierfür zunächst folgende Zeilen in browser/configure.zcml eingetragen:
<browser:page
for="plone.portlets.interfaces.ILocalPortletAssignable"
class="plone.app.portlets.browser.manage.ManageContextualPortlets"
name="manage-vsabove"
template="templates/managevsabove.pt"
permission="plone.app.portlets.ManagePortlets"
/>
Und falls nicht bereits zu einem früheren Zeitpunkt geschehen, sollte noch das Paket plone.app.portlets eingeschlossen werden:
<include package="plone.app.portlets" />
Schließlich wird dann noch das Page-Template browser/templates/managevsabove.pt erstellt:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:tal="http://xml.zope.org/namespaces/tal"
xmlns:i18n="http://xml.zope.org/namespaces/i18n"
metal:use-macro="context/main_template/macros/master"
i18n:domain="plone">
<head>
<div metal:fill-slot="javascript_head_slot" tal:omit-tag="">
<link type="text/css" rel="kinetic-stylesheet"
tal:attributes="href string:${context/absolute_url}/++resource++manage-portlets.kss"/>
</div>
</head>
<body>
<div metal:fill-slot="main">
<h1 class="documentFirstHeading">Manage above content portlets</h1>
<span tal:replace="structure provider:vs.abovecontentportlets" />
</div>
</body>
</html>
Nach einem Neustart des Zope-Servers sollten sich nun die Portlets verwalten lassen wenn folgende URL aufgerufen wird:
http://localhost/mysite/@@manage-vsabove
