如何覆盖Plone的特殊案例内容显示菜单?

时间:2011-06-07 23:03:21

标签: plone

要在Plone文件夹上获取一次性视图,我会执行类似这样的操作(并非显示所有代码):

configure.zcml

<!-- Marker interface. Set this on the folder through the ZMI
     interfaces tab.
  -->
<interface interface=".interfaces.IMySpecialFolder" />

browser/configure.zcml

<!-- Special case view. Set as the folder's view through the ZMI
     properties tab (layout property).
  -->
<browser:page
  for="..interfaces.IMySpecialFolder"
  name="special"
  template="special.pt"
  permission="zope2.View"
  />

这很有用,但我想控制文件夹的显示菜单,列出我的特殊情况视图。我可以添加它,它只显示在我标记的文件夹上,但我必须更改站点范围的ATFolder FTI。

browser/configure.zcml

<include package="plone.app.contentmenu" />

<browser:menuItem
  for="..interfaces.IMySpecialFolder"
  menu="plone_displayviews"
  title="Special view"
  action="@@special"
  description="Special case folder view"
  />

profiles/default/types/Folder.xml

<?xml version="1.0"?>
<object name="Folder">
 <property name="view_methods" purge="False">
  <element value="special"/>
 </property>
</object>

当然,如果不影响网站上的每个文件夹,我都无法删除现有的可用视图方法。

有没有办法在不更改内容类型的FTI的情况下进行一次性显示菜单调整?

实际上,此问题似乎已经解决过了。 p4a.z2utils补丁CMFDynamicViewFTI以从IDynamicallyViewable适配器查找中获取可用视图的列表。 (dateable.chronos将此机制用于其文件夹日历视图)。所以我的问题就变成了:

有没有办法在不更改内容类型的FTI且不修补Plone的情况下进行一次性显示菜单调整?

3 个答案:

答案 0 :(得分:3)

plone显示菜单构建器使用ISelectableBrowserDefault在“显示”菜单中获取可用选项(请参阅 http://dev.plone.org/plone/browser/plone.app.contentmenu/trunk/plone/app/contentmenu/menu.py#L220

所以我认为(但我没有尝试过这个)如果你为一个更具体的界面(在你的情况IMySpecialFolder中)定义了一个适配器,它提供了Products.CMFDynamicViewFTI.interface.ISelectableBrowserDefault它应该可以工作。

适配器应具有上述plone.app.contentmenu.menu.DisplayMenu所需的方法。

答案 1 :(得分:1)

回答我自己的问题,我意识到实现一次性文件夹视图最直接的方法是遵循Plone本身在Members文件夹中应用的模式:调用的PythonScript index_html自定义视图,例如

member_search=context.restrictedTraverse('member_search_form')
return member_search()

Products.CMFPlone说明how to setup such a PythonScript with a GenericSetup import handler

回想起来,我发现在我的问题场景中我不需要标记界面。答案中没有必要。

请注意,此解决方案不会导致“文件夹的显示菜单仅列出我的特殊案例视图”,但我完全取消了显示菜单。我很好。

答案 2 :(得分:0)

您可以解决的一种方法是使用遍历钩子来注册菜单项,或者在这种情况下,取消注册菜单项,或者注册具有使它们不显示的条件的菜单项。使用遍历钩子,您可以使用标记界面使其发生在某个文件夹,子部分或页面中。 你可以在这里看到我们在哪里实现了类似的代码

https://github.com/collective/collective.listingviews/blob/master/src/collective/listingviews/browser/views/controlpanel.py#L105

在这种情况下,我们只想根据控制面板配置动态注册新的显示菜单项。