繁体   English   中英

如何动态地将敏捷行为字段的模式更改为只读?

[英]How to dynamically change the mode of a Dexterity behavior field to read-only?

Collector.googlenews是一个程序包,它实现(除其他外)行为会向基于敏捷的内容类型添加2个新字段。

其中一个字段(称为standout_journalism )具有一些特殊要求,这些要求已被证明很难实施:

  • 任何网站在过去一周只能有7个项目标记为杰出
  • 要计数,并且必须将项目声明为突出(布尔字段)并且必须发布

然后,我必须实现2种不同的验证:

  • 在工作流程过渡上,当我们已经有7个时,避免发布标记为杰出的项目
  • 在编辑表单上,当我们已经有7个时,避免将已发布的项目标记为突出

我能够使用工作流防护和一个显示警告的视图来解决第一部分,该警告解释了为什么禁用过渡,但是我不确定第二部分。

我创建了一个不变式,如果用户尝试更改已发布项目中字段的值,则表单将返回错误。

问题在于我们认为行为应该有所不同:当不允许将某项标记为突出时,我们希望避免更改该字段的值(将其标记为只读)。

我应该创建自己的小部件吗? 我应该在该字段中覆盖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()来获取门户。这样,所有逻辑都直接位于您的行为中。
  • 指令形式验证器修饰器-> https://pypi.python.org/pypi/plone.directives.form#validators

如果由于某种原因,这是不可能的:您需要在表单级别进行验证。 这意味着定制灵活性编辑表单。

在这里,我将侵入handleApply方法并引发WidgetActionExecutionErrorActionExecutionError 取决于是要在小部件上显示错误消息还是在表单上显示常规错误消息。 检查http://garbas.github.io/plone-z3c.form-tutorial/validation.html

编辑:除了可以进行表单验证(非常高级别)之外,还可以验证低级别的修改。在这种情况下,您可以在行为中编写自己的字段设置器。

DX类型的自定义获取/设置器的工作示例。 仅供参考: 我最近还在plone.app.dx存储库中发现了此问题

这应该很容易适应行为,因为默认情况下,您可以在行为数据的PropertyStorage和AnnotationStorage之间进行选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM