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