С какими правилами работает plone, чтобы решить, какие меню отображать и когда? - PullRequest
4 голосов
/ 19 июля 2011

Я использую Plone 4.0.5, и я потратил целый день, пытаясь понять plone.app.contentmenu.

У меня есть тип архетипов на основе пользовательских папок, и я написал представлениедля этого.При использовании base_view по умолчанию (site / MyObject / base_view) все работает как положено.Однако при использовании моего собственного пользовательского представления меню начинают исчезать, и я не могу этого понять.

Во-первых, мой zcml,

<browser:page
  for="my.product.interfaces.IMyType"
  name="view"
  class="my.product.browser.mytype.MyTypeViewView"
  permission="zope.Public"
/>

Само представление столь же простонасколько это возможно:

class MyTypeViewView(BrowserView):
    template = ViewPageTemplateFile("templates/mytype_view.pt")
    def __call__(self):
        return self.template()

И шаблон представления также уменьшен до нуля:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="plone">
<body>
<metal:content-core fill-slot="content-core">
  hi there.
</metal:content-core>
</body>
</html>

Если я захожу на сайт / MyObject / view, шаблон показывает «Привет!»,но plone-contentmenu-actions и plone-contentmenu-workflow исчезают.plone-contentmenu-фабрики, однако, остается.если я затем изменю ZCML, чтобы установить name = "view_test", и зайду на сайт / MyObject / view_test, ни одно из меню вообще не отобразится.

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

Если я переименую свое представление в base_view и открою URL объектанапрямую, у меня все еще нет доступного меню рабочего процесса.

Наверное, мой вопрос должен быть таким:

С какими именно правилами работает plone, чтобы решить, какие меню отображать и когда?Какой код мне следует читать?

- изменить:

Я добавил эту функцию в свой просмотр:

def __init__(self, context, request):
    super(MyTypeViewView, self).__init__(context, request)
    alsoProvides(self, IViewView)
    alsoProvides(self.context, IViewView)

, если я установил точку останова в моем вызов код, я получаю это:

>>> IViewView.providedBy(self)
True
>>> IViewView.providedBy(self.context)
True

Я почти уверен, что мне нужно было только применить IViewView к самому представлению, но, независимо от этого, это ничего не меняет для меня.

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Plone применил интерфейс маркера IViewView к виду, который является каноническим для объекта - тот, который вы получаете, щелкая вкладку вида.Определенные части интерфейса ограничены этим интерфейсом - см. Раздел «Ограничение просмотра в каноническом представлении» в http://plone.org/products/dexterity/documentation/manual/five.grok/browser-components/viewlets

2 голосов
/ 20 июля 2011

Поскольку у вас уже есть класс представления (MyTypeViewView) для вашей страницы, проще сделать так, чтобы он реализовывал интерфейс, а не создавал его экземпляры:

from plone.app.layout.globals.interfaces import IViewView

class MyTypeViewView(BrowserView):
    interface.implements(IViewView)

    ...

Хотя я думаю, что этоне решит вашу проблему, так как у меня есть много пользовательских представлений, которые не реализуют IViewView, но хорошо отображают все действия.

Полагаю, вам просто нужно добавить свои представления в доступные представления по умолчанию для вашего типа в portal_typesинструмент, и ты в порядке.

...