Браузер Zope3: страница с несколькими интерфейсами

Допустим, у меня есть следующий код в моем файле configure.zcml. Я хочу, чтобы мой класс был реализован для другого интерфейса, скажем, Interface2

<browser:page
        for="Interface1"
        class="plone.app.content.browser.reviewlist.FullReviewListView"
        name="full_review_list"
        template="document_full_review_list.pt"
        permission="cmf.ReviewPortalContent" />

Как мне объявить это в моем файле zcml?

До тех пор, пока я попробовал следующее:

<browser:page
       for="Interface1 Interface2"
       class="plone.app.content.browser.reviewlist.FullReviewListView"
       name="full_review_list"
       template="document_full_review_list.pt"
       permission="cmf.ReviewPortalContent" />

а также

<browser:page
       for="Interface1"
       allowed_interface="Interface2"
       class="plone.app.content.browser.reviewlist.FullReviewListView"
       name="full_review_list"
       template="document_full_review_list.pt"
       permission="cmf.ReviewPortalContent" />

1 ответ

Решение

Вам придется зарегистрировать его дважды, по одному разу для каждого интерфейса.

Имя может быть тем же, без получения ConfigurationConflictError, так как представление браузера - это именованный мультиадаптер, который адаптирует как объект, предоставляющий определенный интерфейс (т.е. Interface1 или Interface2), так и запрос.

Таким образом, если интерфейс, который должен предоставлять объект, отличается для каждой регистрации просмотра браузера, то конфликта нет.

<browser:page
        for="Interface1"
        class="plone.app.content.browser.reviewlist.FullReviewListView"
        name="full_review_list"
        template="document_full_review_list.pt"
        permission="cmf.ReviewPortalContent" />

<browser:page
        for="Interface2"
        class="plone.app.content.browser.reviewlist.FullReviewListView"
        name="full_review_list"
        template="document_full_review_list.pt"
        permission="cmf.ReviewPortalContent" />

И наоборот, вы можете иметь две регистрации в браузере для одного и того же интерфейса объекта (и с одинаковым именем), но с разборчивыми критериями, являющимися интерфейсом, предоставленным запросом. Вот для чего нужен атрибут layer.

Другие вопросы по тегам