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)

2つのアプローチに違いはありますか?どちらも同じ結果になるようです。

サブ質問:インポートできるクラスがあることは知っていますBrowserViewが、従来は誰もがを使用していますBrowserPage。2つのクラスの間に有意差がある場合はどうなりますか?

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')

ブラウザー ビューで使用できるもう 1 つのパターンは、更新メソッドの追加です。

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

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

しかし、これは問題ではありません。


違いは何ですか?違いはありません。ブラウザー ビューは呼び出し可能でなければなりません。ZCML ディレクティブは、レンダリングされたページを返さなければならないインデックスをオブジェクトが持つように、この callable を構築します。

ただし、呼び出しごとにテンプレートを作成する (あなたの例) 違いが 1 つあります。ブラウザー ビューの呼び出しごとに、テンプレートの新しいインスタンスを作成しています。これは、クラス変数には当てはまりません。

最後のオプション: ディレクティブにクラス引数は必要ありません

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

詳細については、src がテンプレート名である SimpleViewClassを使用するディレクティブのコードを読む必要があります。

于 2012-12-14T09:53:03.470 に答える
7

portal_view_customizationsPlone では、テンプレートが明示的に登録されている場合 (例えば、ZCML または Grok ディレクティブを使用) にのみ、テンプレート TTW を ( 経由で) カスタマイズできます。

でのみテンプレートを定義する__call__と、 では表示されませんportal_view_customizations

また、メソッド内でテンプレートをロードすると、すべてのビュー インスタンス (すべてのリクエスト) に対してディスクから再ロードされると思います。

于 2012-12-14T06:11:03.230 に答える
1

私の知る限り、違いはありません。ZCML ディレクティブは、 で ViewClass を生成しViewPageTemplateFile、 でテンプレートをレンダリングし__call__ます。132、151zope.browserpage.metaconfigure.page行を参照してください。

これは、例で行うのとまったく同じです__call__。メソッドでテンプレートを明示的にインスタンス化します。

サブ質問について: 私の理解では、Zope2/Plone のコンテキストでは大きな違いは明らかではありません。インターフェース ( ) に基づいてzope.publisher.interfaces.browser.IBrowserPage、BrowserPage は、 および を実装__call__しているため、継承元の基本クラスですbrowserDefault。それでも、 Ploneを使用するBrowserPageか使用するかは問題ではないようです。BrowserView

于 2012-12-14T04:33:10.530 に答える