我想创建一个在用户尝试访问资源时触发的订阅者(这是一种自定义内容类型)。因此,对象没有被添加,修改,没有任何东西,只是被遍历。类似于Zope View Event。
因此,基本上,假设自定义内容类型具有自定义工作流(两种状态:private
和viewed
)。初始状态为private
。此内容类型仅以匿名用户使用_createObjectByType
以编程方式创建。假设一个名为myobjet
的对象以编程方式添加到我的Plone站点的根文件夹中。
我想要的是:当用户访问时
http://localhost:8080/Plone/myobject
...它会自动将此对象的工作流程状态更改为viewed
。网址http://localhost:8080/Plone/myobject
将是自定义视图,而不是默认base_edit
。
我应该使用哪个活动?我从this list尝试了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>
如果解决方案是自己编写一个事件,是否有一个简单的教程?
答案 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__
方法)?