我希望为我的基于Dexterity的自定义内容类型的属性('sector')启用一个名为Sectors的特殊索引。
在我的架构中,在 types / mycontent.py 里面我有:
class IMyContent(form.Schema):
"""
My Content
"""
sectors = schema.Set(
title=_(u"Sectors"),
description=_(u"Select some sectors"),
value_type=schema.Choice(vocabulary=vocs.sectors),
required=True,
)
(...)
然后我以这种方式在 indexers.py
中定义索引from plone.indexer.decorator import indexer
from zr.content.types.mycontent import IMyContent
@indexer(IMyContent)
def Sectors(obj):
"""Indexer for Sectors attribute.
"""
d = getattr(obj, "sectors", u"")
return d if d else None
最后在根包 configure.zcml :
中<adapter name="Sectors" factory=".indexers.Sectors"/>
然而,它似乎不起作用。即使重新安装产品后,我也看不到portal_catalog和目录脑对象中的索引似乎也没有。
我做错了什么?
答案 0 :(得分:10)
您没有定义目录索引。这只会使索引器可用。您需要在GenericSetup配置文件中使用catalog.xml:
<?xml version="1.0"?>
<object name="portal_catalog" meta_type="Plone Catalog Tool">
<index name="Sectors" meta_type="KeywordIndex">
<indexed_attr value="Sectors"/>
</index>
</object>
答案 1 :(得分:0)
接受的解决方案可能略显模糊,因此这里有几点澄清:
1)不要编辑全局通用设置。
除非你做一些非常奇怪的事情,否则你将把你的网站设置为一系列plone扩展,并且具有如下文件夹结构:
app.plugin/
app.plugin/app/
app.plugin/app/configure.zcml
app.plugin/app/profiles/
app.plugin/app/profiles/default
app.plugin/app/profiles/default/types
app.plugin/app/profiles/default/types/Folder.xml
app.plugin/app/profiles/default/types/app.mydexteritytype.xml
app.plugin/app/profiles/default/types.xml
app.plugin/app/profiles/default/portlets.xml
app.plugin/app/profiles/default/catalog.xml <---- ADD THIS
2)你没有拥有在catalog.xml中拥有一个xml块(根据公认的解决方案),你可以从前端ZMI创建索引。但是,如果你这样做,下次安装插件时它会被吹走。所以你可能做想要。
3)安装catalog.xml后,浏览到portal_catalog的ZMI接口,并检查“索引”选项卡下的索引是否存在。如果它不是你搞砸了。
4)要构建索引,您需要进入“高级”标签并选择重建。
5)索引器贪婪地消耗异常并且不会引发它们(对于AttributeError尤其重要;您可能不会索引某些要编制索引的值),因此如果要确保索引器实际运行,请尝试添加记录或打印声明:
@indexer(IMyDexterityType)
def dummy_indexer(obj, **kw):
try:
print('indexed: %r' % obj)
return obj.title
except Exception as e:
print('index fail: %r' % e)
return ''
如果没有别的,你应该看到一些输出,如:
2013-08-12 16:42:28 INFO GenericSetup.archetypetool Archetype tool imported.
2013-08-12 16:42:28 INFO GenericSetup.resourceregistry Stylesheet registry imported.
2013-08-12 16:42:28 INFO GenericSetup.resourceregistry Javascript registry imported.
indexed: <MyDexterityType at /Plone/test/cat-document-0>
indexed: <MyDexterityType at /Plone/test/hello>
6)一些文档(http://developer.plone.org/reference_manuals/external/plone.app.dexterity/advanced/catalog-indexing-strategies.html?highlight=custom%20indexing#creating-custom-indexers)中提到的grok.global_adapter()是关于注册虚拟属性的,并没有减少设置catalog.xml的需要。
最后,有人在这里把一个有效的例子放在github上,这非常有用: