plone - 如何在 Plone 中获取所有注册的 'browser:resource'

标签 plone

我怎样才能让所有注册browser:resourcebrowser:resourceDirectory从组件注册表?

我查看了不同的地方,试图发现 zcml 指令 browser:resource 创建了什么样的组件。并找到 Products.Five.browser.metaconfigureregisterAdapter称呼:

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))

在哪里 providedByzope.interface.declarations.providedBy() .所有这些IDefaultBrowserLayer提供的是.. zope.interface.IInterfacezope.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/

相关文章:

Plone zodb 错误 CMFUid 断言

plone - 如何使用 Diazo 主题取消所有 tinymce 窗口的主题

plone - 将 Plone 4.1 和 pas.plugins.sqlalchemy 与现有的用户和角色表一起使用

plone - 从 "add link"对话中看不到新的敏捷内容类型

session - 如何增加 Plone 登录 session ?

python - buildout 找不到 Plone 的 pip 包

seo - 管理 quintagroup seoptimizer 的权限

plone - 如何添加条件以使敏捷类型可添加?

jquery-ui - Plone Dexterity RelationChoice 小部件与 jQueryUI 冲突?

plone - Plone 3.1.7 中的 JavaScript 注册表损坏