plone.indexer和Dexterity的问题

时间:2011-07-11 13:54:57

标签: indexing plone dexterity

我希望为我的基于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和目录脑对象中的索引似乎也没有。

我做错了什么?

2 个答案:

答案 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上,这非常有用:

https://github.com/aclark4life/event_days_indexer