Completed
Push — master ( 1da3a1...d54839 )
by cam
01:28
created
ecrire/public/aiguiller.php 1 patch
Indentation   +289 added lines, -289 removed lines patch added patch discarded remove patch
@@ -11,164 +11,164 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function securiser_redirect_action($redirect) {
18
-	// cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
19
-	if (strpos($redirect, '%') !== false) {
20
-		$r2 = urldecode($redirect);
21
-		if (($r3 = securiser_redirect_action($r2)) !== $r2) {
22
-			return $r3;
23
-		}
24
-	}
25
-	if (
26
-		(tester_url_absolue($redirect) or preg_match(',^\w+:,', trim($redirect)))
27
-		and !defined('_AUTORISER_ACTION_ABS_REDIRECT')
28
-	) {
29
-		// si l'url est une url du site, on la laisse passer sans rien faire
30
-		// c'est encore le plus simple
31
-		$base = $GLOBALS['meta']['adresse_site'] . '/';
32
-		if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
33
-			return $redirect;
34
-		}
35
-		$base = url_de_base();
36
-		if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
37
-			return $redirect;
38
-		}
18
+    // cas d'un double urlencode : si un urldecode de l'url n'est pas secure, on retient ca comme redirect
19
+    if (strpos($redirect, '%') !== false) {
20
+        $r2 = urldecode($redirect);
21
+        if (($r3 = securiser_redirect_action($r2)) !== $r2) {
22
+            return $r3;
23
+        }
24
+    }
25
+    if (
26
+        (tester_url_absolue($redirect) or preg_match(',^\w+:,', trim($redirect)))
27
+        and !defined('_AUTORISER_ACTION_ABS_REDIRECT')
28
+    ) {
29
+        // si l'url est une url du site, on la laisse passer sans rien faire
30
+        // c'est encore le plus simple
31
+        $base = $GLOBALS['meta']['adresse_site'] . '/';
32
+        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
33
+            return $redirect;
34
+        }
35
+        $base = url_de_base();
36
+        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
37
+            return $redirect;
38
+        }
39 39
 
40
-		return '';
41
-	}
40
+        return '';
41
+    }
42 42
 
43
-	return $redirect;
43
+    return $redirect;
44 44
 }
45 45
 
46 46
 // https://code.spip.net/@traiter_appels_actions
47 47
 function traiter_appels_actions() {
48
-	// cas de l'appel qui renvoie une redirection (302) ou rien (204)
49
-	if ($action = _request('action')) {
50
-		include_spip('base/abstract_sql'); // chargement systematique pour les actions
51
-		include_spip('inc/autoriser');
52
-		include_spip('inc/headers');
53
-		include_spip('inc/actions');
54
-		// des actions peuvent appeler _T
55
-		if (!isset($GLOBALS['spip_lang'])) {
56
-			include_spip('inc/lang');
57
-			utiliser_langue_visiteur();
58
-		}
59
-		// si l'action est provoque par un hit {ajax}
60
-		// il faut transmettre l'env ajax au redirect
61
-		// on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
62
-		if (
63
-			($v = _request('var_ajax'))
64
-			and ($v !== 'form')
65
-			and ($args = _request('var_ajax_env'))
66
-			and ($url = _request('redirect'))
67
-		) {
68
-			$url = parametre_url($url, 'var_ajax', $v, '&');
69
-			$url = parametre_url($url, 'var_ajax_env', $args, '&');
70
-			set_request('redirect', $url);
71
-		} else {
72
-			if (_request('redirect')) {
73
-				set_request('redirect', securiser_redirect_action(_request('redirect')));
74
-			}
75
-		}
76
-		$var_f = charger_fonction($action, 'action');
77
-		$var_f();
78
-		if (!isset($GLOBALS['redirect'])) {
79
-			$GLOBALS['redirect'] = _request('redirect');
80
-			if ($_SERVER['REQUEST_METHOD'] == 'POST') {
81
-				$GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
82
-			}
83
-			$GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
84
-		}
85
-		if ($url = $GLOBALS['redirect']) {
86
-			// si l'action est provoque par un hit {ajax}
87
-			// il faut transmettre l'env ajax au redirect
88
-			// qui a pu etre defini par l'action
89
-			if (
90
-				($v = _request('var_ajax'))
91
-				and ($v !== 'form')
92
-				and ($args = _request('var_ajax_env'))
93
-			) {
94
-				$url = parametre_url($url, 'var_ajax', $v, '&');
95
-				$url = parametre_url($url, 'var_ajax_env', $args, '&');
96
-				// passer l'ancre en variable pour pouvoir la gerer cote serveur
97
-				$url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
98
-			}
99
-			$url = str_replace('&', '&', $url); // les redirections se font en &, pas en en &
100
-			redirige_par_entete($url);
101
-		}
48
+    // cas de l'appel qui renvoie une redirection (302) ou rien (204)
49
+    if ($action = _request('action')) {
50
+        include_spip('base/abstract_sql'); // chargement systematique pour les actions
51
+        include_spip('inc/autoriser');
52
+        include_spip('inc/headers');
53
+        include_spip('inc/actions');
54
+        // des actions peuvent appeler _T
55
+        if (!isset($GLOBALS['spip_lang'])) {
56
+            include_spip('inc/lang');
57
+            utiliser_langue_visiteur();
58
+        }
59
+        // si l'action est provoque par un hit {ajax}
60
+        // il faut transmettre l'env ajax au redirect
61
+        // on le met avant dans la query string au cas ou l'action fait elle meme sa redirection
62
+        if (
63
+            ($v = _request('var_ajax'))
64
+            and ($v !== 'form')
65
+            and ($args = _request('var_ajax_env'))
66
+            and ($url = _request('redirect'))
67
+        ) {
68
+            $url = parametre_url($url, 'var_ajax', $v, '&');
69
+            $url = parametre_url($url, 'var_ajax_env', $args, '&');
70
+            set_request('redirect', $url);
71
+        } else {
72
+            if (_request('redirect')) {
73
+                set_request('redirect', securiser_redirect_action(_request('redirect')));
74
+            }
75
+        }
76
+        $var_f = charger_fonction($action, 'action');
77
+        $var_f();
78
+        if (!isset($GLOBALS['redirect'])) {
79
+            $GLOBALS['redirect'] = _request('redirect');
80
+            if ($_SERVER['REQUEST_METHOD'] == 'POST') {
81
+                $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
82
+            }
83
+            $GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
84
+        }
85
+        if ($url = $GLOBALS['redirect']) {
86
+            // si l'action est provoque par un hit {ajax}
87
+            // il faut transmettre l'env ajax au redirect
88
+            // qui a pu etre defini par l'action
89
+            if (
90
+                ($v = _request('var_ajax'))
91
+                and ($v !== 'form')
92
+                and ($args = _request('var_ajax_env'))
93
+            ) {
94
+                $url = parametre_url($url, 'var_ajax', $v, '&');
95
+                $url = parametre_url($url, 'var_ajax_env', $args, '&');
96
+                // passer l'ancre en variable pour pouvoir la gerer cote serveur
97
+                $url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url);
98
+            }
99
+            $url = str_replace('&', '&', $url); // les redirections se font en &, pas en en &
100
+            redirige_par_entete($url);
101
+        }
102 102
 
103
-		// attention : avec zlib.output_compression=1 on a vu des cas de ob_get_length() qui renvoi 0
104
-		// et du coup en renvoi un status 204 a tort (vu sur le menu rubriques notamment)
105
-		if (
106
-			!headers_sent()
107
-			and !ob_get_length()
108
-		) {
109
-			http_status(204);
110
-		} // No Content
111
-		return true;
112
-	}
103
+        // attention : avec zlib.output_compression=1 on a vu des cas de ob_get_length() qui renvoi 0
104
+        // et du coup en renvoi un status 204 a tort (vu sur le menu rubriques notamment)
105
+        if (
106
+            !headers_sent()
107
+            and !ob_get_length()
108
+        ) {
109
+            http_status(204);
110
+        } // No Content
111
+        return true;
112
+    }
113 113
 
114
-	return false;
114
+    return false;
115 115
 }
116 116
 
117 117
 
118 118
 // https://code.spip.net/@refuser_traiter_formulaire_ajax
