2011-09-15 40 views
5

我正在为Plone 4开发一个内容类型,并且我想阻止它可能从其父对象继承的所有用户,组和上下文Portlet。我完全被文档弄糊涂了 - 在portlets.xml中,<blacklist/>只能解决路径特定的阻塞问题。 <assignment/>看起来像我想要的,但它似乎太具体 - 我不想管理我的内容类型上所有可能的portlet的分配。Plone内容类型特定的Portlet分配

有一些提示,我发现自定义特定于内容类型的ILeftColumn和IRightColumn portlet管理器,但我找不到任何好的示例。有没有人有任何提示或建议?我觉得我错过了简单的事情。

回答

6

为了防止portlet获取并保持添加portlert的可能性,您可以添加事件侦听器来创建自动阻止获取的内容。

像这样:

<subscriber 
     for="my.package.interfaces.IMyContent 
      zope.app.container.interfaces.IObjectAddedEvent"     
handler=".subscribers.blockPortletsUpponMyContentCreation" 
        /> 

,比做到这一点:

from zope.component import getMultiAdapter, getUtility 
from plone.portlets.interfaces import IPortletManager 
from plone.portlets.interfaces import ILocalPortletAssignmentManager 
from plone.portlets.constants import USER_CATEGORY 
from plone.portlets.constants import GROUP_CATEGORY 
from plone.portlets.constants import CONTENT_TYPE_CATEGORY 
from plone.portlets.constants import CONTEXT_CATEGORY 

def blockPortletsUpponMyContentCreation(mycontent, event): 
    for manager_name in ('plone.leftcolumn','plone.rightcolumn'): 
     manager = getUtility(IPortletManager, name=manager_name) 
     assignable = getMultiAdapter((mycontent, manager,), ILocalPortletAssignmentManager) 
     for category in (GROUP_CATEGORY, CONTENT_TYPE_CATEGORY,CONTEXT_CATEGORY,USER_CATEGORY): 
      assignable.setBlacklistStatus(category, 1) 

注意:此代码是由plone.app.portlet manage view

编辑19/08/2011启发:包含的修补程序的建议由@will在我未经测试的代码...所以现在是测试

+0

谢谢!这正是我想要做的,它阻止了现有的portlet,同时保留了用户将来分配它们的能力。我非常想要在portlets.xml中做一些事情,这是订阅者没有想到的。 – Will

+1

对于后代,应该对上述代码进行一些修改,以使其发挥作用。在ZCML中,'factory'属性应该是'handler',管理者名称需要用'getUtility()'与它们各自的'IPortletManager'管理器匹配。 – Will

+0

@请问您能否将此答案标记为您问题的答案? – toutpt

1

通过Sitesetup(controlpanel) - >类型 - >“管理分配给此内容类型的portlet”,对您的门户网站类型进行分配。

然后通过ZMI导出配置 - > portal_setup - > Export-Tab - >选择'Portlets' - >点击底部的'export'。

提取类型/ YourType.xml文件并将相关部分复制到程序包配置文件/ default/types/YourType.xml中。

+0

它似乎这样你只能添加portlet,而不是集团k父母portlet。你确定那样吗? –

+0

啊不,这是不可能的,我只是提到你的第二段。你不想完全阻止prtlet,但仍然可以分配新的,是吗? – ida

相关问题