0

我在 Orbeon 表单运行器中有一个表单,我需要在使用“工作流发送”提交之前添加外部验证。我们可以为此在 properties-local.xml 中的“workflow-send”按钮添加功能吗?

作为记录,我还实现了一个按钮,该按钮进行验证并在验证结果返回时执行某些操作。因此,或者,我们可以将“工作流发送”功能添加到我的那个按钮吗?

4

1 回答 1

1

我通过对persistence-model.xml 文件进行一些更改来做到这一点。这种验证需要在持久化阶段完成。因为,我们需要的是在保存数据之前调用的服务器端验证(访问数据库等),显然是在工作流发送之前调用的。

我已经注释掉了旧的代码片段。

<!-- Respond to send button activation -->
<xforms:action ev:event="DOMActivate" ev:observer="fr-workflow-send-button">
    <xforms:send submission="validation-submission" />
    <!-- xforms:setvalue ref="instance('fr-persistence-instance')/submit-or-save-or-send">send</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 ev:event="my-valid-action">
    <xforms:setvalue
        ref="instance('fr-persistence-instance')/submit-or-save-or-send">send</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:instance id="validation-result">
    <dummy />
</xforms:instance>

<xforms:submission id="validation-submission"
    ref="xxforms:instance('fr-form-instance')" resource="http://localhost:8080/MyApp/OrbeonValidationServlet"
    method="post" replace="instance" instance="validation-result">
    <!-- Clear external errors just before doing external validation -->
    <xforms:delete ev:event="xforms-submit" nodeset="//@v:*" />
    <xforms:action ev:event="xforms-submit-done">
        <!-- Insert external validation results when done -->
        <xforms:insert nodeset="."
            origin="instance('validation-result')/v:data/*" />
        <!-- Show all errors on form -->
        <xforms:dispatch name="fr-visit-all" targetid="error-summary" />
        <!-- Update error summary for incremental mode -->
        <xforms:refresh />
        <xforms:dispatch name="fr-update" targetid="error-summary" />
        <xforms:dispatch name="my-valid-action" target="fr-persistence-model"
            if="count(instance('validation-result')/v:global-errors/*) 
            = 0" />
    </xforms:action>
</xforms:submission>

所以基本上

  • 我已经实现了 my-valid-action 和 validate-submission
  • 放置验证提交而不是工作流发送
  • 仅在没有错误时调度 my-valid-action
  • 从 my-valid-action 调用 workflow-send

最后一件事是将验证结果绑定到我表单中的 fr:error-summary。

可以更加努力地使 /OrbeonValidationServlet 可以从 properties-local.xml 设置。

于 2012-11-07T07:31:14.357 回答