在 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'
在文件夹中创建对象时触发的新规则中使用此转换。
全局或选定文件夹激活规则。
如何让我的文件夹式自定义类型在 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'
在文件夹中创建对象时触发的新规则中使用此转换。 全局或选定文件夹激活规则。