119 119
 function refuser_traiter_formulaire_ajax() {
120
-	if (
121
-		$v = _request('var_ajax')
122
-		and $v == 'form'
123
-		and $form = _request('formulaire_action')
124
-		and $args = _request('formulaire_action_args')
125
-		and decoder_contexte_ajax($args, $form) !== false
126
-	) {
127
-		// on est bien dans le contexte de traitement d'un formulaire en ajax
128
-		// mais traiter ne veut pas
129
-		// on le dit a la page qui va resumbit
130
-		// sans ajax
131
-		include_spip('inc/actions');
132
-		ajax_retour('noajax', false);
133
-		exit;
134
-	}
120
+    if (
121
+        $v = _request('var_ajax')
122
+        and $v == 'form'
123
+        and $form = _request('formulaire_action')
124
+        and $args = _request('formulaire_action_args')
125
+        and decoder_contexte_ajax($args, $form) !== false
126
+    ) {
127
+        // on est bien dans le contexte de traitement d'un formulaire en ajax
128
+        // mais traiter ne veut pas
129
+        // on le dit a la page qui va resumbit
130
+        // sans ajax
131
+        include_spip('inc/actions');
132
+        ajax_retour('noajax', false);
133
+        exit;
134
+    }
135 135
 }
136 136
 
137 137
 // https://code.spip.net/@traiter_appels_inclusions_ajax
138 138
 function traiter_appels_inclusions_ajax() {
139
-	// traiter les appels de bloc ajax (ex: pagination)
140
-	if (
141
-		$v = _request('var_ajax')
142
-		and $v !== 'form'
143
-		and $args = _request('var_ajax_env')
144
-	) {
145
-		include_spip('inc/filtres');
146
-		include_spip('inc/actions');
147
-		if (
148
-			$args = decoder_contexte_ajax($args)
149
-			and $fond = $args['fond']
150
-		) {
151
-			include_spip('public/assembler');
152
-			$contexte = calculer_contexte();
153
-			$contexte = array_merge($args, $contexte);
154
-			$page = recuperer_fond($fond, $contexte, ['trim' => false]);
155
-			$texte = $page;
156
-			if ($ancre = _request('var_ajax_ancre')) {
157
-				// pas n'importe quoi quand meme dans la variable !
158
-				$ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
159
-				$texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
160
-			}
161
-		} else {
162
-			include_spip('inc/headers');
163
-			http_response_code(400);
164
-			$texte = _L('signature ajax bloc incorrecte');
165
-		}
166
-		ajax_retour($texte, false);
139
+    // traiter les appels de bloc ajax (ex: pagination)
140
+    if (
141
+        $v = _request('var_ajax')
142
+        and $v !== 'form'
143
+        and $args = _request('var_ajax_env')
144
+    ) {
145
+        include_spip('inc/filtres');
146
+        include_spip('inc/actions');
147
+        if (
148
+            $args = decoder_contexte_ajax($args)
149
+            and $fond = $args['fond']
150
+        ) {
151
+            include_spip('public/assembler');
152
+            $contexte = calculer_contexte();
153
+            $contexte = array_merge($args, $contexte);
154
+            $page = recuperer_fond($fond, $contexte, ['trim' => false]);
155
+            $texte = $page;
156
+            if ($ancre = _request('var_ajax_ancre')) {
157
+                // pas n'importe quoi quand meme dans la variable !
158
+                $ancre = str_replace(['<', '"', "'"], ['&lt;', '&quot;', ''], $ancre);
159
+                $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte;
160
+            }
161
+        } else {
162
+            include_spip('inc/headers');
163
+            http_response_code(400);
164
+            $texte = _L('signature ajax bloc incorrecte');
165
+        }
166
+        ajax_retour($texte, false);
167 167
 
168
-		return true; // on a fini le hit
169
-	}
168
+        return true; // on a fini le hit
169
+    }
170 170
 
171
-	return false;
171
+    return false;
172 172
 }
173 173
 
174 174
 // au 1er appel, traite les formulaires dynamiques charger/verifier/traiter
@@ -177,173 +177,173 @@  discard block
 block discarded – undo
177 177
 
178 178
 // https://code.spip.net/@traiter_formulaires_dynamiques
179 179
 function traiter_formulaires_dynamiques($get = false) {
180
-	static $post = [];
181
-	static $done = false;
180
+    static $post = [];
181
+    static $done = false;
182 182
 
183
-	if ($get) {
184
-		return $post;
185
-	}
186
-	if ($done) {
187
-		return false;
188
-	}
189
-	$done = true;
183
+    if ($get) {
184
+        return $post;
185
+    }
186
+    if ($done) {
187
+        return false;
188
+    }
189
+    $done = true;
190 190
 
191
-	if (
192
-		!($form = _request('formulaire_action')
193
-		and $args = _request('formulaire_action_args'))
194
-	) {
195
-		return false;
196
-	} // le hit peut continuer normalement
191
+    if (
192
+        !($form = _request('formulaire_action')
193
+        and $args = _request('formulaire_action_args'))
194
+    ) {
195
+        return false;
196
+    } // le hit peut continuer normalement
197 197
 
198
-	// verifier que le post est licite (du meme auteur ou d'une session anonyme)
199
-	$sign = _request('formulaire_action_sign');
200
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
201
-		if (empty($sign)) {
202
-			spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR);
203
-			return false;
204
-		}
205
-		$securiser_action = charger_fonction('securiser_action', 'inc');
206
-		$secu = $securiser_action($form, $args, '', -1);
207
-		if ($sign !== $secu['hash']) {
208
-			spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR);
209
-			return false;
210
-		}
211
-	}
212
-	else {
213
-		if (!is_null($sign)) {
214
-			spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR);
215
-			return false;
216
-		}
217
-	}
198
+    // verifier que le post est licite (du meme auteur ou d'une session anonyme)
199
+    $sign = _request('formulaire_action_sign');
200
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
201
+        if (empty($sign)) {
202
+            spip_log("signature ajax form incorrecte : $form (formulaire non signe mais on a une session)", 'formulaires' . _LOG_ERREUR);
203
+            return false;
204
+        }
205
+        $securiser_action = charger_fonction('securiser_action', 'inc');
206
+        $secu = $securiser_action($form, $args, '', -1);
207
+        if ($sign !== $secu['hash']) {
208
+            spip_log("signature ajax form incorrecte : $form (formulaire signe mais ne correspond pas a la session)", 'formulaires' . _LOG_ERREUR);
209
+            return false;
210
+        }
211
+    }
212
+    else {
213
+        if (!is_null($sign)) {
214
+            spip_log("signature ajax form incorrecte : $form (formulaire signe mais pas de session)", 'formulaires' . _LOG_ERREUR);
215
+            return false;
216
+        }
217
+    }
218 218
 
