我有一个灵活的内容类型,它是文件夹的,我希望它根据它的孩子的内容(pdfs等)显示在搜索结果中。这是可能的,在哪里以及如何实现?
答案 0 :(得分:3)
一种可能的解决方案是重新索引子项的searchableText
而不是项目本身(连接所有子项的searchableText)。
您的新搜索文本索引可能如下所示:
@indexer(IYourContainerType)
def SearchableText(obj):
searchable_text = obj.SearchableText()
for item in obj.getFolderContents({'portal_type': 'File'}, full_object=True):
searchable_text += item.SearchableText()
return searchable_text
现在您必须订阅一些事件,因为容器的SearchableText需要在容器中的更改时自动更新。
处理if:
事件处理程序可能如下所示:
def reindex_container(obj, event):
parent = aq_parent(aq_inner(obj))
if not IYourContainerType.providedBy(parent):
return
catalog = getToolByName(obj, 'portal_catalog')
# Only reindex existing brains! The parent may be just
# deleted, we should not put it back in the catalog.
parent_path = '/'.join(parent.getPhysicalPath())
if catalog.getrid(parent_path) is not None:
parent.reindexObject()
您可能需要单独处理MOVE
。