问题在于,我需要在下一次提交之前验证表单,然后用户才能提交任何他应该点击的内容" Save"按钮,如果他试图点击"提交"一个人收到类似的信息"你应该在提交之前保存表格"。
首先我认为我可以将系统字段添加到表单中,如save-indicator,添加约束就像那样
<xforms:bind id="isSaved-bind" nodeset="isSaved"
name="isSaved" type="xforms:string" constraint="number(.)=1" required="true()"/>
并添加
<xforms:setvalue ref="xxforms:instance('fr-form-instance')/person/isSaved">1</xforms:setvalue>
在&#34; Save&#34;按钮点击。
但是,问题是我必须重写所有现有表单以在那里插入新代码。
是否可以制作全局变量,例如&#34; isSaved&#34; 并在提交前检查每个表单,如果用户没有保存表单则显示错误消息?
或者可能有另一种我无法看到的方式?
任何答案都将受到赞赏。
答案 0 :(得分:2)
Form Runner会跟踪表单是 clean 还是 dirty ,您可以在xxforms:instance('fr-persistence-instance')/data-status
中访问该信息。处理提交的代码位于apps/fr/includes/persistence/persistence-model.xml
。在那里,您可以将DOMActivate
上fr-submit-button
的监听器更改为:
<xforms:action ev:event="DOMActivate" ev:observer="fr-submit-button">
<xforms:action if="instance('fr-persistence-instance')/data-status = 'clean'">
<xforms:setvalue ref="instance('fr-persistence-instance')/submit-or-save-or-send">submit</xforms:setvalue>
<xforms:dispatch name="fr-save-action" target="fr-persistence-model">
<xxforms:context name="fr:check-data-valid" select="true()"/>
</xforms:dispatch>
</xforms:action>
<xforms:action if="instance('fr-persistence-instance')/data-status = 'dirty'">
<xforms:message>You must save form before submitting it.</xforms:message>
</xforms:action>
</xforms:action>
请注意,persistence-model.xml
位于orbeon-form-runner.jar
。要更改该文件,请从那里提取,然后将其放在WEB-INF/resources/apps/fr/includes/persistence/persistence-model.xml
中。 WEB-INF/resources
上的该版本将优先于jar文件中的版本。另请注意,在升级到新版本的Orbeon Forms时,依赖于Form Runner或Form Builder内部的这些类型的更改可能会中断。因此,您可能需要仔细跟踪它们,以便在升级时更轻松地重新应用更改。
答案 1 :(得分:0)