如何获得所有已注册的浏览器:资源#39;在Plone

时间:2013-08-13 13:14:49

标签: plone

如何从组件注册表中获取所有已注册的browser:resourcebrowser: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),它看起来像我想要的但我无法找到它的实现位置所以我不知道如何调用它。

1 个答案:

答案 0 :(得分:2)

zope.component.getAdapters() 需要传递一个实例。 zope.interface.registry.Components.getAdapters() method来电:

list(map(providedBy, objects))

其中providedByzope.interface.declarations.providedBy()IDefaultBrowserLayer提供的所有内容均为.. zope.interface.IInterfacezope.interface.ISpecification

您需要传入提供 IDefaultBrowserLayer的虚拟对象,而不是直接传入界面。

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)