工作流程守卫:
仅供参考,而不是工作流守卫,我们曾经指向其他工作流转换脚本。在我们的例子中,a比非常有限的脚本(至少在 Plone 4 中)BrowserView
具有更多的可能性。content_status_modify
它也更容易测试,我在工作流保护方面遇到了一些问题......但我不记得了:-((可能我错过了一些有效负载/上下文/请求)。
您可以使用您的工作流程设置工作流程转换脚本definition.xml
(示例):
<transition new_state="somestate" title="Some Title" transition_id="transition_id" after_script="" before_script="" trigger="USER">
<action category="workflow" icon="" url="%(content_url)s/some-other-modify-status-script?transition=transition_di">Some Title</action>
<guard>
<guard-role>Contributor</guard-role>
<guard-role>Manager</guard-role>
<guard-role>Reviewer</guard-role>
<guard-role>Site Administrator</guard-role>
</guard>
</transition>
此示例将 url 从更改content_status_modify
为some-other-modify-status-script
这是自定义状态修改脚本的完整示例
重要的部分发生在第 21 行。它检查一些约束,如果它有效,则转换将发生,如果不是,则甚至不会初始化转换。
我敢肯定,在您的情况下,您可以将其缩短为几行可读的行。
完整的例子后面有一个“约束系统”(适配器),它允许注册约束,这就是为什么还有几行代码......
验证表单:
如果由于某种原因这是不可能的:您需要在表单级别进行验证。这意味着自定义敏捷编辑表单。
在那里,我会侵入该handleApply
方法并提出一个WidgetActionExecutionError
or ActionExecutionError
。取决于您是想要小部件上的错误消息还是表单上的一般错误消息。检查http://garbas.github.io/plone-z3c.form-tutorial/validation.html
编辑:除了表单验证(非常高级别)之外,您可以确保还验证了低级别修改在这种情况下,您可以在您的行为中编写自己的字段设置器。
DX 类型的自定义 getter/setter 的工作示例。
仅供参考:我最近也在 plone.app.dx 存储库中发现了这个问题
这应该很容易适应行为,因为默认情况下,您可以在 PropertyStorage 和 AnnotationStorage 之间选择行为数据。