6

在 Plone 中创建BrowserView时,我知道我可以选择使用ZCML配置模板,如下所示:

<configure

    xmlns:browser="http://namespaces.zope.org/browser"
    >

    <browser:page
        …
        class=".foo.FooView"
        template="foo.pt"
        …
        />

</configure>

或者在代码中:

# foo.py
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.publisher.browser import BrowserPage


class FooView(BrowserPage):
    """
    My View
    """

    def __call__(self):
        return ViewPageTemplateFile('foo.pt')(self)

这两种方法有什么区别吗?它们似乎都产生了相同的结果。

子问题:我知道有BrowserView一个可以导入的类,但通常每个人都使用BrowserPage. 如果两个类别之间存在任何显着差异怎么办?

4

3 回答 3

8

注意:要完全等同于 ZCML,您应该设置index变量以指定您使用的模板。这样,TTW 自定义也将起作用。

# foo.py
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
from zope.publisher.browser import BrowserPage
class FooView(BrowserPage):
    index = ViewPageTemplateFile('foo.pt')

您可以在浏览器视图中使用的另一种模式是添加更新方法。

class FooView(BrowserPage):
    index = ViewPageTemplateFile('foo.pt')
    def __call__(self):
        self.update()
        return self.index()

    def update(self):
        self.portal_catalog = ...  # initialize code

但这不是问题。


那么区别是什么呢?没有区别。浏览器视图必须是可调用的。ZCML 指令以对象具有必须返回呈现页面的索引的方式构建此可调用对象。

但是在每次调用(您的示例)时创建模板有一个区别:您在每次调用浏览器视图时创建模板的新实例。类变量不是这种情况。

最后一个选项:指令中不需要类参数

<configure xmlns:browser="http://namespaces.zope.org/browser">
  <browser:page
    …
    template="foo.pt"
    …
    />
</configure>

有关更多信息,您应该阅读指令的代码,该指令使用SimpleViewClass,其中 src 是模板名称

于 2012-12-14T09:53:03.470 回答
7

在 Plone 中,您只能在显式注册模板时(例如使用 ZCML 或 Grok 指令)自定义模板 TTW(通过portal_view_customizations)。

如果您只在您的 中定义模板__call__,您将不会在portal_view_customizations.

另外,我猜想在方法中加载模板会为每个视图实例(每个请求)从磁盘重新加载它。

于 2012-12-14T06:11:03.230 回答
1

AFAIK,没有区别。ZCML 指令生成一个带有 a 的 ViewClassViewPageTemplateFile并将模板呈现在__call__. 见zope.browserpage.metaconfigure.page第 132、151 行。

这与您在示例中所做的完全相同:您在__call__方法中显式实例化模板。

至于子问题:据我了解,在 Zope2/Plone 的上下文中,显着差异并不明显。基于接口 ( zope.publisher.interfaces.browser.IBrowserPage),BrowserPage 是您想要继承的基类,因为它实现了__call__browserDefaultBrowserPage然而,使用或BrowserView与 Plone 一起使用似乎并不重要。

于 2012-12-14T04:33:10.530 回答