如何在启动时初始加载plone站点时进行订阅

时间:2012-07-26 08:04:18

标签: plone

我想以编程方式进行一些注册,这取决于存储在plone.app.registry中的数据。具体来说,我想将menuItems添加到对象的显示菜单中,通常通过zcml完成。

这种“plone loaded”事件的“标准”方法是什么?

我考虑的方法是:

  • 在站点根目录上使用预遍历挂钩,进行注册,然后设置一些类型标记以防止重新注册
  • 侦听zope启动事件(如zope.processlifetime.IProcessStarting),然后查找ZODB中的所有Plone站点并执行注册

1 个答案:

答案 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)。