2010-05-31 4 views
1

J'utilise la solution Orbeon Forms pour générer des messages à partir de formulaires Web remplis. J'ai lu différents extraits de code dans le wiki d'Orbeon sur la soumission de XForms depuis un pipeline, et j'ai essayé différentes solutions mais ça ne marche pas, et il n'y a pas d'exemple avec un POST d'un pipeline, attrapé par un PFC et envoyé à une vue XForms qui reçoit les données publiées (tous les exemples sont faits sur la même page).Comment charger et transmettre un formulaire Xforms dans Orbeon (Comment envoyer une instance à XForms)?

J'ai le pipeline suivant qui est reçu sur son entrée par exemple:

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> 

Ensuite, il y a le PFC qui attraper les actions:

page- flux.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> 

Ensuite, il y a le point de vue de la réussite, ce qui est très simple:

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> 

Tout ce processus, je lançais en cliquant sur le bouton « Enregistrer » dans la page « 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> 

Le problème est que la publication est bien faite, le PFC attrape bien l'action, charge la vue correcte, mais la vue est chargée sans données (la vue ne trouve pas les données sur son entrée d'instance).

J'ai essayé avec un GET dans la vue pour récupérer les données POST, et c'est la même chose. Aucune donnée n'est récupérée. Donc, le bouton de téléchargement ne fonctionne pas. J'espère que je suis assez clair pour trouver une solution. Merci d'avance.

Répondre

0

Après avoir pris Alessandro adivces en considération et la recherche d'autres extraits de code sur Orbeon wiki, voici la solution qui fonctionne bien pour moi:

Le pipeline recevant une instance de formulaire rempli sur son entrée par exemple:

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> 

les actions PFC et la capture du correspondin mise à l'eau g une:

la page-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> 

La vue Success recevoir la sortie de données après traitement:

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> 

La vue avec Modifier un bouton "Enregistrer" ouvrant tout le processus:

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> 

Les principaux problèmes dans le code précédent et conseils donnés étaient:

  • le <xforms:instance> doit spécifier un resource="" ou contient au moins un contenu par défaut (ici <dummy /> L'événement xforms-submit-done ne semble pas fonctionner ou exister. Donc, j'ai utilisé un événement xforms-submit.
1

Seul un xforms:submission replace="instance" est logique lorsqu'il est utilisé par le processeur oxf:xforms-submission. Le résultat de la soumission doit donc renvoyer le code XML, mais cela ne fonctionnera pas ici car lorsque vous envoyez une soumission à une page XForms, le code HTML est renvoyé. Je suppose que vous avez un formulaire qui fait une soumission replace="all" à /CUSDECCD001B/write. À la place:

  1. Effectuez la soumission replace="instance" et stockez le résultat dans une instance.
  2. Dans pipelineWrite.xpl, renvoyez la sortie file du processeur Java directement, sans appeler le processeur de soumission XForms.
  3. Retour dans les XForms qui effectue la soumission replace="instance" à /CUSDECCD001B/write, lorsque cette soumission est effectuée (xforms-submit-done) exécuter une autre soumission POST les résultats à /CUSDECCD001B/success.
+0

Salut Alessandro. Merci beaucoup pour votre aide ! En fait vous avez raison, j'aurais dû insérer le code XForms qui démarre tout le processus. J'ai donc modifié mon post pour ajouter la page "ViewModify" XForms. Puis j'ai essayé d'appliquer les modifications que vous avez indiquées. Je pense que c'est presque ok pour les items 2/et 3/listés, mais la dernière chose est que je ne vois pas comment "stocker le résultat en instance" (item 1 /). Pourriez-vous jeter un oeil aux nouvelles versions de fichiers? Merci beaucoup ! – Clem

+1

Clem, le code semble bon. Donc je suppose que vous avez aussi une instance 'CUSDECCD001BFile' (puisque vous avez' instance = "CUSDECCD001BFile" 'dans la soumission). Si vous ne le faites pas, vous devrez en ajouter un, et au début, il peut contenir à peu près tout. Je mets souvent un élément '' pour préciser que c'est juste un espace réservé. – avernet

Questions connexes