为了将promotion Portlet自动加到所有新建的顶级Cinema Folders,我们可以利用event预定者来达到此目的: from five import grok
from zope import schema
from plone.directives import form
from plone.app.textfield import RichText
from optilux.cinemacontent import CinemaMessageFactory as _
...
from zope.component import getUtility
from zope.component import getMultiAdapter
from zope.container.interfaces import INameChooser
from zope.lifecycleevent.interfaces import IObjectAddedEvent
from plone.portlets.interfaces import IPortletManager
from plone.portlets.interfaces import IPortletAssignmentMapping
from optilux.cinemacontent.interfaces import \
PROMOTIONS_PORTLET_COLUMN
from optilux.cinemacontent.portlets import promotions
from Acquisition import aq_parent
...
@grok.subscribe(ICinemaFolder, IObjectAddedEvent)
def addPromotionsPortlet(obj, event):
parent = aq_parent(obj)
if ICinemaFolder.providedBy(parent):
return
column = getUtility(IPortletManager,
name=PROMOTIONS_PORTLET_COLUMN)
manager = getMultiAdapter((obj, column,),
IPortletAssignmentMapping)
assignment = promotions.Assignment()
chooser = INameChooser(manager)
manager[chooser.chooseName(None, assignment)] = assignment
这个event handler将在一个新的Cinema Folder首次创建并保存时被调用。portlet被加到指定的portletManager,这在interfaces.py中定义为一个常量。 PROMOTIONS_PORTLET_COLUMN = u"plone.rightcolumn"The portlet manager is multi-adapted alongside the context object to IPortletAssignmentMapping, which provides an ordered container of portlet assignments for the given context and portlet manager. It has a dict-like interface,with string keys. To make sure we get a unique and proper key, we rely upon a name chooser adapter.