Example #1
0
/**
 * 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;
}
Example #2
0
/**
 * 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;
}
Example #3
0
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
}
Example #4
0
/**
 * 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('&amp;', 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;
}
Example #5
0
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
}