4

我正在处理敏捷内容类型中的复杂验证,该验证应在工作流转换时检查多个字段的依赖关系 - 我希望它在将内容从“私有”发送到“待处理”时触发的 SimplePublicationWorkflow 中工作。

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

那么,在现代 Plone 中验证过渡的推荐方法是什么?我遇到了建议在转换的 Guard 表达式上添加要调用的外部方法的文档 - 但我不想使用外部方法,如果可能的话,我想保留默认工作流程。创建自定义选项是一种选项,它提供了一种干净的方式来进行检查。

4

2 回答 2

3

推荐的方法是设置一个守卫

守卫表达式应该能够查找视图以促进更复杂的守卫代码,但是当守卫返回时False,甚至没有将转换列为可用。

于 2013-08-02T15:20:16.700 回答
0

仅作记录;我今天找到了另一个用例,我修补了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

def validate_workflow_transition(event):
    if not check_something():
        raise MyException

补丁.py

def doActionFor(self, ob, action, comment='', **kw):
    ...
    # XXX: above this everything is included without any changes
    #      monkey patch replaces only the last line
    try:
        self._changeStateOf(ob, tdef, kw)
    except MyException:
        # do something
        pass

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

于 2017-01-24T01:53:36.490 回答