を作成せずに、純粋にZCMLまたはgrokの方法でPlone4のビューと名前付きアダプターのレジストリを保持する方法を探していますregisterSomething(myClass)
。
たとえば、特定の性質のすべての名前付き(マルチ)アダプターの名前の語彙を必要とするメイン製品があるとします。この製品はいくつかのアダプターを提供できますが、他のアダプターは他の製品(サードパーティ)から入手できます。これは、メイン製品の依存関係ではありません。
明らかな方法は、ページモデルを追跡するためのPloneArticleのようなある種のレジストリを作成することです(registerArticleModel(MyPageModel)
)が、よりクリーンな方法があることを願っています。
問題は、レジストリ効果を達成するための純粋な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"
/>
..。
テンプレート内:
<-- 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>
コンテキストはほとんどすべてのコンテンツタイプです。
このアプローチは理にかなっていますか?もしそうなら、どうすれば辞書のそれらすべてのビュー名を見つけることができますか?