我正在构建一个基于Plone 4.1的站点,并且我正在尝试找到通过多个排序条件对集合进行排序的最佳方法,或者至少为站点的字体页面自定义集合portlet。我相信portlet使用集合排序设置,除非您选择随机。以下是portlet中标准结果的代码部分:
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
例如,我希望能够按到期日期排序(如果存在),如果不存在,则使用创建日期作为示例。或者按标签和创建日期排序。任何有关最佳方法的反馈都将受到赞赏。
答案 0 :(得分:1)
与this answer一样,只有AdvancedQuery可以使用多种排序,而且我没有将AdvancedQuery集成到我知道的集合中。所以基本上这是不可能的,除非你自己将AdvancedQuery集成到集合中,这将是一项非常重要的任务。
一个hackish解决方法可能是使用plone.indexer
编写一个索引器,根据你的逻辑返回正确的排序值,在目录中创建一个新的FieldIndex(profiles/default/catalog.xml
),将新索引注册为对profiles/default/portal_atct.xml
中的排序条件有效,然后将其用作排序索引。
答案 1 :(得分:1)
正如罗斯所说,你需要使用AdvancedQuery来排序多个标准。 如果您只需要在首页上使用此功能,我建议您根据collectionportlet创建自定义portelt。
在collectionportlet调用collection.queryCatalog()的地方,你需要为你的排序添加一些额外的逻辑:
>>> uids = [brain.UID for brain in collection.queryCatalog()]
>>> query = AdvancedQuery.In('UID', uids)
>>> results = catalog.evalAdvancedQuery(query, (('sortable_title', 'asc'), ('date', 'desc')
然后您可以使用结果代替上面代码示例中的结果