我怎样才能让所有注册browser:resource
和 browser:resourceDirectory
从组件注册表?
我查看了不同的地方,试图发现 zcml 指令 browser:resource
创建了什么样的组件。并找到 Products.Five.browser.metaconfigure
与 registerAdapter
称呼:
handler('registerAdapter', factory, (layer,), Interface, name, _context.info)
这意味着它将注册一个需要
(layer,)
的适配器。并提供Interface
,但调用以下内容不起作用(它返回一个不是浏览器资源的组件):from zope.publisher.interfaces.browser import IDefaultBrowserLayer
zope.component.getAdapters((IDefaultBrowserLayer,), Interface)
我不确定,但似乎
getAdapters
需要一个实例。我不想查询 zope.component 而是要获得注册的适配器。我在
zope.interface.interfaces
中找到一种方法lookupAll(required, provided)
这看起来像我想要的,但我找不到它的实现位置,所以我不知道如何调用它。
最佳答案
zope.component.getAdapters()
确实需要传递一个实例。 zope.interface.registry.Components.getAdapters()
method调用:
list(map(providedBy, objects))
在哪里
providedBy
是 zope.interface.declarations.providedBy()
.所有这些IDefaultBrowserLayer
提供的是.. zope.interface.IInterface
和 zope.interface.ISpecification
.您需要传入一个提供
IDefaultBrowserLayer
的虚拟对象。而不是直接传入接口(interface)。from zope.publisher.interfaces.browser import IDefaultBrowserLayer
import zope.component
import zope.interface
class dummy(object):
zope.interface.classProvides(IDefaultBrowserLayer)
zope.component.getAdapters((dummy,), zope.interface.Interface)
关于plone - 如何在 Plone 中获取所有注册的 'browser:resource',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18210148/