0

を作成せずに、純粋に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>

コンテキストはほとんどすべてのコンテンツタイプです。

このアプローチは理にかなっていますか?もしそうなら、どうすれば辞書のそれらすべてのビュー名を見つけることができますか?

4

1 に答える 1

0

zope.component docs 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 でオーバーライドindexすることはできません。これは重要です...template

于 2012-02-01T16:36:38.607 に答える