219
-	include_spip('inc/filtres');
220
-	if (($args = decoder_contexte_ajax($args, $form)) === false) {
221
-		spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR);
219
+    include_spip('inc/filtres');
220
+    if (($args = decoder_contexte_ajax($args, $form)) === false) {
221
+        spip_log("signature ajax form incorrecte : $form (encodage corrompu)", 'formulaires' . _LOG_ERREUR);
222 222
 
223
-		return false; // continuons le hit comme si de rien etait
224
-	} else {
225
-		include_spip('inc/lang');
226
-		// sauvegarder la lang en cours
227
-		$old_lang = $GLOBALS['spip_lang'];
228
-		// changer la langue avec celle qui a cours dans le formulaire
229
-		// on la depile de $args car c'est un argument implicite masque
230
-		changer_langue(array_shift($args));
223
+        return false; // continuons le hit comme si de rien etait
224
+    } else {
225
+        include_spip('inc/lang');
226
+        // sauvegarder la lang en cours
227
+        $old_lang = $GLOBALS['spip_lang'];
228
+        // changer la langue avec celle qui a cours dans le formulaire
229
+        // on la depile de $args car c'est un argument implicite masque
230
+        changer_langue(array_shift($args));
231 231
 
232 232
 
233
-		// inclure mes_fonctions et autres filtres avant verifier/traiter
234
-		include_fichiers_fonctions();
235
-		// ainsi que l'API SQL bien utile dans verifier/traiter
236
-		include_spip('base/abstract_sql');
233
+        // inclure mes_fonctions et autres filtres avant verifier/traiter
234
+        include_fichiers_fonctions();
235
+        // ainsi que l'API SQL bien utile dans verifier/traiter
236
+        include_spip('base/abstract_sql');
237 237
 
238
-		/**
239
-		 * Pipeline exécuté lors de la soumission d'un formulaire,
240
-		 * mais avant l'appel de la fonction de vérification.
241
-		 */
242
-		pipeline(
243
-			'formulaire_receptionner',
244
-			[
245
-				'args' => ['form' => $form, 'args' => $args],
246
-				'data' => null,
247
-			]
248
-		);
238
+        /**
239
+         * Pipeline exécuté lors de la soumission d'un formulaire,
240
+         * mais avant l'appel de la fonction de vérification.
241
+         */
242
+        pipeline(
243
+            'formulaire_receptionner',
244
+            [
245
+                'args' => ['form' => $form, 'args' => $args],
246
+                'data' => null,
247
+            ]
248
+        );
249 249
 
250
-		$verifier = charger_fonction('verifier', "formulaires/$form/", true);
251
-		$post["erreurs_$form"] = pipeline(
252
-			'formulaire_verifier',
253
-			[
254
-				'args' => ['form' => $form, 'args' => $args],
255
-				'data' => $verifier ? call_user_func_array($verifier, $args) : []
256
-			]
257
-		);
258
-		// prise en charge CVT multi etape si besoin
259
-		if (_request('cvtm_prev_post')) {
260
-			include_spip('inc/cvt_multietapes');
261
-			$post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes(
262
-				['form' => $form, 'args' => $args],
263
-				$post["erreurs_$form"]
264
-			);
265
-		}
250
+        $verifier = charger_fonction('verifier', "formulaires/$form/", true);
251
+        $post["erreurs_$form"] = pipeline(
252
+            'formulaire_verifier',
253
+            [
254
+                'args' => ['form' => $form, 'args' => $args],
255
+                'data' => $verifier ? call_user_func_array($verifier, $args) : []
256
+            ]
257
+        );
258
+        // prise en charge CVT multi etape si besoin
259
+        if (_request('cvtm_prev_post')) {
260
+            include_spip('inc/cvt_multietapes');
261
+            $post["erreurs_$form"] = cvtmulti_formulaire_verifier_etapes(
262
+                ['form' => $form, 'args' => $args],
263
+                $post["erreurs_$form"]
264
+            );
265
+        }
266 266
 
267
-		// accessibilite : si des erreurs mais pas de message general l'ajouter
268
-		if ((isset($post["erreurs_$form"]) and count($post["erreurs_$form"])) and !isset($post["erreurs_$form"]['message_erreur'])) {
269
-			$post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(
270
-				count($post["erreurs_$form"]),
271
-				'avis_1_erreur_saisie',
272
-				'avis_nb_erreurs_saisie'
273
-			);
274
-		}
267
+        // accessibilite : si des erreurs mais pas de message general l'ajouter
268
+        if ((isset($post["erreurs_$form"]) and count($post["erreurs_$form"])) and !isset($post["erreurs_$form"]['message_erreur'])) {
269
+            $post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(
270
+                count($post["erreurs_$form"]),
271
+                'avis_1_erreur_saisie',
272
+                'avis_nb_erreurs_saisie'
273
+            );
274
+        }
275 275
 
276
-		// si on ne demandait qu'une verif json
277
-		if (_request('formulaire_action_verifier_json')) {
278
-			include_spip('inc/json');
279
-			include_spip('inc/actions');
280
-			ajax_retour(json_encode($post["erreurs_$form"]), 'text/plain');
276
+        // si on ne demandait qu'une verif json
277
+        if (_request('formulaire_action_verifier_json')) {
278
+            include_spip('inc/json');
279
+            include_spip('inc/actions');
280
+            ajax_retour(json_encode($post["erreurs_$form"]), 'text/plain');
281 281
 
282
-			return true; // on a fini le hit
283
-		}
284
-		$retour = '';
285
-		if (isset($post["erreurs_$form"]) and (count($post["erreurs_$form"]) == 0)) {
286
-			$rev = '';
287
-			if ($traiter = charger_fonction('traiter', "formulaires/$form/", true)) {
288
-				$rev = call_user_func_array($traiter, $args);
289
-			}
282
+            return true; // on a fini le hit
283
+        }
284
+        $retour = '';
285
+        if (isset($post["erreurs_$form"]) and (count($post["erreurs_$form"]) == 0)) {
286
+            $rev = '';
287
+            if ($traiter = charger_fonction('traiter', "formulaires/$form/", true)) {
288
+                $rev = call_user_func_array($traiter, $args);
289
+            }
290 290
 
291
-			$rev = pipeline(
292
-				'formulaire_traiter',
293
-				[
294
-					'args' => ['form' => $form, 'args' => $args],
295
-					'data' => $rev
296
-				]
297
-			);
298
-			// le retour de traiter est
299
-			// un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
300
-			// il permet le pipelinage, en particulier
301
-			// en y passant l'id de l'objet cree/modifie
302
-			// si message_erreur est present, on considere que le traitement a echoue
303
-			$post["message_ok_$form"] = '';
304
-			// on peut avoir message_ok et message_erreur
305
-			if (isset($rev['message_ok'])) {
306
-				$post["message_ok_$form"] = $rev['message_ok'];
307
-			}
291
+            $rev = pipeline(
292
+                'formulaire_traiter',
293
+                [
294
+                    'args' => ['form' => $form, 'args' => $args],
295
+                    'data' => $rev
296
+                ]
297
+            );
298
+            // le retour de traiter est
299
+            // un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx)
300
+            // il permet le pipelinage, en particulier
301
+            // en y passant l'id de l'objet cree/modifie
302
+            // si message_erreur est present, on considere que le traitement a echoue
303
+            $post["message_ok_$form"] = '';
304
+            // on peut avoir message_ok et message_erreur
305
+            if (isset($rev['message_ok'])) {
306
+                $post["message_ok_$form"] = $rev['message_ok'];
307
+            }
308 308
 
309
-			// verifier si traiter n'a pas echoue avec une erreur :
310
-			if (isset($rev['message_erreur'])) {
311
-				$post["erreurs_$form"]['message_erreur'] = $rev['message_erreur'];
312
-				// si il y a une erreur on ne redirige pas
313
-			} else {
314
-				// sinon faire ce qu'il faut :
315
-				if (isset($rev['editable'])) {
316
-					$post["editable_$form"] = $rev['editable'];
317
-				}
318
-				// si une redirection est demandee, appeler redirigae_formulaire qui choisira
319
-				// le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
320
-				if (isset($rev['redirect']) and $rev['redirect']) {
321
-					include_spip('inc/headers');
322
-					list($masque, $message) = redirige_formulaire($rev['redirect'], '', 'ajaxform');
323
-					$post["message_ok_$form"] .= $message;
324
-					$retour .= $masque;
325
-				}
326
-			}
327
-		}
328
-		// si le formulaire a ete soumis en ajax, on le renvoie direct !
329
-		if (_request('var_ajax')) {
330
-			if (find_in_path('formulaire_.php', 'balise/', true)) {
331
-				include_spip('inc/actions');
332
-				include_spip('public/assembler');
333
-				array_unshift($args, $form);
334
-				$retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn', $args), false);
335
-				// on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
336
-				// sans cela le formulaire n'est pas actif apres le hit ajax
337
-				// la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
338
-				$retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
339
-				ajax_retour($retour, false);
309
+            // verifier si traiter n'a pas echoue avec une erreur :
310
+            if (isset($rev['message_erreur'])) {
311
+                $post["erreurs_$form"]['message_erreur'] = $rev['message_erreur'];
312
+                // si il y a une erreur on ne redirige pas
313
+            } else {
314
+                // sinon faire ce qu'il faut :
315
+                if (isset($rev['editable'])) {
316
+                    $post["editable_$form"] = $rev['editable'];
317
+                }
318
+                // si une redirection est demandee, appeler redirigae_formulaire qui choisira
319
+                // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue)
320
+                if (isset($rev['redirect']) and $rev['redirect']) {
321
+                    include_spip('inc/headers');
322
+                    list($masque, $message) = redirige_formulaire($rev['redirect'], '', 'ajaxform');
323
+                    $post["message_ok_$form"] .= $message;
324
+                    $retour .= $masque;
325
+                }
326
+            }
327
+        }
328
+        // si le formulaire a ete soumis en ajax, on le renvoie direct !
329
+        if (_request('var_ajax')) {
330
+            if (find_in_path('formulaire_.php', 'balise/', true)) {
331
+                include_spip('inc/actions');
332
+                include_spip('public/assembler');
333
+                array_unshift($args, $form);
334
+                $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn', $args), false);
335
+                // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7
336
+                // sans cela le formulaire n'est pas actif apres le hit ajax
337
+                // la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe
338
+                $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour;
339
+                ajax_retour($retour, false);
340 340
 
341
-				return true; // on a fini le hit
342
-			}
343
-		}
344
-		// restaurer la lang en cours
345
-		changer_langue($old_lang);
346
-	}
341
+                return true; // on a fini le hit
342
+            }
343
+        }
344
+        // restaurer la lang en cours
345
+        changer_langue($old_lang);
346
+    }
347 347
 
