Простой способ в Plone 4 собирать представления/адаптеры в реестре/реестрах?

Поиск способа вести реестр представлений и именованных адаптеров в Plone 4 чисто ZCML или grok, не создавая registerSomething(myClass).

Например, если у меня есть основной продукт, которому нужен словарь имен для всех именованных (мульти)адаптеров определенной природы. Продукт может предоставлять несколько адаптеров, но другие адаптеры могут быть получены от других продуктов (сторонних производителей), которые не должны зависеть от основного продукта.

Очевидным способом является создание какого-либо реестра, такого как PloneArticle, для отслеживания моделей страниц (registerArticleModel(MyPageModel)), но я надеюсь, что есть более чистый способ.

Вопрос в том, есть ли чисто ZCML/grok способ добиться эффекта реестра? Таким образом, когда сторонний продукт делает доступным собственный адаптер, «реестр» автоматически подхватывает его и показывает в словаре. Например, запросив в системе компонентов все адаптеры с определенной сигнатурой.

Конечно, «реестр» не должен быть постоянным. Основной продукт будет использовать запасные варианты в случае отсутствия адаптеров/представлений.

Производительность не проблема, но линейный поиск по всем адаптерам для составления словаря не является приемлемым решением.

ОБНОВЛЕНИЕ: чтобы сделать это более конкретным, рассмотрим следующий вариант использования с представлениями:

  <browser:page
  name="content-item-plain"
  for="*"
  class=".content_item.ContentItem"
  permission="zope2.View"
  layer="my.model.browser.interfaces.IMyModelLayer"
  template="templates/content_item_plain.pt"
  />

  <browser:page
  name="content-item-another"
  for="*"
  class=".content_item.ContentItem"
  permission="zope2.View"
  layer="my.model.browser.interfaces.IMyModelLayer"
  template="templates/content_item_another.pt"
  />

...

В шаблоне:

<-- config/layout may contain '@@content-item-another' or '@@content-item-plain' 
from the vocabulary -->

<tal:def define="layout config/layout"
     <metal:item use-macro="context/?layout/html" />
</tal:def>

Где контекст — это почти любой тип контента.

Есть ли смысл в этом подходе? Если это так, как я могу найти все эти имена представлений для словаря?


person Roman Susi    schedule 01.02.2012    source источник
comment
Это именно то, для чего предназначена архитектура компонентов Zope, но неясно, о чем вы спрашиваете. Вы читали доступную документацию?   -  person Martijn Pieters    schedule 01.02.2012
comment
В документации ответов не нашел. Мой вопрос можно свести к тому, существует ли метод (скажем, findAllMultiAdapters) для поиска всех подходящих именованных адаптеров: component.findAllMultiAdapters((IA, IB), name=*)   -  person Roman Susi    schedule 01.02.2012
comment
На самом деле, это еще не все. Пожалуйста, взгляните на обновление.   -  person Roman Susi    schedule 01.02.2012


Ответы (1)


Вероятно, я пропустил следующую часть документации zope.component http://pypi.python.org/pypi/zope.component

Иногда вы хотите знать все доступные адаптеры. Допустим, вы хотите узнать обо всех адаптерах, которые преобразуют немецкий тип сокета в американский:

>>> sockets = list(zope.component.getAdapters((bathroomDE,), IUSSocket))
>>> len(sockets)
3
>>> names = [name for name, socket in sockets]
>>> names.sort()
>>> names
[u'', u'dvd', u'shaver']

Кажется, это отвечает на мой вопрос о (не мульти) адаптерах. Просмотры еще не покрыты.

Я могу сделать именованный адаптер для просмотра, но тогда я не могу переопределить index с template в ZCML, что важно...

person Roman Susi    schedule 01.02.2012
comment
getAdapters() также может получать несколько адаптеров (например, представления) с некоторыми ограничениями (только один именованный адаптер на интерфейс). - person sdupton; 01.02.2012