2

collective.googlenews是一个包,它实现了一种行为,它确实向基于敏捷的内容类型添加了 2 个新字段。

其中一个字段(称为standout_journalism)有一些特殊要求,事实证明这些要求实施起来很复杂:

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

然后我必须实施 2 个不同的验证:

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

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

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

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

我应该创建自己的小部件吗?我应该重写update字段中的方法吗?我应该覆盖updateWidgets表单中的方法吗?

在任何情况下,我都不知道如何继续,因为文档不清楚添加的字段与行为一样。

非常感谢任何指向代码示例的指针。

4

1 回答 1

3

工作流程守卫:

仅供参考,而不是工作流守卫,我们曾经指向其他工作流转换脚本。在我们的例子中,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_modifysome-other-modify-status-script

这是自定义状态修改脚本的完整示例

重要的部分发生第 21 行。它检查一些约束,如果它有效,则转换将发生,如果不是,则甚至不会初始化转换。

我敢肯定,在您的情况下,您可以将其缩短为几行可读的行。

完整的例子后面有一个“约束系统”(适配器),它允许注册约束,这就是为什么还有几行代码......

验证表单:

  • 不变量:尽量使用简单的不变量。我假设您正在使用目录来获取必要的数据。您可以通过目录获取门户,hooks.getSite()还可以获取目录。这样所有逻辑都直接位于您的行为中。
  • 指令表单验证器装饰器-> https://pypi.python.org/pypi/plone.directives.form#validators

如果由于某种原因这是不可能的:您需要在表单级别进行验证。这意味着自定义敏捷编辑表单。

在那里,我会侵入该handleApply方法并提出一个WidgetActionExecutionErroror ActionExecutionError。取决于您是想要小部件上的错误消息还是表单上的一般错误消息。检查http://garbas.github.io/plone-z3c.form-tutorial/validation.html

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

DX 类型的自定义 getter/setter 的工作示例。 仅供参考:我最近也在 plone.app.dx 存储库中发现了这个问题

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

于 2017-01-24T16:01:16.237 回答