问题是,我需要在以下一种方式提交之前验证表单,在用户可以提交任何内容之前,他应该单击"保存"按钮,如果他试图单击"提交",则会收到类似"您应该在提交前保存表单"的消息。
首先我想我可以像保存指示符一样将系统字段添加到表单中,像一样添加约束
<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>
单击"保存"按钮时的操作。
但是,问题是,我必须重写所有现有的表单,以便在其中插入新的代码。
是否有可能生成类似"isSaved"的全局变量,并在提交前对每个表单进行检查,如果用户没有保存表单,则显示错误消息?
或者可能还有另一种我看不见的方式?
如有任何答案,我们将不胜感激。
Form Runner跟踪表单是clean还是dirty,您可以在xxforms:instance('fr-persistence-instance')/data-status
中访问这些信息。处理提交的代码在apps/fr/includes/persistence/persistence-model.xml
中。在那里,您可以将fr-submit-button
上DOMActivate
的侦听器更改为:
<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内部结构的更改可能会中断。因此,您可能需要仔细跟踪它们,以便在升级时更容易地重新应用更改。
我使用全局标志指示器来检查在关闭窗口或提交之前是否保存了表单,并且它运行得很好。
这些信息在这个维基中得到了清晰的解释。
祝你一切顺利!