覆盖视图(来自其他程序包),修复浏览器层优先级

时间:2018-10-04 13:51:21

标签: plone plone-4.x

我有一个other.package正在注册一个视图my_view。然后,我尝试用我的this.package中定义的视图替换该视图。

  <browser:page
    for="other.package.interfaces.IBarClass"
    name="my_view"
    class="this.package.views.FooClass"
    permission="zope2.View"
    layer="this.package.interfaces.IThisPackageContentLayer"
    />

由于某些原因,my_view没有被覆盖。我认为可能是关于图层优先级的,但是我不知道如何解决。有什么建议吗?

如果我重命名视图(name="my_view_new"),它将按预期工作。但是,如果使用相同的名称,则原始名称似乎具有优先权。我该如何更改?

更新: 这是关于图层优先级的:

(Pdb) self.request.__provides__.__iro__[13]
<InterfaceClass other.package.interfaces.layer.IOriginalLayer>
(Pdb) self.request.__provides__.__iro__[14]
<InterfaceClass this.package.content.interfaces.IThisPackageContentLayer>
  

您可以通过查看以下内容来检查HTTP请求对象中的激活层:   请按self.request。提供 iro 。图层从零开始评估   索引(最高优先级)最后一个索引(最低优先级)。 (source)

所以,问题是如何确定层的优先级?

2 个答案:

答案 0 :(得分:2)

此问题已通过以下方式解决了各层的优先级:

class IThisPackageContentLayer(IOriginalLayer):

如建议的here

答案 1 :(得分:2)

另一种方法是,在同一浏览器层上使用ZCML-Override。 这也应该覆盖原始图层,但是对原始图层进行子类化的解决方案有点好;)。