Completed
Push — master ( 03d021...09bea4 )
by cam
04:40
created
ecrire/public/composer.php 3 patches
Doc Comments   +8 added lines, -1 removed lines patch added patch discarded remove patch
@@ -148,6 +148,10 @@  discard block
 block discarded – undo
148 148
 	return $nom ? $nom : false;
149 149
 }
150 150
 
151
+/**
152
+ * @param string $squelette
153
+ * @param string $phpfile
154
+ */
151 155
 function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) {
152 156
 
153 157
 	// Le dernier index est '' (fonction principale)
@@ -172,6 +176,9 @@  discard block
 block discarded – undo
172 176
 
173 177
 // Le squelette compile est-il trop vieux ?
174 178
 // https://code.spip.net/@squelette_obsolete
179
+/**
180
+ * @param string $skel
181
+ */
175 182
 function squelette_obsolete($skel, $squelette) {
176 183
 	static $date_change = null;
177 184
 	// ne verifier la date de mes_fonctions et mes_options qu'une seule fois
@@ -485,7 +492,7 @@  discard block
 block discarded – undo
485 492
  * tel que "A_B_C_", sinon "A_B_" sinon "A_"
486 493
  * 
487 494
  * @param string $nom
488
- * @return array|null
495
+ * @return string
489 496
  */
490 497
 function chercher_balise_generique($nom) {
491 498
 	if (false === strpos($nom, "_")) {
Please login to merge, or discard this patch.
Indentation   +727 added lines, -727 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 include_spip('inc/texte');
@@ -43,239 +43,239 @@  discard block
 block discarded – undo
43 43
 // https://code.spip.net/@public_composer_dist
44 44
 function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = '') {
45 45
 
46
-	$nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
47
-
48
-	//  si deja en memoire (INCLURE  a repetition) c'est bon.
49
-	if (function_exists($nom)) {
50
-		return $nom;
51
-	}
52
-
53
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
54
-		$GLOBALS['debug_objets']['courant'] = $nom;
55
-	}
56
-
57
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
58
-
59
-	// si squelette est deja compile et perenne, le charger
60
-	if (!squelette_obsolete($phpfile, $source)) {
61
-		include_once $phpfile;
62
-		#if (!squelette_obsolete($phpfile, $source)
63
-		#  AND lire_fichier ($phpfile, $skel_code,
64
-		#  array('critique' => 'oui', 'phpcheck' => 'oui'))){
65
-		## eval('?'.'>'.$skel_code);
66
-		#	 spip_log($skel_code, 'comp')
67
-		#}
68
-	}
69
-
70
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
71
-		include_once $lib;
72
-	}
73
-
74
-	// tester si le eval ci-dessus a mis le squelette en memoire
75
-
76
-	if (function_exists($nom)) {
77
-		return $nom;
78
-	}
79
-
80
-	// charger le source, si possible, et compiler 
81
-	$skel_code = '';
82
-	if (lire_fichier($source, $skel)) {
83
-		$compiler = charger_fonction('compiler', 'public');
84
-		$skel_code = $compiler($skel, $nom, $gram, $source, $connect);
85
-	}
86
-
87
-	// Ne plus rien faire si le compilateur n'a pas pu operer.
88
-	if (!$skel_code) {
89
-		return false;
90
-	}
91
-
92
-	foreach ($skel_code as $id => $boucle) {
93
-		$f = $boucle->return;
94
-		try {
95
-			// @todo : a remplacer quand _PHP_MIN >= 7
96
-			// eval("return true; $f ;");
97
-			// PHP 5.x compat
98
-			if ($ok = @eval("return true; $f ;") === false) {
99
-				// Code syntaxiquement faux (critere etc mal programme')
100
-				$msg = _T('zbug_erreur_compilation');
101
-				erreur_squelette($msg, $boucle);
102
-				// continuer pour trouver d'autres fautes eventuelles
103
-				// mais prevenir que c'est mort
104
-				$nom = '';
105
-			}
106
-		} catch (\ParseError $e) {
107
-			// Code syntaxiquement faux (critere etc mal programme')
108
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
109
-			erreur_squelette($msg, $boucle);
110
-			// continuer pour trouver d'autres fautes eventuelles
111
-			// mais prevenir que c'est mort
112
-			$nom = '';
113
-		}
114
-
115
-		// Contexte de compil inutile a present
116
-		// (mais la derniere valeur de $boucle est utilisee ci-dessous)
117
-		$skel_code[$id] = $f;
118
-	}
119
-
120
-	$code = '';
121
-	if ($nom) {
122
-		// Si le code est bon, concatener et mettre en cache
123
-		if (function_exists($nom)) {
124
-			$code = squelette_traduit($skel, $source, $phpfile, $skel_code);
125
-		} else {
126
-			// code semantiquement faux: bug du compilateur
127
-			// $boucle est en fait ici la fct principale du squelette
128
-			$msg = _T('zbug_erreur_compilation');
129
-			erreur_squelette($msg, $boucle);
130
-			$nom = '';
131
-		}
132
-	}
133
-
134
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
135
-
136
-		// Tracer ce qui vient d'etre compile
137
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
138
-
139
-		// si c'est ce que demande le debusqueur, lui passer la main
140
-		if ($GLOBALS['debug_objets']['sourcefile']
141
-			and (_request('var_mode_objet') == $nom)
142
-			and (_request('var_mode_affiche') == 'code')
143
-		) {
144
-			erreur_squelette();
145
-		}
146
-	}
147
-
148
-	return $nom ? $nom : false;
46
+    $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
47
+
48
+    //  si deja en memoire (INCLURE  a repetition) c'est bon.
49
+    if (function_exists($nom)) {
50
+        return $nom;
51
+    }
52
+
53
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
54
+        $GLOBALS['debug_objets']['courant'] = $nom;
55
+    }
56
+
57
+    $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
58
+
59
+    // si squelette est deja compile et perenne, le charger
60
+    if (!squelette_obsolete($phpfile, $source)) {
61
+        include_once $phpfile;
62
+        #if (!squelette_obsolete($phpfile, $source)
63
+        #  AND lire_fichier ($phpfile, $skel_code,
64
+        #  array('critique' => 'oui', 'phpcheck' => 'oui'))){
65
+        ## eval('?'.'>'.$skel_code);
66
+        #	 spip_log($skel_code, 'comp')
67
+        #}
68
+    }
69
+
70
+    if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
71
+        include_once $lib;
72
+    }
73
+
74
+    // tester si le eval ci-dessus a mis le squelette en memoire
75
+
76
+    if (function_exists($nom)) {
77
+        return $nom;
78
+    }
79
+
80
+    // charger le source, si possible, et compiler 
81
+    $skel_code = '';
82
+    if (lire_fichier($source, $skel)) {
83
+        $compiler = charger_fonction('compiler', 'public');
84
+        $skel_code = $compiler($skel, $nom, $gram, $source, $connect);
85
+    }
86
+
87
+    // Ne plus rien faire si le compilateur n'a pas pu operer.
88
+    if (!$skel_code) {
89
+        return false;
90
+    }
91
+
92
+    foreach ($skel_code as $id => $boucle) {
93
+        $f = $boucle->return;
94
+        try {
95
+            // @todo : a remplacer quand _PHP_MIN >= 7
96
+            // eval("return true; $f ;");
97
+            // PHP 5.x compat
98
+            if ($ok = @eval("return true; $f ;") === false) {
99
+                // Code syntaxiquement faux (critere etc mal programme')
100
+                $msg = _T('zbug_erreur_compilation');
101
+                erreur_squelette($msg, $boucle);
102
+                // continuer pour trouver d'autres fautes eventuelles
103
+                // mais prevenir que c'est mort
104
+                $nom = '';
105
+            }
106
+        } catch (\ParseError $e) {
107
+            // Code syntaxiquement faux (critere etc mal programme')
108
+            $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
109
+            erreur_squelette($msg, $boucle);
110
+            // continuer pour trouver d'autres fautes eventuelles
111
+            // mais prevenir que c'est mort
112
+            $nom = '';
113
+        }
114
+
115
+        // Contexte de compil inutile a present
116
+        // (mais la derniere valeur de $boucle est utilisee ci-dessous)
117
+        $skel_code[$id] = $f;
118
+    }
119
+
120
+    $code = '';
121
+    if ($nom) {
122
+        // Si le code est bon, concatener et mettre en cache
123
+        if (function_exists($nom)) {
124
+            $code = squelette_traduit($skel, $source, $phpfile, $skel_code);
125
+        } else {
126
+            // code semantiquement faux: bug du compilateur
127
+            // $boucle est en fait ici la fct principale du squelette
128
+            $msg = _T('zbug_erreur_compilation');
129
+            erreur_squelette($msg, $boucle);
130
+            $nom = '';
131
+        }
132
+    }
133
+
134
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
135
+
136
+        // Tracer ce qui vient d'etre compile
137
+        $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
138
+
139
+        // si c'est ce que demande le debusqueur, lui passer la main
140
+        if ($GLOBALS['debug_objets']['sourcefile']
141
+            and (_request('var_mode_objet') == $nom)
142
+            and (_request('var_mode_affiche') == 'code')
143
+        ) {
144
+            erreur_squelette();
145
+        }
146
+    }
147
+
148
+    return $nom ? $nom : false;
149 149
 }
150 150
 
151 151
 function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) {
152 152
 
153
-	// Le dernier index est '' (fonction principale)
154
-	$noms = substr(join(', ', array_keys($boucles)), 0, -2);
155
-	if (CODE_COMMENTE) {
156
-		$code = "
153
+    // Le dernier index est '' (fonction principale)
154
+    $noms = substr(join(', ', array_keys($boucles)), 0, -2);
155
+    if (CODE_COMMENTE) {
156
+        $code = "
157 157
 /*
158 158
  * Squelette : $sourcefile
159 159
  * Date :      " . gmdate("D, d M Y H:i:s", @filemtime($sourcefile)) . " GMT
160 160
  * Compile :   " . gmdate("D, d M Y H:i:s", time()) . " GMT
161 161
  * " . (!$boucles ? "Pas de boucle" : ("Boucles :   " . $noms)) . "
162 162
  */ ";
163
-	}
163
+    }
164 164
 
165
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
166
-	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
167
-		ecrire_fichier($phpfile, $code);
168
-	}
165
+    $code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
166
+    if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
167
+        ecrire_fichier($phpfile, $code);
168
+    }
169 169
 
170
-	return $code;
170
+    return $code;
171 171
 }
172 172
 
173 173
 // Le squelette compile est-il trop vieux ?
174 174
 // https://code.spip.net/@squelette_obsolete
175 175
 function squelette_obsolete($skel, $squelette) {
176
-	static $date_change = null;
177
-	// ne verifier la date de mes_fonctions et mes_options qu'une seule fois
178
-	// par hit
179
-	if (is_null($date_change)) {
180
-		if (@file_exists($fonc = 'mes_fonctions.php')) {
181
-			$date_change = @filemtime($fonc);
182
-		} # compatibilite
183
-		if (defined('_FILE_OPTIONS')) {
184
-			$date_change = max($date_change, @filemtime(_FILE_OPTIONS));
185
-		}
186
-	}
187
-
188
-	return (
189
-		(defined('_VAR_MODE') and in_array(_VAR_MODE, array('recalcul', 'preview', 'debug')))
190
-		or !@file_exists($skel)
191
-		or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
192
-			> ($date = @filemtime($skel)))
193
-		or ($date_change > $date)
194
-	);
176
+    static $date_change = null;
177
+    // ne verifier la date de mes_fonctions et mes_options qu'une seule fois
178
+    // par hit
179
+    if (is_null($date_change)) {
180
+        if (@file_exists($fonc = 'mes_fonctions.php')) {
181
+            $date_change = @filemtime($fonc);
182
+        } # compatibilite
183
+        if (defined('_FILE_OPTIONS')) {
184
+            $date_change = max($date_change, @filemtime(_FILE_OPTIONS));
185
+        }
186
+    }
187
+
188
+    return (
189
+        (defined('_VAR_MODE') and in_array(_VAR_MODE, array('recalcul', 'preview', 'debug')))
190
+        or !@file_exists($skel)
191
+        or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
192
+            > ($date = @filemtime($skel)))
193
+        or ($date_change > $date)
194
+    );
195 195
 }
196 196
 
197 197
 // Activer l'invalideur de session
198 198
 // https://code.spip.net/@invalideur_session
199 199
 function invalideur_session(&$Cache, $code = null) {
200
-	$Cache['session'] = spip_session();
200
+    $Cache['session'] = spip_session();
201 201
 
202
-	return $code;
202
+    return $code;
203 203
 }
204 204
 
205 205
 
206 206
 // https://code.spip.net/@analyse_resultat_skel
