如何在orbeon xforms中创建自己的验证规则?

时间:2012-03-27 15:12:27

标签: orbeon xforms

问题在于,我需要在下一次提交之前验证表单,然后用户才能提交任何他应该点击的内容" 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; 并在提交前检查每个表单,如果用户没有保存表单则显示错误消息?

或者可能有另一种我无法看到的方式?


任何答案都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

Form Runner会跟踪表单是 clean 还是 dirty ,您可以在xxforms:instance('fr-persistence-instance')/data-status中访问该信息。处理提交的代码位于apps/fr/includes/persistence/persistence-model.xml。在那里,您可以将DOMActivatefr-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)

我使用全局标志指示器来检查窗体是否在关闭窗口或提交之前保存,并且它运行良好。

此信息在此wiki中有明确说明。

一切顺利!