348
-	return false; // le hit peut continuer normalement
348
+    return false; // le hit peut continuer normalement
349 349
 }
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 1 patch
Indentation   +916 added lines, -916 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = [];
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = [];
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = '';
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = '';
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = '';
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = '';
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = [];
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = [];
183 183
 }
184 184
 
185 185
 
@@ -189,386 +189,386 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = [];
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = [];
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = [];
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = [];
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = '';
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = '';
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = [];
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = [];
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = [];
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = [];
455
-
456
-	public $join = [];
457
-	public $having = [];
458
-	public $limit;
459
-	public $group = [];
460
-	public $order = [];
461
-	public $default_order = [];
462
-	public $date = 'date';
463
-	public $hash = '';
464
-	public $in = '';
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = [];
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = [];
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	/**
559
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
-	 * notamment si le champ a été trouve dans une boucle parente
561
-	 *
562
-	 * Tableau nom du champ => index de boucle
563
-	 *
564
-	 * @var array $index_champ
565
-	*/
566
-	public $index_champ = [];
567
-
568
-	// obsoletes, conserves provisoirement pour compatibilite
569
-	public $tout = false;
570
-	public $plat = false;
571
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = [];
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = [];
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = [];
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = [];
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = '';
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = '';
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = [];
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = [];
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = [];
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = [];
455
+
456
+    public $join = [];
457
+    public $having = [];
458
+    public $limit;
459
+    public $group = [];
460
+    public $order = [];
461
+    public $default_order = [];
462
+    public $date = 'date';
463
+    public $hash = '';
464
+    public $in = '';
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = [];
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = [];
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = []; // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    /**
559
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
560
+     * notamment si le champ a été trouve dans une boucle parente
561
+     *
562
+     * Tableau nom du champ => index de boucle
563
+     *
564
+     * @var array $index_champ
565
+     */
566
+    public $index_champ = [];
567
+
568
+    // obsoletes, conserves provisoirement pour compatibilite
569
+    public $tout = false;
570
+    public $plat = false;
571
+    public $lien = false;
572 572
 }
573 573
 
574 574
 /**
@@ -579,56 +579,56 @@  discard block
 block discarded – undo
579 579
  * @package SPIP\Core\Compilateur\AST
580 580
  **/
581 581
 class Critere {
582
-	/**
583
-	 * Type de noeud
584
-	 *
585
-	 * @var string
586
-	 */
587
-	public $type = 'critere';
588
-
589
-	/**
590
-	 * Opérateur (>, <, >=, IN, ...)
591
-	 *
592
-	 * @var null|string
593
-	 */
594
-	public $op;
595
-
596
-	/**
597
-	 * Présence d'une négation (truc !op valeur)
598
-	 *
599
-	 * @var null|string
600
-	 */
601
-	public $not;
602
-
603
-	/**
604
-	 * Présence d'une exclusion (!truc op valeur)
605
-	 *
606
-	 * @var null|string
607
-	 */
608
-	public $exclus;
609
-
610
-	/**
611
-	 * Présence d'une condition dans le critère (truc ?)
612
-	 *
613
-	 * @var bool
614
-	 */
615
-	public $cond = false;
616
-
617
-	/**
618
-	 * Paramètres du critère
619
-	 * - $param[0] : élément avant l'opérateur
620
-	 * - $param[1..n] : éléments après l'opérateur
621
-	 *
622
-	 * @var array
623
-	 */
624
-	public $param = [];
625
-
626
-	/**
627
-	 * Numéro de ligne dans le code source du squelette
628
-	 *
629
-	 * @var int
630
-	 */
631
-	public $ligne = 0;
582
+    /**
583
+     * Type de noeud
584
+     *
585
+     * @var string
586
+     */
587
+    public $type = 'critere';
588
+
589
+    /**
590
+     * Opérateur (>, <, >=, IN, ...)
591
+     *
592
+     * @var null|string
593
+     */
594
+    public $op;
595
+
596
+    /**
597
+     * Présence d'une négation (truc !op valeur)
598
+     *
599
+     * @var null|string
600
+     */
601
+    public $not;
602
+
603
+    /**
604
+     * Présence d'une exclusion (!truc op valeur)
605
+     *
606
+     * @var null|string
607
+     */
608
+    public $exclus;
609
+
610
+    /**
611
+     * Présence d'une condition dans le critère (truc ?)
612
+     *
613
+     * @var bool
614
+     */
615
+    public $cond = false;
616
+
617
+    /**
618
+     * Paramètres du critère
619
+     * - $param[0] : élément avant l'opérateur
620
+     * - $param[1..n] : éléments après l'opérateur
621
+     *
622
+     * @var array
623
+     */
624
+    public $param = [];
625
+
626
+    /**
627
+     * Numéro de ligne dans le code source du squelette
628
+     *
629
+     * @var int
630
+     */
631
+    public $ligne = 0;
632 632
 }
633 633
 
634 634
 /**
@@ -637,139 +637,139 @@  discard block
 block discarded – undo
637 637
  * @package SPIP\Core\Compilateur\AST
638 638
  **/
639 639
 class Champ {
640
-	/**
641
-	 * Type de noeud
642
-	 *
643
-	 * @var string
644
-	 */
645
-	public $type = 'champ';
646
-
647
-	/**
648
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
-	 *
650
-	 * @var string|null
651
-	 */
652
-	public $nom_champ;
653
-
654
-	/**
655
-	 * Identifiant de la boucle parente si explicité
656
-	 *
657
-	 * @var string|null
658
-	 */
659
-	public $nom_boucle = '';
660
-
661
-	/**
662
-	 * Partie optionnelle avant
663
-	 *
664
-	 * @var null|string|array
665
-	 */
666
-	public $avant;
667
-
668
-	/**
669
-	 * Partie optionnelle après
670
-	 *
671
-	 * @var null|string|array
672
-	 */
673
-	public $apres;
674
-
675
-	/**
676
-	 * Étoiles : annuler des automatismes
677
-	 *
678
-	 * - '*' annule les filtres automatiques
679
-	 * - '**' annule en plus les protections de scripts
680
-	 *
681
-	 * @var null|string
682
-	 */
683
-	public $etoile;
684
-
685
-	/**
686
-	 * Arguments et filtres explicites sur la balise
687
-	 *
688
-	 * - $param[0] contient les arguments de la balise
689
-	 * - $param[1..n] contient les filtres à appliquer à la balise
690
-	 *
691
-	 * @var array
692
-	 */
693
-	public $param = [];
694
-
695
-	/**
696
-	 * Source des filtres  (compatibilité) (?)
697
-	 *
698
-	 * @var array|null
699
-	 */
700
-	public $fonctions = [];
701
-
702
-	/**
703
-	 * Identifiant de la boucle
704
-	 *
705
-	 * @var string
706
-	 */
707
-	public $id_boucle = '';
708
-
709
-	/**
710
-	 * AST du squelette, liste de toutes les boucles
711
-	 *
712
-	 * @var Boucles[]
713
-	 */
714
-	public $boucles;
715
-
716
-	/**
717
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
718
-	 *
719
-	 * @var string|null
720
-	 */
721
-	public $type_requete;
722
-
723
-	/**
724
-	 * Résultat de la compilation: toujours une expression PHP
725
-	 *
726
-	 * @var string
727
-	 */
728
-	public $code = '';
729
-
730
-	/**
731
-	 * Interdire les scripts
732
-	 *
733
-	 * false si on est sûr de cette balise
734
-	 *
735
-	 * @see interdire_scripts()
736
-	 * @var bool
737
-	 */
738
-	public $interdire_scripts = true;
739
-
740
-	/**
741
-	 * Description du squelette
742
-	 *
743
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
-	 *
745
-	 * Peut contenir les index :
746
-	 *
747
-	 * - nom : Nom du fichier de cache
748
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
-	 * - sourcefile : Chemin du squelette
750
-	 * - squelette : Code du squelette
751
-	 * - id_mere : Identifiant de la boucle parente
752
-	 * - documents : Pour embed et img dans les textes
753
-	 * - session : Pour un cache sessionné par auteur
754
-	 * - niv : Niveau de tabulation
755
-	 *
756
-	 * @var array
757
-	 */
758
-	public $descr = [];
759
-
760
-	/**
761
-	 * Numéro de ligne dans le code source du squelette
762
-	 *
763
-	 * @var int
764
-	 */
765
-	public $ligne = 0;
766
-
767
-	/**
768
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
769
-	 *
770
-	 * @var bool
771
-	 */
772
-	public $balise_calculee = false;
640
+    /**
641
+     * Type de noeud
642
+     *
643
+     * @var string
644
+     */
645
+    public $type = 'champ';
646
+
647
+    /**
648
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
649
+     *
650
+     * @var string|null
651
+     */
652
+    public $nom_champ;
653
+
654
+    /**
655
+     * Identifiant de la boucle parente si explicité
656
+     *
657
+     * @var string|null
658
+     */
659
+    public $nom_boucle = '';
660
+
661
+    /**
662
+     * Partie optionnelle avant
663
+     *
664
+     * @var null|string|array
665
+     */
666
+    public $avant;
667
+
668
+    /**
669
+     * Partie optionnelle après
670
+     *
671
+     * @var null|string|array
672
+     */
673
+    public $apres;
674
+
675
+    /**
676
+     * Étoiles : annuler des automatismes
677
+     *
678
+     * - '*' annule les filtres automatiques
679
+     * - '**' annule en plus les protections de scripts
680
+     *
681
+     * @var null|string
682
+     */
683
+    public $etoile;
684
+
685
+    /**
686
+     * Arguments et filtres explicites sur la balise
687
+     *
688
+     * - $param[0] contient les arguments de la balise
689
+     * - $param[1..n] contient les filtres à appliquer à la balise
690
+     *
691
+     * @var array
692
+     */
693
+    public $param = [];
694
+
695
+    /**
696
+     * Source des filtres  (compatibilité) (?)
697
+     *
698
+     * @var array|null
699
+     */
700
+    public $fonctions = [];
701
+
702
+    /**
703
+     * Identifiant de la boucle
704
+     *
705
+     * @var string
706
+     */
707
+    public $id_boucle = '';
708
+
709
+    /**
710
+     * AST du squelette, liste de toutes les boucles
711
+     *
712
+     * @var Boucles[]
713
+     */
714
+    public $boucles;
715
+
716
+    /**
717
+     * Alias de table d'application de la requête ou nom complet de la table SQL
718
+     *
719
+     * @var string|null
720
+     */
721
+    public $type_requete;
722
+
723
+    /**
724
+     * Résultat de la compilation: toujours une expression PHP
725
+     *
726
+     * @var string
727
+     */
728
+    public $code = '';
729
+
730
+    /**
731
+     * Interdire les scripts
732
+     *
733
+     * false si on est sûr de cette balise
734
+     *
735
+     * @see interdire_scripts()
736
+     * @var bool
737
+     */
738
+    public $interdire_scripts = true;
739
+
740
+    /**
741
+     * Description du squelette
742
+     *
743
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
744
+     *
745
+     * Peut contenir les index :
746
+     *
747
+     * - nom : Nom du fichier de cache
748
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
749
+     * - sourcefile : Chemin du squelette
750
+     * - squelette : Code du squelette
751
+     * - id_mere : Identifiant de la boucle parente
752
+     * - documents : Pour embed et img dans les textes
753
+     * - session : Pour un cache sessionné par auteur
754
+     * - niv : Niveau de tabulation
755
+     *
756
+     * @var array
757
+     */
758
+    public $descr = [];
759
+
760
+    /**
761
+     * Numéro de ligne dans le code source du squelette
762
+     *
763
+     * @var int
764
+     */
765
+    public $ligne = 0;
766
+
767
+    /**
768
+     * Drapeau pour reperer les balises calculées par une fonction explicite
769
+     *
770
+     * @var bool
771
+     */
772
+    public $balise_calculee = false;
773 773
 }
