Простой способ в Plone 4 собрать представления / адаптеры в реестре / реестрах? - PullRequest
0 голосов
/ 01 февраля 2012

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

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

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

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

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

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

UPDATE: чтобы сделать это более конкретным, рассмотрим следующий вариант использования с представлениями:

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

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

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

1 Ответ

0 голосов
/ 01 февраля 2012

Я, вероятно, пропустил следующую часть в документации 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, что важно ...

...