我想以编程方式进行一些注册,这些注册取决于存储在 plone.app.registry 中的数据。具体来说,我想将 menuItems 添加到对象的显示菜单中,这通常是通过 zcml 完成的。
这种“克隆加载”事件的“标准”方法是什么?
我考虑过的方法是:
- 在站点根目录上使用预遍历钩子,进行注册,然后设置某种标记以防止重新注册
- 监听 zope 启动事件(如 zope.processlifetime.IProcessStarting),然后在 ZODB 中找到所有 Plone 站点并执行注册
我想以编程方式进行一些注册,这些注册取决于存储在 plone.app.registry 中的数据。具体来说,我想将 menuItems 添加到对象的显示菜单中,这通常是通过 zcml 完成的。
这种“克隆加载”事件的“标准”方法是什么?
我考虑过的方法是:
我会使用一个事件处理程序来挂钩站点遍历,并带有一个切换:
_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 站点上设置本地注册表(调用),然后才能访问注册表实用程序。