207 207
 function analyse_resultat_skel($nom, $cache, $corps, $source = '') {
208
-	static $filtres = array();
209
-	$headers = array();
210
-
211
-	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
212
-	// note: on essaie d'attrapper aussi certains de ces entetes codes
213
-	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
214
-	if (stripos($corps, 'header') !== false
215
-		and preg_match_all(
216
-			'/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
217
-			$corps, $regs, PREG_SET_ORDER)
218
-	) {
219
-		foreach ($regs as $r) {
220
-			$corps = str_replace($r[0], '', $corps);
221
-			# $j = Content-Type, et pas content-TYPE.
222
-			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
223
-
224
-			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
225
-				$headers[$j] .= "|" . $r[3];
226
-			} else {
227
-				$headers[$j] = $r[3];
228
-			}
229
-		}
230
-	}
231
-	// S'agit-il d'un resultat constant ou contenant du code php
232
-	$process_ins = (
233
-		strpos($corps, '<' . '?') === false
234
-		or
235
-		(strpos($corps, '<' . '?xml') !== false and
236
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
237
-	)
238
-		? 'html'
239
-		: 'php';
240
-
241
-	$skel = array(
242
-		'squelette' => $nom,
243
-		'source' => $source,
244
-		'process_ins' => $process_ins,
245
-		'invalideurs' => $cache,
246
-		'entetes' => $headers,
247
-		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
248
-	);
249
-
250
-	// traiter #FILTRE{} et filtres
251
-	if (!isset($filtres[$nom])) {
252
-		$filtres[$nom] = pipeline('declarer_filtres_squelettes', array('args' => $skel, 'data' => array()));
253
-	}
254
-	$filtres_headers = array();
255
-	if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
256
-		$filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
257
-		unset($headers['X-Spip-Filtre']);
258
-	}
259
-	if (count($filtres[$nom]) or count($filtres_headers)) {
260
-		include_spip('public/sandbox');
261
-		$corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
262
-
263
-		if ($process_ins == 'html') {
264
-			$skel['process_ins'] = (
265
-				strpos($corps, '<' . '?') === false
266
-				or
267
-				(strpos($corps, '<' . '?xml') !== false and
268
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
269
-			)
270
-				? 'html'
271
-				: 'php';
272
-		}
273
-	}
274
-
275
-	$skel['entetes'] = $headers;
276
-	$skel['texte'] = $corps;
277
-
278
-	return $skel;
208
+    static $filtres = array();
209
+    $headers = array();
210
+
211
+    // Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
212
+    // note: on essaie d'attrapper aussi certains de ces entetes codes
213
+    // "a la main" dans les squelettes, mais evidemment sans exhaustivite
214
+    if (stripos($corps, 'header') !== false
215
+        and preg_match_all(
216
+            '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
217
+            $corps, $regs, PREG_SET_ORDER)
218
+    ) {
219
+        foreach ($regs as $r) {
220
+            $corps = str_replace($r[0], '', $corps);
221
+            # $j = Content-Type, et pas content-TYPE.
222
+            $j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
223
+
224
+            if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
225
+                $headers[$j] .= "|" . $r[3];
226
+            } else {
227
+                $headers[$j] = $r[3];
228
+            }
229
+        }
230
+    }
231
+    // S'agit-il d'un resultat constant ou contenant du code php
232
+    $process_ins = (
233
+        strpos($corps, '<' . '?') === false
234
+        or
235
+        (strpos($corps, '<' . '?xml') !== false and
236
+            strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
237
+    )
238
+        ? 'html'
239
+        : 'php';
240
+
241
+    $skel = array(
242
+        'squelette' => $nom,
243
+        'source' => $source,
244
+        'process_ins' => $process_ins,
245
+        'invalideurs' => $cache,
246
+        'entetes' => $headers,
247
+        'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
248
+    );
249
+
250
+    // traiter #FILTRE{} et filtres
251
+    if (!isset($filtres[$nom])) {
252
+        $filtres[$nom] = pipeline('declarer_filtres_squelettes', array('args' => $skel, 'data' => array()));
253
+    }
254
+    $filtres_headers = array();
255
+    if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
256
+        $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
257
+        unset($headers['X-Spip-Filtre']);
258
+    }
259
+    if (count($filtres[$nom]) or count($filtres_headers)) {
260
+        include_spip('public/sandbox');
261
+        $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
262
+
263
+        if ($process_ins == 'html') {
264
+            $skel['process_ins'] = (
265
+                strpos($corps, '<' . '?') === false
266
+                or
267
+                (strpos($corps, '<' . '?xml') !== false and
268
+                    strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
269
+            )
270
+                ? 'html'
271
+                : 'php';
272
+        }
273
+    }
274
+
275
+    $skel['entetes'] = $headers;
276
+    $skel['texte'] = $corps;
277
+
278
+    return $skel;
279 279
 }
280 280
 
281 281
 //
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
290 290
 if ($lang_select) lang_select();
291 291
 ?'
292
-	. '>');
292
+    . '>');
293 293
 
294 294
 /**
295 295
  * Synthétise une balise dynamique : crée l'appel à l'inclusion
@@ -309,29 +309,29 @@  discard block
 block discarded – undo
309 309
  *     Code PHP pour inclure le squelette de la balise dynamique
310 310
  **/
311 311
 function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
312
-	if (strncmp($file, "/", 1) !== 0) {
313
-		$file = './" . _DIR_RACINE . "' . $file;
314
-	}
315
-
316
-	$lang = $context_compil[4];
317
-	if (preg_match(",\W,", $lang)) {
318
-		$lang = '';
319
-	}
320
-
321
-	$args = array_map('argumenter_squelette', $args);
322
-	if (!empty($context_compil['appel_php_depuis_modele'])) {
323
-		$args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')';
324
-	}
325
-	$args = join(', ', $args);
326
-
327
-	$r = sprintf(CODE_INCLURE_BALISE,
328
-		$file,
329
-		$lang,
330
-		$nom,
331
-		$args,
332
-		join(', ', array_map('_q', $context_compil)));
333
-
334
-	return $r;
312
+    if (strncmp($file, "/", 1) !== 0) {
313
+        $file = './" . _DIR_RACINE . "' . $file;
314
+    }
315
+
316
+    $lang = $context_compil[4];
317
+    if (preg_match(",\W,", $lang)) {
318
+        $lang = '';
319
+    }
320
+
321
+    $args = array_map('argumenter_squelette', $args);
322
+    if (!empty($context_compil['appel_php_depuis_modele'])) {
323
+        $args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')';
324
+    }
325
+    $args = join(', ', $args);
326
+
327
+    $r = sprintf(CODE_INCLURE_BALISE,
328
+        $file,
329
+        $lang,
330
+        $nom,
331
+        $args,
332
+        join(', ', array_map('_q', $context_compil)));
333
+
334
+    return $r;
335 335
 }
336 336
 
337 337
 /**
@@ -349,21 +349,21 @@  discard block
 block discarded – undo
349 349
  **/
350 350
 function argumenter_squelette($v) {
351 351
 
352
-	if (is_object($v)) {
353
-		if (PHP_VERSION_ID < 73000 and $v instanceof \stdClass) {
354
-			return "(object) " . var_export((array) $v, true);
355
-		}
356
-		return var_export($v, true);
357
-	} elseif (!is_array($v)) {
358
-		return "'" . texte_script($v) . "'";
359
-	} else {
360
-		$out = array();
361
-		foreach ($v as $k => $val) {
362
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
363
-		}
364
-
365
-		return 'array(' . join(", ", $out) . ')';
366
-	}
352
+    if (is_object($v)) {
353
+        if (PHP_VERSION_ID < 73000 and $v instanceof \stdClass) {
354
+            return "(object) " . var_export((array) $v, true);
355
+        }
356
+        return var_export($v, true);
357
+    } elseif (!is_array($v)) {
358
+        return "'" . texte_script($v) . "'";
359
+    } else {
360
+        $out = array();
361
+        foreach ($v as $k => $val) {
362
+            $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
363
+        }
364
+
365
+        return 'array(' . join(", ", $out) . ')';
366
+    }
367 367
 }
368 368
 
369 369
 
@@ -394,85 +394,85 @@  discard block
 block discarded – undo
394 394
  *     Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique
395 395
  **/
396 396
 function executer_balise_dynamique($nom, $args, $context_compil) {
397
-	/** @var string Nom de la balise à charger (balise demandée ou balise générique) */
398
-	$nom_balise = $nom;
399
-	/** @var string Nom de la balise générique (si utilisée) */
400
-	$nom_balise_generique = "";
401
-
402
-	$appel_php_depuis_modele = false;
403
-	if (is_array($context_compil)
404
-	  and !is_numeric($context_compil[3])
405
-	  and empty($context_compil[0])
406
-		and empty($context_compil[1])
407
-		and empty($context_compil[2])
408
-		and empty($context_compil[3])) {
409
-		$appel_php_depuis_modele = true;
410
-	}
411
-
412
-	if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
413
-		// Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
414
-		if ($balise_generique = chercher_balise_generique($nom)) {
415
-			// injecter en premier arg le nom de la balise 
416
-			array_unshift($args, $nom);
417
-			$nom_balise_generique = $balise_generique['nom_generique'];
418
-			$fonction_balise = $balise_generique['fonction_generique'];
419
-			$nom_balise = $nom_balise_generique;
420
-		}
421
-		unset($balise_generique);
422
-	}
423
-
424
-	if (!$fonction_balise) {
425
-		$msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
426
-		erreur_squelette($msg, $context_compil);
427
-
428
-		return '';
429
-	}
430
-
431
-	// retrouver le fichier qui a déclaré la fonction
432
-	// même si la fonction dynamique est déclarée dans un fichier de fonctions.
433
-	// Attention sous windows, getFileName() retourne un antislash. 
434
-	$reflector = new ReflectionFunction($fonction_balise);
435
-	$file = str_replace('\\', '/', $reflector->getFileName());
436
-	if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
437
-		$file = substr($file, strlen(_ROOT_RACINE));
438
-	}
439
-
440
-	// Y a-t-il une fonction de traitement des arguments ?
441
-	$f = 'balise_' . $nom_balise . '_stat';
442
-
443
-	$r = !function_exists($f) ? $args : $f($args, $context_compil);
444
-
445
-	if (!is_array($r)) {
446
-		return $r;
447
-	}
448
-
449
-	// verifier que la fonction dyn est la, 
450
-	// sinon se replier sur la generique si elle existe
451
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
452
-		if (
453
-			$balise_generique = chercher_balise_generique($nom)
454
-			and $nom_balise_generique = $balise_generique['nom_generique']
455
-			and $file = include_spip("balise/" . strtolower($nom_balise_generique))
456
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
457
-		) {
458
-			// et lui injecter en premier arg le nom de la balise 
459
-			array_unshift($r, $nom);
460
-			$nom_balise = $nom_balise_generique;
461
-			if (!_DIR_RESTREINT) {
462
-				$file = _DIR_RESTREINT_ABS . $file;
463
-			}
464
-		} else {
465
-			$msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
466
-			erreur_squelette($msg, $context_compil);
467
-
468
-			return '';
469
-		}
470
-	}
471
-
472
-	if ($appel_php_depuis_modele) {
473
-		$context_compil['appel_php_depuis_modele'] = true;
474
-	}
475
-	return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
397
+    /** @var string Nom de la balise à charger (balise demandée ou balise générique) */
398
+    $nom_balise = $nom;
399
+    /** @var string Nom de la balise générique (si utilisée) */
400
+    $nom_balise_generique = "";
401
+
402
+    $appel_php_depuis_modele = false;
403
+    if (is_array($context_compil)
404
+      and !is_numeric($context_compil[3])
405
+      and empty($context_compil[0])
406
+        and empty($context_compil[1])
407
+        and empty($context_compil[2])
408
+        and empty($context_compil[3])) {
409
+        $appel_php_depuis_modele = true;
410
+    }
411
+
412
+    if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
413
+        // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
414
+        if ($balise_generique = chercher_balise_generique($nom)) {
415
+            // injecter en premier arg le nom de la balise 
416
+            array_unshift($args, $nom);
417
+            $nom_balise_generique = $balise_generique['nom_generique'];
418
+            $fonction_balise = $balise_generique['fonction_generique'];
419
+            $nom_balise = $nom_balise_generique;
420
+        }
421
+        unset($balise_generique);
422
+    }
423
+
424
+    if (!$fonction_balise) {
425
+        $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
426
+        erreur_squelette($msg, $context_compil);
427
+
428
+        return '';
429
+    }
430
+
431
+    // retrouver le fichier qui a déclaré la fonction
432
+    // même si la fonction dynamique est déclarée dans un fichier de fonctions.
433
+    // Attention sous windows, getFileName() retourne un antislash. 
434
+    $reflector = new ReflectionFunction($fonction_balise);
435
+    $file = str_replace('\\', '/', $reflector->getFileName());
436
+    if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
437
+        $file = substr($file, strlen(_ROOT_RACINE));
438
+    }
439
+
440
+    // Y a-t-il une fonction de traitement des arguments ?
441
+    $f = 'balise_' . $nom_balise . '_stat';
442
+
443
+    $r = !function_exists($f) ? $args : $f($args, $context_compil);
444
+
445
+    if (!is_array($r)) {
446
+        return $r;
447
+    }
448
+
449
+    // verifier que la fonction dyn est la, 
450
+    // sinon se replier sur la generique si elle existe
451
+    if (!function_exists('balise_' . $nom_balise . '_dyn')) {
452
+        if (
453
+            $balise_generique = chercher_balise_generique($nom)
454
+            and $nom_balise_generique = $balise_generique['nom_generique']
455
+            and $file = include_spip("balise/" . strtolower($nom_balise_generique))
456
+            and function_exists('balise_' . $nom_balise_generique . '_dyn')
457
+        ) {
458
+            // et lui injecter en premier arg le nom de la balise 
459
+            array_unshift($r, $nom);
460
+            $nom_balise = $nom_balise_generique;
461
+            if (!_DIR_RESTREINT) {
462
+                $file = _DIR_RESTREINT_ABS . $file;
463
+            }
464
+        } else {
465
+            $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
466
+            erreur_squelette($msg, $context_compil);
467
+
468
+            return '';
469
+        }
470
+    }
471
+
472
+    if ($appel_php_depuis_modele) {
473
+        $context_compil['appel_php_depuis_modele'] = true;
474
+    }
475
+    return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
476 476
 
477 477
 }
478 478
 
@@ -488,23 +488,23 @@  discard block
 block discarded – undo
488 488
  * @return array|null
489 489
  */
