<browser:page ...
同じname=
属性を持つCMF スキン レイヤーによって提供されるビューをオーバーライドしようとしています。これは Plone で可能ですか、それともブラウザ ビューは他のブラウザ ビューのみをオーバーライドできますか?
3 に答える
(これは少し遅いですが、一体何ですか)
CMF スキン レイヤーは、ブラウザー ビューをオーバーライドします。そのため@@
、URL で browserview の名前の前に置く必要があります。つまり、あいまいさをなくし、CMF スキン レイヤー テンプレートの代わりに browserview が呼び出されるようにする必要があります。
要するに、@@
前に置くとブラウザビューがオーバーライドされますが、そうでない場合はオーバーライドされません。
すなわち:
localhost:8080/Plone/@@myview
オーバーライド:
localhost:8080/Plone/myview
これを克服するには、CMF スキン レイヤーのテンプレートと変数をオーバーライドしtal:define
てView
、@@myview
. その後も、CMF スキン レイヤー テンプレートから BrowserViews メソッドにアクセスできます。
デフォルトでは、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 インポート ステップでインストールされたものです。
マーティン
よくわかりませんが、plone_skins の "custom" フォルダで試してみると、すぐにできます。
http://plone.org/documentation/kb/applying-a-custom-view-to-a-specific-folderから「代替」方法を試すこともできます