2012-04-01 10 views
1

Plone 4のメンバーデータを特定のスキーマで拡張すると同時に、これらのプロファイルの中で効率的な(つまり線形より優れた)検索を提供する必要があります。Plone 4の拡張プロファイルを持つ検索メンバー

collective.examples.userdataは、正しい方法でユーザーデータを作成する方法の例ですが、検索はどうですか?カタログを使用するなどの効率的な検索ソリューションはありますか?

メンブレンのようなものがありますが、コンテンツにユーザーを割り当てることができますが、 アーキタイプと非常に古い製品(多分、私の印象は間違っています)を使用します。

でも、ユーザーデータを敏捷性タイプのインスタンスにマッピングすることは問題ありません。

問題は、準備が整ったコードがあるか、カスタムソリューションが必要なのでしょうか?

答えて

1

いいえ、ここに記載されている唯一の解決策は、membraneです。しかし、IMOは複雑で特殊な製品なので、本当に必要とは思わない。 目標を達成するには、少しの開発が必要です。多かれ少なかれ方法は次のようになります。

+0

リンク#2は本当に問題の核心ですが、残念ながらそれはもう機能しません。更新されたリンクを提供できますか?私は以下の便利なことを発見しましたが、私の意見ではこの文書は広すぎます - http://svn.plone.org/svn/plone/plone.indexer/trunk/plone/indexer/README.txt –

0

でカスタム検索フォームを作成します。

カタログツールは、アーキタイプからのreference_catalogと同様に行われます。最も本質的な部分:

from Products.ZCatalog.ZCatalog import ZCatalog 
class MemberdataCatalog(UniqueObject, ZCatalog): 
    implements(IMemberdataCatalog) 
    ... 

    security.declareProtected(ManageZCatalogEntries, 'catalog_object') 
    def catalog_object(self, obj, uid=None, idxs=[], 
        update_metadata=1, pghandler=None): 
     w = obj 
     if not IIndexableObject.providedBy(obj): 
      wrapper = component.queryMultiAdapter((obj, self), IIndexableObject) 
      if wrapper is not None: 
       w = wrapper 

     ZCatalog.catalog_object(self, w, w and str("/".join(w.getPhysicalPath())), idxs, 
          update_metadata, pghandler=pghandler) 

(すべてGenericSetupもので、また原型と同様に行うことができます)(後者はevent.contextを必要とIPrincipalCreatedEvent、IPrincipalDeletedEvent、IConfigurationChangedEvent ため

加入クラス。 。名前 _( 'UserDataConfiglet'、 'PersonalPreferencesPanel'、 'UserDataPanel')を処理する - 残念ながら、Ploneにはプロファイルデータの変更に関する特定のイベントはありません。イベントハンドラがどのように受信し、どのパラメータがどのようなパラメータを受け取るかについては、PASを参照してください。

これらのユーザーのアドレスを指定して再インデックスするカタログのビュー/ memberdata/username。 boboによって実行された「ユーザー名」は、インデックスとメタデータに必要なプロパティーを持つラップされたユーザー を返します。

http://plone.org/products/collective.examples.userdataは、実際にユーザープロファイルを拡張する方法を示す良いガイドです。それとは別に、アダプタがEnhancedUserDataPanelAdapterここ

class IndexableAdapter(EnhancedUserDataPanelAdapter): 
    implements(IIndexableObject) 
    adapts(IMemberData, IMemberdataCatalog) 
    def __init__(self, context, catalog): 
     self.context = context 
     self.userid = context.getId() 
     self.catalog = catalog 
    def getPhysicalPath(self): 
     return make_physical_path(self.userid) # path to the view, which "fakes" an object 
    def __getattr__(self, name): 
     """ Proxing attribute accesses. """ 
     return getattr(self.context, name) 
    # Specific indexer 
    def SearchableTextIntra(self): 
     ... 

を必要とされている

がUserDataPanelAdapter由来と拡張されました。

IMemberdataCatalogは、カタログのインターフェイスです。

.getObject()を使用すると、何百回も(!)遅くなりましたので、すべてをメタデータに入れて、縦/横の長さも にすることが重要です。

グループメンバシップはイベントが存在しないため別々に処理されました。グループ内の変更を意味する は、一部またはすべてのmemebrを再インデックスする必要があります。

関連する問題