7

器用さベースのカスタムコンテンツタイプの属性(「セクター」)に対して、セクターと呼ばれる特別なインデックスを有効にしたい。

私のスキーマでは、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プロファイルに次のカタログ.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をインストールした後、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)に記載されているgrok.global_adapter()#creating-custom-indexers)は、仮想プロパティの登録に関するものであり、catalog.xmlを設定する必要性を軽減するものではありません。

最後に、誰かがここのgithubに実用的な例を載せました。これは非常に便利です。

https://github.com/aclark4life/event_days_indexer

于 2013-08-12T08:59:33.220 に答える