簡體   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