2012-02-01 7 views
0

registerSomething(myClass)を作成せずに、純粋にZCMLまたはgrokの方法で、Plone 4のビューと名前付きアダプタのレジストリを保持する方法を探します。Plone 4でレジストリ/レジストリのビュー/アダプタを収集する簡単な方法は?

たとえば、主な製品がある場合、特定の性質を持つすべての名前付き(マルチ)アダプタのボキャブラリが必要です。製品にはいくつかのアダプターが用意されていますが、他のアダプターは他の製品(第三者)から提供されている可能性があります。

明白な方法は、ページモデル(registerArticleModel(MyPageModel))を追跡するためのPloneArticleのような何らかのレジストリを作成することですが、私はよりクリーンな方法があることを願っています。

質問は、レジストリの効果を達成するために純粋にZCML/grokの方法ですか?このようにして、第三者の製品がそれ自身のアダプタを利用できるようになると、「レジストリ」はそれを自動的に取り出してボキャブラリに表示します。たとえば、特定のシグネチャを持つすべてのアダプタのコンポーネントシステムにクエリを実行します。

もちろん、「レジストリ」は永続的であってはいけません。アダプター/ビューが欠落している場合、主製品はフォールバックを使用します。

パフォーマンスは問題ありませんが、ボキャブラリをコンパイルするためのすべてのアダプタを使用した線形検索は許容できません。テンプレートで

<browser:page 
    name="content-item-plain" 
    for="*" 
    class=".content_item.ContentItem" 
    permission="zope2.View" 
    layer="my.model.browser.interfaces.IMyModelLayer" 
    template="templates/content_item_plain.pt" 
    /> 

    <browser:page 
    name="content-item-another" 
    for="*" 
    class=".content_item.ContentItem" 
    permission="zope2.View" 
    layer="my.model.browser.interfaces.IMyModelLayer" 
    template="templates/content_item_another.pt" 
    /> 

...

UPDATE: が、これはより具体的にするために、ビューの次のユースケースを考える

コンテキストがほとんどである
<-- config/layout may contain '@@content-item-another' or '@@content-item-plain' 
from the vocabulary --> 

<tal:def define="layout config/layout" 
    <metal:item use-macro="context/?layout/html" /> 
</tal:def> 

任意のコンテンツタイプ。

このアプローチは意味がありますか?そうであれば、どのように辞書のビュー名をすべて見つけることができますか?

+0

これは、Zopeのコンポーネントアーキテクチャを解決するために設計されて正確に何でありますあなたが何を求めているのかは不明です。利用可能なドキュメントを読んだことがありますか? –

+0

私はドキュメントの回答を見つけられませんでした。 component.findAllMultiAdapters((IA、IB)、name = "*") –

+0

ヒントをお寄せいただきありがとうございます。適切な名前のアダプタを見つけるためのメソッド(「findAllMultiAdapters」など)が存在する場合、 –

答えて

0

私はおそらく、時にはあなたが利用可能なすべてのアダプタを知りたいzope.componentドキュメントhttp://pypi.python.org/pypi/zope.component

で、次の部分を見落としています。あなたが米国 ソケットタイプにドイツ語を変換するすべてのアダプタについて知りたい としましょう:

>>> sockets = list(zope.component.getAdapters((bathroomDE,), IUSSocket)) 
>>> len(sockets) 
3 
>>> names = [name for name, socket in sockets] 
>>> names.sort() 
>>> names 
[u'', u'dvd', u'shaver'] 

これは(非マルチ)アダプタの側に私の質問に答えているようです。ビューはまだカバーされていません。

私はビューに表示できるという名前のアダプタを作ることができますが、その後、私は重要であるZCMLでtemplateindexをオーバーライドすることはできません...

+0

getAdapters()は、マルチアダプター(ビューなど)もいくつかの制限付きで入手できます(インターフェースごとに1つの名前付きアダプターのみ)。 – sdupton

関連する問題