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