490 490
 function chercher_balise_generique($nom) {
491
-	if (false === strpos($nom, "_")) {
492
-		return null;
493
-	}
494
-	$nom_generique = $nom;
495
-	while (false !== ($p = strrpos($nom_generique, "_"))) {
496
-		$nom_generique = substr($nom_generique, 0, $p + 1);
497
-		$fonction_generique = charger_fonction($nom_generique, 'balise', true);
498
-		if ($fonction_generique) {
499
-			return [
500
-				'nom' => $nom,
501
-				'nom_generique' => $nom_generique,
502
-				'fonction_generique' => $fonction_generique,
503
-			];
504
-		}
505
-		$nom_generique = substr($nom_generique, 0, -1);
506
-	}
507
-	return null;
491
+    if (false === strpos($nom, "_")) {
492
+        return null;
493
+    }
494
+    $nom_generique = $nom;
495
+    while (false !== ($p = strrpos($nom_generique, "_"))) {
496
+        $nom_generique = substr($nom_generique, 0, $p + 1);
497
+        $fonction_generique = charger_fonction($nom_generique, 'balise', true);
498
+        if ($fonction_generique) {
499
+            return [
500
+                'nom' => $nom,
501
+                'nom_generique' => $nom_generique,
502
+                'fonction_generique' => $fonction_generique,
503
+            ];
504
+        }
505
+        $nom_generique = substr($nom_generique, 0, -1);
506
+    }
507
+    return null;
508 508
 }
509 509
 
510 510
 
@@ -528,27 +528,27 @@  discard block
 block discarded – undo
528 528
  * @return null;
529 529
  **/
530 530
 function lang_select_public($lang, $lang_select, $titre = null) {
531
-	// Cas 1. forcer_lang = true et pas de critere {lang_select}
532
-	if (isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
533
-		and $lang_select !== 'oui'
534
-	) {
535
-		$lang = $GLOBALS['spip_lang'];
536
-	} // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
537
-	elseif (!strlen($lang)) {
538
-		$lang = $GLOBALS['spip_lang'];
539
-	} // Cas 3. l'objet est multilingue !
540
-	elseif ($lang_select !== 'oui'
541
-		and strlen($titre) > 10
542
-		and strpos($titre, '<multi>') !== false
543
-		and strpos(echappe_html($titre), '<multi>') !== false
544
-	) {
545
-		$lang = $GLOBALS['spip_lang'];
546
-	}
547
-
548
-	// faire un lang_select() eventuellement sur la langue inchangee
549
-	lang_select($lang);
550
-
551
-	return;
531
+    // Cas 1. forcer_lang = true et pas de critere {lang_select}
532
+    if (isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
533
+        and $lang_select !== 'oui'
534
+    ) {
535
+        $lang = $GLOBALS['spip_lang'];
536
+    } // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
537
+    elseif (!strlen($lang)) {
538
+        $lang = $GLOBALS['spip_lang'];
539
+    } // Cas 3. l'objet est multilingue !
540
+    elseif ($lang_select !== 'oui'
541
+        and strlen($titre) > 10
542
+        and strpos($titre, '<multi>') !== false
543
+        and strpos(echappe_html($titre), '<multi>') !== false
544
+    ) {
545
+        $lang = $GLOBALS['spip_lang'];
546
+    }
547
+
548
+    // faire un lang_select() eventuellement sur la langue inchangee
549
+    lang_select($lang);
550
+
551
+    return;
552 552
 }
553 553
 
554 554
 
@@ -556,21 +556,21 @@  discard block
 block discarded – undo
556 556
 // il faut le nettoyer car il pourrait etre injecte en SQL
557 557
 // https://code.spip.net/@nettoyer_env_doublons
558 558
 function nettoyer_env_doublons($envd) {
559
-	foreach ($envd as $table => $liste) {
560
-		$n = '';
561
-		foreach (explode(',', $liste) as $val) {
562
-			if ($a = intval($val) and $val === strval($a)) {
563
-				$n .= ',' . $val;
564
-			}
565
-		}
566
-		if (strlen($n)) {
567
-			$envd[$table] = $n;
568
-		} else {
569
-			unset($envd[$table]);
570
-		}
571
-	}
572
-
573
-	return $envd;
559
+    foreach ($envd as $table => $liste) {
560
+        $n = '';
561
+        foreach (explode(',', $liste) as $val) {
562
+            if ($a = intval($val) and $val === strval($a)) {
563
+                $n .= ',' . $val;
564
+            }
565
+        }
566
+        if (strlen($n)) {
567
+            $envd[$table] = $n;
568
+        } else {
569
+            unset($envd[$table]);
570
+        }
571
+    }
572
+
573
+    return $envd;
574 574
 }
575 575
 
576 576
 /**
@@ -589,21 +589,21 @@  discard block
 block discarded – undo
589 589
  *     Opérateur trouvé (SELF ou SUBSELECT) sinon false.
590 590
  **/
591 591
 function match_self($w) {
592
-	if (is_string($w)) {
593
-		return false;
594
-	}
595
-	if (is_array($w)) {
596
-		if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
597
-			return $w;
598
-		}
599
-		foreach (array_filter($w, 'is_array') as $sw) {
600
-			if ($m = match_self($sw)) {
601
-				return $m;
602
-			}
603
-		}
604
-	}
605
-
606
-	return false;
592
+    if (is_string($w)) {
593
+        return false;
594
+    }
595
+    if (is_array($w)) {
596
+        if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
597
+            return $w;
598
+        }
599
+        foreach (array_filter($w, 'is_array') as $sw) {
600
+            if ($m = match_self($sw)) {
601
+                return $m;
602
+            }
603
+        }
604
+    }
605
+
606
+    return false;
607 607
 }
608 608
 
609 609
 /**
@@ -619,16 +619,16 @@  discard block
 block discarded – undo
619 619
  *     est remplacée par son code.
620 620
  **/
621 621
 function remplace_sous_requete($w, $sousrequete) {
622
-	if (is_array($w)) {
623
-		if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
624
-			return $sousrequete;
625
-		}
626
-		foreach ($w as $k => $sw) {
627
-			$w[$k] = remplace_sous_requete($sw, $sousrequete);
628
-		}
629
-	}
630
-
631
-	return $w;
622
+    if (is_array($w)) {
623
+        if (in_array(reset($w), array("SELF", "SUBSELECT"))) {
624
+            return $sousrequete;
625
+        }
626
+        foreach ($w as $k => $sw) {
627
+            $w[$k] = remplace_sous_requete($sw, $sousrequete);
628
+        }
629
+    }
630
+
631
+    return $w;
632 632
 }
633 633
 
634 634
 /**
@@ -642,17 +642,17 @@  discard block
 block discarded – undo
642 642
  *     - Conditions avec des sous requêtes
643 643
  **/
644 644
 function trouver_sous_requetes($where) {
645
-	$where_simples = array();
646
-	$where_sous = array();
647
-	foreach ($where as $k => $w) {
648
-		if (match_self($w)) {
649
-			$where_sous[$k] = $w;
650
-		} else {
651
-			$where_simples[$k] = $w;
652
-		}
653
-	}
654
-
655
-	return array($where_simples, $where_sous);
645
+    $where_simples = array();
646
+    $where_sous = array();
647
+    foreach ($where as $k => $w) {
648
+        if (match_self($w)) {
649
+            $where_sous[$k] = $w;
650
+        } else {
651
+            $where_simples[$k] = $w;
652
+        }
653
+    }
654
+
655
+    return array($where_simples, $where_sous);
656 656
 }
657 657
 
658 658
 
@@ -678,263 +678,263 @@  discard block
 block discarded – undo
678 678
  * @return resource
679 679
  */
