как настроить коллекцию plone 4 для сортировки по нескольким полям - PullRequest
2 голосов
/ 18 сентября 2011

Я создаю сайт на основе Plone 4.1 и пытаюсь найти лучший способ либо отсортировать коллекцию по нескольким критериям сортировки, либо, по крайней мере, настроить портлет сбора, чтобы сделать это для страницы шрифтов сайта.Я полагаю, что портлет использует параметры сортировки коллекции, если вы не выберете случайный.Вот фрагмент кода из стандартных результатов в портлете:

def _standard_results(self):
    results = []
    collection = self.collection()
    if collection is not None:
        limit = self.data.limit
        if limit and limit > 0:
            # pass on batching hints to the catalog
            results = collection.queryCatalog(batch=True, b_size=limit)
            results = results._sequence
        else:
            results = collection.queryCatalog()
        if limit and limit > 0:
            results = results[:limit]
    return results

Например, я хотел бы иметь возможность сортировать по дате истечения срока, если он присутствует, если нет, то используйте, например, дату создания.Или сортировать по тегам и дате создания.Буду признателен за любые отзывы о наилучшем подходе к этому.

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

, как сказал Росс, вам потребуется AdvancedQuery для сортировки по нескольким критериям. если вам просто нужно это для главной страницы, я бы предложил создать настраиваемый портлет на основе портлета сбора.

, где коллекционный портлет вызывает collection.queryCatalog (), вам нужно добавить дополнительную логику для сортировки:

>>> uids = [brain.UID for brain in collection.queryCatalog()]
>>> query = AdvancedQuery.In('UID', uids)
>>> results = catalog.evalAdvancedQuery(query, (('sortable_title', 'asc'), ('date', 'desc')

тогда вы можете использовать результаты вместо результатов в приведенном выше примере кода

1 голос
/ 18 сентября 2011

Как и в этом ответе , множественная сортировка доступна только через AdvancedQuery , и нет никакой интеграции AdvancedQuery в коллекции, о которых я знаю.Так что в принципе это невозможно, если вы сами не интегрируете AdvancedQuery в коллекции, что было бы нетривиальной задачей.

Хакерский обходной путь может заключаться в использовании plone.indexer для написания индексаторакоторый возвращает правильное значение сортировки в соответствии с вашей логикой, создайте новый FieldIndex в каталоге (profiles/default/catalog.xml), зарегистрируйте этот новый индекс как действительный для критерия сортировки в profiles/default/portal_atct.xml, а затем используйте его в качестве индекса сортировки.

...