我创建了一个Dexterity产品,其中包含容器和非容器Dexterity内容类型。在发现了collective.documentviewer(yay!thanks!huzzah!)后,我想使用它的dvpdf-group-view,但是在ZCML中注册为for Folders,而我的Dexterity容器没有资格。我查看了我的容器类型上可用的Web界面,添加了SiteRoot,并且启用了视图,但也完全错误。
我确信有一种正确的方法可以做到这一点,我很确定它是整个适配器/接口机制的核心,但我在任何一本书中都找不到它。
有人想尝试解释吗?首先,一行或两行将使Dexterity容器假装它也是一个文件夹;第二,如何更改Dexterity类型的单个实例的默认视图,以便它呈现外部组件的视图?
感谢。
答案 0 :(得分:4)
<强> 1。注册敏捷容器的视图
视图是为Archetypes文件夹界面(Products.CMFCore.interfaces._content.IFolderish
)注册的,但您的dexterity容器不提供此界面(但plone.dexterity.interfaces.IDexterityContainer
)。
原因可能是产品和/或视图与灵巧性不兼容。
Anway,你可以通过在你的包中IDexterityContainer
放一点ZCML来注册configure.zcml
界面的视图来自己尝试一下(参见Creating a package部分Dexterity Developer Manual):
<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>
<browser:page>
是从collective.documentviewer configure.zcml复制的,但我已将界面for=
更改为dexterity容器界面,因此该视图也适用于灵巧容器。
内部<configure package="collective.documentviewer">
告诉ZCML解析器应该应用配置,好像configure.zcml将直接在collective.documentviewer
中 - 这允许您使用原始模板(否则你会必须复制或做一些讨厌的事情。)
我自己没有测试过:可能仍然是视图需要一个原型容器,并且不能使用灵巧容器。您可能还需要从文档查看器中为灵活容器注册更多组件(可能是菜单?请查看original configure.zcml中注册的内容。
如果一切正常,您应该考虑直接在github上对collective.documentviewer进行更改并向作者发出拉动请求(请注意,灵巧不是plone-core)。但首先要问你是否以及如何做到这一点: - )
<强> 2。更改默认视图
使用plone可以为特定类型定义多个视图。然后可以在每种类型的实例的显示菜单中选择视图。如果您打开http://localhost:8080/Plone/portal_types/manage_main
并点击类型,则会有一个字段Available view methods
,您可以在其中添加视图名称(dvpdf-group-view
)。
创建类型的新对象或访问现有对象后,您将拥有一个“显示”菜单,该列表应列出视图。选择它,此对象现在默认为此视图。
(如果你想让视图在这种类型的其他对象上无法选择,你可以将它从类型配置中删除,这样就不再可以选择了 - 你的对象的现有配置将会保留。)