Поиск способа вести реестр представлений и именованных адаптеров в 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>
Где контекст - это почти любой тип контента.
Имеет ли этот подход смысл? Если да, как я могу найти все эти имена представлений для словаря?