774 774
 
775 775
 
@@ -777,123 +777,123 @@  discard block
 block discarded – undo
777 777
  * Description d'une chaîne de langue
778 778
  **/
779 779
 class Idiome {
780
-	/**
781
-	 * Type de noeud
782
-	 *
783
-	 * @var string
784
-	 */
785
-	public $type = 'idiome';
786
-
787
-	/**
788
-	 * Clé de traduction demandée. Exemple 'item_oui'
789
-	 *
790
-	 * @var string
791
-	 */
792
-	public $nom_champ = '';
793
-
794
-	/**
795
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
-	 *
797
-	 * @var string
798
-	 */
799
-	public $module = '';
800
-
801
-	/**
802
-	 * Arguments à passer à la chaîne
803
-	 *
804
-	 * @var array
805
-	 */
806
-	public $arg = [];
807
-
808
-	/**
809
-	 * Filtres à appliquer au résultat
810
-	 *
811
-	 * @var array
812
-	 */
813
-	public $param = [];
814
-
815
-	/**
816
-	 * Source des filtres  (compatibilité) (?)
817
-	 *
818
-	 * @var array|null
819
-	 */
820
-	public $fonctions = [];
821
-
822
-	/**
823
-	 * Inutilisé, propriété générique de l'AST
824
-	 *
825
-	 * @var string|array
826
-	 */
827
-	public $avant = '';
828
-
829
-	/**
830
-	 * Inutilisé, propriété générique de l'AST
831
-	 *
832
-	 * @var string|array
833
-	 */
834
-	public $apres = '';
835
-
836
-	/**
837
-	 * Identifiant de la boucle
838
-	 *
839
-	 * @var string
840
-	 */
841
-	public $id_boucle = '';
842
-
843
-	/**
844
-	 * AST du squelette, liste de toutes les boucles
845
-	 *
846
-	 * @var Boucles[]
847
-	 */
848
-	public $boucles;
849
-
850
-	/**
851
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
852
-	 *
853
-	 * @var string|null
854
-	 */
855
-	public $type_requete;
856
-
857
-	/**
858
-	 * Résultat de la compilation: toujours une expression PHP
859
-	 *
860
-	 * @var string
861
-	 */
862
-	public $code = '';
863
-
864
-	/**
865
-	 * Interdire les scripts
866
-	 *
867
-	 * @see interdire_scripts()
868
-	 * @var bool
869
-	 */
870
-	public $interdire_scripts = false;
871
-
872
-	/**
873
-	 * Description du squelette
874
-	 *
875
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
-	 *
877
-	 * Peut contenir les index :
878
-	 * - nom : Nom du fichier de cache
879
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
-	 * - sourcefile : Chemin du squelette
881
-	 * - squelette : Code du squelette
882
-	 * - id_mere : Identifiant de la boucle parente
883
-	 * - documents : Pour embed et img dans les textes
884
-	 * - session : Pour un cache sessionné par auteur
885
-	 * - niv : Niveau de tabulation
886
-	 *
887
-	 * @var array
888
-	 */
889
-	public $descr = [];
890
-
891
-	/**
892
-	 * Numéro de ligne dans le code source du squelette
893
-	 *
894
-	 * @var int
895
-	 */
896
-	public $ligne = 0;
780
+    /**
781
+     * Type de noeud
782
+     *
783
+     * @var string
784
+     */
785
+    public $type = 'idiome';
786
+
787
+    /**
788
+     * Clé de traduction demandée. Exemple 'item_oui'
789
+     *
790
+     * @var string
791
+     */
792
+    public $nom_champ = '';
793
+
794
+    /**
795
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
796
+     *
797
+     * @var string
798
+     */
799
+    public $module = '';
800
+
801
+    /**
802
+     * Arguments à passer à la chaîne
803
+     *
804
+     * @var array
805
+     */
806
+    public $arg = [];
807
+
808
+    /**
809
+     * Filtres à appliquer au résultat
810
+     *
811
+     * @var array
812
+     */
813
+    public $param = [];
814
+
815
+    /**
816
+     * Source des filtres  (compatibilité) (?)
817
+     *
818
+     * @var array|null
819
+     */
820
+    public $fonctions = [];
821
+
822
+    /**
823
+     * Inutilisé, propriété générique de l'AST
824
+     *
825
+     * @var string|array
826
+     */
827
+    public $avant = '';
828
+
829
+    /**
830
+     * Inutilisé, propriété générique de l'AST
831
+     *
832
+     * @var string|array
833
+     */
834
+    public $apres = '';
835
+
836
+    /**
837
+     * Identifiant de la boucle
838
+     *
839
+     * @var string
840
+     */
841
+    public $id_boucle = '';
842
+
843
+    /**
844
+     * AST du squelette, liste de toutes les boucles
845
+     *
846
+     * @var Boucles[]
847
+     */
848
+    public $boucles;
849
+
850
+    /**
851
+     * Alias de table d'application de la requête ou nom complet de la table SQL
852
+     *
853
+     * @var string|null
854
+     */
855
+    public $type_requete;
856
+
857
+    /**
858
+     * Résultat de la compilation: toujours une expression PHP
859
+     *
860
+     * @var string
861
+     */
862
+    public $code = '';
863
+
864
+    /**
865
+     * Interdire les scripts
866
+     *
867
+     * @see interdire_scripts()
868
+     * @var bool
869
+     */
870
+    public $interdire_scripts = false;
871
+
872
+    /**
873
+     * Description du squelette
874
+     *
875
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
876
+     *
877
+     * Peut contenir les index :
878
+     * - nom : Nom du fichier de cache
879
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
880
+     * - sourcefile : Chemin du squelette
881
+     * - squelette : Code du squelette
882
+     * - id_mere : Identifiant de la boucle parente
883
+     * - documents : Pour embed et img dans les textes
884
+     * - session : Pour un cache sessionné par auteur
885
+     * - niv : Niveau de tabulation
886
+     *
887
+     * @var array
888
+     */
889
+    public $descr = [];
890
+
891
+    /**
892
+     * Numéro de ligne dans le code source du squelette
893
+     *
894
+     * @var int
895
+     */
896
+    public $ligne = 0;
897 897
 }
