[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / ecrire / public / aiguiller.php
index d34c686..0006d75 100644 (file)
@@ -3,33 +3,39 @@
 /***************************************************************************\
  *  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
@@ -44,118 +50,136 @@ function traiter_appels_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('&lt;','&quot;',''),$ancre);
-                               $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>".$texte;
+                               $ancre = str_replace(array('<', '"', "'"), array('&lt;', '&quot;', ''), $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');
@@ -164,97 +188,119 @@ function traiter_formulaires_dynamiques($get=false){
                // 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
 }
-
-?>