需要在Plone 4上使用特定模式扩展memberdata,同时在这些配置文件中提供有效(即比线性更好)的搜索。
collective.examples.userdata似乎是一个关于如何使用户数据正确方法的例子,但搜索呢?是否有任何有效的搜索解决方案,例如,使用目录?
有膜,能把用户映射到内容,但是使用的东西 Archetypes和相当古老的产品(也许,我的印象是错误的)。
但是,例如,将userdata映射到Dexterity类型实例可能没问题。
问题是,是否有任何现成的代码或需要自定义解决方案?
答案 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。