false)); $texte = $page; if ($ancre = _request('var_ajax_ancre')) { // pas n'importe quoi quand meme dans la variable ! $ancre = str_replace(array('<', '"', "'"), array('<', '"', ''), $ancre); $texte = "anchor" . $texte; } } else { include_spip('inc/headers'); http_status(400); $texte = _L('signature ajax bloc incorrecte'); } ajax_retour($texte, false); return true; // on a fini le hit } return false; } // au 1er appel, traite les formulaires dynamiques charger/verifier/traiter // au 2e se sachant 2e, retourne les messages et erreurs stockes au 1er // Le 1er renvoie True si il faut faire exit a la sortie // http://code.spip.net/@traiter_formulaires_dynamiques 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 // verifier que le post est licite (du meme auteur ou d'une session anonyme) $sign = _request('formulaire_action_sign'); if (!empty($GLOBALS['visiteur_session']['id_auteur'])) { if (empty($sign)) { spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR); return false; } $securiser_action = charger_fonction('securiser_action', 'inc'); $secu = $securiser_action($form, $args, '', -1); if ($sign !== $secu['hash']) { spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR); return false; } } else { if (!empty($sign)) { spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR); return false; } } include_spip('inc/filtres'); if (($args = decoder_contexte_ajax($args, $form)) === false) { spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR); 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'); /** * Pipeline exécuté lors de la soumission d'un formulaire, * mais avant l'appel de la fonction de vérification. */ pipeline( 'formulaire_receptionner', array( 'args' => array('form' => $form, 'args' => $args), 'data' => null, ) ); $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() ) ); // prise en charge CVT multi etape si besoin if (_request('cvtm_prev_post')) { include_spip('inc/cvt_multietapes'); $post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes( array('form' => $form, 'args' => $args), $post["erreurs_$form"] ); } // 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 = "" . $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 }