程序自动指派portlet样例

程序自动指派portlet样例
为了将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.




设置