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; }