Я хочу создать подписчика, который запускается, когда пользователь пытается получить доступ к ресурсу (который является пользовательским типом контента). Таким образом, объект не добавляется, не изменяется, ничего, просто пересекается. Что-то вроде 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>
Если решение состоит в том, чтобы написать событие самостоятельно, есть ли простое руководство для этого?