[SPIP] ~maj 3.0.10 --> 3.0.14
[lhc/web/www.git] / www / ecrire / public / aiguiller.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 function securiser_redirect_action($redirect){
16 if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')){
17 // si l'url est une url du site, on la laisse passer sans rien faire
18 // c'est encore le plus simple
19 $base = $GLOBALS['meta']['adresse_site']."/";
20 if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0)
21 return $redirect;
22 $base = url_de_base();
23 if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0)
24 return $redirect;
25 return "";
26 }
27 return $redirect;
28 }
29
30 // http://doc.spip.org/@traiter_appels_actions
31 function traiter_appels_actions(){
32 // cas de l'appel qui renvoie une redirection (302) ou rien (204)
33 if ($action = _request('action')) {
34 include_spip('base/abstract_sql'); // chargement systematique pour les actions
35 include_spip('inc/autoriser');
36 include_spip('inc/headers');
37 include_spip('inc/actions');
38 // des actions peuvent appeler _T
39 if (!isset($GLOBALS['spip_lang'])) {
40 include_spip('inc/lang');
41 utiliser_langue_visiteur();
42 }
43 // si l'action est provoque par un hit {ajax}
44 // il faut transmettre l'env ajax au redirect
45 // on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
46 if (($v=_request('var_ajax'))
47 AND ($v!=='form')
48 AND ($args = _request('var_ajax_env'))
49 AND ($url = _request('redirect'))){
50 $url = parametre_url($url,'var_ajax',$v,'&');
51 $url = parametre_url($url,'var_ajax_env',$args,'&');
52 set_request('redirect',$url);
53 }
54 else if(_request('redirect')){
55 set_request('redirect',securiser_redirect_action(_request('redirect')));
56 }
57 $var_f = charger_fonction($action, 'action');
58 $var_f();
59 if (!isset($GLOBALS['redirect'])) {
60 $GLOBALS['redirect'] = _request('redirect');
61 if ($_SERVER['REQUEST_METHOD'] == 'POST')
62 $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
63 $GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
64 }
65 if ($url = $GLOBALS['redirect']) {
66 // si l'action est provoque par un hit {ajax}
67 // il faut transmettre l'env ajax au redirect
68 // qui a pu etre defini par l'action
69 if (($v=_request('var_ajax'))
70 AND ($v!=='form')
71 AND ($args = _request('var_ajax_env'))) {
72 $url = parametre_url($url,'var_ajax',$v,'&');
73 $url = parametre_url($url,'var_ajax_env',$args,'&');
74 // passer l'ancre en variable pour pouvoir la gerer cote serveur
75 $url = preg_replace(',#([^#&?]+)$,',"&var_ajax_ancre=\\1",$url);
76 }
77 $url = str_replace('&amp;','&',$url); // les redirections se font en &, pas en en &amp;
78 redirige_par_entete($url);
79 }
80 if (!headers_sent()
81 AND !ob_get_length())
82 http_status(204); // No Content
83 return true;
84 }
85 return false;
86 }
87
88
89 // http://doc.spip.org/@refuser_traiter_formulaire_ajax
90 function refuser_traiter_formulaire_ajax(){
91 if ($v=_request('var_ajax')
92 AND $v=='form'
93 AND $form = _request('formulaire_action')
94 AND $args = _request('formulaire_action_args')
95 AND decoder_contexte_ajax($args,$form)!==false) {
96 // on est bien dans le contexte de traitement d'un formulaire en ajax
97 // mais traiter ne veut pas
98 // on le dit a la page qui va resumbit
99 // sans ajax
100 include_spip('inc/actions');
101 ajax_retour('noajax',false);
102 exit;
103 }
104 }
105
106 // http://doc.spip.org/@traiter_appels_inclusions_ajax
107 function traiter_appels_inclusions_ajax(){
108 // traiter les appels de bloc ajax (ex: pagination)
109 if ($v = _request('var_ajax')
110 AND $v !== 'form'
111 AND $args = _request('var_ajax_env')) {
112 include_spip('inc/filtres');
113 include_spip('inc/actions');
114 if ($args = decoder_contexte_ajax($args)
115 AND $fond = $args['fond']) {
116 include_spip('public/assembler');
117 $contexte = calculer_contexte();
118 $contexte = array_merge($args, $contexte);
119 $page = recuperer_fond($fond,$contexte,array('trim'=>false));
120 $texte = $page;
121 if ($ancre = _request('var_ajax_ancre')){
122 // pas n'importe quoi quand meme dans la variable !
123 $ancre = str_replace(array('<','"',"'"),array('&lt;','&quot;',''),$ancre);
124 $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>".$texte;
125 }
126 }
127 else {
128 include_spip('inc/headers');
129 http_status(403);
130 $texte = _L('signature ajax bloc incorrecte');
131 }
132 ajax_retour($texte, false);
133 return true; // on a fini le hit
134 }
135 return false;
136 }
137
138 // au 1er appel, traite les formulaires dynamiques charger/verifier/traiter
139 // au 2e se sachant 2e, retourne les messages et erreurs stockes au 1er
140 // Le 1er renvoie True si il faut faire exit a la sortie
141
142 // http://doc.spip.org/@traiter_formulaires_dynamiques
143 function traiter_formulaires_dynamiques($get=false){
144 static $post = array();
145 static $done = false;
146
147 if ($get) return $post;
148 if ($done) return false;
149 $done = true;
150
151 if (!($form = _request('formulaire_action')
152 AND $args = _request('formulaire_action_args')))
153 return false; // le hit peut continuer normalement
154
155 include_spip('inc/filtres');
156 if (($args = decoder_contexte_ajax($args,$form))===false) {
157 spip_log("signature ajax form incorrecte : $form");
158 return false; // continuons le hit comme si de rien etait
159 } else {
160 include_spip('inc/lang');
161 // sauvegarder la lang en cours
162 $old_lang = $GLOBALS['spip_lang'];
163 // changer la langue avec celle qui a cours dans le formulaire
164 // on la depile de $args car c'est un argument implicite masque
165 changer_langue(array_shift($args));
166
167
168 // inclure mes_fonctions et autres filtres avant verifier/traiter
169 include_spip('public/parametrer');
170 $verifier = charger_fonction("verifier","formulaires/$form/",true);
171 $post["erreurs_$form"] = pipeline(
172 'formulaire_verifier',
173 array(
174 'args'=>array('form'=>$form,'args'=>$args),
175 'data'=>$verifier?call_user_func_array($verifier,$args):array())
176 );
177 // si on ne demandait qu'une verif json
178 if (_request('formulaire_action_verifier_json')){
179 include_spip('inc/json');
180 include_spip('inc/actions');
181 ajax_retour(json_encode($post["erreurs_$form"]),'text/plain');
182 return true; // on a fini le hit
183 }
184 $retour = "";
185 if ((count($post["erreurs_$form"])==0)){
186 $rev = "";
187 if ($traiter = charger_fonction("traiter","formulaires/$form/",true))
188 $rev = call_user_func_array($traiter,$args);
189
190 $rev = pipeline(
191 'formulaire_traiter',
192 array(
193 'args'=>array('form'=>$form,'args'=>$args),
194 'data'=>$rev)
195 );
196 // le retour de traiter peut avoir 3 formats
197 // - simple message texte
198 // - tableau a deux entrees ($editable,$message)
199 // - tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
200 // le dernier format est celui conseille car il permet le pipelinage, en particulier
201 // en y passant l'id de l'objet cree/modifie
202 // si message_erreur est present, on considere que le traitement a echoue
203 // cas du message texte simple
204 if (!is_array($rev)){
205 $post["message_ok_$form"] = $rev;
206 }
207 // cas du tableau deux valeurs simple (ancien format, deconseille)
208 elseif (count($rev)==2
209 AND !array_key_exists('message_ok',$rev)
210 AND !array_key_exists('message_erreur',$rev)
211 AND !array_key_exists('redirect',$rev)) {
212 $post["editable_$form"] = reset($rev);
213 $post["message_ok_$form"] = end($rev);
214 }
215 // cas du tableau explicite (conseille)
216 else {
217 // verifier si traiter n'a pas echoue avec une erreur :
218 if (isset($rev['message_erreur'])) {
219 $post["erreurs_$form"]["message_erreur"] = $rev['message_erreur'];
220
221 }
222 else {
223 // sinon faire ce qu'il faut :
224 if (isset($rev['message_ok']))
225 $post["message_ok_$form"] = $rev['message_ok'];
226 if (isset($rev['editable']))
227 $post["editable_$form"] = $rev['editable'];
228 // si une redirection est demandee, appeler redirigae_formulaire qui choisira
229 // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
230 if (isset($rev['redirect']) AND $rev['redirect']){
231 include_spip('inc/headers');
232 list($masque,$message) = redirige_formulaire($rev['redirect'], '','ajaxform');
233 $post["message_ok_$form"] .= $message;
234 $retour .= $masque;
235 }
236 }
237 }
238 }
239 // si le formulaire a ete soumis en ajax, on le renvoie direct !
240 if (_request('var_ajax')){
241 if (find_in_path('formulaire_.php','balise/',true)) {
242 include_spip('inc/actions');
243 include_spip('public/assembler');
244 array_unshift($args,$form);
245 $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn',$args),false);
246 // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
247 // sans cela le formulaire n'est pas actif apres le hit ajax
248 $retour = "<br class='bugajaxie' style='display:none;'/>".$retour;
249 ajax_retour($retour,false);
250 return true; // on a fini le hit
251 }
252 }
253 // restaurer la lang en cours
254 changer_langue($old_lang);
255 }
256 return false; // le hit peut continuer normalement
257 }
258
259 ?>