0

寻找一种方法以纯粹的 ZCML 或 grok 方式在 Plone 4 中保留视图和命名适配器的注册表,而无需制作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 文档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 回答