如何更改portlet顺序(首先放置父portlet)

时间:2015-02-27 03:55:13

标签: plone

如何重新排序portlet,以便继承的父portlet位于当前项的portlet之前?

2 个答案:

答案 0 :(得分:5)

Mathias解决方案似乎更容易;无论如何,如果您不想安装第三方产品,我想留下这些文件。

您可以通过编写适配器来更改portlet的排序方式。例如,下面的一个,在提供IATImage接口(图像)的任何对象上重新排序portlet,因此首先呈现内容类型portelts,然后是组1,最后是上下文:

from plone.portlets.interfaces import IPortletManager
from plone.portlets.interfaces import IPortletRetriever
from plone.portlets.retriever import PortletRetriever as BaseRetriever
from Products.ATContentTypes.interfaces import IATImage
from zope.component import adapts
from zope.interface import implements


class PortletRetriever(BaseRetriever):
    implements(IPortletRetriever)
    adapts(IATImage, IPortletManager)

    def getPortlets(self):
        assignments = super(PortletRetriever, self).getPortlets()
        context = [p for p in assignments if p['category'] == 'context']
        group = [p for p in assignments if p['category'] == 'group']
        content_type = [p for p in assignments if p['category'] == 'content_type']
        new_assignments = content_type + group + context
        return new_assignments

请勿忘记在ZCML文件中使用以下内容注册适配器:

<configure xmlns="http://namespaces.zope.org/zope">
  ...
  <adapter factory=".adapters.PortletRetriever" />
  ...
</configure>

答案 1 :(得分:4)

我知道有两种解决方案

<强> collective.weightedportlets

您可以为每个portlet定义权重,无论portlet是哪个部分/组(用户,上下文,类型,继承)。 版本1.1与Plone 4.3兼容。

<强> Solgema.PortletsManager

基本上做类似于collective.weightedportlets的事情,但它可以由D'n'D完成,它扩展了manage-portlets的UI。

你的黑客可以入侵portlet猎犬,但我不建议这样做。

PS:如果你想编写自己的portlet检索器,还要检查collective.weightedportlets: - )

More about how plone renders portlets.