我想以编程方式进行一些注册,这取决于存储在plone.app.registry中的数据。具体来说,我想将menuItems添加到对象的显示菜单中,通常通过zcml完成。
这种“plone loaded”事件的“标准”方法是什么?
我考虑的方法是:
答案 0 :(得分:3)
我使用事件处理程序挂钩到网站遍历,并使用切换:
_menuItemsRegistered = set()
def beforeSiteTraverse(site, event, _handled=set()):
if site.getPhysicalPath() not in _handled:
registerMenuItems(site)
__handled.add(site.getPhysicalPath())
现在registerMenuItems
只会为每个Plone网站执行一次,并且执行起来非常便宜。
如果你只需要为每个实例处理一个Plone站点,你可以减少这个(更进一步);只需在第一次触发后取消订阅您的处理程序。
这比处理IProcessStarting
事件更有效,因为在您甚至可以访问注册表实用程序之前,您必须在每个Plone站点上设置本地注册表(调用setSite
)。