在 folder_contents 中反转 Plone 默认排序顺序

Reverse the Plone default sort order in folder_contents

如何让我的文件夹式自定义类型在 folder_contents 视图中以相反的时间顺序显示它的对象列表?

默认是列表顶部最旧的对象,我希望刚添加的新对象位于列表顶部。

如果 Plone 有开箱即用的这个功能就好了……如果有我找不到它。

folder_contents 视图按文件夹本身存储的位置显示项目(子项)。您可能知道,您可以通过拖放来更改位置。

目前,如果您向文件夹添加新项目,plone 会执行 append。恕我直言,这种行为非常适合大多数用例。

我不确定你的目标是什么,但如果你需要 folder_contents,它按时间顺序显示项目,你可以根据需要自定义 folder_contents,这意味着排序创建日期(最新的在最上面)并且不再显示 manual sort column

关于自定义 folder_contents

的提示

一个好的切入点是 plone.app.content 的 tableview.py -> https://github.com/plone/plone.app.content/blob/2.1.5/plone/app/content/browser/tableview.py#L30

要实际更改其父对象中的对象位置,您可以利用 Zope2 的 OFS.IOrderedContainer 接口访问相关方法并将其连接到 zope.lifecycleevent.interfaces.IObjectAddedEvent,就像在这个 Plone 插件中一样“adi.revertorder"(免责声明:作者=meh):

在你configure.zcml注册事件监听器:

<subscriber for="Products.CMFCore.interfaces.IContentish
                 zope.lifecycleevent.interfaces.IObjectAddedEvent"
            handler=".subscriber.revertOrder" />

然后在处理程序中(此处:subscriber.py),定义调用的方法:

from Acquisition import aq_inner
from Acquisition import aq_parent

from OFS.interfaces import IOrderedContainer

def revertOrder(obj, eve):
    """
    Use IOrderedContainer interface to move an object to top of folder on creation.
    """
    parent = obj.aq_inner.aq_parent
    ordered = IOrderedContainer(parent, None)
    if ordered is not None:
        ordered.moveObjectToPosition(obj.getId(), 0)

适用于敏捷- 基于原型的内容类型。

另请参阅文档:http://docs.plone.org/external/plone.app.dexterity/docs/advanced/event-handlers.html

collective.sortmyfolder 有一些选项可以颠倒顺序,或者在不同的字段上排序,但它只能使用一次。添加另一个项目后,您需要再次对文件夹重新排序。不完全是您想要的,但在某些情况下可能会有所帮助。

谢谢大家。来自 Ida 的指针让我到达那里......我只需要导入 IObjectAddedEvent:

在myobject.py

from zope.lifecycleevent.interfaces import IObjectAddedEvent

...

class IMyObject(model.Schema):

...

# Listener for adding myObject: move myObject to the top of the parent folder
def addItemToTop(myObject, event):
    event.newParent.moveObjectToPosition(myObject.getId(),0)

并在configure.zcml中注册监听器:

<subscriber
    for=".myobject.IMyObject zope.lifecycleevent.interfaces.IObjectAddedEvent"
    handler=".myobject.addItemToTop"
/>

Doco 在这里:http://docs.plone.org/external/plone.app.dexterity/docs/advanced/event-handlers.html

使用规则也是一种选择。

以下将创建的对象移动到文件夹中的顶部位置。

将工作流脚本(类型 'Python Script')“moveToFirstPosition”添加到您的工作流中:

contentObject = review_state.object
obj_id = contentObject.getId()
parent = contentObject.aq_parent
parent.moveObjectToPosition(obj_id, 0)

添加过渡'moveToTop‘ and select script ‚moveToFirstPosition'

在文件夹中创建对象时触发的新规则中使用此转换。 全局或选定文件夹激活规则。