Проблема с plone.indexer и Ловкостью - PullRequest
7 голосов
/ 11 июля 2011

Я хочу включить специальный индекс, называемый Секторами, для атрибута («секторов») моего пользовательского типа контента на основе Ловкости.

В моей схеме внутри 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 ]

10 голосов
/ 11 июля 2011

Вы не определяете индекс каталога. Это просто сделает индексатор доступным для добавления. Вам требуется catalog.xml в вашем профиле GenericSetup с:

<?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>
0 голосов
/ 12 августа 2013

Принятое решение может быть немного неясным, поэтому вот несколько пояснений:

1) НЕ редактируйте ваши общие общие настройки.

Если вы не делаете что-то чрезвычайно странное, вы настроите свой сайт как серию дополнительных компонентов и будете иметь структуру папок, такую ​​как:

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)t имеет , чтобы иметь блок xml (согласно принятому решению) в catalog.xml, вы можете просто создать индекс из внешнего интерфейса ZMI.Тем не менее, если вы сделаете это, он будет взорван при следующей установке плагинов.Так что вы, вероятно, do захотите.

3) После установки вашего catalog.xml перейдите к интерфейсу ZMI к portal_catalog и убедитесь, что на вкладке «indexes» ваш индекс существует.Если вы не ошиблись.

4) Чтобы построить индекс, вам нужно перейти на вкладку "Дополнительно" и выбрать перестроить.

5) Индексатор жадно потребляет исключения и не вызывает их (особенно важно для AttributeError; вы не можете индексировать некоторые значения, которые хотите индексировать), поэтому, если вы хотите убедиться, что ваш индексатор действительно работает, попробуйте добавить оператор log или 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) 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

...