898 898
 
899 899
 /**
@@ -902,28 +902,28 @@  discard block
 block discarded – undo
902 902
  * @package SPIP\Core\Compilateur\AST
903 903
  **/
904 904
 class Polyglotte {
905
-	/**
906
-	 * Type de noeud
907
-	 *
908
-	 * @var string
909
-	 */
910
-	public $type = 'polyglotte';
911
-
912
-	/**
913
-	 * Tableau des traductions possibles classées par langue
914
-	 *
915
-	 * Tableau code de langue => texte
916
-	 *
917
-	 * @var array
918
-	 */
919
-	public $traductions = [];
920
-
921
-	/**
922
-	 * Numéro de ligne dans le code source du squelette
923
-	 *
924
-	 * @var int
925
-	 */
926
-	public $ligne = 0;
905
+    /**
906
+     * Type de noeud
907
+     *
908
+     * @var string
909
+     */
910
+    public $type = 'polyglotte';
911
+
912
+    /**
913
+     * Tableau des traductions possibles classées par langue
914
+     *
915
+     * Tableau code de langue => texte
916
+     *
917
+     * @var array
918
+     */
919
+    public $traductions = [];
920
+
921
+    /**
922
+     * Numéro de ligne dans le code source du squelette
923
+     *
924
+     * @var int
925
+     */
926
+    public $ligne = 0;
927 927
 }
928 928
 
929 929
 
@@ -948,90 +948,90 @@  discard block
 block discarded – undo
948 948
  */
949 949
 function declarer_interfaces() {
950 950
 
951
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
952
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
-
956
-	// definition des statuts de publication
957
-	$GLOBALS['table_statut'] = [];
958
-
959
-	//
960
-	// tableau des tables de jointures
961
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
-	$GLOBALS['tables_jointures'] = [];
963
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
-
965
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
-
968
-
969
-	if (!defined('_TRAITEMENT_TYPO')) {
970
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
-	}
972
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
-	}
975
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
-	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')';
979
-	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(%s)';
981
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
-
1003
-	// valeur par defaut pour les balises non listees ci-dessus
1004
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
-	// toujours securiser les DATA
1006
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
-
1010
-
1011
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
-	$interfaces = pipeline(
1013
-		'declarer_tables_interfaces',
1014
-		[
1015
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1016
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
-			'table_date' => $GLOBALS['table_date'],
1018
-			'table_titre' => $GLOBALS['table_titre'],
1019
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1020
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
-			'table_statut' => $GLOBALS['table_statut'],
1023
-		]
1024
-	);
1025
-	if ($interfaces) {
1026
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1029
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
-	}
951
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
952
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
953
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
954
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
955
+
956
+    // definition des statuts de publication
957
+    $GLOBALS['table_statut'] = [];
958
+
959
+    //
960
+    // tableau des tables de jointures
961
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
962
+    $GLOBALS['tables_jointures'] = [];
963
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
964
+
965
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
966
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
967
+
968
+
969
+    if (!defined('_TRAITEMENT_TYPO')) {
970
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
971
+    }
972
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
973
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
974
+    }
975
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977
+    }
978
+    $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')';
979
+    $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
+    $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(%s)';
981
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
984
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
985
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
986
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
987
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
988
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
990
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
991
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
992
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
993
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
994
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
995
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
996
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
997
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
998
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
999
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
1000
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
1001
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
1002
+
1003
+    // valeur par defaut pour les balises non listees ci-dessus
1004
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
1005
+    // toujours securiser les DATA
1006
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
1007
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
1008
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
1009
+
1010
+
1011
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1012
+    $interfaces = pipeline(
1013
+        'declarer_tables_interfaces',
1014
+        [
1015
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1016
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1017
+            'table_date' => $GLOBALS['table_date'],
1018
+            'table_titre' => $GLOBALS['table_titre'],
1019
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1020
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1021
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1022
+            'table_statut' => $GLOBALS['table_statut'],
1023
+        ]
1024
+    );
1025
+    if ($interfaces) {
1026
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1027
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1028
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1029
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1030
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1031
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1032
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1033
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1034
+    }
1035 1035
 }
1036 1036
 
1037 1037
 declarer_interfaces();
Please login to merge, or discard this patch.
ecrire/balise/formulaire_.php 1 patch
Indentation   +252 added lines, -252 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/filtres');
@@ -35,25 +35,25 @@  discard block
 block discarded – undo
35 35
  *     Saisie protégée
36 36
  **/
37 37
 function protege_champ($texte) {
38
-	if (is_array($texte)) {
39
-		$texte = array_map('protege_champ', $texte);
40
-	} else {
41
-		// ne pas corrompre une valeur serialize
42
-		if ((preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) != false) or is_null($texte)) {
43
-			return $texte;
44
-		}
45
-		if (
46
-			is_string($texte)
47
-			and $texte
48
-			and strpbrk($texte, "&\"'<>") !== false
49
-		) {
50
-			$texte = spip_htmlspecialchars($texte, ENT_QUOTES);
51
-		} elseif (is_bool($texte)) {
52
-			$texte = ($texte ? '1' : '');
53
-		}
54
-	}
55
-
56
-	return $texte;
38
+    if (is_array($texte)) {
39
+        $texte = array_map('protege_champ', $texte);
40
+    } else {
41
+        // ne pas corrompre une valeur serialize
42
+        if ((preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) != false) or is_null($texte)) {
43
+            return $texte;
44
+        }
45
+        if (
46
+            is_string($texte)
47
+            and $texte
48
+            and strpbrk($texte, "&\"'<>") !== false
49
+        ) {
50
+            $texte = spip_htmlspecialchars($texte, ENT_QUOTES);
51
+        } elseif (is_bool($texte)) {
52
+            $texte = ($texte ? '1' : '');
53
+        }
54
+    }
55
+
56
+    return $texte;
57 57
 }
58 58
 
59 59
 /**
@@ -67,17 +67,17 @@  discard block
 block discarded – undo
67 67
  *     - false : pas de squelette trouvé
68 68
  **/
69 69
 function existe_formulaire($form) {
70
-	if (substr($form, 0, 11) == 'FORMULAIRE_') {
71
-		$form = strtolower(substr($form, 11));
72
-	} else {
73
-		$form = strtolower($form);
74
-	}
70
+    if (substr($form, 0, 11) == 'FORMULAIRE_') {
71
+        $form = strtolower(substr($form, 11));
72
+    } else {
73
+        $form = strtolower($form);
74
+    }
75 75
 
76
-	if (!$form) {
77
-		return '';
78
-	} // on ne sait pas, le nom du formulaire n'est pas fourni ici
76
+    if (!$form) {
77
+        return '';
78
+    } // on ne sait pas, le nom du formulaire n'est pas fourni ici
79 79
 
80
-	return trouver_fond($form, 'formulaires/') ? $form : false;
80
+    return trouver_fond($form, 'formulaires/') ? $form : false;
81 81
 }
82 82
 
83 83
 /**
@@ -86,31 +86,31 @@  discard block
 block discarded – undo
86 86
  * @return false|array
87 87
  */
