2011-09-18 33 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,然後用它作爲你的排序索引。

相關問題