我正在灵巧内容类型中进行复杂验证,该类型应检查工作流转换时跨多个字段的依赖关系 - 我希望它在内容从“私有”发送到“私有”时触发的SimplePublicationWorkflow中工作挂起”。
我已经为IBeforeEvent注册了一个事件监听器并将其连接起来 - 但是没有做任何事情就可以阻止过渡发生。 (如果你在那里引发了一个例外,它就会被删除,而且用户会看到错误页面而不是自定义消息。)
那么,在现代Plone中验证转换的推荐方法是什么?我发现文档建议添加外部方法以在转换的Guard表达式上调用 - 但我不想使用外部方法,如果可能,我想保留默认工作流程。创建一个自定义的选项提供了一种干净的方法来进行检查。
答案 0 :(得分:3)
建议的方法是设置后卫。
守护表达式应能够查找视图以促进更复杂的保护代码,但当保护返回False
时,转换甚至不会列为可用。
答案 1 :(得分:0)
仅供记录;我今天发现了另一个用例,我将Products.DCWorkflow作为概念验证进行修补:
<强> configure.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>
<强> subscribers.py 强>
def validate_workflow_transition(event):
if not check_something():
raise MyException
<强> patches.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
概念验证按预期工作,但我对结束用户界面不满意,所以我决定遵循Martijn的建议并重新实施一切作为后卫;它需要额外的代码来设置所涉及的所有工作流转换(并在卸载时删除它们),以及浏览器视图和viewlet以显示消息,解释转换不可用的原因,但最后会更清洁。 / p>