/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2016 *
+ * Copyright (c) 2001-2017 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
-if (!defined('_ECRIRE_INC_VERSION')) return;
+if (!defined('_ECRIRE_INC_VERSION')) {
+ return;
+}
function securiser_redirect_action($redirect) {
if ((tester_url_absolue($redirect) or preg_match(',^\w+:,',trim($redirect)))
and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
// si l'url est une url du site, on la laisse passer sans rien faire
// c'est encore le plus simple
- $base = $GLOBALS['meta']['adresse_site']."/";
- if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0)
+ $base = $GLOBALS['meta']['adresse_site'] . "/";
+ if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
return $redirect;
+ }
$base = url_de_base();
- if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0)
+ if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
return $redirect;
+ }
+
return "";
}
+
return $redirect;
}
-// http://doc.spip.org/@traiter_appels_actions
-function traiter_appels_actions(){
+// http://code.spip.net/@traiter_appels_actions
+function traiter_appels_actions() {
// cas de l'appel qui renvoie une redirection (302) ou rien (204)
if ($action = _request('action')) {
include_spip('base/abstract_sql'); // chargement systematique pour les actions
// si l'action est provoque par un hit {ajax}
// il faut transmettre l'env ajax au redirect
// on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
- if (($v=_request('var_ajax'))
- AND ($v!=='form')
- AND ($args = _request('var_ajax_env'))
- AND ($url = _request('redirect'))){
- $url = parametre_url($url,'var_ajax',$v,'&');
- $url = parametre_url($url,'var_ajax_env',$args,'&');
- set_request('redirect',$url);
- }
- else if(_request('redirect')){
- set_request('redirect',securiser_redirect_action(_request('redirect')));
+ if (($v = _request('var_ajax'))
+ and ($v !== 'form')
+ and ($args = _request('var_ajax_env'))
+ and ($url = _request('redirect'))
+ ) {
+ $url = parametre_url($url, 'var_ajax', $v, '&');
+ $url = parametre_url($url, 'var_ajax_env', $args, '&');
+ set_request('redirect', $url);
+ } else {
+ if (_request('redirect')) {
+ set_request('redirect', securiser_redirect_action(_request('redirect')));
+ }
}
$var_f = charger_fonction($action, 'action');
$var_f();
if (!isset($GLOBALS['redirect'])) {
$GLOBALS['redirect'] = _request('redirect');
- if ($_SERVER['REQUEST_METHOD'] == 'POST')
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
+ }
$GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
}
if ($url = $GLOBALS['redirect']) {
// si l'action est provoque par un hit {ajax}
// il faut transmettre l'env ajax au redirect
// qui a pu etre defini par l'action
- if (($v=_request('var_ajax'))
- AND ($v!=='form')
- AND ($args = _request('var_ajax_env'))) {
- $url = parametre_url($url,'var_ajax',$v,'&');
- $url = parametre_url($url,'var_ajax_env',$args,'&');
+ if (($v = _request('var_ajax'))
+ and ($v !== 'form')
+ and ($args = _request('var_ajax_env'))
+ ) {
+ $url = parametre_url($url, 'var_ajax', $v, '&');
+ $url = parametre_url($url, 'var_ajax_env', $args, '&');
// passer l'ancre en variable pour pouvoir la gerer cote serveur
- $url = preg_replace(',#([^#&?]+)$,',"&var_ajax_ancre=\\1",$url);
+ $url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
}
- $url = str_replace('&','&',$url); // les redirections se font en &, pas en en &
+ $url = str_replace('&', '&', $url); // les redirections se font en &, pas en en &
redirige_par_entete($url);
}
if (!headers_sent()
- AND !ob_get_length())
- http_status(204); // No Content
+ and !ob_get_length()
+ ) {
+ http_status(204);
+ } // No Content
return true;
}
+
return false;
}
-// http://doc.spip.org/@refuser_traiter_formulaire_ajax
-function refuser_traiter_formulaire_ajax(){
- if ($v=_request('var_ajax')
- AND $v=='form'
- AND $form = _request('formulaire_action')
- AND $args = _request('formulaire_action_args')
- AND decoder_contexte_ajax($args,$form)!==false) {
+// http://code.spip.net/@refuser_traiter_formulaire_ajax
+function refuser_traiter_formulaire_ajax() {
+ if ($v = _request('var_ajax')
+ and $v == 'form'
+ and $form = _request('formulaire_action')
+ and $args = _request('formulaire_action_args')
+ and decoder_contexte_ajax($args, $form) !== false
+ ) {
// on est bien dans le contexte de traitement d'un formulaire en ajax
// mais traiter ne veut pas
// on le dit a la page qui va resumbit
// sans ajax
include_spip('inc/actions');
- ajax_retour('noajax',false);
+ ajax_retour('noajax', false);
exit;
}
}
-// http://doc.spip.org/@traiter_appels_inclusions_ajax
-function traiter_appels_inclusions_ajax(){
+// http://code.spip.net/@traiter_appels_inclusions_ajax
+function traiter_appels_inclusions_ajax() {
// traiter les appels de bloc ajax (ex: pagination)
if ($v = _request('var_ajax')
- AND $v !== 'form'
- AND $args = _request('var_ajax_env')) {
+ and $v !== 'form'
+ and $args = _request('var_ajax_env')
+ ) {
include_spip('inc/filtres');
include_spip('inc/actions');
if ($args = decoder_contexte_ajax($args)
- AND $fond = $args['fond']) {
+ and $fond = $args['fond']
+ ) {
include_spip('public/assembler');
$contexte = calculer_contexte();
$contexte = array_merge($args, $contexte);
- $page = recuperer_fond($fond,$contexte,array('trim'=>false));
+ $page = recuperer_fond($fond, $contexte, array('trim' => false));
$texte = $page;
- if ($ancre = _request('var_ajax_ancre')){
+ if ($ancre = _request('var_ajax_ancre')) {
// pas n'importe quoi quand meme dans la variable !
- $ancre = str_replace(array('<','"',"'"),array('<','"',''),$ancre);
- $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>".$texte;
+ $ancre = str_replace(array('<', '"', "'"), array('<', '"', ''), $ancre);
+ $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
}
- }
- else {
+ } 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;
+
+ 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){
+// 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;
+ 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
+ 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) {
+ 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');
// 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);
+ // 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())
- );
+ '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')){
+ if (_request('formulaire_action_verifier_json')) {
include_spip('inc/json');
include_spip('inc/actions');
- ajax_retour(json_encode($post["erreurs_$form"]),'text/plain');
+ ajax_retour(json_encode($post["erreurs_$form"]), 'text/plain');
+
return true; // on a fini le hit
}
$retour = "";
- if ((count($post["erreurs_$form"])==0)){
+ if ((count($post["erreurs_$form"]) == 0)) {
$rev = "";
- if ($traiter = charger_fonction("traiter","formulaires/$form/",true))
- $rev = call_user_func_array($traiter,$args);
+ 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
+ '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
- // cas du message texte simple
- if (!is_array($rev)){
- $post["message_ok_$form"] = $rev;
+ $post["message_ok_$form"] = '';
+ // on peut avoir message_ok et message_erreur
+ if (isset($rev['message_ok'])) {
+ $post["message_ok_$form"] = $rev['message_ok'];
}
- // 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'];
-
+
+ // 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'];
}
- 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 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)) {
+ 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);
+ 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);
+ // 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
}
-
-?>