3

<browser:page ...同じname=属性を持つCMF スキン レイヤーによって提供されるビューをオーバーライドしようとしています。これは Plone で可能ですか、それともブラウザ ビューは他のブラウザ ビューのみをオーバーライドできますか?

4

3 に答える 3

5

(これは少し遅いですが、一体何ですか)

CMF スキン レイヤーは、ブラウザー ビューをオーバーライドします。そのため@@、URL で browserview の名前の前に置く必要があります。つまり、あいまいさをなくし、CMF スキン レイヤー テンプレートの代わりに browserview が呼び出されるようにする必要があります。

要するに、@@前に置くとブラウザビューがオーバーライドされますが、そうでない場合はオーバーライドされません。

すなわち:

localhost:8080/Plone/@@myview 

オーバーライド:

localhost:8080/Plone/myview

これを克服するには、CMF スキン レイヤーのテンプレートと変数をオーバーライドしtal:defineView@@myview. その後も、CMF スキン レイヤー テンプレートから BrowserViews メソッドにアクセスできます。

于 2011-01-31T13:02:09.870 に答える
3

デフォルトでは、CMF スキン メカニズムは、ビューを検索する前に portal_skins を検索します。これは、IPublishTraverse アダプターをカスタマイズすることで変更できます。少し悪いですが、これはうまくいくかもしれません (Plone 3 でテスト済み - Plone 4 でのデフォルトの動作が 100% わからない):

from zope.component import adapts, queryMultiAdapter
from zope.publisher.interfaces.browser import IBrowserRequest 

from Acquisition import aq_base
from ZPublisher.BaseRequest import DefaultPublishTraverse
from Products.CMFCore.Skinnable import SKINDATA, SkinnableObjectManager

from thread import get_ident

_MARKER = object()

class SkinnableTraverser(DefaultPublishTraverse):
    adapts(SkinnableObjectManager, IBrowserRequest)

    def publishTraverse(self, request, name):
        """Let the default traverser do its job, but if the thing that was
        returned was from a skin layer and there's a view with
        the same name, let the view win.
        """

        gotten = super(SkinnableTraverser, self).publishTraverse(request, name) 

        if not name.startswith('_') and not name.startswith('aq_'):
            sd = SKINDATA.get(get_ident())
            if sd is not None:
                ob, skinname, ignore, resolve = sd
                if resolve.get(name, None) is aq_base(gotten):
                    # This was retrieved as a skin resource
                    # Check if it could've been a view also

                    view = queryMultiAdapter((self.context, request), name=name)
                    if view is not None:
                        return view.__of__(self.context)

        return gotten

これを次のように登録する必要があります。

<adapter factory=".skins.SkinnableTraverser" />

おそらくoverrides.zcmlにあります。もう 1 つのオプションは、リクエストでより具体的なマーカー インターフェイスを使用することです。たとえば、browserlayer.xml インポート ステップでインストールされたものです。

マーティン

于 2011-02-19T15:17:06.113 に答える
2

よくわかりませんが、plone_skins の "custom" フォルダで試してみると、すぐにできます。

http://plone.org/documentation/kb/applying-a-custom-view-to-a-specific-folderから「代替」方法を試すこともできます

于 2010-12-17T12:40:42.760 に答える