2010-12-14 7 views

答えて

5

から「オルタナティブ」な方法を試すことができます。そのため、@@をURLのブラウザビュー名の前に付ける必要があります。つまり、CMFスキンレイヤーテンプレートの代わりにブラウザビューが呼び出されるようにする必要があります。

つまり、手短に言えば、@@を手前に置くと、ブラウザビューが上書きされます。

すなわち:

localhost:8080/Plone/@@myview 

オーバーライド:

localhost:8080/Plone/myview 

あなた@@myviewを指すようにあなたのCMFのスキン層とtal:defineView変数でテンプレートをオーバーライドし、これを克服します。それでも、CMFスキン層テンプレートからBrowserViewsメソッドにアクセスできます。

+0

ようこそ!後半の回答はここを歓迎する以上のものであり、早急に答えるよりも正しい答えを心がけています。 – Pops

+1

Ah。有難うございます。 「@@」について学ぶことで、私の即時の対応は「何からの曖昧さ」でしたか?なぜなら、 'view'(少なくとも私が試した場所)は、ブラウザのビューではなく、スキンテンプレートだからです。なぜなら、私はunrestrictedTraverse()を '@@ myview'に使うことができる理由を説明します。 – Auspex

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のインポート手順でインストールされたもの。

Martin

関連する問題