2

我创建了一个包含容器和非容器 Dexterity 内容类型的 Dexterity 产品。发现了collective.documentviewer(耶!谢谢!huzzah!),我想使用它的dvpdf-group-view,但它在ZCML中注册为文件夹,我的敏捷容器不符合条件。我查看了我的容器类型上可用的 Web 界面,添加了 SiteRoot,并启用了应用视图,但也是完全错误的。

我相信有一个正确的方法可以做到这一点,我很确定它是整个适配器/接口机制的核心,但我在任何书中都找不到它。

有人愿意尝试解释吗?首先,让 Dexterity 容器能够假装它也是文件夹的一两行代码;第二,如何改变一个Dexterity类型的单个实例的默认视图,使它呈现一个外部组件的视图?

谢谢。

4

1 回答 1

4

1. 也注册敏捷容器的视图

该视图已为 Archetypes 文件夹接口 ( Products.CMFCore.interfaces._content.IFolderish) 注册,但您的灵巧容器不提供此接口 (但是plone.dexterity.interfaces.IDexterityContainer)。原因可能是产品和/或视图与灵活性不兼容。

IDexterityContainer无论如何,您可以通过在您的包中添加一点 ZCML 来为界面注册视图来自己尝试一下configure.zcml(另请参阅Dexterity 开发人员手册的创建包部分):

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser">

    <configure package="collective.documentviewer">

        <browser:page
            name="dvpdf-group-view"
            for="plone.dexterity.interfaces.IDexterityContainer"
            class=".views.GroupView"
            template="templates/group-view.pt"
            permission="zope2.View"
            layer=".interfaces.ILayer" />

    </configure>

</configure>

这是从collective.documentviewer configure.zcml<browser:page>复制的,但我已将接口更改为敏捷容器接口,因此该视图也适用于敏捷容器。for=

内部<configure package="collective.documentviewer">告诉 ZCML 解析器应该像 configure.zcml 直接在其中一样应用配置collective.documentviewer- 例如,这允许您使用原始模板(否则您将不得不复制它或做一些讨厌的事情)。

我自己没有测试它:视图可能仍然需要原型容器并且不能与灵巧容器一起使用。也可能是您必须从文档查看器中为灵巧容器注册更多组件(也许是菜单?看看原始 configure.zcml中注册的内容。

如果一切正常,您应该考虑直接在github上的collective.documentviewer 中进行更改并向作者提出拉取请求(请注意,敏捷性还不是plone-core)。但首先要问你是否应该以及如何做到这一点:-)

2.更改默认视图

使用 plone 可以为特定类型定义多个视图。然后可以在此类型的每个实例的显示菜单中选择视图。如果您打开http://localhost:8080/Plone/portal_types/manage_main并单击您的类型,则会出现一个字段Available view methods,您可以在其中将视图名称 ( dvpdf-group-view) 添加到单独的行上。

在您创建了您的类型的新对象或访问现有对象后,您将拥有一个“显示”菜单,该菜单应列出该视图。选择它,这个对象现在默认有这个视图。

(如果您想让视图在此类型的其他对象上不可选,您可以将其从类型配置中删除,使其不再可选 - 对象的现有配置将保留)。

于 2013-01-03T19:09:52.810 回答