通过AJAX异步替换Orbeon Form和一个新的

时间:2016-04-19 12:35:37

标签: ajax forms asynchronous orbeon

我正在和Hybris一起使用Orbeon表格。我们有几个页面链接在一起,用户需要按顺序浏览它们(结账过程)。

Orbeon表单的内容动态,是根据之前步骤的操作确定的。例如。

如果用户在步骤1中将产品A添加到购物车,则在步骤2中的表单上只能看到两个字段,如果他在步骤1中添加了另一个(产品B),则应再增加一个字段在表格上可见。

我正在使用某个预处理器类,它预先填充表单上的一些隐藏字段,然后动态显示的逻辑基于这些隐藏字段在表单本身上。当通过这些步骤来回移动时,这可以在一个简单的场景中工作。

然而,问题是我需要在页面上显示 HTML 迷你购物车(不是Orbeon表单的一部分),这也可以< strong>以异步方式触发添加/删除产品。

因此,当我在显示表单的第2步时,用户还可以删除/重新添加一些产品 - &gt;因此,这需要触发表单的异步重新呈现并更改表单的显示(添加或删除新字段)。

我使用AJAX来处理这种异步问题,而我遇到的问题是,当页面第一次加载时会生成许多特定于Orbeon的Javascript文件和变量,并且会使用一些随机的FormID 。当我从后端检索新表单时以及在尝试替换HTML内容时,我在控制台中遇到各种错误时,此FormID不同,因为旧的表单ID遍布整个地方。

如果能够实现这一目标以及如何解决这个问题,有没有人有任何建议?

更新:&#34;隐藏&#34;的示例字段 glass-coverage-selected

<xf:instance id=""fr-form-instance"" xxf:exclude-result-prefixes=""#all""> <form> <glass-coverage-selected/> <section-1> <massive-exterior-walls/> </section-1> ...

稍后,会创建一个绑定:

<xf:bind id=""section-40-bind"" ref=""section-40"" name=""section-40"" relevant=""instance('fr-form-instance')/glass-coverage-selected = 'yes'"">
   <xf:bind id=""previous-glass-insurance-bind"" ref=""previous-glass-insurance"" name=""previous-glass-insurance"">
       <xf:required id=""validation-156-validation"" value=""true()""/>
</xf:bind>

该绑定用于控制某些部分的可见性:

<fr:section id=""section-40-control"" bind=""section-40-bind"">
     <xf:label ref=""$form-resources/section-40/label""/>
     <fr:grid>
         <xh:tr>
            <xh:td>
               <xf:select1 id=""previous-glass-insurance-control"" appearance=""full"" bind=""previous-glass-insurance-bind"" class=""previous-insurance"">
                   <xf:label ref=""$form-resources/previous-glass-insurance/label""/>
                   <xf:hint ref=""$form-resources/previous-glass-insurance/hint""/>
                   <xf:help ref=""$form-resources/previous-glass-insurance/help""/>
                   <xf:alert ref=""$form-resources/previous-glass-insurance/alert[1]"" validation=""validation-156-validation""/>
                   <xf:alert ref=""$form-resources/previous-glass-insurance/alert[2]""/>

                   <xf:itemset ref=""$form-resources/previous-glass-insurance/item"">
                       <xf:label ref=""label""/>
                       <xf:value ref=""value""/>
                       <xf:hint ref=""hint""/>
                    </xf:itemset>
               </xf:select1>
           </xh:td>
       </xh:tr>
    </fr:grid>
</fr:section>

1 个答案:

答案 0 :(得分:1)

您可以在浏览器中操作JavaScript中表单字段的值。如果要设置“隐藏字段”的值,请确保将这些字段设置为未隐藏,方法是在表单生成器中将false()放在可见性下。如果您这样做,出于安全原因,该字段的值甚至不会由Orbeon Forms发送到浏览器,也不能从JavaScript设置。相反,为了能够从JavaScript设置值,您需要使用CSS隐藏控件。最简单的方法是在“控制设置”对话框中为该字段添加类xforms-disabled

然后,假设表单生成器中的控件名称为my-control,则在JavaScript中您可以编写var control = ORBEON.jQuery('*[id $= "my-control-control"]'); ORBEON.xforms.Document.setValue(control.attr('id'), '42');。请注意在控件名称末尾添加的-control。首先测试一下,我建议你不要把CSS类,所以你可以更容易地看到设置值是否有效。

有关上述setValue()和其他JavaScript API的文档,请参阅第Client-side JavaScript API页。