如何在Plon中中止工作流转换

2024-05-23 18:08:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在一个dexterity内容类型中进行复杂的验证,它应该在工作流转换时检查多个字段之间的依赖关系—我希望它能在内容从“private”发送到“pending”时被触发的SimplePublicationWorkflow中工作。在

我已经为ibefreevent注册了一个事件侦听器,并将其连接起来——但是除了引发异常之外,没有任何方法可以阻止转换的发生。(如果您在那里引发一个异常,它将不被捕获,用户将看到一个错误页,而不是一个自定义消息)。在

那么,有什么推荐的方法来验证现代Plone的转变呢?如果我不想使用外部方法的话,我想继续使用外部方法。创建自定义的一个选项提供了一个干净的方法来进行检查。在


Tags: 方法用户消息类型内容关系plone错误
2条回答

建议的方法是设置一个保护。在

保护表达式应该能够查找视图以方便更复杂的保护代码,但是当保护返回False时,转换甚至没有被列为可用的。在

只是为了记录;我今天发现了另一个用例,我用monkey-patched Products.DCWorkflow作为概念证明:

配置.zcml

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:monkey="http://namespaces.plone.org/monkey">

  <monkey:patch
      description="Allow aborting workflow transitions"
      class="Products.DCWorkflow.DCWorkflow.DCWorkflowDefinition"
      original="doActionFor"
      replacement=".patches.doActionFor"
      />

  <subscriber
      for="Products.DCWorkflow.interfaces.IBeforeTransitionEvent"
      handler=".subscribers.validate_workflow_transition"
      />

</configure>

订阅服务器.py

^{pr2}$

补丁.py

^{3}$

概念验证按预期工作,但我对结束的UI不满意,所以我决定按照Martijn的建议重新实现所有的工作流程转换;它需要额外的代码来设置所有涉及的工作流转换(并在卸载时删除它们),以及一个浏览器视图和viewlet来显示一条解释原因的消息转换不可用,但最后会更干净。在

相关问题 更多 >