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(403);
$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://doc.spip.org/@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
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');
$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())
);
// 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 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 = "
".$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
}
?>