在 Orbeon Forms 中提交失败时显示验证错误
Show validation errors, when submit fails in Orbeon Forms
我打开xform页面,直接提交表单,没有访问表单域。
如果表单有验证错误,那么它不会提交数据,但它不会默认显示验证错误 Error Summary Component。
当事件“xforms-submit-error”发生时,我显示一个模态对话框。
验证错误由错误摘要组件控制:
从其文档中,我们看到“...错误摘要组件...跟踪访问过的控件,并仅显示访问过的控件的错误,同时跟踪所有错误...”
这正在发生! :-)
所以我想如果用户尝试提交表单,而不“访问”任何表单字段,如果有任何验证错误,则列出验证错误。
我在各种 orbeon 相关的 sites/code samples/forums 中发现,为了做到这一点,应该使用“访问所有”操作,这将导致将所有控件标记为“已访问”,所以他们的相关错误显示!
所以尝试了类似的方法,但没有成功!:
...
<xf:submission id="submit" ...
...
<xf:action ev:event="xforms-submit-error">
<xf:message level="modal">Oooops!</xf:message>
<!-- virtual visit all form fields? -->
<xf:dispatch name="fr-visit-all" targetid="error-summary"/>
<xf:refresh/>
<xf:dispatch name="fr-update" targetid="error-summary"/>
</xf:action>
...
</xf:submission >
...
</xf:model>
</xh:head>
<xh:body>
<fr:view>
...
<xf:trigger id="submit-control" bind="submit-bind">
<xf:label ref="$form-resources/submit/label" />
<xf:send ev:event="DOMActivate" submission="submit" />
</xf:trigger>
...
如何访问默认的“错误摘要”?我没有添加自定义错误摘要,我想使用内置组件。
使用 Orbeon Forms 4.5
已解决!
问题是 xf:dispatch 事件处理程序的 targetid 属性。
而不是 "error-summary",我们应该使用 "fr-error-summary-model" 作为 targetid 属性 值,以访问内置的 "Error Summary Component".
(检查 components.xsl, error-summary.xbl)
示例工作代码:
...
<xf:submission id="submit" ...
...
<xf:action ev:event="xforms-submit-error">
<!-- Listing the errors present on form -->
<!--
1. visit-all action, which will result in marking all controls "visited", so their related error shows.
2. to properly update the error summary within a submission response, we need an explicit <xf:refresh> action before dispatching....
3. ...fr-update, so that the UI captures all the valid/invalid states:
-->
<xf:dispatch name="fr-visit-all" targetid="fr-error-summary-model"/>
<xf:refresh/>
<xf:dispatch name="fr-update" targetid="fr-error-summary-model"/>
</xf:action>
<xf:action ev:event="xforms-submit-done">
<xxf:script>window.parent.closeIframe();</xxf:script>
</xf:action>
</xf:submission>
...
</xf:model>
</xh:head>
<xh:body>
<fr:view>
...
<xf:trigger id="submit-control" bind="submit-bind">
<xf:label ref="$form-resources/submit/label" />
<xf:send ev:event="DOMActivate" submission="submit" />
</xf:trigger>
...
我打开xform页面,直接提交表单,没有访问表单域。 如果表单有验证错误,那么它不会提交数据,但它不会默认显示验证错误 Error Summary Component。 当事件“xforms-submit-error”发生时,我显示一个模态对话框。
验证错误由错误摘要组件控制: 从其文档中,我们看到“...错误摘要组件...跟踪访问过的控件,并仅显示访问过的控件的错误,同时跟踪所有错误...” 这正在发生! :-)
所以我想如果用户尝试提交表单,而不“访问”任何表单字段,如果有任何验证错误,则列出验证错误。
我在各种 orbeon 相关的 sites/code samples/forums 中发现,为了做到这一点,应该使用“访问所有”操作,这将导致将所有控件标记为“已访问”,所以他们的相关错误显示!
所以尝试了类似的方法,但没有成功!:
...
<xf:submission id="submit" ...
...
<xf:action ev:event="xforms-submit-error">
<xf:message level="modal">Oooops!</xf:message>
<!-- virtual visit all form fields? -->
<xf:dispatch name="fr-visit-all" targetid="error-summary"/>
<xf:refresh/>
<xf:dispatch name="fr-update" targetid="error-summary"/>
</xf:action>
...
</xf:submission >
...
</xf:model>
</xh:head>
<xh:body>
<fr:view>
...
<xf:trigger id="submit-control" bind="submit-bind">
<xf:label ref="$form-resources/submit/label" />
<xf:send ev:event="DOMActivate" submission="submit" />
</xf:trigger>
...
如何访问默认的“错误摘要”?我没有添加自定义错误摘要,我想使用内置组件。
使用 Orbeon Forms 4.5
已解决!
问题是 xf:dispatch 事件处理程序的 targetid 属性。
而不是 "error-summary",我们应该使用 "fr-error-summary-model" 作为 targetid 属性 值,以访问内置的 "Error Summary Component".
(检查 components.xsl, error-summary.xbl)
示例工作代码:
...
<xf:submission id="submit" ...
...
<xf:action ev:event="xforms-submit-error">
<!-- Listing the errors present on form -->
<!--
1. visit-all action, which will result in marking all controls "visited", so their related error shows.
2. to properly update the error summary within a submission response, we need an explicit <xf:refresh> action before dispatching....
3. ...fr-update, so that the UI captures all the valid/invalid states:
-->
<xf:dispatch name="fr-visit-all" targetid="fr-error-summary-model"/>
<xf:refresh/>
<xf:dispatch name="fr-update" targetid="fr-error-summary-model"/>
</xf:action>
<xf:action ev:event="xforms-submit-done">
<xxf:script>window.parent.closeIframe();</xxf:script>
</xf:action>
</xf:submission>
...
</xf:model>
</xh:head>
<xh:body>
<fr:view>
...
<xf:trigger id="submit-control" bind="submit-bind">
<xf:label ref="$form-resources/submit/label" />
<xf:send ev:event="DOMActivate" submission="submit" />
</xf:trigger>
...