Plone 4搜索成员具有扩展的配置文件

时间:2012-04-01 06:44:41

标签: search zope user-profile

需要在Plone 4上使用特定模式扩展memberdata,同时在这些配置文件中提供有效(即比线性更好)的搜索。

collective.examples.userdata似乎是一个关于如何使用户数据正确方法的例子,但搜索呢?是否有任何有效的搜索解决方案,例如,使用目录?

有膜,能把用户映射到内容,但是使用的东西 Archetypes和相当古老的产品(也许,我的印象是错误的)。

但是,例如,将userdata映射到Dexterity类型实例可能没问题。

问题是,是否有任何现成的代码或需要自定义解决方案?

2 个答案:

答案 0 :(得分:1)

不,正如你所说,那里唯一的现成解决方案是membrane。但是IMO它是一个复杂而具体的产品,所以我认为你并不需要它。 要实现目标,您需要进行一些开发。或多或少的方式是:

答案 1 :(得分:0)

这是一个实现的概述(不详细说明):

目录工具与Archetypes的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的东西,也可以与Archetypes类似地完成)

IPrincipalCreatedEvent,IPrincipalDeletedEvent,IConfigurationChangedEvent的订阅者 (后者需要处理event.context。 ._ 名称 _('UserDataConfiglet','PersonalPreferencesPanel','UserDataPanel') - 不幸的是,Plone已经没有特定事件的配置文件数据更改)。请参阅PAS,了解这些工作方式和参数 事件处理人员收到。

要查看并重新索引这些用户的目录的视图/成员数据/用户名。 bobo遍历完成的“用户名”,返回包含属性的包装用户, 索引和元数据需要。

http://plone.org/products/collective.examples.userdata是如何实际扩展用户个人资料的好指南。

除此之外,还需要一个适配器

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派生并扩展了EnhancedUserDataPanelAdapter。

IMemberdataCatalog是目录的界面。

将所有内容放入元数据,甚至是纵向的宽度/高度,这一点非常重要, 因为使用.getObject()会使整个事情变得数百倍(!)变慢。

组成员资格是分开处理的,因为没有事件 表示组中的变化,需要重新索引一些或所有memebrs。