martedì 7 febbraio 2012

Livecycle & Mandatory

In Livecycle spesso si ha a che fare con form che contengono campi obbligatori, ovviamente in tal caso non è possibile eseguire la submit fino a quando questi campi non sono compilati.
Però può succedere che per vari motivi si debba inviare comunque la form al backend in una sorta di step intermedio.
Nel mio caso si tratta di un documento particolarmente lungo ed era necessario dare la possibilità all'utente di salvare il documento in bozza sul server, quindi di fatto eseguire una submit ignorando temporaneamente i campi mandatory.

Secondo lo scripting reference di livecycle per recuperare tutti i field di una form posso utilizzare questo codice:
 // Get the field containers from each page.  
 for (var nPageCount = 0; nPageCount < xfa.host.numPages; nPageCount++) {  
 var oFields = xfa.layout.pageContent(nPageCount, "field");  
 var nNodesLength = oFields.length;  

Usando questo comando però vengono recuperati tutti i campi all'interno del layout della form xfa.layout.pageContent e questo non andava bene nel mio caso, perché venivano ignorati tutti i campi obbligatori nascosti (e quindi esclusi dal layout).

Per ovviare al problema ho utilizzato una funzione ricorsiva che legge tutti i nodi della form, quando trova un campo field o combobox  disabilita il mandatory.
Ma non è finita qui, perché era necessario anche riabilitare on the fly l'obbligatorietà dei campi senza eseguire un refresh della form.
Quindi ogni volta che disabilito un campo salvo il suo status mandatory precedente in un nodo che chiamo prevMandatory e che appendo all'attributo desc del campo stesso.
In questo modo posso disabilitare e riabilitare i campi mandatory in qualsiasi fase della compilazione.

Questa funzione disabilita i campi obbligatori, come parentElement passo la root della form:

 function removeRequiredFields(parentElement){ 
     var currentElement; 
     var allChildrens = parentElement.nodes; 

     for(var i=0; i < allChildrens.length; i++){ 
         currentElement = allChildrens.item(i); 
         if(currentElement.className == "subform"){ 
             //chiamata ricorsiva weeeh! 
             removeRequiredFields(currentElement); 
         } 
         else if(currentElement.className == "field"){ 
             mandatoryDisable(currentElement); 
         } 
         else if(currentElement.className == "exclGroup"){ 
             for(var j=0; j < currentElement.nodes.length; j++){ 
                 if(currentElement.nodes.item(j).className == "field"){ 
                     mandatoryDisable(currentElement); 
                 } 
             } 
         } 
     } 
 } 
 function mandatoryDisable(currentElement){ 
     var mandatory = currentElement.mandatory; 
     if (mandatory == "disabled"){ 
         var vNewVariable = xfa.form.createNode("text", "prevMandatory"); 
         vNewVariable.value = "disabled"; 
         currentElement.desc.nodes.append(vNewVariable);     
     }else if (mandatory == "error"){ 
         var vNewVariable = xfa.form.createNode("text", "prevMandatory"); 
         vNewVariable.value = "error"; 
         currentElement.desc.nodes.append(vNewVariable);     
     } 
     currentElement.mandatory = "disabled"; 
 } 


Questa invece è la funzione per riabilitare i campi obbligatori.

 function enableRequiredFields(parentElement){ 
     var currentElement; 
     var allChildrens = parentElement.nodes; 

     for(var i=0; i < allChildrens.length; i++){ 
         currentElement = allChildrens.item(i); 
         if(currentElement.className == "subform"){ 
             //chiamata ricorsiva weeeh! 
             enableRequiredFields(currentElement); 
         } else if(currentElement.className == "field"){ 
             var nodeLength = currentElement.desc.nodes.length; 
             if(nodeLength > 0){ 
                 var mandatory = currentElement.desc.prevMandatory.value; 
                 currentElement.mandatory = mandatory; 
             } 
         } else if(currentElement.className == "exclGroup"){ 
             for(var j=0; j<; currentElement.nodes.length; j++){ 
                 if(currentElement.nodes.item(j).className == "field"){ 
                     var nodeLength = currentElement.desc.nodes.length; 
                     if(nodeLength > 0){ 
                         var mandatory = currentElement.desc.prevMandatory.value; 
                         currentElement.mandatory = mandatory; 
                     } 
                 } 
             } 
         } 
     } 
 } 

Nessun commento: