Как загрузить и передать форму Xforms в Orbeon (Как отправить экземпляр в XForms)? - PullRequest
1 голос
/ 31 мая 2010

Я использую решение Orbeon Forms для генерации сообщений из заполненных веб-форм.

Я прочитал другой фрагмент кода в вики Orbeon по отправке 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, который ловит действия:

страниц flow.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> 

Тогда есть представление об успехе, которое очень просто:

ViewSuccess.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, и это то же самое. Данные не получены. Так что кнопка загрузки не работает.

Надеюсь, я достаточно ясен, чтобы найти решение. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2010

Только xforms:submission replace="instance" имеет смысл при использовании от процессора oxf:xforms-submission. Таким образом, результат отправки должен возвращать XML, но здесь это не сработает, поскольку при отправке на страницу XForms возвращается HTML.

Я предполагаю, что у вас есть форма, которая отправляет replace="all" в /CUSDECCD001B/write. Вместо этого:

  1. Выполните отправку replace="instance" и сохраните результат в экземпляре.
  2. In pipelineWrite.xpl возвращает вывод file процессора Java напрямую, без вызова процессора отправки XForms.
  3. Вернитесь в XForms, которая выполняет отправку replace="instance" в /CUSDECCD001B/write, когда эта отправка завершена (xforms-submit-done), запустите другую отправку, которая отправит результаты в /CUSDECCD001B/success.
0 голосов
/ 07 июня 2010

После того, как Алессандро принял во внимание и начал искать другие фрагменты кода на 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 ловит действия и запускает соответствующее:

страниц flow.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>

Просмотр Успешное получение данных, выводимых после обработки:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...