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

Plone 避免删除对象(使用IObjectWillBeRemovedEvent)并重定向到自定义视图/模板?,plone,plone-3.x,Plone,Plone 3.x,我想中止删除对象(自定义内容类型),并重定向到将工作流设置为名为不可用的自定义状态的页面(视图),向用户显示一条消息“您已成功删除对象!”。该对象仍将在ZODB上,但对于某些组,它将根本看不到,就好像它真的被删除了一样 我可以使用IObjectWillBeRemovedEvent在订阅服务器中进行提升,但尝试使用raisezeexceptions.Redirect(“url”)无效。raise调用可避免删除,但会显示消息“无法删除对象”,而不是重定向 任何人都有这种情况的解决方案吗?您需要。我很

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

我可以使用
IObjectWillBeRemovedEvent
在订阅服务器中进行提升,但尝试使用
raisezeexceptions.Redirect(“url”)
无效。
raise
调用可避免删除,但会显示消息“无法删除对象”,而不是重定向

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

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

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


事件是用来做额外的事情,这些事情只与事件相关。你想要的是从根本上改变当有人删除时会发生什么。也许你应该修补/覆盖容器对象(文件夹?)上的底层删除方法来进行Workfow转换。

正如你所看到的,Plone/Zope 2对象管理很混乱(是的,我愿意烧掉karma就是为了这么说)。您需要在用户界面级别而不是对象级别重写删除操作

尝试了解如何在Plone用户界面中自定义删除操作

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

  • 创建另一个删除操作,该操作根据您的专用工作流执行


我相信可以从portal_操作配置删除,但删除一个对象(操作菜单)和删除多个对象(文件夹内容)可能有不同的情况。

您可以在事件处理程序中引发s.ObjectManager.BeforeDeleteException的
来停止删除。如果你提出一个
LinkIntegrityNotificationException
,你会被重定向到plonesnice链接完整性页面

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)

嗯,我还没想过覆盖删除方法。。。所有需要此行为的对象都是定制的内容类型,因此覆盖它们不会有问题。只要在我的内容类型声明中覆盖
delete
,删除操作是否会中止,我是否能够在其中运行所需的代码?这看起来不错。我在我的内容类型定义中声明了
def delete
,但它没有被称为“我的坏”。我甚至不知道是否在某个地方定义了
delete
。我将对源代码做一些阅读…正如Ross所说,删除是一个容器方法而不是对象方法。嗯,这可能是一种我也没有想到的方法:覆盖删除操作。因此,我会创建一个新的删除操作,它有一个新的逻辑(如果要删除内容类型,请执行某些操作,否则请删除),并使用它来代替默认的操作(将被隐藏)。我不能只覆盖
文件夹\u delete
删除\u确认
(在门户网站上提供的删除操作中使用的)在我的包中?或者我将来会后悔这样做吗?这种方法有任何非常糟糕的警告吗?可能有很多陷阱,但因为以前没有人这样做过,所以你将是唯一一个遭受这些陷阱的人:)