Как переопределить меню отображения Plone для содержимого особого случая? - PullRequest
6 голосов
/ 08 июня 2011

Чтобы получить одноразовый просмотр папки Plone, я делаю что-то вроде этого (показан не весь код):

В configure.zcml:

<!-- Marker interface. Set this on the folder through the ZMI
     interfaces tab.
  -->
<interface interface=".interfaces.IMySpecialFolder" />

В browser/configure.zcml:

<!-- Special case view. Set as the folder's view through the ZMI
     properties tab (layout property).
  -->
<browser:page
  for="..interfaces.IMySpecialFolder"
  name="special"
  template="special.pt"
  permission="zope2.View"
  />

Это прекрасно работает, но я бы хотел управлять меню отображения папки, чтобы отобразить только мой особый случай. Я могу добавить его, и он отображается только в моей помеченной папке, но мне нужно изменить ATFolder FTI для всего сайта.

В browser/configure.zcml:

<include package="plone.app.contentmenu" />

<browser:menuItem
  for="..interfaces.IMySpecialFolder"
  menu="plone_displayviews"
  title="Special view"
  action="@@special"
  description="Special case folder view"
  />

В profiles/default/types/Folder.xml:

<?xml version="1.0"?>
<object name="Folder">
 <property name="view_methods" purge="False">
  <element value="special"/>
 </property>
</object>

Конечно, я не могу удалить существующие доступные методы просмотра, не затрагивая все папки на сайте.

Есть ли способ настроить это одноразовое меню дисплея без изменения FTI типа контента?

На самом деле, похоже, что эта проблема уже решалась раньше. p4a.z2utils исправления CMFDynamicViewFTI для получения списка доступных представлений из поиска адаптера IDynamicallyViewable. ( dateable.chronos использует этот механизм для представлений календаря своих папок). Так что мой вопрос становится:

Есть ли способ сделать это одноразовое изменение меню дисплея без изменения FTI типа контента и без исправления Plone?

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Конструктор меню Plone Display использует ISelectableBrowserDefault, чтобы получить доступные опции в меню Display (см. http://dev.plone.org/plone/browser/plone.app.contentmenu/trunk/plone/app/contentmenu/menu.py#L220)

). Поэтому я думаю (но я не пробовал это), что если вы определите адаптер дляболее конкретный интерфейс (в вашем случае IMySpecialFolder), который обеспечивает Products.CMFDynamicViewFTI.interface.ISelectableBrowserDefault, он должен работать.

Адаптер должен иметь методы, требуемые plone.app.contentmenu.menu.DisplayMenu выше.

1 голос
/ 05 сентября 2011

Отвечая на мой собственный вопрос, я понял, что самый простой способ получить одноразовые представления папки - это следовать шаблону, который сам Plone применяет в папке Members: PythonScript index_html, который вызывает пользовательское представление,например,

member_search=context.restrictedTraverse('member_search_form')
return member_search()

Products.CMFPlone иллюстрирует , как настроить такой PythonScript с помощью обработчика импорта GenericSetup .

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

Обратите внимание, что это решение не приводит к тому, что "меню отображения папки, в котором содержится только мой особый случай просмотра", как я и просил, но вообще устраняет меню отображения.Я в порядке с этим.

0 голосов
/ 20 декабря 2012

Один из способов решить эту проблему - использовать traversalhook для регистрации элементов меню или, в этом случае, отменить регистрацию элементов меню или зарегистрировать элементы меню с условиями, при которых они не отображаются.С помощью ловушки обхода вы можете использовать интерфейс маркера, чтобы сделать это просто в определенной папке, подразделе или странице.Вы можете увидеть, где мы реализовали подобный код здесь

https://github.com/collective/collective.listingviews/blob/master/src/collective/listingviews/browser/views/controlpanel.py#L105

В этом случае мы просто хотели динамически регистрировать новые пункты меню дисплея на основе конфигурации панели управления.

...