2012-04-01 9 views
1

Es ist notwendig, memberdata auf Plone 4 mit bestimmten Schema zu erweitern und gleichzeitig eine effiziente (das heißt, viel besser als lineare) Suche zwischen diesen Profilen zu bieten.Plone 4 Suche Mitglieder mit erweiterten Profilen

collective.examples.userdata scheint ein Beispiel zu sein, wie man Userdata macht. Der richtige Weg, aber was ist mit Suchen? Gibt es effiziente Suchlösungen, zum Beispiel mit dem Katalog?

Es gibt so etwas wie Membran, die Benutzer Inhalte zuordnen können, aber Archetypen verwendet und ziemlich alt ein Produkt (vielleicht ist mein Eindruck falsch).

Zum Beispiel könnte die Zuordnung von Benutzerdaten zu Dexterity-Typ-Instanzen in Ordnung sein.

Die Frage ist, gibt es einen Code bereit oder benutzerdefinierte Lösung wird benötigt?

Antwort

1

Nein, die einzige fertige Lösung, wie Sie gesagt haben, ist membrane. Aber IMO, es ist ein komplexes und spezifisches Produkt, also glaube ich nicht, dass du es wirklich brauchst. Um Ihr Ziel zu erreichen, benötigen Sie ein wenig Entwicklung. Mehr oder weniger wäre der Weg:

+0

Link # 2 ist wirklich der Kern des Problems, leider funktioniert es nicht mehr. Können Sie einen aktualisierten Link bereitstellen? Ich fand das Folgende nützlich, aber meiner Meinung nach ist dieses Dokument zu weit gefasst - http://svn.plone.org/svn/plone/plone.indexer/trunk/plone/indexer/README.txt –

0

Dies ist eine Übersicht (nicht detailliert Howto) eine Implementierung:

Katalog-Tool ähnlich wie der reference_catalog von Archetypes. Die wichtigsten Teile:

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) 

Abonnenten für IPrincipalCreatedEvent, IPrincipalDeletedEvent, IConfigurationChangedEvent (letzteres braucht man event.context (mit allen GenericSetup Dinge können auch ähnlich wie Urbilder erfolgen) Klasse. ._ Name _ in ('UserDataConfiglet', 'PersonalPreferencesPanel', 'UserDataPanel') verarbeitet werden - Plone hat leider keine spezifischen Ereignisse für Profildatenänderungen. Sehen Sie PAS, wie diese arbeiten und welche Parameter Event-Handler erhalten.

Eine Ansicht/Mitgliedsdaten/Benutzername für den Katalog, um diese Benutzer zu adressieren und neu zu indizieren. Der von bobo durchgeführte "Benutzername" traversiert und gibt einen umgebrochenen Benutzer mit den Eigenschaften zurück, die für Indizes und Metadaten benötigt werden.

Die http://plone.org/products/collective.examples.userdata ist eine gute Anleitung, wie Sie das Benutzerprofil tatsächlich erweitern können.

Abgesehen davon ist ein Adapter

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): 
     ... 

Hier benötigt EnhancedUserDataPanelAdapter wurde von UserDataPanelAdapter abgeleitet und erweitert.

Der IMemberdataCatalog ist die Schnittstelle des Katalogs.

Es ist wichtig, alles in Metadaten zu setzen, auch Breite/Höhe des Portraits, , weil .getObject() das Ganze hunderte Male (!) Langsamer gemacht hat.

Die Gruppenmitgliedschaften wurden getrennt behandelt, da es keine Ereignisse gibt, die Änderungen in den Gruppen bedeuten, die benötigt werden, um einige oder alle Mitglieder neu zu indizieren.