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.
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 –