2011-09-18 62 views
2

我正在构建基于Plone 4.1的网站,并且正在尝试查找按多个排序条件对集合进行排序的最佳方法,或者至少要自定义要执行的集合portlet所以对于网站的字体页面。我相信portlet使用收集排序设置,除非您选择随机。下面是代码在portlet标准结果的部分:如何自定义plone 4集合以便按多个字段进行排序

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 

例如,我想可以,如果存在以由到期日期排序,如果没有则使用创建日期的例子。或按标签和创建日期排序。任何关于最佳方法的反馈将不胜感激。

回答

1

由于ross说您需要使用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') 

,那么你可以使用上面

结果,而不是结果的代码示例
1

this answer一样,只有通过AdvancedQuery才可以进行多种排序,因为没有将AdvancedQuery集成到我知道的集合中。所以基本上这是不可能的,除非你自己将AdvancedQuery集成到集合中,这将是一项不平凡的任务。

一个hackish的解决办法可能是使用plone.indexer写,根据你的逻辑返回正确的排序值的索引,在目录(profiles/default/catalog.xml)创建一个新的字段索引,注册为有效的排序条件的新指数profiles/default/portal_atct.xml,然后用它作为你的排序索引。

相关问题