680 680
 function calculer_select(
681
-	$select = array(),
682
-	$from = array(),
683
-	$from_type = array(),
684
-	$where = array(),
685
-	$join = array(),
686
-	$groupby = array(),
687
-	$orderby = array(),
688
-	$limit = '',
689
-	$having = array(),
690
-	$table = '',
691
-	$id = '',
692
-	$serveur = '',
693
-	$requeter = true
681
+    $select = array(),
682
+    $from = array(),
683
+    $from_type = array(),
684
+    $where = array(),
685
+    $join = array(),
686
+    $groupby = array(),
687
+    $orderby = array(),
688
+    $limit = '',
689
+    $having = array(),
690
+    $table = '',
691
+    $id = '',
692
+    $serveur = '',
693
+    $requeter = true
694 694
 ) {
695 695
 
696
-	// retirer les criteres vides:
697
-	// {X ?} avec X absent de l'URL
698
-	// {par #ENV{X}} avec X absent de l'URL
699
-	// IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
700
-	$menage = false;
701
-	foreach ($where as $k => $v) {
702
-		if (is_array($v)) {
703
-			if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
704
-				$op = false;
705
-			} elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
706
-				$op = false;
707
-			} else {
708
-				$op = $v[0] ? $v[0] : $v;
709
-			}
710
-		} else {
711
-			$op = $v;
712
-		}
713
-		if ((!$op) or ($op == 1) or ($op == '0=0')) {
714
-			unset($where[$k]);
715
-			$menage = true;
716
-		}
717
-	}
718
-
719
-	// evacuer les eventuels groupby vide issus d'un calcul dynamique
720
-	$groupby = array_diff($groupby, array(''));
721
-
722
-	// remplacer les sous requetes recursives au calcul
723
-	list($where_simples, $where_sous) = trouver_sous_requetes($where);
724
-	foreach ($where_sous as $k => $w) {
725
-		$menage = true;
726
-		// on recupere la sous requete 
727
-		$sous = match_self($w);
728
-		if ($sous[0] == 'SELF') {
729
-			// c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
730
-			array_push($where_simples, $sous[2]);
731
-			$wheresub = array(
732
-				$sous[2],
733
-				'0=0'
734
-			); // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
735
-			$jsub = $join;
736
-			// trouver les jointures utiles a
737
-			// reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
738
-			// ie L1.objet='article'
739
-			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
740
-			$i = 0;
741
-			do {
742
-				$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
743
-						array($sous[1] . " AS id"),
744
-						$from,
745
-						$from_type,
746
-						$wheresub,
747
-						$jsub,
748
-						array(), array(), '',
749
-						$having, $table, $id, $serveur, false) . ")");
750
-				if (!$i) {
751
-					$i = 1;
752
-					$wherestring = calculer_where_to_string($where[$k]);
753
-					foreach ($join as $cle => $wj) {
754
-						if (count($wj) == 4
755
-							and strpos($wherestring, "{$cle}.") !== false
756
-						) {
757
-							$i = 0;
758
-							$wheresub[] = $wj[3];
759
-							unset($jsub[$cle][3]);
760
-						}
761
-					}
762
-				}
763
-			} while ($i++ < 1);
764
-		}
765
-		if ($sous[0] == 'SUBSELECT') {
766
-			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
767
-			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
768
-			$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
769
-					$sous[1], # select
770
-					$sous[2], #from
771
-					array(), #from_type
772
-					$sous[3] ? (is_array($sous[3]) ? $sous[3] : array($sous[3])) : array(),
773
-					#where, qui peut etre de la forme string comme dans sql_select
774
-					array(), #join
775
-					$sous[4] ? $sous[4] : array(), #groupby
776
-					$sous[5] ? $sous[5] : array(), #orderby
777
-					$sous[6], #limit
778
-					$sous[7] ? $sous[7] : array(), #having
779
-					$table, $id, $serveur, false
780
-				) . ")");
781
-		}
782
-		array_pop($where_simples);
783
-	}
784
-
785
-	foreach ($having as $k => $v) {
786
-		if ((!$v) or ($v == 1) or ($v == '0=0')) {
787
-			unset($having[$k]);
788
-		}
789
-	}
790
-
791
-	// Installer les jointures.
792
-	// Retirer celles seulement utiles aux criteres finalement absents mais
793
-	// parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
794
-	// si elle est seulement utile a Ln+1 elle meme inutile
795
-
796
-	$afrom = array();
797
-	$equiv = array();
798
-	$k = count($join);
799
-	foreach (array_reverse($join, true) as $cledef => $j) {
800
-		$cle = $cledef;
801
-		// le format de join est :
802
-		// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
803
-		$join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
804
-		if (count($join[$cle]) == 2) {
805
-			$join[$cle][] = $join[$cle][1];
806
-		}
807
-		if (count($join[$cle]) == 3) {
808
-			$join[$cle][] = '';
809
-		}
810
-		list($t, $c, $carr, $and) = $join[$cle];
811
-		// si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
812
-		// pour compat avec ancienne convention
813
-		if (is_numeric($cle)) {
814
-			$cle = "L$k";
815
-		}
816
-		$cle_where_lie = "JOIN-$cle";
817
-		if (!$menage
818
-			or isset($afrom[$cle])
819
-			or calculer_jointnul($cle, $select)
820
-			or calculer_jointnul($cle, array_diff_key($join, array($cle => $join[$cle])))
821
-			or calculer_jointnul($cle, $having)
822
-			or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
823
-		) {
824
-			// corriger les references non explicites dans select
825
-			// ou groupby
826
-			foreach ($select as $i => $s) {
827
-				if ($s == $c) {
828
-					$select[$i] = "$cle.$c AS $c";
829
-					break;
830
-				}
831
-			}
832
-			foreach ($groupby as $i => $g) {
833
-				if ($g == $c) {
834
-					$groupby[$i] = "$cle.$c";
835
-					break;
836
-				}
837
-			}
838
-			// on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
839
-			// sans recours a preg_match
840
-			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
841
-			$afrom[$t][$cle] = array(
842
-				"\n" .
843
-				(isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN",
844
-				$from[$cle],
845
-				"AS $cle",
846
-				"ON (",
847
-				"$cle.$c",
848
-				"=",
849
-				"$t.$carr",
850
-				($and ? "AND " . $and : "") .
851
-				")"
852
-			);
853
-			if (isset($afrom[$cle])) {
854
-				$afrom[$t] = $afrom[$t] + $afrom[$cle];
855
-				unset($afrom[$cle]);
856
-			}
857
-			$equiv[] = $carr;
858
-		} else {
859
-			unset($join[$cledef]);
860
-			if (isset($where_simples[$cle_where_lie])) {
861
-				unset($where_simples[$cle_where_lie]);
862
-				unset($where[$cle_where_lie]);
863
-			}
864
-		}
865
-		unset($from[$cle]);
866
-		$k--;
867
-	}
868
-
869
-	if (count($afrom)) {
870
-		// Regarder si la table principale ne sert finalement a rien comme dans
871
-		//<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
872
-		//<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
873
-		//<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
874
-		// ou dans
875
-		//<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
876
-		// qui comporte plusieurs jointures
877
-		// ou dans
878
-		// <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
879
-		// <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
880
-		// penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
881
-		// <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
882
-		// penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
883
-		// <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
884
-
885
-		$t = key($from);
886
-		$c = current($from);
887
-		reset($from);
888
-		$e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
889
-		if (!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
890
-				calculer_jointnul($t, $select, $e) or
891
-				calculer_jointnul($t, $join, $e) or
892
-				calculer_jointnul($t, $where, $e) or
893
-				calculer_jointnul($t, $orderby, $e) or
894
-				calculer_jointnul($t, $groupby, $e) or
895
-				calculer_jointnul($t, $having, $e))
896
-			&& count($afrom[$t])
897
-		) {
898
-			$nfrom = reset($afrom[$t]);
899
-			$nt = key($afrom[$t]);
900
-			unset($from[$t]);
901
-			$from[$nt] = $nfrom[1];
902
-			unset($afrom[$t][$nt]);
903
-			$afrom[$nt] = $afrom[$t];
904
-			unset($afrom[$t]);
905
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
906
-			$t = $nfrom[4];
907
-			$alias = "";
908
-			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
909
-			$oldcle = explode('.', $nfrom[6]);
910
-			$oldcle = end($oldcle);
911
-			$newcle = explode('.', $nfrom[4]);
912
-			$newcle = end($newcle);
913
-			if ($newcle != $oldcle) {
914
-				// si l'ancienne cle etait deja dans le select avec un AS
915
-				// reprendre simplement ce AS
916
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
917
-				if (preg_match($as, implode(',', $select), $m)) {
918
-					$alias = "";
919
-				} else {
920
-					$alias = ", " . $nfrom[4] . " AS $oldcle";
921
-				}
922
-			}
923
-			$select = remplacer_jointnul($t . $alias, $select, $e);
924
-			$join = remplacer_jointnul($t, $join, $e);
925
-			$where = remplacer_jointnul($t, $where, $e);
926
-			$having = remplacer_jointnul($t, $having, $e);
927
-			$groupby = remplacer_jointnul($t, $groupby, $e);
928
-			$orderby = remplacer_jointnul($t, $orderby, $e);
929
-		}
930
-		$from = reinjecte_joint($afrom, $from);
931
-	}
932
-	$GLOBALS['debug']['aucasou'] = array($table, $id, $serveur, $requeter);
933
-	$r = sql_select($select, $from, $where,
934
-		$groupby, array_filter($orderby), $limit, $having, $serveur, $requeter);
935
-	unset($GLOBALS['debug']['aucasou']);
936
-
937
-	return $r;
696
+    // retirer les criteres vides:
697
+    // {X ?} avec X absent de l'URL
698
+    // {par #ENV{X}} avec X absent de l'URL
699
+    // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
700
+    $menage = false;
701
+    foreach ($where as $k => $v) {
702
+        if (is_array($v)) {
703
+            if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
704
+                $op = false;
705
+            } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
706
+                $op = false;
707
+            } else {
708
+                $op = $v[0] ? $v[0] : $v;
709
+            }
710
+        } else {
711
+            $op = $v;
712
+        }
713
+        if ((!$op) or ($op == 1) or ($op == '0=0')) {
714
+            unset($where[$k]);
715
+            $menage = true;
716
+        }
717
+    }
718
+
719
+    // evacuer les eventuels groupby vide issus d'un calcul dynamique
720
+    $groupby = array_diff($groupby, array(''));
721
+
722
+    // remplacer les sous requetes recursives au calcul
723
+    list($where_simples, $where_sous) = trouver_sous_requetes($where);
724
+    foreach ($where_sous as $k => $w) {
725
+        $menage = true;
726
+        // on recupere la sous requete 
727
+        $sous = match_self($w);
728
+        if ($sous[0] == 'SELF') {
729
+            // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
730
+            array_push($where_simples, $sous[2]);
731
+            $wheresub = array(
732
+                $sous[2],
733
+                '0=0'
734
+            ); // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
735
+            $jsub = $join;
736
+            // trouver les jointures utiles a
737
+            // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
738
+            // ie L1.objet='article'
739
+            // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
740
+            $i = 0;
741
+            do {
742
+                $where[$k] = remplace_sous_requete($w, "(" . calculer_select(
743
+                        array($sous[1] . " AS id"),
744
+                        $from,
745
+                        $from_type,
746
+                        $wheresub,
747
+                        $jsub,
748
+                        array(), array(), '',
749
+                        $having, $table, $id, $serveur, false) . ")");
750
+                if (!$i) {
751
+                    $i = 1;
752
+                    $wherestring = calculer_where_to_string($where[$k]);
753
+                    foreach ($join as $cle => $wj) {
754
+                        if (count($wj) == 4
755
+                            and strpos($wherestring, "{$cle}.") !== false
756
+                        ) {
757
+                            $i = 0;
758
+                            $wheresub[] = $wj[3];
759
+                            unset($jsub[$cle][3]);
760
+                        }
761
+                    }
762
+                }
763
+            } while ($i++ < 1);
764
+        }
765
+        if ($sous[0] == 'SUBSELECT') {
766
+            // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
767
+            array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
768
+            $where[$k] = remplace_sous_requete($w, "(" . calculer_select(
769
+                    $sous[1], # select
770
+                    $sous[2], #from
771
+                    array(), #from_type
772
+                    $sous[3] ? (is_array($sous[3]) ? $sous[3] : array($sous[3])) : array(),
773
+                    #where, qui peut etre de la forme string comme dans sql_select
774
+                    array(), #join
775
+                    $sous[4] ? $sous[4] : array(), #groupby
776
+                    $sous[5] ? $sous[5] : array(), #orderby
777
+                    $sous[6], #limit
778
+                    $sous[7] ? $sous[7] : array(), #having
779
+                    $table, $id, $serveur, false
780
+                ) . ")");
781
+        }
782
+        array_pop($where_simples);
783
+    }
784
+
785
+    foreach ($having as $k => $v) {
786
+        if ((!$v) or ($v == 1) or ($v == '0=0')) {
787
+            unset($having[$k]);
788
+        }
789
+    }
790
+
791
+    // Installer les jointures.
792
+    // Retirer celles seulement utiles aux criteres finalement absents mais
793
+    // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
794
+    // si elle est seulement utile a Ln+1 elle meme inutile
795
+
796
+    $afrom = array();
797
+    $equiv = array();
798
+    $k = count($join);
799
+    foreach (array_reverse($join, true) as $cledef => $j) {
800
+        $cle = $cledef;
801
+        // le format de join est :
802
+        // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
803
+        $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
804
+        if (count($join[$cle]) == 2) {
805
+            $join[$cle][] = $join[$cle][1];
806
+        }
807
+        if (count($join[$cle]) == 3) {
808
+            $join[$cle][] = '';
809
+        }
810
+        list($t, $c, $carr, $and) = $join[$cle];
811
+        // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
812
+        // pour compat avec ancienne convention
813
+        if (is_numeric($cle)) {
814
+            $cle = "L$k";
815
+        }
816
+        $cle_where_lie = "JOIN-$cle";
817
+        if (!$menage
818
+            or isset($afrom[$cle])
819
+            or calculer_jointnul($cle, $select)
820
+            or calculer_jointnul($cle, array_diff_key($join, array($cle => $join[$cle])))
821
+            or calculer_jointnul($cle, $having)
822
+            or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
823
+        ) {
824
+            // corriger les references non explicites dans select
825
+            // ou groupby
826
+            foreach ($select as $i => $s) {
827
+                if ($s == $c) {
828
+                    $select[$i] = "$cle.$c AS $c";
829
+                    break;
830
+                }
831
+            }
832
+            foreach ($groupby as $i => $g) {
833
+                if ($g == $c) {
834
+                    $groupby[$i] = "$cle.$c";
835
+                    break;
836
+                }
837
+            }
838
+            // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
839
+            // sans recours a preg_match
840
+            // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
841
+            $afrom[$t][$cle] = array(
842
+                "\n" .
843
+                (isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN",
844
+                $from[$cle],
845
+                "AS $cle",
846
+                "ON (",
847
+                "$cle.$c",
848
+                "=",
849
+                "$t.$carr",
850
+                ($and ? "AND " . $and : "") .
851
+                ")"
852
+            );
853
+            if (isset($afrom[$cle])) {
854
+                $afrom[$t] = $afrom[$t] + $afrom[$cle];
855
+                unset($afrom[$cle]);
856
+            }
857
+            $equiv[] = $carr;
858
+        } else {
859
+            unset($join[$cledef]);
860
+            if (isset($where_simples[$cle_where_lie])) {
861
+                unset($where_simples[$cle_where_lie]);
862
+                unset($where[$cle_where_lie]);
863
+            }
864
+        }
865
+        unset($from[$cle]);
866
+        $k--;
867
+    }
868
+
869
+    if (count($afrom)) {
870
+        // Regarder si la table principale ne sert finalement a rien comme dans
871
+        //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
872
+        //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
873
+        //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
874
+        // ou dans
875
+        //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
876
+        // qui comporte plusieurs jointures
877
+        // ou dans
878
+        // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
879
+        // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
880
+        // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
881
+        // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
882
+        // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
883
+        // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
884
+
885
+        $t = key($from);
886
+        $c = current($from);
887
+        reset($from);
888
+        $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
889
+        if (!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
890
+                calculer_jointnul($t, $select, $e) or
891
+                calculer_jointnul($t, $join, $e) or
892
+                calculer_jointnul($t, $where, $e) or
893
+                calculer_jointnul($t, $orderby, $e) or
894
+                calculer_jointnul($t, $groupby, $e) or
895
+                calculer_jointnul($t, $having, $e))
896
+            && count($afrom[$t])
897
+        ) {
898
+            $nfrom = reset($afrom[$t]);
899
+            $nt = key($afrom[$t]);
900
+            unset($from[$t]);
901
+            $from[$nt] = $nfrom[1];
902
+            unset($afrom[$t][$nt]);
903
+            $afrom[$nt] = $afrom[$t];
904
+            unset($afrom[$t]);
905
+            $e = '/\b' . preg_quote($nfrom[6]) . '\b/';
906
+            $t = $nfrom[4];
907
+            $alias = "";
908
+            // verifier que les deux cles sont homonymes, sinon installer un alias dans le select
909
+            $oldcle = explode('.', $nfrom[6]);
910
+            $oldcle = end($oldcle);
911
+            $newcle = explode('.', $nfrom[4]);
912
+            $newcle = end($newcle);
913
+            if ($newcle != $oldcle) {
914
+                // si l'ancienne cle etait deja dans le select avec un AS
915
+                // reprendre simplement ce AS
916
+                $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
917
+                if (preg_match($as, implode(',', $select), $m)) {
918
+                    $alias = "";
919
+                } else {
920
+                    $alias = ", " . $nfrom[4] . " AS $oldcle";
921
+                }
922
+            }
923
+            $select = remplacer_jointnul($t . $alias, $select, $e);
924
+            $join = remplacer_jointnul($t, $join, $e);
925
+            $where = remplacer_jointnul($t, $where, $e);
926
+            $having = remplacer_jointnul($t, $having, $e);
927
+            $groupby = remplacer_jointnul($t, $groupby, $e);
928
+            $orderby = remplacer_jointnul($t, $orderby, $e);
929
+        }
930
+        $from = reinjecte_joint($afrom, $from);
931
+    }
932
+    $GLOBALS['debug']['aucasou'] = array($table, $id, $serveur, $requeter);
933
+    $r = sql_select($select, $from, $where,
934
+        $groupby, array_filter($orderby), $limit, $having, $serveur, $requeter);
935
+    unset($GLOBALS['debug']['aucasou']);
936
+
937
+    return $r;
938 938
 }
939 939
 
940 940
 /**
@@ -945,20 +945,20 @@  discard block
 block discarded – undo
945 945
  * @return string
946 946
  */
947 947
 function calculer_where_to_string($v, $join = 'AND') {
948
-	if (empty($v)) {
949
-		return '';
950
-	}
951
-
952
-	if (!is_array($v)) {
953
-		return $v;
954
-	} else {
955
-		$exp = "";
956
-		if (strtoupper($join) === 'AND') {
957
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
958
-		} else {
959
-			return $exp . join($join, $v);
960
-		}
961
-	}
948
+    if (empty($v)) {
949
+        return '';
950
+    }
951
+
952
+    if (!is_array($v)) {
953
+        return $v;
954
+    } else {
955
+        $exp = "";
956
+        if (strtoupper($join) === 'AND') {
957
+            return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
958
+        } else {
959
+            return $exp . join($join, $v);
960
+        }
961
+    }
962 962
 }
963 963
 
964 964
 
@@ -966,62 +966,62 @@  discard block
 block discarded – undo
966 966
 
967 967
 // https://code.spip.net/@calculer_jointnul
968 968
 function calculer_jointnul($cle, $exp, $equiv = '') {
969
-	if (!is_array($exp)) {
970
-		if ($equiv) {
971
-			$exp = preg_replace($equiv, '', $exp);
972
-		}
973
-
974
-		return preg_match("/\\b$cle\\./", $exp);
975
-	} else {
976
-		foreach ($exp as $v) {
977
-			if (calculer_jointnul($cle, $v, $equiv)) {
978
-				return true;
979
-			}
980
-		}
981
-
982
-		return false;
983
-	}
969
+    if (!is_array($exp)) {
970
+        if ($equiv) {
971
+            $exp = preg_replace($equiv, '', $exp);
972
+        }
973
+
974
+        return preg_match("/\\b$cle\\./", $exp);
975
+    } else {
976
+        foreach ($exp as $v) {
977
+            if (calculer_jointnul($cle, $v, $equiv)) {
978
+                return true;
979
+            }
980
+        }
981
+
982
+        return false;
983
+    }
984 984
 }
