在Plone上的浏览器上显示页面以触发订阅者之前,我应该使用哪个事件?

时间:2011-07-06 20:45:16

标签: events plone

我想创建一个在用户尝试访问资源时触发的订阅者(这是一种自定义内容类型)。因此,对象没有被添加,修改,没有任何东西,只是被遍历。类似于Zope View Event

因此,基本上,假设自定义内容类型具有自定义工作流(两种状态:privateviewed)。初始状态为private。此内容类型仅以匿名用户使用_createObjectByType以编程方式创建。假设一个名为myobjet的对象以编程方式添加到我的Plone站点的根文件夹中。

我想要的是:当用户访问时

http://localhost:8080/Plone/myobject

...它会自动将此对象的工作流程状态更改为viewed。网址http://localhost:8080/Plone/myobject将是自定义视图,而不是默认base_edit

我应该使用哪个活动?我从this list尝试了IEndRequestEventIBeforeTraverseEvent,但没有一个工作:我的自定义对象界面没有调用处理程序。

我已经尝试了我的自定义对象接口(如IObjectEditedEvent)的其他事件,并且,对于此事件,在编辑实现接口的对象时调用我的处理程序。但是使用IEndRequestEventIBeforeTraverseEvent并不会调用处理程序。

IEndRequestEventIBeforeTraverseEvent仅在我将订阅者设置为所有接口时才起作用:

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

当我在这种情况下让myhandler打印对象和事件时,它会显示:

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

如果解决方案是自己编写一个事件,是否有一个简单的教程?

2 个答案:

答案 0 :(得分:4)

您可能需要查看http://pypi.python.org/pypi/plone.validatehook

确保将事件绑定到正确的界面。如果将其绑定到“Interface”(如plone.validatehook pypi页面中所述),将为每个请求调用该事件。为了将事件限制为contentish对象,您可以执行以下操作:

from Products.CMFCore.interfaces import IContentish

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

(编辑:我删除了我的第一个答案,因为它不起作用)

答案 1 :(得分:1)

不确定这个订阅者应该做什么,但是如果对象没有被修改,添加或者任何东西,我必须怀疑它只会被查看...所以为什么不使用__call__方法项目视图(如果使用five.grok / dexterity,则为__update__方法)?