2011-09-18 5 views
2

私はPlone 4.1ベースのサイトを構築しており、複数の並べ替え基準でコレクションを並べ替える、または少なくともコレクションポートレットをカスタマイズするための最良の方法を探していますサイトのフォントページのために。あなたがランダムを選択しない限り、ポートレットはコレクションのソート設定を使用すると信じています。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

ロスとして、複数の基準で並べ替えるには、AdvancedQueryが必要だという。 これはフロントページに必要な場合は、コレクションポートレットに基づいてカスタムポートテルを作成することをお勧めします。

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

は、あなたが

の上に自分のコードサンプルでは結果の代わりの結果を使用することができます。collectionportletはcollection.queryCatalogを()あなたの並べ替えのためにいくつかの追加のロジックを追加したいと思う呼び出す

1

this answerのように、複数の並べ替えはAdvancedQueryからのみ利用できます。私が知っているコレクションには、AdvancedQueryが統合されていません。ですから、基本的には、あなたがコレクションに自分自身でAdvancedQueryを統合しない限り、これは不可能です。これは簡単な作業ではありません。

ハック回避策はprofiles/default/portal_atct.xmlでソート基準のための有効なものとして、新しいインデックスを登録し、カタログ(profiles/default/catalog.xml)に新しいFieldIndexにを作成し、あなたのロジックに従って右ソート値を返すインデクサを書くことplone.indexerを使用するかもしれません、それをソートインデックスとして使用します。

関連する問題