985 985
 
986 986
 // https://code.spip.net/@reinjecte_joint
987 987
 function reinjecte_joint($afrom, $from) {
988
-	$from_synth = array();
989
-	foreach ($from as $k => $v) {
990
-		$from_synth[$k] = $from[$k];
991
-		if (isset($afrom[$k])) {
992
-			foreach ($afrom[$k] as $kk => $vv) {
993
-				$afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
994
-			}
995
-			$from_synth["$k@"] = implode(' ', $afrom[$k]);
996
-			unset($afrom[$k]);
997
-		}
998
-	}
999
-
1000
-	return $from_synth;
988
+    $from_synth = array();
989
+    foreach ($from as $k => $v) {
990
+        $from_synth[$k] = $from[$k];
991
+        if (isset($afrom[$k])) {
992
+            foreach ($afrom[$k] as $kk => $vv) {
993
+                $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
994
+            }
995
+            $from_synth["$k@"] = implode(' ', $afrom[$k]);
996
+            unset($afrom[$k]);
997
+        }
998
+    }
999
+
1000
+    return $from_synth;
1001 1001
 }
1002 1002
 
1003 1003
 // https://code.spip.net/@remplacer_jointnul
1004 1004
 function remplacer_jointnul($cle, $exp, $equiv = '') {
1005
-	if (!is_array($exp)) {
1006
-		return preg_replace($equiv, $cle, $exp);
1007
-	} else {
1008
-		foreach ($exp as $k => $v) {
1009
-			$exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1010
-		}
1011
-
1012
-		return $exp;
1013
-	}
1005
+    if (!is_array($exp)) {
1006
+        return preg_replace($equiv, $cle, $exp);
1007
+    } else {
1008
+        foreach ($exp as $k => $v) {
1009
+            $exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1010
+        }
1011
+
1012
+        return $exp;
1013
+    }
1014 1014
 }
1015 1015
 
1016 1016
 // calcul du nom du squelette
1017 1017
 // https://code.spip.net/@calculer_nom_fonction_squel
1018 1018
 function calculer_nom_fonction_squel($skel, $mime_type = 'html', $connect = '') {
1019
-	// ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1020
-	if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1021
-		$skel = substr($skel, strlen(_DIR_RACINE));
1022
-	}
1023
-
1024
-	return $mime_type
1025
-	. (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_'
1026
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1019
+    // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1020
+    if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1021
+        $skel = substr($skel, strlen(_DIR_RACINE));
1022
+    }
1023
+
1024
+    return $mime_type
1025
+    . (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_'
1026
+    . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1027 1027
 }
Please login to merge, or discard this patch.
Spacing   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -54,7 +54,7 @@  discard block
 block discarded – undo
54 54
 		$GLOBALS['debug_objets']['courant'] = $nom;
55 55
 	}
56 56
 
57
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
57
+	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true).$nom.'.php';
58 58
 
59 59
 	// si squelette est deja compile et perenne, le charger
60 60
 	if (!squelette_obsolete($phpfile, $source)) {
@@ -67,7 +67,7 @@  discard block
 block discarded – undo
67 67
 		#}
68 68
 	}
69 69
 
70
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
70
+	if (file_exists($lib = $squelette.'_fonctions'.'.php')) {
71 71
 		include_once $lib;
72 72
 	}
73 73
 
@@ -105,7 +105,7 @@  discard block
 block discarded – undo
105 105
 			}
106 106
 		} catch (\ParseError $e) {
107 107
 			// Code syntaxiquement faux (critere etc mal programme')
108
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
108
+			$msg = _T('zbug_erreur_compilation').' | Line '.$e->getLine().' : '.$e->getMessage();
109 109
 			erreur_squelette($msg, $boucle);
110 110
 			// continuer pour trouver d'autres fautes eventuelles
111 111
 			// mais prevenir que c'est mort
@@ -134,7 +134,7 @@  discard block
 block discarded – undo
134 134
 	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
135 135
 
136 136
 		// Tracer ce qui vient d'etre compile
137
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
137
+		$GLOBALS['debug_objets']['code'][$nom.'tout'] = $code;
138 138
 
139 139
 		// si c'est ce que demande le debusqueur, lui passer la main
140 140
 		if ($GLOBALS['debug_objets']['sourcefile']
@@ -156,13 +156,13 @@  discard block
 block discarded – undo
156 156
 		$code = "
157 157
 /*
158 158
  * Squelette : $sourcefile
159
- * Date :      " . gmdate("D, d M Y H:i:s", @filemtime($sourcefile)) . " GMT
160
- * Compile :   " . gmdate("D, d M Y H:i:s", time()) . " GMT
161
- * " . (!$boucles ? "Pas de boucle" : ("Boucles :   " . $noms)) . "
159
+ * Date :      ".gmdate("D, d M Y H:i:s", @filemtime($sourcefile))." GMT
160
+ * Compile :   " . gmdate("D, d M Y H:i:s", time())." GMT
161
+ * " . (!$boucles ? "Pas de boucle" : ("Boucles :   ".$noms))."
162 162
  */ ";
163 163
 	}
164 164
 
165
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
165
+	$code = '<'."?php\n".$code.join('', $boucles)."\n?".'>';
166 166
 	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
167 167
 		ecrire_fichier($phpfile, $code);
168 168
 	}
@@ -222,7 +222,7 @@  discard block
 block discarded – undo
222 222
 			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
223 223
 
224 224
 			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
225
-				$headers[$j] .= "|" . $r[3];
225
+				$headers[$j] .= "|".$r[3];
226 226
 			} else {
227 227
 				$headers[$j] = $r[3];
228 228
 			}
@@ -230,10 +230,10 @@  discard block
 block discarded – undo
230 230
 	}
231 231
 	// S'agit-il d'un resultat constant ou contenant du code php
