Esempio n. 1
0
 public function TraiterPost()
 {
     global $formxSession;
     global $errs;
     $this->debug('entrée dans TraiterPost');
     /*d'abord analyse des données POST pour savoir si l'on a demandé l'affichage d'une instance de formulaire en particulier 
       Si c'est le cas , on remplit l'affichage de la future fenetre popup et on s'en va
       */
     //Regularisation des données post
     $this->regPost(array('FormX_ext_goto_', 'FoRmX_step_next_x', 'FoRmX_step_prev_x', 'FoRmX_step_cancel_x', 'FoRmX_selCancel_x', 'FoRmX_step_next_x', 'FoRmX_step_prev_x', 'FoRmX_print_x', 'FoRmX_close_x', 'FoRmX_selValid_x', 'FormX_ext_goto_'));
     if ($_POST['FormX_ext_goto_']) {
         $this->debug('trouvé Commande $_POST[\'FormX_ext_goto_\'] =' . $_POST['FormX_ext_goto_']);
         $this->isuseraction = true;
         //si on va vers la selection d'un nouveau type de formulaire
         if ($_POST['FormX_ext_goto_'] == 'new') {
             $this->af .= $this->genMenuSelection();
             return;
         }
         //si on va vers une suppression d'instance
         $reg = array();
         if (ereg("^RM(.*)\$", $_POST['FormX_ext_goto_'], $reg)) {
             //eko("demande de virer le form");
             $this->rmInstance($reg[1]);
             return;
         }
         //si on va vers une réouverture d'instance cloturée
         if (ereg("^ED(.*)\$", $_POST['FormX_ext_goto_'], $reg)) {
             $this->loadInstance($reg[1]);
             $this->unclose();
             $this->af .= $this->affFoRmX();
             return;
         }
         //si on vient de la popup de confirmation de validation totale forcée du formulaire
         if (ereg("^FRCACH(.*)\$", $_POST['FormX_ext_goto_'], $reg)) {
             //eko("demande de virer le form");
             $id_instance = $reg[1];
             //si clic sur 'ok'
             $_POST['FormX_ext_goto_'] = $id_instance;
             if ($_POST['valider_popup_x']) {
                 $_POST[$this->prefix . 'step_next_x'] = 'ok';
             } else {
                 //on ne detecte pas la finitude du formulaire
                 $_POST['pavalider'] = 'y';
             }
             $goOn = 'y';
             $validForce = 'y';
         }
         //sinon, chargement d'instance donné
         if (!isset($goOn) || !$goOn) {
             $id_instance = $_POST['FormX_ext_goto_'];
             $this->loadInstance($_POST['FormX_ext_goto_']);
             if (!isset($validForce) || !$validForce) {
                 $this->detectHeresie();
             }
             //si cette instance a l'attribut onCloseRedirForm et qu'elle est fermée
             $xml = $this->XMLDOM;
             if ($xml->documentElement->hasAttribute('onCloseAndReadCallForm')) {
                 if (formxTools::getDomState($this) == 'F') {
                     $redirform = $xml->documentElement->getAttribute('onCloseAndReadCallForm');
                     $this->loadForm($redirform . ".xml");
                     $id_instance = $this->initInstance($this->ids);
                     $this->loadInstance($id_instance);
                 }
             }
             $this->af .= $this->affFoRmX();
             if (!isset($_POST['FoRmX_print_x'])) {
                 return;
             }
         }
     } else {
         $this->debug('Pas trouvé de commande $_POST[\'FormX_ext_goto_\']');
     }
     //si fermeture de la fenêtre de sélection de formulaire à ajoutter
     if ($_POST[$this->prefix . 'selCancel_x']) {
         $this->isuseraction = true;
     }
     //si un demande de nouveau formulaire à instancier pour le sujet
     if ($_POST[$this->prefix . 'selValid_x']) {
         $this->isuseraction = true;
         //pour chaque instance demandée on en crée une
         if (is_array($_POST[$this->prefix . "chooseNew"])) {
             foreach ($_POST[$this->prefix . "chooseNew"] as $ajout) {
                 //chargement du squelette
                 if ($this->loadForm($ajout . ".xml")) {
                     //initialisation de l'instance
                     $id_instance = $this->initInstance($this->ids);
                     $priority = $this->getPriority();
                     clFoRmXtOoLs::addFormToLoad($this->prefix, $id_instance, $priority);
                 }
             }
         }
         //chargement de la derniere instance demandée
         $instance2load = clFoRmXtOoLs::isFormToLoad($this->prefix);
         if ($instance2load) {
             clFoRmXtOoLs::delFormToLoad($this->prefix, $instance2load);
             $this->loadInstance($instance2load);
             $id_instance = $instance2load;
             $this->af .= $this->affFoRmX();
         }
         return '';
     }
     //recherche un formulaire présent dans les données POST
     //un formulaire etait déja affiché précédement
     foreach ($_POST as $cle => $valeur) {
         //eko("TEST du couple $cle $valeur");
         //on verifie que la clé du POST a bien été générée par FoRmX
         if (ereg("^" . $this->prefix . "INSTANCE\$", $cle)) {
             $this->isuseraction = true;
             $id_instance = $valeur;
             $this->debug("trouve un post d'instance présente: {$valeur}");
             break;
         }
     }
     //su aucune clé trouvée, rien à
     if (!isset($id_instance)) {
         $id_instance = "";
     }
     if (!$id_instance) {
         $this->debug("Pas trouvé d'instance dans les données post: {$valeur}");
         return;
     }
     //si pour cette instance, on a demandé la fermeture: rien
     if ($_POST[$this->prefix . 'close_x']) {
         clFoRmXtOoLs::cleanFormToLoad($this->prefix);
         $this->isuseraction = true;
         return;
     }
     //on charge l'instance en question depuis la BD
     $this->loadInstance($id_instance);
     $xml = $this->XMLDOM;
     //si pour cette instance, on a demandé l'impression:
     if ($_POST[$this->prefix . 'print_x']) {
         $this->isuseraction = true;
         $this->modeImpression = true;
         if ($this->getVersionForm() >= 11) {
             $this->genPrint2($this->getHtmlImpressionContenu());
         } else {
             $this->genPrint($this->affFoRmX());
         }
         $this->modeImpression = false;
         $this->af .= $this->affFoRmX();
         return 1;
     }
     //traitement DOM----------------------------------------------------
     //fonctions DOM
     $etapes = $xml->documentElement->getElementsByTagName('ETAPE');
     //liste de nodes
     //on s'arrête à la dernière étape non validée
     $notTheFirst = '';
     $isNotFini = false;
     $etape_memo_prec = '';
     foreach ($etapes as $etape) {
         //on parcours les nodes
         if (isset($etape_current)) {
             $notTheLast = 'oui';
         } else {
             if ($etape->getAttribute('etat') != 'fini') {
                 $isNotFini = true;
                 $etape_current = $etape;
                 $etape_prec = $etape_memo_prec;
             }
         }
         $etape_memo_prec = $etape;
         if (!isset($etape_current)) {
             $notTheFirst = 'oui';
         }
     }
     $etape = isset($etape_current) ? $etape_current : '';
     if ($_POST[$this->prefix . 'step_prev_x'] && $notTheFirst) {
         $this->debug("retour en arriere détecté et appliqué");
         $etape = $etape_prec;
         $etape->setAttribute('etat', 'en_cours');
     }
     //FIXME : c'est moche ça là...
     //popup de validation du formulaire total
     if ($_POST[$this->prefix . 'step_next_x'] && empty($notTheLast) && empty($validForce)) {
         unset($_POST[$this->prefix . 'step_next_x']);
         $mod = new ModeliXe("FX_message.mxt");
         $mod->SetModeliXe();
         $mod->MxText('titre', 'Confirmation');
         $mod->MxText('message', "Voulez-vous vraiment forcer <br/>l'achevement du formulaire ?");
         $mod->MxHidden('hidden', "FormX_ext_goto_=FRCACH" . $id_instance);
         $mod->MxHidden('hidden2', 'navi=' . $formxSession->genNavi($formxSession->getNavi(0), $formxSession->getNavi(1), $formxSession->getNavi(2), $formxSession->getNavi(3)));
         $this->af .= $mod->MxWrite("1");
         //on ne detecte pas la finitude du formulaire
         $_POST['pavalider'] = 'y';
     }
     //si le champ cancel n' pas été validé on enregistre les changements
     if (!$_POST[$this->prefix . 'step_cancel_x'] && !$_POST[$this->prefix . 'step_prev_x'] && $isNotFini) {
         $this->debug("Mise à jour des Items par les données post demandée");
         //on parcours les champs ITEM et on remplit les champs en validant le type de données
         $items = $etape->getElementsByTagName('ITEM');
         $this->debug("Parcours des items de l'etape");
         foreach ($items as $item) {
             $this->debug("traitement de " . $item->getAttribute('id'));
             $this->affectPost2XML($item);
         }
         //on applique les opérations liés aux changements précédents
         $varGlobalsContainer = formxTools::globalsLoad($this->getIDS());
         foreach ($items as $item) {
             $this->traiterPostPost($item);
         }
         $this->getGlobvarsContainer()->save();
         //clonage ou manipulation dynamique d'un champ demandée
         $activIs = $etape->getElementsByTagName('ActiveItem');
         foreach ($activIs as $activI) {
             if ($this->testCondDOM($activI)) {
                 $this->cloneItem($activI->getAttribute('idItem'), $etape, $activI);
             }
         }
         //Si le formulaire était initialisé, il passe en status "en cours"
         if (formxTools::getDomState($this) == 'I') {
             formxTools::setDomState($this, 'E');
         }
         //on teste si l'étape est validée, si oui on met à jour, on applique les actions, et on cherche si le form est fini .
         //seulement si le post nest pas defini
         if ($_POST['pavalider'] != 'y' && $etape) {
             //si pas les droits au moins W
             //TODO le deplacer avant ça
             $droitetape = $this->session->droit;
             if ($this->XMLCore['access']) {
                 $droitetape = utf8_decode((string) $this->XMLCore['access']);
             }
             if ($etape->getAttribute('access')) {
                 $droitetape = utf8_decode($etape->getAttribute('access'));
             }
             if (!$formxSession->getDroit($droitetape, 'w')) {
                 $this->debug("validation de l'etape refusée car pas W sur le droit '{$droitetape}'");
             }
             if ($etape->getAttribute('dontvalid')) {
                 $this->debug("validation de l'etape refusée car présence de l'attribut dontvalid");
             }
             if (!$etape->getAttribute('dontvalid') && $formxSession->getDroit($droitetape, 'w') && ($this->testEtape($etape) || $_POST[$this->prefix . 'step_next_x'])) {
                 $etape->setAttribute('etat', 'fini');
                 $this->applyActions($etape);
                 if ($this->formIsFini()) {
                     clFoRmXtOoLs::delFormToLoad($this->prefix, $this->idInstance);
                     //supprime du pipeline des multiformulaires
                     $this->justClosed = true;
                     if ($this->XMLCore['disappear']) {
                         //si le form doit disparaitre apres finition
                         $this->rmInstanceForce();
                         return 1;
                     } elseif ($this->XMLCore['phantom']) {
                         formxTools::setDomState($this, 'H');
                     } else {
                         formxTools::setDomState($this, $this->traiterFini());
                     }
                 }
             } else {
             }
         } else {
             //NON VALIDATION FORCEE
         }
         //$this->saveInstance();
     } else {
         $this->debug("Pas de mise à jour des Items par les données post nécéssaire");
     }
     /*on a plus qu'à l'afficher*/
     //--------------------------------------------FIN TRAITEMENT DOM
     //rechagement de simpleXML apres modifs via DOM
     if ($this->mustICloseAfterValid() && $this->justClosed) {
         $_POST['formx_autoclose'] = true;
         $this->affFoRmX();
         //TODO : lorsque plus aucune regle métier dans affFoRmX, virer la ligne
     } else {
         $this->af .= $this->affFoRmX();
     }
     $this->saveInstance();
     if ($this->justClosed && ($id2load = clFoRmXtOoLs::isFormToLoad($this->prefix))) {
         //on gruge sur les données post pour réouvrir le formulaire suivant
         $this->debug("Au moins un autre formulaire est dans la pipeline: le {$id2load} . On l'ouvre");
         $_POST['FormX_ext_goto_'] = $id2load;
         $this->TraiterPost();
     }
     //apres car à l'affichage on peut se rendre compte de certaines choses et vouloir sauvegarder
     return 1;
 }