避免删除对象(使用IObjectWillBeRemovedEvent)并重定向到自定义视图/模板?

时间:2011-08-17 18:59:41

标签: plone plone-3.x

我想中止删除对象(自定义Content-Type),并重定向到将工作流设置为名为Unavailable的自定义状态的页面(视图),向其显示一条消息用户“您成功删除了对象!”。该对象仍将在ZODB上,但对于某些组,它根本就不会被看到,就像它真的被删除一样。

我可以使用IObjectWillBeRemovedEvent对订阅者进行加注,但尝试使用raise zExceptions.Redirect("url")不起作用。 raise调用可以避免删除,但会显示消息“无法删除对象”,而不是重定向。

任何人都有这种情况的解决方案吗?

3 个答案:

答案 0 :(得分:3)

正如你所看到的,Plone / Zope 2对象管理很混乱(是的,我愿意燃烧业力只是为了说明这一点)。您需要在用户界面级别覆盖删除操作,而不是在对象级别。

尝试弄清楚如何在Plone用户界面中自定义删除操作。

  • 确保默认的删除操作不再可见且可用(例如,为其设置更高的所需权限,例如cmf.ManagePortal)

  • 根据您的专业工作流程创建另一个删除操作

我相信删除可以从portal_actions配置,但可能有单独的情况删除一个对象(操作菜单)和删除多个对象(folder_contents)。

答案 1 :(得分:2)

您需要REQUEST.response.redirect("url")。我很确定zExceptions.Redirect是Zope内部处理response.redirect()调用的方式。

确保在调用redirect()之后仍然引发另一个异常。

那就是说,这肯定是错误的做法。首先,您将至少进行双重索引,这是在事务中止之前完成的。目录索引是处理修改内容的请求中最昂贵的部分,因此这会在您的服务器上产生浪费的负载。

事件用于执行与事件仅切线相关的其他内容。你想要的是从根本上改变有人删除时发生的事情。也许你应该修补/覆盖容器对象(文件夹?)上的基础删除方法来进行工作转换。

答案 2 :(得分:1)

您可以在事件处理程序中引发OFS.ObjectManager.BeforeDeleteException以停止删除。如果你引发LinkIntegrityNotificationException,你会被重定向到Plones nice Link完整性页面。

from OFS.interfaces import IObjectWillBeRemovedEvent
from plone.app.linkintegrity.exceptions import LinkIntegrityNotificationException
import grok

@grok.subscribe(ICSRDocument, IObjectWillBeRemovedEvent)
def document_willbemoved(doc, event):
    raise LinkIntegrityNotificationException(doc)