232 232
 	$process_ins = (
233
-		strpos($corps, '<' . '?') === false
233
+		strpos($corps, '<'.'?') === false
234 234
 		or
235
-		(strpos($corps, '<' . '?xml') !== false and
236
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
235
+		(strpos($corps, '<'.'?xml') !== false and
236
+			strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false)
237 237
 	)
238 238
 		? 'html'
239 239
 		: 'php';
@@ -262,10 +262,10 @@  discard block
 block discarded – undo
262 262
 
263 263
 		if ($process_ins == 'html') {
264 264
 			$skel['process_ins'] = (
265
-				strpos($corps, '<' . '?') === false
265
+				strpos($corps, '<'.'?') === false
266 266
 				or
267
-				(strpos($corps, '<' . '?xml') !== false and
268
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
267
+				(strpos($corps, '<'.'?xml') !== false and
268
+					strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false)
269 269
 			)
270 270
 				? 'html'
271 271
 				: 'php';
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
 //
284 284
 
285 285
 /** Code PHP pour inclure une balise dynamique à l'exécution d'une page */
286
-define('CODE_INCLURE_BALISE', '<' . '?php 
286
+define('CODE_INCLURE_BALISE', '<'.'?php 
287 287
 include_once("%s");
288 288
 if ($lang_select = "%s") $lang_select = lang_select($lang_select);
289 289
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
@@ -310,7 +310,7 @@  discard block
 block discarded – undo
310 310
  **/
311 311
 function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
312 312
 	if (strncmp($file, "/", 1) !== 0) {
313
-		$file = './" . _DIR_RACINE . "' . $file;
313
+		$file = './" . _DIR_RACINE . "'.$file;
314 314
 	}
315 315
 
316 316
 	$lang = $context_compil[4];
@@ -351,18 +351,18 @@  discard block
 block discarded – undo
351 351
 
352 352
 	if (is_object($v)) {
353 353
 		if (PHP_VERSION_ID < 73000 and $v instanceof \stdClass) {
354
-			return "(object) " . var_export((array) $v, true);
354
+			return "(object) ".var_export((array) $v, true);
355 355
 		}
356 356
 		return var_export($v, true);
357 357
 	} elseif (!is_array($v)) {
358
-		return "'" . texte_script($v) . "'";
358
+		return "'".texte_script($v)."'";
359 359
 	} else {
360 360
 		$out = array();
361 361
 		foreach ($v as $k => $val) {
362
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
362
+			$out [] = argumenter_squelette($k).'=>'.argumenter_squelette($val);
363 363
 		}
364 364
 
365
-		return 'array(' . join(", ", $out) . ')';
365
+		return 'array('.join(", ", $out).')';
366 366
 	}
367 367
 }
368 368
 
@@ -438,7 +438,7 @@  discard block
 block discarded – undo
438 438
 	}
439 439
 
440 440
 	// Y a-t-il une fonction de traitement des arguments ?
441
-	$f = 'balise_' . $nom_balise . '_stat';
441
+	$f = 'balise_'.$nom_balise.'_stat';
442 442
 
443 443
 	$r = !function_exists($f) ? $args : $f($args, $context_compil);
444 444
 
@@ -448,18 +448,18 @@  discard block
 block discarded – undo
448 448
 
449 449
 	// verifier que la fonction dyn est la, 
450 450
 	// sinon se replier sur la generique si elle existe
451
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
451
+	if (!function_exists('balise_'.$nom_balise.'_dyn')) {
452 452
 		if (
453 453
 			$balise_generique = chercher_balise_generique($nom)
454 454
 			and $nom_balise_generique = $balise_generique['nom_generique']
455
-			and $file = include_spip("balise/" . strtolower($nom_balise_generique))
456
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
455
+			and $file = include_spip("balise/".strtolower($nom_balise_generique))
456
+			and function_exists('balise_'.$nom_balise_generique.'_dyn')
457 457
 		) {
458 458
 			// et lui injecter en premier arg le nom de la balise 
459 459
 			array_unshift($r, $nom);
460 460
 			$nom_balise = $nom_balise_generique;
461 461
 			if (!_DIR_RESTREINT) {
462
-				$file = _DIR_RESTREINT_ABS . $file;
462
+				$file = _DIR_RESTREINT_ABS.$file;
463 463
 			}
464 464
 		} else {
465 465
 			$msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom));
@@ -560,7 +560,7 @@  discard block
 block discarded – undo
560 560
 		$n = '';
561 561
 		foreach (explode(',', $liste) as $val) {
562 562
 			if ($a = intval($val) and $val === strval($a)) {
563
-				$n .= ',' . $val;
563
+				$n .= ','.$val;
564 564
 			}
565 565
 		}
566 566
 		if (strlen($n)) {
@@ -739,14 +739,14 @@  discard block
 block discarded – undo
739 739
 			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
740 740
 			$i = 0;
741 741
 			do {
742
-				$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
743
-						array($sous[1] . " AS id"),
742
+				$where[$k] = remplace_sous_requete($w, "(".calculer_select(
743
+						array($sous[1]." AS id"),
744 744
 						$from,
745 745
 						$from_type,
746 746
 						$wheresub,
747 747
 						$jsub,
748 748
 						array(), array(), '',
749
-						$having, $table, $id, $serveur, false) . ")");
749
+						$having, $table, $id, $serveur, false).")");
750 750
 				if (!$i) {
751 751
 					$i = 1;
752 752
 					$wherestring = calculer_where_to_string($where[$k]);
@@ -765,7 +765,7 @@  discard block
 block discarded – undo
765 765
 		if ($sous[0] == 'SUBSELECT') {
766 766
 			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
767 767
 			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
768
-			$where[$k] = remplace_sous_requete($w, "(" . calculer_select(
768
+			$where[$k] = remplace_sous_requete($w, "(".calculer_select(
769 769
 					$sous[1], # select
770 770
 					$sous[2], #from
771 771
 					array(), #from_type
@@ -777,7 +777,7 @@  discard block
 block discarded – undo
777 777
 					$sous[6], #limit
778 778
 					$sous[7] ? $sous[7] : array(), #having
779 779
 					$table, $id, $serveur, false
780
-				) . ")");
780
+				).")");
781 781
 		}
782 782
 		array_pop($where_simples);
783 783
 	}
@@ -839,15 +839,15 @@  discard block
 block discarded – undo
839 839
 			// sans recours a preg_match
840 840
 			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
841 841
 			$afrom[$t][$cle] = array(
842
-				"\n" .
843
-				(isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN",
842
+				"\n".
843
+				(isset($from_type[$cle]) ? $from_type[$cle] : "INNER")." JOIN",
844 844
 				$from[$cle],
845 845
 				"AS $cle",
846 846
 				"ON (",
847 847
 				"$cle.$c",
848 848
 				"=",
849 849
 				"$t.$carr",
850
-				($and ? "AND " . $and : "") .
850
+				($and ? "AND ".$and : "").
851 851
 				")"
852 852
 			);
853 853
 			if (isset($afrom[$cle])) {
@@ -885,7 +885,7 @@  discard block
 block discarded – undo
885 885
 		$t = key($from);
886 886
 		$c = current($from);
887 887
 		reset($from);
888
-		$e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
888
+		$e = '/\b('."$t\\.".join("|".$t.'\.', $equiv).')\b/';
889 889
 		if (!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
890 890
 				calculer_jointnul($t, $select, $e) or
891 891
 				calculer_jointnul($t, $join, $e) or
@@ -902,7 +902,7 @@  discard block
 block discarded – undo
902 902
 			unset($afrom[$t][$nt]);
903 903
 			$afrom[$nt] = $afrom[$t];
904 904
 			unset($afrom[$t]);
905
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
905
+			$e = '/\b'.preg_quote($nfrom[6]).'\b/';
906 906
 			$t = $nfrom[4];
907 907
 			$alias = "";
908 908
 			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
@@ -913,14 +913,14 @@  discard block
 block discarded – undo
913 913
 			if ($newcle != $oldcle) {
914 914
 				// si l'ancienne cle etait deja dans le select avec un AS
915 915
 				// reprendre simplement ce AS
916
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
916
+				$as = '/\b'.preg_quote($nfrom[6]).'\s+(AS\s+\w+)\b/';
917 917
 				if (preg_match($as, implode(',', $select), $m)) {
918 918
 					$alias = "";
919 919
 				} else {
920
-					$alias = ", " . $nfrom[4] . " AS $oldcle";
920
+					$alias = ", ".$nfrom[4]." AS $oldcle";
921 921
 				}
922 922
 			}
923
-			$select = remplacer_jointnul($t . $alias, $select, $e);
923
+			$select = remplacer_jointnul($t.$alias, $select, $e);
924 924
 			$join = remplacer_jointnul($t, $join, $e);
925 925
 			$where = remplacer_jointnul($t, $where, $e);
926 926
 			$having = remplacer_jointnul($t, $having, $e);
@@ -954,9 +954,9 @@  discard block
 block discarded – undo
954 954
 	} else {
955 955
 		$exp = "";
956 956
 		if (strtoupper($join) === 'AND') {
957
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
957
+			return $exp.join(" $join ", array_map('calculer_where_to_string', $v));
958 958
 		} else {
959
-			return $exp . join($join, $v);
959
+			return $exp.join($join, $v);
960 960
 		}
961 961
 	}
962 962
 }
@@ -1022,6 +1022,6 @@  discard block
 block discarded – undo
1022 1022
 	}
1023 1023
 
1024 1024
 	return $mime_type
1025
-	. (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_'
1026
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1025
+	. (!$connect ? '' : preg_replace('/\W/', "_", $connect)).'_'
1026
+	. md5($GLOBALS['spip_version_code'].' * '.$skel.(isset($GLOBALS['marqueur_skel']) ? '*'.$GLOBALS['marqueur_skel'] : ''));
1027 1027
 }
Please login to merge, or discard this patch.
ecrire/public/references.php 1 patch
Indentation   +488 added lines, -488 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Compilateur\References
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -41,14 +41,14 @@  discard block
 block discarded – undo
41 41
  *     - '' si une référence explicite incorrecte est envoyée
42 42
  */
43 43
 function index_boucle($p) {
44
-	if (strlen($p->nom_boucle)) {
45
-		// retourne l’index explicite demandé s’il existe
46
-		if (!empty($p->boucles[$p->nom_boucle])) {
47
-			return $p->nom_boucle;
48
-		}
49
-		return '';
50
-	} 
51
-	return $p->id_boucle;
44
+    if (strlen($p->nom_boucle)) {
45
+        // retourne l’index explicite demandé s’il existe
46
+        if (!empty($p->boucles[$p->nom_boucle])) {
47
+            return $p->nom_boucle;
48
+        }
49
+        return '';
50
+    } 
51
+    return $p->id_boucle;
52 52
 }
53 53
 
54 54
 
@@ -71,17 +71,17 @@  discard block
 block discarded – undo
71 71
  *     - '' si une référence explicite incorrecte est envoyée
72 72
  */
73 73
 function index_boucle_mere($p) {
74
-	if (strlen($p->nom_boucle)) {
75
-		// retourne l’index explicite demandé s’il existe
76
-		if (!empty($p->boucles[$p->nom_boucle])) {
77
-			return $p->nom_boucle;
78
-		}
79
-		return '';
80
-	} 
81
-	if (!empty($p->descr['id_mere'])) {
82
-		return $p->descr['id_mere'];
83
-	}
84
-	return '';
74
+    if (strlen($p->nom_boucle)) {
75
+        // retourne l’index explicite demandé s’il existe
76
+        if (!empty($p->boucles[$p->nom_boucle])) {
77
+            return $p->nom_boucle;
78
+        }
79
+        return '';
80
+    } 
81
+    if (!empty($p->descr['id_mere'])) {
82
+        return $p->descr['id_mere'];
83
+    }
84
+    return '';
85 85
 }
86 86
 
87 87
 /**
@@ -115,69 +115,69 @@  discard block
 block discarded – undo
115 115
  *     Code PHP pour obtenir le champ SQL
116 116
  */
117 117
 function index_pile(
118
-	$idb,
119
-	$nom_champ,
120
-	&$boucles,
121
-	$explicite = '',
122
-	$defaut = null,
123
-	$remonte_pile = true,
124
-	$select = true
118
+    $idb,
119
+    $nom_champ,
120
+    &$boucles,
121
+    $explicite = '',
122
+    $defaut = null,
123
+    $remonte_pile = true,
124
+    $select = true
125 125
 ) {
126
-	if (!is_string($defaut)) {
127
-		$defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
128
-	}
129
-
130
-	$i = 0;
131
-	if (strlen($explicite)) {
132
-		// Recherche d'un champ dans un etage superieur
133
-		while (($idb !== $explicite) && ($idb !== '')) {
134
-			#	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
135
-			$i++;
136
-			$idb = $boucles[$idb]->id_parent;
137
-		}
138
-	}
139
-
140
-	#	spip_log("Cherche: $nom_champ a partir de '$idb'");
141
-	$nom_champ = strtolower($nom_champ);
142
-	$conditionnel = array();
143
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
144
-	// il y a incoherences qu'il vaut mieux eviter
145
-	while (isset($boucles[$idb])) {
146
-		$joker = true;
147
-		// modifie $joker si tous les champs sont autorisés.
148
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
149
-		// $c = le nom du champ demandé
150
-		list($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
151
-		if ($t) {
152
-			if ($select and !in_array($t, $boucles[$idb]->select)) {
153
-				$boucles[$idb]->select[] = $t;
154
-			}
155
-			$champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
156
-			if (!$joker) {
157
-				return index_compose($conditionnel, $champ);
158
-			}
159
-
160
-			// tant que l'on trouve des tables avec joker, on continue
161
-			// avec la boucle parente et on conditionne à l'exécution
162
-			// la présence du champ. Si le champ existe à l'exécution
163
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
164
-			$conditionnel[] = "isset($champ)?$champ";
165
-		}
166
-
167
-		if ($remonte_pile) {
168
-			#	spip_log("On remonte vers $i");
169
-			// Sinon on remonte d'un cran
170
-			$idb = $boucles[$idb]->id_parent;
171
-			$i++;
172
-		} else {
173
-			$idb = null;
174
-		}
175
-	}
176
-
177
-	#	spip_log("Pas vu $nom_champ");
178
-	// esperons qu'il y sera
179
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
180
-	return index_compose($conditionnel, $defaut);
126
+    if (!is_string($defaut)) {
127
+        $defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']';
128
+    }
129
+
130
+    $i = 0;
131
+    if (strlen($explicite)) {
132
+        // Recherche d'un champ dans un etage superieur
133
+        while (($idb !== $explicite) && ($idb !== '')) {
134
+            #	spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
135
+            $i++;
136
+            $idb = $boucles[$idb]->id_parent;
137
+        }
138
+    }
139
+
140
+    #	spip_log("Cherche: $nom_champ a partir de '$idb'");
141
+    $nom_champ = strtolower($nom_champ);
142
+    $conditionnel = array();
143
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
144
+    // il y a incoherences qu'il vaut mieux eviter
145
+    while (isset($boucles[$idb])) {
146
+        $joker = true;
147
+        // modifie $joker si tous les champs sont autorisés.
148
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
149
+        // $c = le nom du champ demandé
150
+        list($t, $c) = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
151
+        if ($t) {
152
+            if ($select and !in_array($t, $boucles[$idb]->select)) {
153
+                $boucles[$idb]->select[] = $t;
154
+            }
155
+            $champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']';
156
+            if (!$joker) {
157
+                return index_compose($conditionnel, $champ);
158
+            }
159
+
160
+            // tant que l'on trouve des tables avec joker, on continue
161
+            // avec la boucle parente et on conditionne à l'exécution
162
+            // la présence du champ. Si le champ existe à l'exécution
163
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
164
+            $conditionnel[] = "isset($champ)?$champ";
165
+        }
166
+
167
+        if ($remonte_pile) {
168
+            #	spip_log("On remonte vers $i");
169
+            // Sinon on remonte d'un cran
170
+            $idb = $boucles[$idb]->id_parent;
171
+            $i++;
172
+        } else {
173
+            $idb = null;
174
+        }
175
+    }
176
+
177
+    #	spip_log("Pas vu $nom_champ");
178
+    // esperons qu'il y sera
179
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
180
+    return index_compose($conditionnel, $defaut);
181 181
 }
182 182
 
183 183
 /**
@@ -191,12 +191,12 @@  discard block
 block discarded – undo
191 191
  * @return string              Code PHP complet de recherche d'un champ
192 192
  */
193 193
 function index_compose($conditionnel, $defaut) {
194
-	while ($c = array_pop($conditionnel)) {
195
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
196
-		$defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
197
-	}
194
+    while ($c = array_pop($conditionnel)) {
195
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
196
+        $defaut = "($c:(" . ($defaut ? $defaut : "''") . "))";
197
+    }
198 198
 
199
-	return $defaut;
199
+    return $defaut;
200 200
 }
201 201
 
202 202
 /**
@@ -232,74 +232,74 @@  discard block
 block discarded – undo
232 232
  **/
233 233
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
234 234
 
235
-	$r = $boucles[$idb]->type_requete;
236
-	// boucle recursive, c'est foutu...
237
-	if ($r == TYPE_RECURSIF) {
238
-		return array();
239
-	}
240
-	if (!$r) {
241
-		$joker = false; // indiquer a l'appelant
242
-		# continuer pour chercher l'erreur suivante
243
-		return array("'#" . $r . ':' . $nom_champ . "'", '');
244
-	}
245
-
246
-	$desc = $boucles[$idb]->show;
247
-	// le nom du champ est il une exception de la table ? un alias ?
248
-	$excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
249
-	if ($excep) {
250
-		$excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
251
-	}
252
-	if ($excep) {
253
-		$joker = false; // indiquer a l'appelant
254
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
255
-	} // pas d'alias. Le champ existe t'il ?
256
-	else {
257
-		// le champ est réellement présent, on le prend.
258
-		if (isset($desc['field'][$nom_champ])) {
259
-			$t = $boucles[$idb]->id_table;
260
-			$joker = false; // indiquer a l'appelant
261
-			return array("$t.$nom_champ", $nom_champ);
262
-		}
263
-		// Tous les champs sont-ils acceptés ?
264
-		// Si oui, on retourne le champ, et on lève le flag joker
265
-		// C'est le cas des itérateurs DATA qui acceptent tout
266
-		// et testent la présence du champ à l'exécution et non à la compilation
267
-		// car ils ne connaissent pas ici leurs contenus.
268
-		elseif (/*$joker AND */
269
-		isset($desc['field']['*'])
270
-		) {
271
-			$joker = true; // indiquer a l'appelant
272
-			return array($nom_champ, $nom_champ);
273
-		}
274
-		// pas d'alias, pas de champ, pas de joker...
275
-		// tenter via une jointure...
276
-		else {
277
-			$joker = false; // indiquer a l'appelant
278
-			// regarder si le champ est deja dans une jointure existante
279
-			// sinon, si il y a des joitures explicites, la construire
280
-			if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
281
-				if ($boucles[$idb]->jointures_explicites) {
282
-					// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
283
-					// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
284
-					// mais est-ce ce qu'on veut ?
285
-					$jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
286
-					if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
287
-						$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
288
-					}
289
-				}
290
-			}
291
-			if ($t) {
292
-				// si on a trouvé une jointure possible, on fait comme
293
-				// si c'était une exception pour le champ demandé
294
-				return index_exception($boucles[$idb],
295
-					$desc,
296
-					$nom_champ,
297
-					array($t[1]['id_table'], reset($t[2])));
298
-			}
299
-
300
-			return array('', '');
301
-		}
302
-	}
235
+    $r = $boucles[$idb]->type_requete;
236
+    // boucle recursive, c'est foutu...
237
+    if ($r == TYPE_RECURSIF) {
238
+        return array();
239
+    }
240
+    if (!$r) {
241
+        $joker = false; // indiquer a l'appelant
242
+        # continuer pour chercher l'erreur suivante
243
+        return array("'#" . $r . ':' . $nom_champ . "'", '');
244
+    }
245
+
246
+    $desc = $boucles[$idb]->show;
247
+    // le nom du champ est il une exception de la table ? un alias ?
248
+    $excep = isset($GLOBALS['exceptions_des_tables'][$r]) ? $GLOBALS['exceptions_des_tables'][$r] : '';
249
+    if ($excep) {
250
+        $excep = isset($excep[$nom_champ]) ? $excep[$nom_champ] : '';
251
+    }
252
+    if ($excep) {
253
+        $joker = false; // indiquer a l'appelant
254
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
255
+    } // pas d'alias. Le champ existe t'il ?
256
+    else {
257
+        // le champ est réellement présent, on le prend.
258
+        if (isset($desc['field'][$nom_champ])) {
259
+            $t = $boucles[$idb]->id_table;
260
+            $joker = false; // indiquer a l'appelant
261
+            return array("$t.$nom_champ", $nom_champ);
262
+        }
263
+        // Tous les champs sont-ils acceptés ?
264
+        // Si oui, on retourne le champ, et on lève le flag joker
265
+        // C'est le cas des itérateurs DATA qui acceptent tout
266
+        // et testent la présence du champ à l'exécution et non à la compilation
267
+        // car ils ne connaissent pas ici leurs contenus.
268
+        elseif (/*$joker AND */
269
+        isset($desc['field']['*'])
270
+        ) {
271
+            $joker = true; // indiquer a l'appelant
272
+            return array($nom_champ, $nom_champ);
273
+        }
274
+        // pas d'alias, pas de champ, pas de joker...
275
+        // tenter via une jointure...
276
+        else {
277
+            $joker = false; // indiquer a l'appelant
278
+            // regarder si le champ est deja dans une jointure existante
279
+            // sinon, si il y a des joitures explicites, la construire
280
+            if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) {
281
+                if ($boucles[$idb]->jointures_explicites) {
282
+                    // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
283
+                    // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
284
+                    // mais est-ce ce qu'on veut ?
285
+                    $jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites);
286
+                    if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
287
+                        $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
288
+                    }
289
+                }
290
+            }
291
+            if ($t) {
292
+                // si on a trouvé une jointure possible, on fait comme
293
+                // si c'était une exception pour le champ demandé
294
+                return index_exception($boucles[$idb],
295
+                    $desc,
296
+                    $nom_champ,
297
+                    array($t[1]['id_table'], reset($t[2])));
298
+            }
299
+
300
+            return array('', '');
301
+        }
302
+    }
303 303
 }
