7

我希望为基于 Dexterity 的自定义内容类型的属性(“扇区”)启用一个特殊的索引,称为扇区。

在我的模式中,在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 中的索引,并且目录大脑对象似乎也没有它。

我究竟做错了什么?

4

2 回答 2

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>
于 2011-07-11T13:59:14.133 回答
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 后,浏览ZMI 界面到portal_catalog 并检查'indexes' 选项卡下的索引是否存在。如果没有,你就搞砸了。

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) grok.global_adapter() 如某些文档中所述(http://developer.plone.org/reference_manuals/external/plone.app.dexterity/advanced/catalog-indexing-strategies.html?highlight=custom%20indexing #creating-custom-indexers)是关于注册虚拟属性,并不能减轻设置您的 catalog.xml 的需要。

最后,有人在 github 上放了一个工作示例,这非常有用:

https://github.com/aclark4life/event_days_indexer

于 2013-08-12T08:59:33.220 回答