88 88
 function test_formulaire_inclus_par_modele() {
89
-	$trace = debug_backtrace(null, 20);
90
-	$trace_fonctions = array_column($trace, 'function');
91
-	$trace_fonctions = array_map('strtolower', $trace_fonctions);
92
-
93
-	// regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
94
-	if (
95
-		function_exists('arguments_balise_dyn_depuis_modele')
96
-		and $form = arguments_balise_dyn_depuis_modele(null, 'read')
97
-	) {
98
-		if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
99
-			$k = array_search('balise_formulaire__dyn', $trace_fonctions);
100
-			if ($trace[$k]['args'][0] === $form) {
101
-				return $trace[$k]['args'];
102
-			}
103
-		}
104
-	}
105
-
106
-	// fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
107
-	// mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
108
-	if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
109
-		$k = array_search('inclure_modele', $trace_fonctions);
110
-		// les arguments de recuperer_fond() passes par inclure_modele()
111
-		return $trace[$k - 1]['args'][1]['args'];
112
-	}
113
-	return false;
89
+    $trace = debug_backtrace(null, 20);
90
+    $trace_fonctions = array_column($trace, 'function');
91
+    $trace_fonctions = array_map('strtolower', $trace_fonctions);
92
+
93
+    // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
94
+    if (
95
+        function_exists('arguments_balise_dyn_depuis_modele')
96
+        and $form = arguments_balise_dyn_depuis_modele(null, 'read')
97
+    ) {
98
+        if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
99
+            $k = array_search('balise_formulaire__dyn', $trace_fonctions);
100
+            if ($trace[$k]['args'][0] === $form) {
101
+                return $trace[$k]['args'];
102
+            }
103
+        }
104
+    }
105
+
106
+    // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
107
+    // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
108
+    if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
109
+        $k = array_search('inclure_modele', $trace_fonctions);
110
+        // les arguments de recuperer_fond() passes par inclure_modele()
111
+        return $trace[$k - 1]['args'][1]['args'];
112
+    }
113
+    return false;
114 114
 }
115 115
 
116 116
 /**
@@ -125,17 +125,17 @@  discard block
 block discarded – undo
125 125
  **/
126 126
 function balise_FORMULAIRE__dist($p) {
127 127
 
128
-	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
129
-	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
130
-	if (existe_formulaire($p->nom_champ) === false) {
131
-		$p->code = "''";
132
-		$p->interdire_scripts = false;
128
+    // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
129
+    // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
130
+    if (existe_formulaire($p->nom_champ) === false) {
131
+        $p->code = "''";
132
+        $p->interdire_scripts = false;
133 133
 
134
-		return $p;
135
-	}
134
+        return $p;
135
+    }
136 136
 
137
-	// sinon renvoyer un code php dynamique
138
-	return calculer_balise_dynamique($p, $p->nom_champ, []);
137
+    // sinon renvoyer un code php dynamique
138
+    return calculer_balise_dynamique($p, $p->nom_champ, []);
139 139
 }
140 140
 
141 141
 /**
@@ -155,17 +155,17 @@  discard block
 block discarded – undo
155 155
  *     - string : texte à afficher directement
156 156
  */
157 157
 function balise_FORMULAIRE__dyn($form, ...$args) {
158
-	$form = existe_formulaire($form);
159
-	if (!$form) {
160
-		return '';
161
-	}
158
+    $form = existe_formulaire($form);
159
+    if (!$form) {
160
+        return '';
161
+    }
162 162
 
163
-	$contexte = balise_FORMULAIRE__contexte($form, $args);
164
-	if (!is_array($contexte)) {
165
-		return $contexte;
166
-	}
163
+    $contexte = balise_FORMULAIRE__contexte($form, $args);
164
+    if (!is_array($contexte)) {
165
+        return $contexte;
166
+    }
167 167
 
168
-	return ["formulaires/$form", 3600, $contexte];
168
+    return ["formulaires/$form", 3600, $contexte];
169 169
 }
170 170
 
171 171
 /**
@@ -179,84 +179,84 @@  discard block
 block discarded – undo
179 179
  *     Contexte d'environnement à envoyer au squelette
180 180
  **/
181 181
 function balise_FORMULAIRE__contexte($form, $args) {
182
-	// tester si ce formulaire vient d'etre poste (memes arguments)
183
-	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
184
-	// si poste, on recupere les erreurs
185
-
186
-	$je_suis_poste = false;
187
-	if (
188
-		$post_form = _request('formulaire_action')
189
-		and $post_form == $form
190
-		and $p = _request('formulaire_action_args')
191
-		and is_array($p = decoder_contexte_ajax($p, $post_form))
192
-	) {
193
-		// enlever le faux attribut de langue masque
194
-		array_shift($p);
195
-		if (formulaire__identifier($form, $args, $p)) {
196
-			$je_suis_poste = true;
197
-		}
198
-	}
199
-
200
-	$editable = true;
201
-	$erreurs = $post = [];
202
-	if ($je_suis_poste) {
203
-		$post = traiter_formulaires_dynamiques(true);
204
-		$e = "erreurs_$form";
205
-		$erreurs = isset($post[$e]) ? $post[$e] : [];
206
-		$editable = "editable_$form";
207
-		$editable = (!isset($post[$e]))
208
-			|| count($erreurs)
209
-			|| (isset($post[$editable]) && $post[$editable]);
210
-	}
211
-
212
-	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
213
-
214
-	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
215
-	// C'est plus fort qu'editable qui est gere par le squelette
216
-	// Idealement $valeur doit etre alors un message explicatif.
217
-	if (!is_array($valeurs)) {
218
-		return is_string($valeurs) ? $valeurs : '';
219
-	}
220
-
221
-	// charger peut passer une action si le formulaire ne tourne pas sur self()
222
-	// ou une action vide si elle ne sert pas
223
-	$action = (isset($valeurs['action'])) ? $valeurs['action'] : self('&amp;', true);
224
-	// bug IEx : si action finit par /
225
-	// IE croit que le <form ... action=../ > est autoferme
226
-	if (substr($action, -1) == '/') {
227
-		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
228
-		$action .= '#';
229
-	}
230
-
231
-	// recuperer la saisie en cours si erreurs
232
-	// seulement si c'est ce formulaire qui est poste
233
-	// ou si on le demande explicitement par le parametre _forcer_request = true
234
-	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
235
-	foreach (array_keys($valeurs) as $champ) {
236
-		if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
237
-			if ($dispo and (($v = _request($champ)) !== null)) {
238
-				$valeurs[$champ] = $v;
239
-			}
240
-			// nettoyer l'url des champs qui vont etre saisis
241
-			if ($action) {
242
-				$action = parametre_url($action, $champ, '');
243
-			}
244
-			// proteger les ' et les " dans les champs que l'on va injecter
245
-			$valeurs[$champ] = protege_champ($valeurs[$champ]);
246
-		}
247
-	}
248
-
249
-	if ($action) {
250
-		// nettoyer l'url
251
-		$action = parametre_url($action, 'formulaire_action', '');
252
-		$action = parametre_url($action, 'formulaire_action_args', '');
253
-	}
254
-
255
-	/**
256
-	 * @deprecated
257
-	 * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
258
-	 */
259
-	/*
182
+    // tester si ce formulaire vient d'etre poste (memes arguments)
183
+    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
184
+    // si poste, on recupere les erreurs
185
+
186
+    $je_suis_poste = false;
187
+    if (
188
+        $post_form = _request('formulaire_action')
189
+        and $post_form == $form
190
+        and $p = _request('formulaire_action_args')
191
+        and is_array($p = decoder_contexte_ajax($p, $post_form))
192
+    ) {
193
+        // enlever le faux attribut de langue masque
194
+        array_shift($p);
195
+        if (formulaire__identifier($form, $args, $p)) {
196
+            $je_suis_poste = true;
197
+        }
198
+    }
199
+
200
+    $editable = true;
201
+    $erreurs = $post = [];
202
+    if ($je_suis_poste) {
203
+        $post = traiter_formulaires_dynamiques(true);
204
+        $e = "erreurs_$form";
205
+        $erreurs = isset($post[$e]) ? $post[$e] : [];
206
+        $editable = "editable_$form";
207
+        $editable = (!isset($post[$e]))
208
+            || count($erreurs)
209
+            || (isset($post[$editable]) && $post[$editable]);
210
+    }
211
+
212
+    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
213
+
214
+    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
215
+    // C'est plus fort qu'editable qui est gere par le squelette
216
+    // Idealement $valeur doit etre alors un message explicatif.
217
+    if (!is_array($valeurs)) {
218
+        return is_string($valeurs) ? $valeurs : '';
219
+    }
220
+
221
+    // charger peut passer une action si le formulaire ne tourne pas sur self()
222
+    // ou une action vide si elle ne sert pas
223
+    $action = (isset($valeurs['action'])) ? $valeurs['action'] : self('&amp;', true);
224
+    // bug IEx : si action finit par /
225
+    // IE croit que le <form ... action=../ > est autoferme
226
+    if (substr($action, -1) == '/') {
227
+        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
228
+        $action .= '#';
229
+    }
230
+
231
+    // recuperer la saisie en cours si erreurs
232
+    // seulement si c'est ce formulaire qui est poste
233
+    // ou si on le demande explicitement par le parametre _forcer_request = true
234
+    $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
235
+    foreach (array_keys($valeurs) as $champ) {
236
+        if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
237
+            if ($dispo and (($v = _request($champ)) !== null)) {
238
+                $valeurs[$champ] = $v;
239
+            }
240
+            // nettoyer l'url des champs qui vont etre saisis
241
+            if ($action) {
242
+                $action = parametre_url($action, $champ, '');
243
+            }
244
+            // proteger les ' et les " dans les champs que l'on va injecter
245
+            $valeurs[$champ] = protege_champ($valeurs[$champ]);
246
+        }
247
+    }
248
+
249
+    if ($action) {
250
+        // nettoyer l'url
251
+        $action = parametre_url($action, 'formulaire_action', '');
252
+        $action = parametre_url($action, 'formulaire_action_args', '');
253
+    }
254
+
255
+    /**
256
+     * @deprecated
257
+     * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
258
+     */
259
+    /*
260 260
 	if (isset($valeurs['_action'])) {
261 261
 		$securiser_action = charger_fonction('securiser_action', 'inc');
262 262
 		$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@@ -266,59 +266,59 @@  discard block
 block discarded – undo
266 266
 	}
267 267
 	*/