304 304
 
305 305
 
@@ -327,52 +327,52 @@  discard block
 block discarded – undo
327 327
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
328 328
  **/
329 329
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
330
-	static $trouver_table;
331
-	if (!$trouver_table) {
332
-		$trouver_table = charger_fonction('trouver_table', 'base');
333
-	}
334
-
335
-	if (is_array($excep)) {
336
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
337
-		$t = null;
338
-		if (count($excep) == 3) {
339
-			$index_exception_derogatoire = array_pop($excep);
340
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
341
-		}
342
-		if ($t == null) {
343
-			list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
344
-			$excep = $x;    #PHP5 de droite a gauche !
345
-			$j = $trouver_table($e, $boucle->sql_serveur);
346
-			if (!$j) {
347
-				return array('', '');
348
-			}
349
-			$e = $j['table'];
350
-			if (!$t = array_search($e, $boucle->from)) {
351
-				$k = $j['key']['PRIMARY KEY'];
352
-				if (strpos($k, ',')) {
353
-					$l = (preg_split('/\s*,\s*/', $k));
354
-					$k = $desc['key']['PRIMARY KEY'];
355
-					if (!in_array($k, $l)) {
356
-						spip_log("jointure impossible $e " . join(',', $l));
357
-
358
-						return array('', '');
359
-					}
360
-				}
361
-				$k = array($boucle->id_table, array($e), $k);
362
-				fabrique_jointures($boucle, array($k));
363
-				$t = array_search($e, $boucle->from);
364
-			}
365
-		}
366
-	} else {
367
-		$t = $boucle->id_table;
368
-	}
369
-	// demander a SQL de gerer le synonyme
370
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
371
-	if ($excep != $nom_champ) {
372
-		$excep .= ' AS ' . $nom_champ;
373
-	}
374
-
375
-	return array("$t.$excep", $nom_champ);
330
+    static $trouver_table;
331
+    if (!$trouver_table) {
332
+        $trouver_table = charger_fonction('trouver_table', 'base');
333
+    }
334
+
335
+    if (is_array($excep)) {
336
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
337
+        $t = null;
338
+        if (count($excep) == 3) {
339
+            $index_exception_derogatoire = array_pop($excep);
340
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
341
+        }
342
+        if ($t == null) {
343
+            list($e, $x) = $excep;  #PHP4 affecte de gauche a droite
344
+            $excep = $x;    #PHP5 de droite a gauche !
345
+            $j = $trouver_table($e, $boucle->sql_serveur);
346
+            if (!$j) {
347
+                return array('', '');
348
+            }
349
+            $e = $j['table'];
350
+            if (!$t = array_search($e, $boucle->from)) {
351
+                $k = $j['key']['PRIMARY KEY'];
352
+                if (strpos($k, ',')) {
353
+                    $l = (preg_split('/\s*,\s*/', $k));
354
+                    $k = $desc['key']['PRIMARY KEY'];
355
+                    if (!in_array($k, $l)) {
356
+                        spip_log("jointure impossible $e " . join(',', $l));
357
+
358
+                        return array('', '');
359
+                    }
360
+                }
361
+                $k = array($boucle->id_table, array($e), $k);
362
+                fabrique_jointures($boucle, array($k));
363
+                $t = array_search($e, $boucle->from);
364
+            }
365
+        }
366
+    } else {
367
+        $t = $boucle->id_table;
368
+    }
369
+    // demander a SQL de gerer le synonyme
370
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
371
+    if ($excep != $nom_champ) {
372
+        $excep .= ' AS ' . $nom_champ;
373
+    }
374
+
375
+    return array("$t.$excep", $nom_champ);
376 376
 }
377 377
 
378 378
 /**
@@ -397,7 +397,7 @@  discard block
 block discarded – undo
397 397
  *     Code PHP pour retrouver le champ
398 398
  */
399 399
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
400
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
400
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
401 401
 }
402 402
 
403 403
 
@@ -417,9 +417,9 @@  discard block
 block discarded – undo
417 417
  *     Code PHP pour d'exécution de la balise et de ses filtres
418 418
  **/
419 419
 function calculer_champ($p) {
420
-	$p = calculer_balise($p->nom_champ, $p);
420
+    $p = calculer_balise($p->nom_champ, $p);
421 421
 
422
-	return applique_filtres($p);
422
+    return applique_filtres($p);
423 423
 }
424 424
 
425 425
 
@@ -456,26 +456,26 @@  discard block
 block discarded – undo
456 456
  **/
457 457
 function calculer_balise($nom, $p) {
458 458
 
459
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
460
-	if ($f = charger_fonction($nom, 'balise', true)) {
461
-		$p->balise_calculee = true;
462
-		$res = $f($p);
463
-		if ($res !== null and is_object($res)) {
464
-			return $res;
465
-		}
466
-	}
467
-
468
-	// Certaines des balises comportant un _ sont generiques
469
-	if ($balise_generique = chercher_balise_generique($nom)) {
470
-		$res = $balise_generique['fonction_generique']($p);
471
-		if ($res !== null and is_object($res)) {
472
-			return $res;
473
-		}
474
-	}
475
-
476
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
477
-
478
-	return $f($nom, $p);
459
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
460
+    if ($f = charger_fonction($nom, 'balise', true)) {
461
+        $p->balise_calculee = true;
462
+        $res = $f($p);
463
+        if ($res !== null and is_object($res)) {
464
+            return $res;
465
+        }
466
+    }
467
+
468
+    // Certaines des balises comportant un _ sont generiques
469
+    if ($balise_generique = chercher_balise_generique($nom)) {
470
+        $res = $balise_generique['fonction_generique']($p);
471
+        if ($res !== null and is_object($res)) {
472
+            return $res;
473
+        }
474
+    }
475
+
476
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
477
+
478
+    return $f($nom, $p);
479 479
 }
480 480
 
481 481
 
@@ -503,36 +503,36 @@  discard block
 block discarded – undo
503 503
  **/
504 504
 function calculer_balise_DEFAUT_dist($nom, $p) {
505 505
 
506
-	// ca pourrait etre un champ SQL homonyme,
507
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
508
-
509
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
510
-	// il faut recracher {...} quand ce n'est finalement pas des args
511
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
512
-		$code = addslashes($p->fonctions[0][1]);
513
-		$p->code .= " . '$code'";
514
-	}
515
-
516
-	// ne pas passer le filtre securite sur les id_xxx
517
-	if (strpos($nom, 'ID_') === 0) {
518
-		$p->interdire_scripts = false;
519
-	}
520
-
521
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
522
-	// SI le champ SQL n'est pas trouve
523
-	// ET si la balise a une forme de couleur
524
-	// ET s'il n'y a ni filtre ni etoile
525
-	// ALORS retourner la couleur.
526
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
527
-	if (preg_match("/^[A-F]{1,6}$/i", $nom)
528
-		and !$p->etoile
529
-		and !$p->fonctions
530
-	) {
531
-		$p->code = "'#$nom'";
532
-		$p->interdire_scripts = false;
533
-	}
534
-
535
-	return $p;
506
+    // ca pourrait etre un champ SQL homonyme,
507
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
508
+
509
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
510
+    // il faut recracher {...} quand ce n'est finalement pas des args
511
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
512
+        $code = addslashes($p->fonctions[0][1]);
513
+        $p->code .= " . '$code'";
514
+    }
515
+
516
+    // ne pas passer le filtre securite sur les id_xxx
517
+    if (strpos($nom, 'ID_') === 0) {
518
+        $p->interdire_scripts = false;
519
+    }
520
+
521
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
522
+    // SI le champ SQL n'est pas trouve
523
+    // ET si la balise a une forme de couleur
524
+    // ET s'il n'y a ni filtre ni etoile
525
+    // ALORS retourner la couleur.
526
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
527
+    if (preg_match("/^[A-F]{1,6}$/i", $nom)
528
+        and !$p->etoile
529
+        and !$p->fonctions
530
+    ) {
531
+        $p->code = "'#$nom'";
532
+        $p->interdire_scripts = false;
533
+    }
534
+
535
+    return $p;
536 536
 }
537 537
 
538 538
 
@@ -575,36 +575,36 @@  discard block
 block discarded – undo
575 575
  **/
576 576
 function calculer_balise_dynamique($p, $nom, $l, $supp = array()) {
577 577
 
578
-	if (!balise_distante_interdite($p)) {
579
-		$p->code = "''";
580
-
581
-		return $p;
582
-	}
583
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
584
-	// il faut recracher {...} quand ce n'est finalement pas des args
585
-	if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
586
-		$p->fonctions = null;
587
-	}
588
-
589
-	if ($p->param and ($c = $p->param[0])) {
590
-		// liste d'arguments commence toujours par la chaine vide
591
-		array_shift($c);
592
-		// construire la liste d'arguments comme pour un filtre
593
-		$param = compose_filtres_args($p, $c, ',');
594
-	} else {
595
-		$param = "";
596
-	}
597
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
598
-
599
-	$p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
600
-		join(',', $collecte),
601
-		($collecte ? $param : substr($param, 1)), # virer la virgule
602
-		memoriser_contexte_compil($p),
603
-		(!$supp ? '' : (', ' . join(',', $supp))));
604
-
605
-	$p->interdire_scripts = false;
606
-
607
-	return $p;
578
+    if (!balise_distante_interdite($p)) {
579
+        $p->code = "''";
580
+
581
+        return $p;
582
+    }
583
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
584
+    // il faut recracher {...} quand ce n'est finalement pas des args
585
+    if ($p->fonctions and (!$p->fonctions[0][0]) and $p->fonctions[0][1]) {
586
+        $p->fonctions = null;
587
+    }
588
+
589
+    if ($p->param and ($c = $p->param[0])) {
590
+        // liste d'arguments commence toujours par la chaine vide
591
+        array_shift($c);
592
+        // construire la liste d'arguments comme pour un filtre
593
+        $param = compose_filtres_args($p, $c, ',');
594
+    } else {
595
+        $param = "";
596
+    }
597
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
598
+
599
+    $p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
600
+        join(',', $collecte),
601
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
602
+        memoriser_contexte_compil($p),
603
+        (!$supp ? '' : (', ' . join(',', $supp))));
604
+
605
+    $p->interdire_scripts = false;
606
+
607
+    return $p;
608 608
 }
609 609
 
610 610
 
@@ -634,13 +634,13 @@  discard block
 block discarded – undo
634 634
  *     Liste des codes PHP d'éxecution des balises collectées
635 635
  **/
636 636
 function collecter_balise_dynamique($l, &$p, $nom) {
637
-	$args = array();
638
-	foreach ($l as $c) {
639
-		$x = calculer_balise($c, $p);
640
-		$args[] = $x->code;
641
-	}
637
+    $args = array();
638
+    foreach ($l as $c) {
639
+        $x = calculer_balise($c, $p);
640
+        $args[] = $x->code;
641
+    }
642 642
 
643
-	return $args;
643
+    return $args;
644 644
 }
645 645
 
646 646
 
@@ -655,20 +655,20 @@  discard block
 block discarded – undo
655 655
  *     Nom de la connexion
656 656
  **/
657 657
 function trouver_nom_serveur_distant($p) {
658
-	$nom = $p->id_boucle;
659
-	if ($nom
660
-		and isset($p->boucles[$nom])
661
-	) {
662
-		$s = $p->boucles[$nom]->sql_serveur;
663
-		if (strlen($s)
664
-			and strlen($serveur = strtolower($s))
665
-			and !in_array($serveur, $GLOBALS['exception_des_connect'])
666
-		) {
667
-			return $serveur;
668
-		}
669
-	}
670
-
671
-	return "";
658
+    $nom = $p->id_boucle;
659
+    if ($nom
660
+        and isset($p->boucles[$nom])
661
+    ) {
662
+        $s = $p->boucles[$nom]->sql_serveur;
663
+        if (strlen($s)
664
+            and strlen($serveur = strtolower($s))
665
+            and !in_array($serveur, $GLOBALS['exception_des_connect'])
666
+        ) {
667
+            return $serveur;
668
+        }
669
+    }
670
+
671
+    return "";
672 672
 }
673 673
 
674 674
 
@@ -692,15 +692,15 @@  discard block
 block discarded – undo
692 692
  *     - false : La balise est interdite car le serveur est distant
693 693
  **/
694 694
 function balise_distante_interdite($p) {
695
-	$nom = $p->id_boucle;
695
+    $nom = $p->id_boucle;
696 696
 
697
-	if ($nom and trouver_nom_serveur_distant($p)) {
698
-		spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
697
+    if ($nom and trouver_nom_serveur_distant($p)) {
698
+        spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
699 699
 
700
-		return false;
701
-	}
700
+        return false;
701
+    }
702 702
 
703
-	return true;
703
+    return true;
704 704
 }
705 705
 
706 706
 
@@ -711,67 +711,67 @@  discard block
 block discarded – undo
711 711
 // https://code.spip.net/@champs_traitements
