1

我正在使用 Orbeon Forms 解决方案从已填写的 Web 表单中生成消息。

我在 Orbeon 的 wiki 中阅读了有关从管道提交 XForms 的不同代码片段,我尝试了不同的解决方案,但它不起作用,并且没有示例来自管道的 POST,被 PFC 捕获并发送到 XForms 视图接收发布的数据(所有示例都在同一页面中完成)。

我在他的实例输入中收到了以下管道:

pipelineWrite.xpl

<p:config ...>
    <p:param name="instance" type="input"/> <!-- instance containing the data of the form filled by user -->
    <p:param name="data" type="output"/>

    <p:processor name="oxf:java"> <!-- transforms the data into a file -->
        <p:input name="config">
            <config sourcepath="." class="ProcessorWriteCUSDECCD001B"/>
        </p:input>
        <p:input name="input" href="#instance"/>
        <p:output name="output" id="file"/> <!-- XML containing the url of the file -->
    </p:processor>       
</p:config> 

然后是捕捉动作的 PFC:

页面流.xml

<config xmlns="http://www.orbeon.com/oxf/controller">

    <page path-info="/CUSDECCD001B/" view="View/ViewForm.xhtml"/> <!-- load the form to be filled in by user -->

    <page path-info="/CUSDECCD001B/write" model="Controller/PipelineWrite.xpl"/> <!-- send the instance of the form filled to the pipeline above -->

    <page path-info="/CUSDECCD001B/success" view="View/ViewSuccess.xhtml"/> <!-- send the instance containing the url of the file to the success view -->

    <epilogue url="oxf:/config/epilogue.xpl"/>
</config> 

然后是成功视图,非常简单:

查看成功.xhtml

<html ... >
  <head>
    <title>Generation OK</title>
    <xforms:model>
            <xforms:instance id="FILE" src="input:instance">
                <files xmlns="">
                    <file mediaType="" filename="" size="" />
                </files>
            </xforms:instance>
        </xforms:model>
  </head>
  <body>
        Click here to download :
        <xforms:output ref="//file" appearance="xxforms:download">
            <xforms:filename ref="@filename"/>
            <xforms:mediatype ref="@mediatype"/>
            <xforms:label>Download</xforms:label>
        </xforms:output>
  </body>
</html> 

我通过单击“ViewModify”页面中的“保存”按钮启动了所有这些过程:

ViewModify.xhtml

<xforms:model>
    <xforms:instance id="CUSDECCD001B" src="../apps/CUSDECCD001B/Model/ModelCUSDECCD001B.xml" />
    <xforms:submission id="save-submission" ref="instance('CUSDECCD001B')" action="/CUSDECCD001B/write" replace="instance" instance="CUSDECCD001BFile">
        <xforms:send ev:event="xforms-submit-done" submission="send-to-success"/>
    </xforms:submission>
    <xforms:submission id="send-to-success" method="post" action="/CUSDECCD001B/success" ref="instance('CUSDECCD001BFile')" replace="all"/>
</xforms:model>

  <!-- .... Content of XForms form -->

<xforms:submit submission="save-submission">
    <xforms:label>Save</xforms:label>
</xforms:submit>

问题是帖子做得很好,PFC 很好地捕捉到了动作,加载了正确的视图,但是视图加载时没有数据(视图在他的实例输入上找不到数据)。

我尝试在视图中使用 GET 来检索 POST 数据,这也是同样的事情。未检索到任何数据。所以下载按钮不起作用。

我希望我足够清楚以找到解决方案。提前致谢。

4

2 回答 2

1

只有从处理器xforms:submission replace="instance"使用时才有意义。oxf:xforms-submission因此,提交的结果必须返回 XML,但这在这里不起作用,因为当您向 XForms 页面提交时,会返回 HTML。

我假设您有一个提交replace="all"/CUSDECCD001B/write. 反而:

  1. 提交replace="instance"并将结果存储在实例中。
  2. pipelineWrite.xpl直接返回 Java 处理器的输出,file而不调用 XForms 提交处理器。
  3. replace="instance"回到执行提交到的 XForms 中/CUSDECCD001B/write,当提交完成时 ( xforms-submit-done) 运行另一个提交,将结果 POST 到/CUSDECCD001B/success
于 2010-06-01T22:49:59.257 回答
0

在考虑了 Alessandro adivces 并在Orbeon wiki上搜索其他代码片段后,以下是适合我的解决方案:

管道在他的实例输入上接收填充的表单实例:

piplineWrite.xpl

<p:param name="instance" type="input"/>
<p:param name="data" type="output"/>

<p:processor name="oxf:java">
    <p:input name="config">
        <config sourcepath="." class="ProcessorWrite"/>
    </p:input>
    <p:input name="input" href="#instance"/>
    <p:output name="output" ref="data"/>
</p:processor>

PFC 捕捉动作并启动相应的动作:

页面流.xml

<config xmlns="http://www.orbeon.com/oxf/controller">
    <page path-info="/CUSDECCD001B/write" view="Controller/PipelineWrite.xpl"/>
    <page path-info="/CUSDECCD001B/success" view="View/ViewSuccess.xhtml"/>
    <epilogue url="oxf:/config/epilogue.xpl"/>
</config>

处理后视图Success接收数据输出:

viewSuccess.xhtml

<html ...>
  <head>
    <xforms:model>
        <xforms:instance id="FILE" src="input:instance"/>
    </xforms:model>
  </head>
  <body>

    <p> Generation Success !</p>

    <div class="toolbar">
        Cliquer to download :
        <xforms:output ref="//file" appearance="xxforms:download">
            <xforms:filename ref="@filename"/>
            <xforms:mediatype ref="@mediatype"/>
            <xforms:label>Download</xforms:label>
        </xforms:output>
    </div>
  </body>
</html>

使用“保存”按钮启动整个过程的视图修改:

viewModify.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events">
  <head>
    <xforms:model>
      <xforms:instance id="CUSDECCD001BFile">
        <dummy xmlns="" />
      </xforms:instance>
      <xforms:submission id="save-submission" ref="instance('CUSDECCD001B')" action="/CUSDECCD001B/write" method="post" replace="instance" instance="CUSDECCD001BFile">
        <xforms:action ev:event="xforms-submit">
          <xforms:send submission="send-submission" />
        </xforms:action>
      </xforms:submission>
      <xforms:submission id="send-submission" ref="instance('CUSDECCD001BFile')" action="/CUSDECCD001B/success" method="post" />
    </xforms:model>
  </head>
  <body>
    ...
    <xforms:submit submission="save-submission">
      <xforms:label>Save</xforms:label>
    </xforms:submit>
  </body>
</html>

前面的代码片段和给出的建议中的主要问题是:

  • 必须<xforms:instance>指定一个resource=""或至少包含一个默认内容(此处<dummy />),
  • xforms-submit-done事件似乎不起作用或不存在。所以,我使用了一个xforms-submit事件。
于 2010-06-06T20:52:53.763 回答