![](/img/trans.png)
[英]TFS Build Workflow Change Folder/File Attributes From Read-Only to Read/Write?
[英]How to dynamically change the mode of a Dexterity behavior field to read-only?
Collector.googlenews是一个程序包,它实现(除其他外)行为会向基于敏捷的内容类型添加2个新字段。
其中一个字段(称为standout_journalism
)具有一些特殊要求,这些要求已被证明很难实施:
然后,我必须实现2种不同的验证:
我能够使用工作流防护和一个显示警告的视图来解决第一部分,该警告解释了为什么禁用过渡,但是我不确定第二部分。
我创建了一个不变式,如果用户尝试更改已发布项目中字段的值,则表单将返回错误。
问题在于我们认为行为应该有所不同:当不允许将某项标记为突出时,我们希望避免更改该字段的值(将其标记为只读)。
我应该创建自己的小部件吗? 我应该在该字段中覆盖update
方法吗? 我应该覆盖表单中的updateWidgets
方法吗?
在任何情况下,我都不知道如何进行操作,因为文档尚不清楚与行为一起添加的字段。
任何指向代码示例的指针都将受到赞赏。
工作流防护:
过去只是FYI而不是工作流防护,我们曾经指向其他工作流转换脚本。 在我们的例子中, BrowserView
比非常有限的content_status_modify
脚本(至少在Plone 4中)具有更多的可能性。
它也更容易测试,并且我在工作流防护方面存在一些问题...但是我不记得了:-((可能我错过了一些有效负载/上下文/请求)。
您可以使用工作流程的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行。它检查一些约束,如果有效,则将进行转换,否则,转换不会被初始化。
我确定在您的情况下,您可以将其缩短为几行可读的代码。
完整的示例后面有一个“约束系统”(适配器),它允许注册约束,这就是为什么还要多行代码的原因...
验证表格:
hooks.getSite()
以及hooks.getSite()
来获取门户。这样,所有逻辑都直接位于您的行为中。 如果由于某种原因,这是不可能的:您需要在表单级别进行验证。 这意味着定制灵活性编辑表单。
在这里,我将侵入handleApply
方法并引发WidgetActionExecutionError
或ActionExecutionError
。 取决于是要在小部件上显示错误消息还是在表单上显示常规错误消息。 检查http://garbas.github.io/plone-z3c.form-tutorial/validation.html
编辑:除了可以进行表单验证(非常高级别)之外,还可以验证低级别的修改。在这种情况下,您可以在行为中编写自己的字段设置器。
DX类型的自定义获取/设置器的工作示例。 仅供参考: 我最近还在plone.app.dx存储库中发现了此问题
这应该很容易适应行为,因为默认情况下,您可以在行为数据的PropertyStorage和AnnotationStorage之间进行选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.