712 712
 function champs_traitements($p) {
713 713
 
714
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
715
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
716
-	} else {
717
-		// quand on utilise un traitement catch-all *
718
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
719
-		// leur propre securite
720
-		if (!$p->balise_calculee) {
721
-			$ps = $GLOBALS['table_des_traitements']['*'];
722
-		} else {
723
-			$ps = false;
724
-		}
725
-	}
726
-
727
-	if (is_array($ps)) {
728
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
729
-		$idb = index_boucle($p);
730
-		// mais on peut aussi etre hors boucle. Se mefier.
731
-		$type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
732
-		$table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
733
-
734
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
735
-		if ($table_sql and isset($ps[$table_sql])) {
736
-			$ps = $ps[$table_sql];
737
-		} // ou pour une boucle en particulier "DATA","articles"
738
-		elseif ($type_requete and isset($ps[$type_requete])) {
739
-			$ps = $ps[$type_requete];
740
-		} // ou pour indiferrement quelle que soit la boucle
741
-		elseif (isset($ps[0])) {
742
-			$ps = $ps[0];
743
-		} else {
744
-			$ps = false;
745
-		}
746
-	}
747
-
748
-	if (!$ps) {
749
-		return $p->code;
750
-	}
751
-
752
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
753
-	// ou si in INCLURE contient {doublons}
754
-	// on insere une fonction de remplissage du tableau des doublons 
755
-	// dans les filtres propre() ou typo()
756
-	// (qui traitent les raccourcis <docXX> referencant les docs)
757
-
758
-	if (isset($p->descr['documents'])
759
-		and
760
-		$p->descr['documents']
761
-		and (
762
-			(strpos($ps, 'propre') !== false)
763
-			or
764
-			(strpos($ps, 'typo') !== false)
765
-		)
766
-	) {
767
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
768
-	}
769
-
770
-	// La protection des champs par |safehtml est assuree par les extensions
771
-	// dans la declaration des traitements des champs sensibles
772
-
773
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
774
-	return str_replace('%s', $p->code, $ps);
714
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
715
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
716
+    } else {
717
+        // quand on utilise un traitement catch-all *
718
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
719
+        // leur propre securite
720
+        if (!$p->balise_calculee) {
721
+            $ps = $GLOBALS['table_des_traitements']['*'];
722
+        } else {
723
+            $ps = false;
724
+        }
725
+    }
726
+
727
+    if (is_array($ps)) {
728
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
729
+        $idb = index_boucle($p);
730
+        // mais on peut aussi etre hors boucle. Se mefier.
731
+        $type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false;
732
+        $table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false;
733
+
734
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
735
+        if ($table_sql and isset($ps[$table_sql])) {
736
+            $ps = $ps[$table_sql];
737
+        } // ou pour une boucle en particulier "DATA","articles"
738
+        elseif ($type_requete and isset($ps[$type_requete])) {
739
+            $ps = $ps[$type_requete];
740
+        } // ou pour indiferrement quelle que soit la boucle
741
+        elseif (isset($ps[0])) {
742
+            $ps = $ps[0];
743
+        } else {
744
+            $ps = false;
745
+        }
746
+    }
747
+
748
+    if (!$ps) {
749
+        return $p->code;
750
+    }
751
+
752
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
753
+    // ou si in INCLURE contient {doublons}
754
+    // on insere une fonction de remplissage du tableau des doublons 
755
+    // dans les filtres propre() ou typo()
756
+    // (qui traitent les raccourcis <docXX> referencant les docs)
757
+
758
+    if (isset($p->descr['documents'])
759
+        and
760
+        $p->descr['documents']
761
+        and (
762
+            (strpos($ps, 'propre') !== false)
763
+            or
764
+            (strpos($ps, 'typo') !== false)
765
+        )
766
+    ) {
767
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
768
+    }
769
+
770
+    // La protection des champs par |safehtml est assuree par les extensions
771
+    // dans la declaration des traitements des champs sensibles
772
+
773
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
774
+    return str_replace('%s', $p->code, $ps);
775 775
 }
776 776
 
777 777
 
@@ -784,109 +784,109 @@  discard block
 block discarded – undo
784 784
 // https://code.spip.net/@applique_filtres
785 785
 function applique_filtres($p) {
786 786
 
787
-	// Traitements standards (cf. supra)
788
-	if ($p->etoile == '') {
789
-		$code = champs_traitements($p);
790
-	} else {
791
-		$code = $p->code;
792
-	}
787
+    // Traitements standards (cf. supra)
788
+    if ($p->etoile == '') {
789
+        $code = champs_traitements($p);
790
+    } else {
791
+        $code = $p->code;
792
+    }
793 793
 
794
-	// Appliquer les filtres perso
795
-	if ($p->param) {
796
-		$code = compose_filtres($p, $code);
797
-	}
794
+    // Appliquer les filtres perso
795
+    if ($p->param) {
796
+        $code = compose_filtres($p, $code);
797
+    }
798 798
 
799
-	// S'il y a un lien avec la session, ajouter un code qui levera
800
-	// un drapeau dans la structure d'invalidation $Cache
801
-	if (isset($p->descr['session'])) {
802
-		$code = "invalideur_session(\$Cache, $code)";
803
-	}
799
+    // S'il y a un lien avec la session, ajouter un code qui levera
800
+    // un drapeau dans la structure d'invalidation $Cache
801
+    if (isset($p->descr['session'])) {
802
+        $code = "invalideur_session(\$Cache, $code)";
803
+    }
804 804
 
805
-	$code = sandbox_composer_interdire_scripts($code, $p);
805
+    $code = sandbox_composer_interdire_scripts($code, $p);
806 806
 
807
-	return $code;
807
+    return $code;
808 808
 }
809 809
 
810 810
 // Cf. function pipeline dans ecrire/inc_utils.php
811 811
 // https://code.spip.net/@compose_filtres
812 812
 function compose_filtres(&$p, $code) {
813 813
 
814
-	$image_miette = false;
815
-	foreach ($p->param as $filtre) {
816
-		$fonc = array_shift($filtre);
817
-		if (!$fonc) {
818
-			continue;
819
-		} // normalement qu'au premier tour.
820
-		$is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
821
-		if ($image_miette and !$is_filtre_image) {
822
-			// il faut graver maintenant car apres le filtre en cours
823
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
824
-			$code = "filtrer('image_graver', $code)";
825
-			$image_miette = false;
826
-		}
827
-		// recuperer les arguments du filtre, 
828
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
829
-		if ($fonc !== '?') {
830
-			$sep = ',';
831
-		} else {
832
-			$sep = ':';
833
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
834
-			if (count($filtre) != 2) {
835
-				$filtre = array(isset($filtre[0]) ? $filtre[0] : "", isset($filtre[1]) ? $filtre[1] : "");
836
-			}
837
-		}
838
-		$arglist = compose_filtres_args($p, $filtre, $sep);
839
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
840
-		if ($logique) {
841
-			$code = $logique;
842
-		} else {
843
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p);
844
-			if ($is_filtre_image) {
845
-				$image_miette = true;
846
-			}
847
-		}
848
-	}
849
-	// ramasser les images intermediaires inutiles et graver l'image finale
850
-	if ($image_miette) {
851
-		$code = "filtrer('image_graver',$code)";
852
-	}
853
-
854
-	return $code;
814
+    $image_miette = false;
815
+    foreach ($p->param as $filtre) {
816
+        $fonc = array_shift($filtre);
817
+        if (!$fonc) {
818
+            continue;
819
+        } // normalement qu'au premier tour.
820
+        $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') and $fonc != 'image_graver');
821
+        if ($image_miette and !$is_filtre_image) {
822
+            // il faut graver maintenant car apres le filtre en cours
823
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
824
+            $code = "filtrer('image_graver', $code)";
825
+            $image_miette = false;
826
+        }
827
+        // recuperer les arguments du filtre, 
828
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
829
+        if ($fonc !== '?') {
830
+            $sep = ',';
831
+        } else {
832
+            $sep = ':';
833
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
834
+            if (count($filtre) != 2) {
835
+                $filtre = array(isset($filtre[0]) ? $filtre[0] : "", isset($filtre[1]) ? $filtre[1] : "");
836
+            }
837
+        }
838
+        $arglist = compose_filtres_args($p, $filtre, $sep);
839
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
840
+        if ($logique) {
841
+            $code = $logique;
842
+        } else {
843
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p);
844
+            if ($is_filtre_image) {
845
+                $image_miette = true;
846
+            }
847
+        }
848
+    }
849
+    // ramasser les images intermediaires inutiles et graver l'image finale
850
+    if ($image_miette) {
851
+        $code = "filtrer('image_graver',$code)";
852
+    }
853
+
854
+    return $code;
855 855
 }
856 856
 
857 857
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
858 858
 // et comparateurs
859 859
 function filtre_logique($fonc, $code, $arg) {
860 860
 
861
-	switch (true) {
862
-		case in_array($fonc, $GLOBALS['table_criteres_infixes']):
863
-			return "($code $fonc $arg)";
864
-		case ($fonc == 'and') or ($fonc == 'et'):
865
-			return "((($code) AND ($arg)) ?' ' :'')";
866
-		case ($fonc == 'or') or ($fonc == 'ou'):
867
-			return "((($code) OR ($arg)) ?' ' :'')";
868
-		case ($fonc == 'xor') or ($fonc == 'xou'):
869
-			return "((($code) XOR ($arg)) ?' ' :'')";
870
-		case ($fonc == 'sinon'):
871
-			return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
872
-		case ($fonc == 'not') or ($fonc == 'non'):
873
-			return "(($code) ?'' :' ')";
874
-		case ($fonc == 'yes') or ($fonc == 'oui'):
875
-			return "(($code) ?' ' :'')";
876
-	}
877
-
878
-	return '';
861
+    switch (true) {
862
+        case in_array($fonc, $GLOBALS['table_criteres_infixes']):
863
+            return "($code $fonc $arg)";
864
+        case ($fonc == 'and') or ($fonc == 'et'):
865
+            return "((($code) AND ($arg)) ?' ' :'')";
866
+        case ($fonc == 'or') or ($fonc == 'ou'):
867
+            return "((($code) OR ($arg)) ?' ' :'')";
868
+        case ($fonc == 'xor') or ($fonc == 'xou'):
869
+            return "((($code) XOR ($arg)) ?' ' :'')";
870
+        case ($fonc == 'sinon'):
871
+            return "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)";
872
+        case ($fonc == 'not') or ($fonc == 'non'):
873
+            return "(($code) ?'' :' ')";
874
+        case ($fonc == 'yes') or ($fonc == 'oui'):
875
+            return "(($code) ?' ' :'')";
876
+    }
877
+
878
+    return '';
879 879
 }
880 880
 
881 881
 // https://code.spip.net/@compose_filtres_args
882 882
 function compose_filtres_args($p, $args, $sep) {
883
-	$arglist = "";
884
-	foreach ($args as $arg) {
885
-		$arglist .= $sep .
886
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
887
-	}
883
+    $arglist = "";
884
+    foreach ($args as $arg) {
885
+        $arglist .= $sep .
886
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
887
+    }
888 888
 
889
-	return $arglist;
889
+    return $arglist;
890 890
 }
891 891
 
892 892
 
@@ -904,15 +904,15 @@  discard block
 block discarded – undo
904 904
  **/
905 905
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
906 906
 
907
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
908
-	if ($boucles[$idb]->externe) {
909
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
910
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
911
-		// on ignore le defaut fourni dans ce cas
912
-		$defaut = "@\$Pile[\$SP]['$nom_champ']";
913
-	}
907
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
908
+    if ($boucles[$idb]->externe) {
909
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
910
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
911
+        // on ignore le defaut fourni dans ce cas
912
+        $defaut = "@\$Pile[\$SP]['$nom_champ']";
913
+    }
914 914
 
915
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
915
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
916 916
 }
917 917
 
918 918
 //
@@ -927,30 +927,30 @@  discard block
 block discarded – undo
927 927
 
928 928
 // https://code.spip.net/@rindex_pile
929 929
 function rindex_pile($p, $champ, $motif) {
930
-	$n = 0;
931
-	$b = $p->id_boucle;
932
-	$p->code = '';
933
-	while ($b != '') {
934
-		foreach ($p->boucles[$b]->criteres as $critere) {
935
-			if ($critere->op == $motif) {
936
-				$p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
937
-					"]['$champ']";
938
-				$b = '';
939
-				break 2;
940
-			}
941
-		}
942
-		$n++;
943
-		$b = $p->boucles[$b]->id_parent;
944
-	}
945
-
946
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
947
-	if (!$p->code) {
948
-		$p->code = "''";
949
-	}
950
-
951
-	$p->interdire_scripts = false;
952
-
953
-	return $p;
930
+    $n = 0;
931
+    $b = $p->id_boucle;
932
+    $p->code = '';
933
+    while ($b != '') {
934
+        foreach ($p->boucles[$b]->criteres as $critere) {
935
+            if ($critere->op == $motif) {
936
+                $p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") .
937
+                    "]['$champ']";
938
+                $b = '';
939
+                break 2;
940
+            }
941
+        }
942
+        $n++;
943
+        $b = $p->boucles[$b]->id_parent;
944
+    }
945
+
946
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
947
+    if (!$p->code) {
948
+        $p->code = "''";
949
+    }
950
+
951
+    $p->interdire_scripts = false;
952
+
953
+    return $p;
954 954
 }
955 955
 
956 956
 /** 
@@ -960,7 +960,7 @@  discard block
 block discarded – undo
960 960
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
961 961
  */
962 962
 function zbug_presenter_champ($p, $champ = "") {
963
-	$balise = $champ ? $champ : $p->nom_champ;
964
-	$explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
965
-	return "#{$explicite}{$balise}";
963
+    $balise = $champ ? $champ : $p->nom_champ;
964
+    $explicite = $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
965
+    return "#{$explicite}{$balise}";
966 966
 }
967 967
\ No newline at end of file
Please login to merge, or discard this patch.