3

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

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

有人有解决这种情况的方法吗?

4

3 回答 3

3

如您所见,Plone / Zope 2 对象管理很混乱(是的,我愿意为此付出代价)。您需要在用户界面级别覆盖删除操作,而不是在对象级别。

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

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

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

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

于 2011-08-18T16:16:45.630 回答
2

你需要REQUEST.response.redirect("url")。我很确定 zExceptions.Redirect 是 Zope 在内部处理 response.redirect() 调用的方式。确保在调用 redirect() 之后仍然引发另一个异常,以便事务中止。

也就是说,这似乎是实现这一目标的错误方法。一方面,您将至少进行双重索引,这是在事务中止之前完成的。目录索引是处理修改内容的请求中最昂贵的部分,因此这会在您的服务器上造成浪费的负载。

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

于 2011-08-17T20:00:00.200 回答
1

您可以在事件处理程序中引发 aOFS.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)
于 2014-05-27T11:18:24.543 回答