寻找一种方法,以纯粹的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>
上下文几乎是任何内容类型。
这种方法有意义吗?如果是,我怎样才能找到字典的所有视图名称?
答案 0 :(得分: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
,这很重要......