Обратный порядок сортировки 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 имеет несколько опций для изменения порядка или порядка в другом поле, но он работает только один раз. После того, как вы добавите другой элемент, вам нужно будет изменить порядок папок снова. Не совсем то, что вы хотите, но это может быть полезно в некоторых случаях.

Другие вопросы по тегам