Браузер 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.