/** * Reinjecter dans _request() les valeurs postees * dans les etapes precedentes * * @param string $form * @return array */ function cvtmulti_recuperer_post_precedents($form) { include_spip('inc/filtres'); if ($form and $c = _request('cvtm_prev_post') and $c = decoder_contexte_ajax($c, $form)) { #var_dump($c); # reinjecter dans la bonne variable pour permettre de retrouver # toutes les saisies dans un seul tableau if ($_SERVER['REQUEST_METHOD'] == 'POST') { $store =& $_POST; } else { $store =& $_GET; } foreach ($c as $k => $v) { // on ecrase pas si saisi a nouveau ! if (!isset($store[$k])) { $_REQUEST[$k] = $store[$k] = $v; } elseif (is_array($store[$k]) and is_array($v) and $z = array_keys($v) and !is_numeric(reset($z)) and $z = array_keys($store[$k]) and !is_numeric(reset($z))) { $_REQUEST[$k] = $store[$k] = array_merge($v, $store[$k]); } } // vider pour eviter un second appel a verifier_n // en cas de double implementation (unipotence) set_request('cvtm_prev_post'); return array($c['_etape'], $c['_etapes']); } return false; }
/** * Reinjecter dans _request() les valeurs postees * dans les etapes precedentes * * @param string $form * @return array */ function migration_recuperer_post_precedents($form){ include_spip('inc/filtres'); if ($form AND $c = _request('cvtm_prev_post') AND $c = decoder_contexte_ajax($c, $form)){ #var_dump($c); # reinjecter dans la bonne variable pour permettre de retrouver # toutes les saisies dans un seul tableau if ($_SERVER['REQUEST_METHOD']=='POST') $store = &$_POST; else $store = &$_GET; foreach($c as $k=>$v) if (!isset($store[$k])) // on ecrase pas si saisi a nouveau ! $_REQUEST[$k] = $store[$k] = $v; // vider pour eviter un second appel a verifier_n // en cas de double implementation (unipotence) set_request('cvtm_prev_post'); return array($c['_etape'],$c['_etapes']); } return false; }
function traiter_formulaires_dynamiques($get=false){ static $post = array(); static $done = false; if ($get) return $post; if ($done) return false; $done = true; if (!($form = _request('formulaire_action') AND $args = _request('formulaire_action_args'))) return false; // le hit peut continuer normalement include_spip('inc/filtres'); if (($args = decoder_contexte_ajax($args,$form))===false) { spip_log("signature ajax form incorrecte : $form"); return false; // continuons le hit comme si de rien etait } else { include_spip('inc/lang'); // sauvegarder la lang en cours $old_lang = $GLOBALS['spip_lang']; // changer la langue avec celle qui a cours dans le formulaire // on la depile de $args car c'est un argument implicite masque changer_langue(array_shift($args)); $verifier = charger_fonction("verifier","formulaires/$form/",true); $post["erreurs_$form"] = pipeline( 'formulaire_verifier', array( 'args'=>array('form'=>$form,'args'=>$args), 'data'=>$verifier?call_user_func_array($verifier,$args):array()) ); if ((count($post["erreurs_$form"])==0)){ $rev = ""; $retour = ""; if ($traiter = charger_fonction("traiter","formulaires/$form/",true)) $rev = call_user_func_array($traiter,$args); $rev = pipeline( 'formulaire_traiter', array( 'args'=>array('form'=>$form,'args'=>$args), 'data'=>$rev) ); // le retour de traiter peut avoir 3 formats // - simple message texte // - tableau a deux entrees ($editable,$message) // - tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx) // le dernier format est celui conseille car il permet le pipelinage, en particulier // en y passant l'id de l'objet cree/modifie // si message_erreur est present, on considere que le traitement a echoue // cas du message texte simple if (!is_array($rev)){ $post["message_ok_$form"] = $rev; } // cas du tableau deux valeurs simple (ancien format, deconseille) elseif (count($rev)==2 AND !array_key_exists('message_ok',$rev) AND !array_key_exists('message_erreur',$rev) AND !array_key_exists('redirect',$rev)) { $post["editable_$form"] = reset($rev); $post["message_ok_$form"] = end($rev); } // cas du tableau explicite (conseille) else { // verifier si traiter n'a pas echoue avec une erreur : if (isset($rev['message_erreur'])) { $post["erreurs_$form"]["message_erreur"] = $rev['message_erreur']; } else { // sinon faire ce qu'il faut : if (isset($rev['message_ok'])) $post["message_ok_$form"] = $rev['message_ok']; if (isset($rev['editable'])) $post["editable_$form"] = $rev['editable']; // si une redirection est demandee, appeler redirigae_formulaire qui choisira // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue) if (isset($rev['redirect']) AND $rev['redirect']){ include_spip('inc/headers'); list($masque,$message) = redirige_formulaire($rev['redirect'], '','ajaxform'); $post["message_ok_$form"] .= $message; $retour .= $masque; } } } } // si le formulaire a ete soumis en ajax, on le renvoie direct ! if (_request('var_ajax')){ if (find_in_path('formulaire_.php','balise/',true)) { include_spip('inc/actions'); include_spip('public/assembler'); array_unshift($args,$form); $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn',$args),false); // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7 // sans cela le formulaire n'est pas actif apres le hit ajax $retour = "<br class='bugajaxie' style='display:none;'/>".$retour; ajax_retour($retour,false); return true; // on a fini le hit } } // restaurer la lang en cours changer_langue($old_lang); } return false; // le hit peut continuer normalement }
/** * Calcule le contexte à envoyer dans le squelette d'un formulaire * * @param string $form * Nom du formulaire * @param array $args * Arguments envoyés à l'appel du formulaire * @return array * Contexte d'environnement à envoyer au squelette **/ function balise_FORMULAIRE__contexte($form, $args) { // tester si ce formulaire vient d'etre poste (memes arguments) // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page // si poste, on recupere les erreurs $je_suis_poste = false; if ($post_form = _request('formulaire_action') and $post_form == $form and $p = _request('formulaire_action_args') and is_array($p = decoder_contexte_ajax($p, $post_form))) { // enlever le faux attribut de langue masque array_shift($p); if (formulaire__identifier($form, $args, $p)) { $je_suis_poste = true; } } $editable = true; $erreurs = $post = array(); if ($je_suis_poste) { $post = traiter_formulaires_dynamiques(true); $e = "erreurs_{$form}"; $erreurs = isset($post[$e]) ? $post[$e] : array(); $editable = "editable_{$form}"; $editable = !isset($post[$e]) || count($erreurs) || isset($post[$editable]) && $post[$editable]; } $valeurs = formulaire__charger($form, $args, $je_suis_poste); // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable // C'est plus fort qu'editable qui est gere par le squelette // Idealement $valeur doit etre alors un message explicatif. if (!is_array($valeurs)) { return is_string($valeurs) ? $valeurs : ''; } // charger peut passer une action si le formulaire ne tourne pas sur self() // ou une action vide si elle ne sert pas $action = isset($valeurs['action']) ? $valeurs['action'] : self('&', true); // bug IEx : si action finit par / // IE croit que le <form ... action=../ > est autoferme if (substr($action, -1) == '/') { // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un / $action .= '#'; } // recuperer la saisie en cours si erreurs // seulement si c'est ce formulaire qui est poste // ou si on le demande explicitement par le parametre _forcer_request = true $dispo = $je_suis_poste || isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']; foreach (array_keys($valeurs) as $champ) { if ($champ[0] !== '_' and !in_array($champ, array('message_ok', 'message_erreur', 'editable'))) { if ($dispo and ($v = _request($champ)) !== NULL) { $valeurs[$champ] = $v; } // nettoyer l'url des champs qui vont etre saisis if ($action) { $action = parametre_url($action, $champ, ''); } // proteger les ' et les " dans les champs que l'on va injecter $valeurs[$champ] = protege_champ($valeurs[$champ]); } } if ($action) { // nettoyer l'url $action = parametre_url($action, 'formulaire_action', ''); $action = parametre_url($action, 'formulaire_action_args', ''); } if (isset($valeurs['_action'])) { $securiser_action = charger_fonction('securiser_action', 'inc'); $secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1); $valeurs['_hidden'] = (isset($valeurs['_hidden']) ? $valeurs['_hidden'] : '') . "<input type='hidden' name='arg' value='" . $secu['arg'] . "' />" . "<input type='hidden' name='hash' value='" . $secu['hash'] . "' />"; } // empiler la lang en tant que premier argument implicite du CVT // pour permettre de la restaurer au moment du Verifier et du Traiter array_unshift($args, $GLOBALS['spip_lang']); $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form); $valeurs['erreurs'] = $erreurs; $valeurs['action'] = $action; $valeurs['form'] = $form; if (!isset($valeurs['id'])) { $valeurs['id'] = 'new'; } // editable peut venir de charger() ou de traiter() sinon if (!isset($valeurs['editable'])) { $valeurs['editable'] = $editable; } // dans tous les cas, renvoyer un espace ou vide (et pas un booleen) $valeurs['editable'] = $valeurs['editable'] ? ' ' : ''; if ($je_suis_poste) { $valeurs['message_erreur'] = ""; if (isset($erreurs['message_erreur'])) { $valeurs['message_erreur'] = $erreurs['message_erreur']; } $valeurs['message_ok'] = ""; if (isset($post["message_ok_{$form}"])) { $valeurs['message_ok'] = $post["message_ok_{$form}"]; } elseif (isset($erreurs['message_ok'])) { $valeurs['message_ok'] = $erreurs["message_ok"]; } } return $valeurs; }
function traiter_formulaires_dynamiques($get = false) { static $post = array(); static $done = false; if ($get) { return $post; } if ($done) { return false; } $done = true; if (!($form = _request('formulaire_action') and $args = _request('formulaire_action_args'))) { return false; } // le hit peut continuer normalement include_spip('inc/filtres'); if (($args = decoder_contexte_ajax($args, $form)) === false) { spip_log("signature ajax form incorrecte : {$form}"); return false; // continuons le hit comme si de rien etait } else { include_spip('inc/lang'); // sauvegarder la lang en cours $old_lang = $GLOBALS['spip_lang']; // changer la langue avec celle qui a cours dans le formulaire // on la depile de $args car c'est un argument implicite masque changer_langue(array_shift($args)); // inclure mes_fonctions et autres filtres avant verifier/traiter include_spip('public/parametrer'); // ainsi que l'API SQL bien utile dans verifier/traiter include_spip('base/abstract_sql'); $verifier = charger_fonction("verifier", "formulaires/{$form}/", true); $post["erreurs_{$form}"] = pipeline('formulaire_verifier', array('args' => array('form' => $form, 'args' => $args), 'data' => $verifier ? call_user_func_array($verifier, $args) : array())); // accessibilite : si des erreurs mais pas de message general l'ajouter if (count($post["erreurs_{$form}"]) and !isset($post["erreurs_{$form}"]['message_erreur'])) { $post["erreurs_{$form}"]['message_erreur'] = singulier_ou_pluriel(count($post["erreurs_{$form}"]), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie'); } // si on ne demandait qu'une verif json if (_request('formulaire_action_verifier_json')) { include_spip('inc/json'); include_spip('inc/actions'); ajax_retour(json_encode($post["erreurs_{$form}"]), 'text/plain'); return true; // on a fini le hit } $retour = ""; if (count($post["erreurs_{$form}"]) == 0) { $rev = ""; if ($traiter = charger_fonction("traiter", "formulaires/{$form}/", true)) { $rev = call_user_func_array($traiter, $args); } $rev = pipeline('formulaire_traiter', array('args' => array('form' => $form, 'args' => $args), 'data' => $rev)); // le retour de traiter est // un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx) // il permet le pipelinage, en particulier // en y passant l'id de l'objet cree/modifie // si message_erreur est present, on considere que le traitement a echoue $post["message_ok_{$form}"] = ''; // on peut avoir message_ok et message_erreur if (isset($rev['message_ok'])) { $post["message_ok_{$form}"] = $rev['message_ok']; } // verifier si traiter n'a pas echoue avec une erreur : if (isset($rev['message_erreur'])) { $post["erreurs_{$form}"]["message_erreur"] = $rev['message_erreur']; // si il y a une erreur on ne redirige pas } else { // sinon faire ce qu'il faut : if (isset($rev['editable'])) { $post["editable_{$form}"] = $rev['editable']; } // si une redirection est demandee, appeler redirigae_formulaire qui choisira // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue) if (isset($rev['redirect']) and $rev['redirect']) { include_spip('inc/headers'); list($masque, $message) = redirige_formulaire($rev['redirect'], '', 'ajaxform'); $post["message_ok_{$form}"] .= $message; $retour .= $masque; } } } // si le formulaire a ete soumis en ajax, on le renvoie direct ! if (_request('var_ajax')) { if (find_in_path('formulaire_.php', 'balise/', true)) { include_spip('inc/actions'); include_spip('public/assembler'); array_unshift($args, $form); $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn', $args), false); // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7 // sans cela le formulaire n'est pas actif apres le hit ajax // la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour; ajax_retour($retour, false); return true; // on a fini le hit } } // restaurer la lang en cours changer_langue($old_lang); } return false; // le hit peut continuer normalement }