Обратный порядок сортировки Plone по умолчанию в folder_contents
Как я могу сделать так, чтобы мой папочный пользовательский тип отображал список объектов в обратном хронологическом порядке в представлении folder_contents?
По умолчанию это самый старый объект в верхней части списка, я бы хотел, чтобы новый объект был добавлен в верхней части списка.
Было бы неплохо, если бы у Plone была эта функция из коробки... если это так, я не могу ее найти.
5 ответов
Для фактического изменения obj-позиции в родительском объекте вы можете использовать Zope2 OFS.IOrderedContainer
-интерфейс для доступа к соответствующим методам и подключить его zope.lifecycleevent.interfaces.IObjectAddedEvent
, как в этом Plone-аддоне " adi.revertorder" (заявление об отказе: author=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
Представление folder_contents отображает элементы (дочерние элементы) в соответствии с положением, сохраненным в самой папке. Как вы, возможно, знаете, вы можете изменить положение с помощью drag'n'drop.
В настоящее время Plone делает append
если вы добавите новый элемент в папку. ИМХО такое поведение идеально подходит для большинства случаев использования.
Я не уверен, какова ваша цель, но если вам нужен folder_contents, который показывает элементы в хронологическом порядке, вы можете настроить folder_contents в соответствии с вашими потребностями, что означает сортировку по дате создания (самая новая сверху) и больше не показывать manual sort column
,
Советы по настройке folder_contents
Хорошей точкой входа является tableview.py для plone.app.content -> https://github.com/plone/plone.app.content/blob/2.1.5/plone/app/content/browser/tableview.py
Использование правила также вариант.
Следующее перемещает объекты при создании на верхнюю позицию в папке.
Добавьте сценарий рабочего процесса (введите "Python Script") "moveToFirstPosition" в рабочий процесс:
contentObject = review_state.object
obj_id = contentObject.getId()
parent = contentObject.aq_parent
parent.moveObjectToPosition(obj_id, 0)
Добавьте переход "moveToTop" и выберите сценарий "moveToFirstPosition"
Используйте этот переход в новом правиле, которое запускается при создании объектов в папках. Активируйте правило глобально или на выбранных папках.
Спасибо всем. Указатель от 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"
/>
Доко здесь: http://docs.plone.org/external/plone.app.dexterity/docs/advanced/event-handlers.html
community.sortmyfolder имеет несколько опций для изменения порядка или порядка в другом поле, но он работает только один раз. После того, как вы добавите другой элемент, вам нужно будет изменить порядок папок снова. Не совсем то, что вы хотите, но это может быть полезно в некоторых случаях.