268 268
 
269
-	// empiler la lang en tant que premier argument implicite du CVT
270
-	// pour permettre de la restaurer au moment du Verifier et du Traiter
271
-	array_unshift($args, $GLOBALS['spip_lang']);
272
-
273
-	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
274
-	$valeurs['erreurs'] = $erreurs;
275
-	$valeurs['action'] = $action;
276
-	$valeurs['form'] = $form;
277
-
278
-	$valeurs['formulaire_sign'] = '';
279
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
280
-		$securiser_action = charger_fonction('securiser_action', 'inc');
281
-		$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
282
-		$valeurs['formulaire_sign'] = $secu['hash'];
283
-	}
284
-
285
-	if (!isset($valeurs['id'])) {
286
-		$valeurs['id'] = 'new';
287
-	}
288
-	// editable peut venir de charger() ou de traiter() sinon
289
-	if (!isset($valeurs['editable'])) {
290
-		$valeurs['editable'] = $editable;
291
-	}
292
-	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
293
-	$valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
294
-
295
-	if ($je_suis_poste) {
296
-		$valeurs['message_erreur'] = '';
297
-		if (isset($erreurs['message_erreur'])) {
298
-			$valeurs['message_erreur'] = $erreurs['message_erreur'];
299
-		}
300
-
301
-		$valeurs['message_ok'] = '';
302
-		if (isset($post["message_ok_$form"])) {
303
-			$valeurs['message_ok'] = $post["message_ok_$form"];
304
-		} elseif (isset($erreurs['message_ok'])) {
305
-			$valeurs['message_ok'] = $erreurs['message_ok'];
306
-		}
307
-
308
-		// accessibilite : encapsuler toutes les erreurs dans un role='alert'
309
-		// uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
310
-		// et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
311
-		if (html5_permis()) {
312
-			foreach ($erreurs as $k => $v) {
313
-				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
314
-					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
315
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
316
-				}
317
-			}
318
-		}
319
-	}
320
-
321
-	return $valeurs;
269
+    // empiler la lang en tant que premier argument implicite du CVT
270
+    // pour permettre de la restaurer au moment du Verifier et du Traiter
271
+    array_unshift($args, $GLOBALS['spip_lang']);
272
+
273
+    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
274
+    $valeurs['erreurs'] = $erreurs;
275
+    $valeurs['action'] = $action;
276
+    $valeurs['form'] = $form;
277
+
278
+    $valeurs['formulaire_sign'] = '';
279
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
280
+        $securiser_action = charger_fonction('securiser_action', 'inc');
281
+        $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
282
+        $valeurs['formulaire_sign'] = $secu['hash'];
283
+    }
284
+
285
+    if (!isset($valeurs['id'])) {
286
+        $valeurs['id'] = 'new';
287
+    }
288
+    // editable peut venir de charger() ou de traiter() sinon
289
+    if (!isset($valeurs['editable'])) {
290
+        $valeurs['editable'] = $editable;
291
+    }
292
+    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
293
+    $valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
294
+
295
+    if ($je_suis_poste) {
296
+        $valeurs['message_erreur'] = '';
297
+        if (isset($erreurs['message_erreur'])) {
298
+            $valeurs['message_erreur'] = $erreurs['message_erreur'];
299
+        }
300
+
301
+        $valeurs['message_ok'] = '';
302
+        if (isset($post["message_ok_$form"])) {
303
+            $valeurs['message_ok'] = $post["message_ok_$form"];
304
+        } elseif (isset($erreurs['message_ok'])) {
305
+            $valeurs['message_ok'] = $erreurs['message_ok'];
306
+        }
307
+
308
+        // accessibilite : encapsuler toutes les erreurs dans un role='alert'
309
+        // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
310
+        // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
311
+        if (html5_permis()) {
312
+            foreach ($erreurs as $k => $v) {
313
+                if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
314
+                    // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
315
+                    $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
316
+                }
317
+            }
318
+        }
319
+    }
320
+
321
+    return $valeurs;
322 322
 }
323 323
 
324 324
 /**
@@ -330,51 +330,51 @@  discard block
 block discarded – undo
330 330
  * @return array
331 331
  */
332 332
 function formulaire__charger($form, $args, $poste) {
333
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
334
-		$valeurs = call_user_func_array($charger_valeurs, $args);
335
-	} else {
336
-		$valeurs = [];
337
-	}
338
-
339
-	$valeurs = pipeline(
340
-		'formulaire_charger',
341
-		[
342
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
343
-			'data' => $valeurs
344
-		]
345
-	);
346
-
347
-	// prise en charge CVT multi etape
348
-	if (is_array($valeurs) and isset($valeurs['_etapes'])) {
349
-		include_spip('inc/cvt_multietapes');
350
-		$valeurs = cvtmulti_formulaire_charger_etapes(
351
-			['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
352
-			$valeurs
353
-		);
354
-	}
355
-
356
-	// si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
357
-	if (is_array($valeurs)) {
358
-		if (!isset($valeurs['_pipelines'])) {
359
-			$valeurs['_pipelines'] = [];
360
-		}
361
-		// l'ancien argument _pipeline devient maintenant _pipelines
362
-		// reinjectons le vieux _pipeline au debut de _pipelines
363
-		if (isset($valeurs['_pipeline'])) {
364
-			$pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
365
-			$args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
366
-
367
-			$pipelines = [$pipe => $args];
368
-			$valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
369
-		}
370
-
371
-		// et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
372
-		// qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
373
-		// (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
374
-		$valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
375
-	}
376
-
377
-	return $valeurs;
333
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
334
+        $valeurs = call_user_func_array($charger_valeurs, $args);
335
+    } else {
336
+        $valeurs = [];
337
+    }
338
+
339
+    $valeurs = pipeline(
340
+        'formulaire_charger',
341
+        [
342
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
343
+            'data' => $valeurs
344
+        ]
345
+    );
346
+
347
+    // prise en charge CVT multi etape
348
+    if (is_array($valeurs) and isset($valeurs['_etapes'])) {
349
+        include_spip('inc/cvt_multietapes');
350
+        $valeurs = cvtmulti_formulaire_charger_etapes(
351
+            ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
352
+            $valeurs
353
+        );
354
+    }
355
+
356
+    // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
357
+    if (is_array($valeurs)) {
358
+        if (!isset($valeurs['_pipelines'])) {
359
+            $valeurs['_pipelines'] = [];
360
+        }
361
+        // l'ancien argument _pipeline devient maintenant _pipelines
362
+        // reinjectons le vieux _pipeline au debut de _pipelines
363
+        if (isset($valeurs['_pipeline'])) {
364
+            $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
365
+            $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
366
+
367
+            $pipelines = [$pipe => $args];
368
+            $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
369
+        }
370
+
371
+        // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
372
+        // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
373
+        // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
374
+        $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
375
+    }
376
+
377
+    return $valeurs;
378 378
 }
379 379
 
380 380
 /**
@@ -393,9 +393,9 @@  discard block
 block discarded – undo
393 393
  * @return bool
394 394
  */
395 395
 function formulaire__identifier($form, $args, $p) {
396
-	if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
397
-		return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
398
-	}
396
+    if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
397
+        return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
398
+    }
399 399
 
400
-	return $args === $p;
400
+    return $args === $p;
401 401
 }
Please login to merge, or discard this patch.