Какое событие следует использовать непосредственно перед тем, как страница отобразится в браузере на Plone для запуска подписчика? - PullRequest
2 голосов
/ 07 июля 2011

Я хочу создать подписчика, который запускается, когда пользователь пытается получить доступ к ресурсу (который является пользовательским типом контента). Таким образом, объект не добавляется, не изменяется, ничего, просто пересекается. Что-то вроде Zope View Event .

Итак, предположим, что у пользовательского типа контента есть собственный рабочий процесс (два состояния: private и viewed). Исходное состояние private. Этот тип контента будет создаваться только программно, с использованием _createObjectByType анонимными пользователями. Предположим, что объект с именем myobjet был добавлен программно в корневую папку моего сайта Plone.

Что я хочу, это: когда пользователь получает доступ

http://localhost:8080/Plone/myobject

... автоматически изменяет состояние рабочего процесса этого объекта на viewed. URL http://localhost:8080/Plone/myobject будет настраиваемым, а не стандартным base_edit.

Какое событие мне следует использовать? Я пробовал IEndRequestEvent и IBeforeTraverseEvent из этого списка , и ни один из них не работает: обработчик не вызывается для моего пользовательского интерфейса объекта.

Я пробовал другие события с моим пользовательским интерфейсом объекта (например, IObjectEditedEvent), и для этого события мой обработчик вызывается, когда я редактирую объект, который реализует интерфейс. Но использование IEndRequestEvent и IBeforeTraverseEvent не вызывает обработчик.

IEndRequestEvent и IBeforeTraverseEvent работают, только когда я настраиваю подписчика на все интерфейсы:

  <subscriber
     for="*
          zope.app.publication.interfaces.IBeforeTraverseEvent"
     handler=".subscriber.myhandler"
     />

И когда я заставляю myhandler напечатать объект и событие в этой ситуации, он показывает:

<PloneSite at Plone>
<zope.app.publication.interfaces.BeforeTraverseEvent object at 0xd52618c>

Если решение состоит в том, чтобы написать событие самостоятельно, есть ли простое руководство для этого?

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Возможно, вы захотите взглянуть на http://pypi.python.org/pypi/plone.validatehook.

Убедитесь, что вы связали событие с нужным интерфейсом.Если вы свяжете его с «Интерфейсом» (как описано на странице pypi plone.validatehook), событие будет вызываться для каждого отдельного запроса.Чтобы ограничить событие контентными объектами, вы можете сделать следующее:

from Products.CMFCore.interfaces import IContentish

@adapter(IContentish, IPostValidationEvent)
def RedirectMember(object, event):
    ...

(Изменить: я удалил свой первый ответ, потому что он не работал)

1 голос
/ 07 июля 2011

Не уверен, что этот подписчик должен делать, но если объект не изменяется, не добавляется или что-либо еще, чем я должен подозревать, он просто будет просмотрен ... так почему бы просто не использовать метод __call__ элементовview (или метод __update__, если вы используете five.grok / dexterity)?

...