3

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

这种“克隆加载”事件的“标准”方法是什么?

我考虑过的方法是:

  • 在站点根目录上使用预遍历钩子,进行注册,然后设置某种标记以防止重新注册
  • 监听 zope 启动事件(如 zope.processlifetime.IProcessStarting),然后在 ZODB 中找到所有 Plone 站点并执行注册
4

1 回答 1

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事件更好,因为您必须setSite在每个 Plone 站点上设置本地注册表(调用),然后才能访问注册表实用程序。

于 2012-07-26T09:50:20.187 回答