【问题标题】:Reverse the Plone default sort order in folder_contents反转 folder_contents 中的 Plone 默认排序顺序
【发布时间】:2015-12-20 07:57:30
【问题描述】:

如何让我的文件夹自定义类型在文件夹内容视图中按时间倒序显示它的对象列表?

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

如果 Plone 有开箱即用的这个功能会很好......如果有的话我找不到它。

【问题讨论】:

  • 注意:添加了“将新对象添加到文件夹顶部”的最终代码作为下面的答案。不用担心 folder_contents 的默认排序顺序,因为它现在与此工作代码无关。

标签: sorting directory plone dexterity archetypes


【解决方案1】:

要实际更改其父对象中的 obj 位置,您可以使用 Zope2 的 OFS.IOrderedContainer-interface 访问相关方法并将其连接到 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)

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

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

【讨论】:

  • 谢谢,我希望将 /folder_contents 保留为视图并使用标准的“内容”单击绿色栏...我只想将新项目添加到列表顶部。并且用户仍然希望能够使用拖放任意排序内容。
  • 我已经有一个自定义的灵巧文件夹对象和视图模板,但我不知道是否有一种方法可以轻松地覆盖标准 /folder_contents 行为,使用新对象行为的“前置”而不是“附加” '如果这有意义......
  • @AaronWilliams:更新了任务,也提供了敏捷的解决方案。
【解决方案2】:

使用规则也是一种选择。

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

将工作流脚本(输入“Python 脚本”)“moveToFirstPosition”添加到您的工作流中:

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

添加一个过渡“moveToTop”并选择脚本“moveToFirstPosition”

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

【讨论】:

  • 对于想要限制行为位置的情况来说,这似乎是一种可行的解决方案。很酷,点赞。
  • 谢谢,我查看了 plone.app.contentrules。不确定如何添加可以从“执行以下操作”词汇表中选择的“工作流程脚本”? doco有链接吗?我发现一个名为“collective.contentrules.runscript”的产品也需要吗?
  • 这是默认克隆,不需要附加组件。用于此新规则的操作是工作流转换。此转换必须在您的一个工作流中的 portal_workflow 中创建。过渡使用必须在同一工作流程中创建的脚本。该脚本可能类似于上面提到的“moveToFirstPosition”。如果你喜欢这种方式,也许你会考虑在产品中定义这一切,过渡和脚本,而不是通过网络界面来完成。
【解决方案3】:

谢谢大家。来自 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

【讨论】:

  • 除了这与我的答案相同之外,您还缺少for 中的接口参数,就像我在示例包中使用的 asterix-wildcard 一样。引用文档:“for 的第一个参数是描述对象类型的接口。第二个参数是事件类型”。不过有趣的是,它似乎对你有用。
  • P.S.:使用通配符-asterix 不好,更新的答案限制了有争议的对象。在您的情况下,您可以使用 path.to.myobject.IMyObject,如果您希望这仅发生在您的特定内容类型上。
  • 感谢 Ida ...我确实接受了您的答案作为正确答案,我只是添加了我完成的解决方案,以防它帮助任何人,因为我不需要 IOrderContainer 来访问 moveObjectToPosition 方法...它是已经可用。至于缺少的“for”参数,它实际上就在那里,你只是没有看到两个参数之间的空格:)
  • 哦,我明白了,立即可用,很好,谢谢。很抱歉匆忙阅读,我已经习惯了每个论点都为自己消耗一行。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

    我不确定您的目标是什么,但如果您需要按时间顺序显示项目的文件夹内容,您可以根据需要自定义文件夹内容,这意味着按创建日期(最新在顶部)排序,不再显示manual sort column

    关于自定义文件夹内容的提示

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

    【讨论】:

    • 我想要完全相同的行为,除了 prepend 而不是 append...有什么想法吗?
    • 我使用 Plone 已经很长时间了,一直认为把最新的项目放在第一位更合乎逻辑。 Plone 应该在显示菜单 imo 中为此提供标准控件。
    • @AaronWilliams:您需要帮助实现该选项吗?最好的方法是提供一个代码示例,有朝一日它可能会被视为核心。为 Dexterity 找到一个类似的事件,就像我为 Archetypes 引用的那个,并添加一个控制面板选项来通过 UI 设置道具,应该是这样 :-)
    • @AaronWilliams:我认为 Mathias 试图指出的是,有两个不同的问题:一个是能够以用户任意意愿手动设置订单,另一个是拥有 folder_contents - 按某些标准排序的视图,例如最新的优先。
    • @AaronWilliams:现在可以安装 adi.revertorder,如果您想预先添加新的内容项,作为网站的默认行为。
    猜你喜欢
    • 2013-06-25
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多