2011-07-11 5 views
7

私の敏捷性ベースのカスタムコンテンツタイプの属性( 'sectors')に対して、Sectorsという特殊インデックスを有効にしたいとします。plone.indexerと巧妙な問題

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 

で内側に、このようにインデックスを定義します。私が持っているタイプ/ mycontent.pyの内側に私のスキーマで

、ルートパッケージconfigure.zcml

<adapter name="Sectors" factory=".indexers.Sectors"/> 

ただし、動作していないようです。製品を再インストールした後でも、portal_catalogの索引は表示されず、カタログのbrainオブジェクトにも索引が付いていないようです。

私は間違っていますか?

答えて

10

カタログ索引を定義していません。これにより、インデクサを追加できるようになります。あなたのグローバルな汎用的な設定を編集しないでください)

1:受け入れソリューションはので、ここで、ややあいまいかもしれ

<?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

それでも、汎用的な設定で新しいインデックスを追加しないでくださいそれはquick_installerを使用しています。 –

+1

一般的に製品を再インストールすることは間違っているという兆候です。 – MatthewWilkes

0

明確化のカップルがいる:あなたがあなたのGenericSetupプロファイル内のcatalog.xmlが必要です。

あなたは非常に奇妙な何かをやっている場合を除き、あなたは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からインデックスを作成するだけです。ただし、これを行うと、次にプラグインをインストールするときに吹き飛ばされます。だからおそらくdoしたい。

3)catalog.xmlをインストールした後、portal_catalogへのZMIインタフェースを参照し、インデックスが存在することを確認します。それはあなたが台無しにしていない場合。

4)ビルドにインデックスを追加するには、[詳細設定]タブに移動して再構築する必要があります。

5)インデクサーは慎重に例外を消費し、それらを発生させません(特にAttributeErrorでは重要ですが、インデックスを付けることはできません)ので、インデクサーが実際に動作していることを確認したい場合は、その中にログまたはprint文:

@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())であります仮想pの登録についてカタログを設定する必要性を軽減するものではありません。

最後に、誰かが非常に有用である、ここではgithubの上で作業例を置くだ:あなたは再インストールした場合、あなたはすべてのデータを失うことになるので、

https://github.com/aclark4life/event_days_indexer