Completed
Push — master ( 350a8b...37aa61 )
by cam
01:39
created
ecrire/public/debusquer.php 2 patches
Indentation   +691 added lines, -691 removed lines patch added patch discarded remove patch
@@ -12,7 +12,7 @@  discard block
 block discarded – undo
12 12
 \***************************************************************************/
13 13
 
14 14
 if (!defined('_ECRIRE_INC_VERSION')) {
15
-	return;
15
+    return;
16 16
 }
17 17
 
18 18
 include_spip('public/decompiler');
@@ -69,125 +69,125 @@  discard block
 block discarded – undo
69 69
  *     - true si $opt 'erreurs' = 'reset'
70 70
  **/
71 71
 function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
72
-	static $should_log;
73
-	static $tableau_des_erreurs = [];
74
-
75
-	// Pour des tests unitaires, pouvoir récupérer les erreurs générées
76
-	if (isset($opt['erreurs'])) {
77
-		if ($opt['erreurs'] == 'get') {
78
-			return $tableau_des_erreurs;
79
-		}
80
-		if ($opt['erreurs'] == 'reset') {
81
-			$tableau_des_erreurs = [];
82
-
83
-			return true;
84
-		}
85
-	}
86
-
87
-	if (is_null($should_log)) {
88
-		$should_log = (empty($GLOBALS['visiteur_session']) || !include_spip('inc/autoriser') || !autoriser('debug'));
89
-	}
90
-
91
-	// Erreur ou appel final ?
92
-	if ($message) {
93
-		$message = debusquer_compose_message($message);
94
-		$tableau_des_erreurs[] = [$message, $lieu];
95
-		set_request('var_mode', 'debug');
96
-		$GLOBALS['bouton_admin_debug'] = true;
97
-		// Permettre a la compil de continuer
98
-		if (is_object($lieu) && (!isset($lieu->code) || !$lieu->code)) {
99
-			$lieu->code = "''";
100
-		}
101
-		// loger si personne ne verra l'erreur
102
-		if ($should_log) {
103
-			debusquer_loger_erreur($message, $lieu);
104
-		}
105
-		// forcer l'appel au debusqueur en cas de boucles infernales
106
-		$urgence = (_DEBUG_MAX_SQUELETTE_ERREURS && (is_countable($tableau_des_erreurs) ? count($tableau_des_erreurs) : 0) > _DEBUG_MAX_SQUELETTE_ERREURS);
107
-		if (!$urgence) {
108
-			return;
109
-		}
110
-	}
111
-	// espace public ?
112
-	if (empty($GLOBALS['debug_objets']['principal']) && isset($GLOBALS['fond'])) {
113
-		$GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
114
-	}
115
-
116
-	include_spip('inc/autoriser');
117
-	if (!autoriser('debug')) {
118
-		return;
119
-	}
120
-	include_spip('inc/headers');
121
-	include_spip('inc/filtres');
122
-
123
-	lang_select($GLOBALS['visiteur_session']['lang'] ?? null);
124
-	$fonc = preg_replace(',\W,', '_', _request('var_mode_objet') ?? '');
125
-	$mode = preg_replace(',\W,', '_', _request('var_mode_affiche') ?? '');
126
-
127
-	$self = str_replace("\\'", ''', (string) self());
128
-	$self = parametre_url($self, 'var_mode', 'debug');
129
-
130
-	$res = debusquer_bandeau($tableau_des_erreurs)
131
-		. '<br />'
132
-		. debusquer_squelette($fonc, $mode, $self);
133
-
134
-	if (!_DIR_RESTREINT || headers_sent()) {
135
-		return $res;
136
-	}
137
-	if ($tableau_des_erreurs) {
138
-		http_response_code(503);
139
-	}
140
-
141
-	http_no_cache();
142
-	if (isset($_GET['var_profile'])) {
143
-		$titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', '');
144
-		$titre = parametre_url($titre, 'var_mode', '');
145
-	} else {
146
-		if (!$fonc) {
147
-			$fonc = $GLOBALS['debug_objets']['principal'];
148
-		}
149
-		$titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
150
-	}
151
-	if ($message === false) {
152
-		lang_select();
153
-
154
-		return debusquer_entete($titre, $res);
155
-	} else {
156
-		echo debusquer_entete($titre, $res);
157
-	}
158
-	exit;
72
+    static $should_log;
73
+    static $tableau_des_erreurs = [];
74
+
75
+    // Pour des tests unitaires, pouvoir récupérer les erreurs générées
76
+    if (isset($opt['erreurs'])) {
77
+        if ($opt['erreurs'] == 'get') {
78
+            return $tableau_des_erreurs;
79
+        }
80
+        if ($opt['erreurs'] == 'reset') {
81
+            $tableau_des_erreurs = [];
82
+
83
+            return true;
84
+        }
85
+    }
86
+
87
+    if (is_null($should_log)) {
88
+        $should_log = (empty($GLOBALS['visiteur_session']) || !include_spip('inc/autoriser') || !autoriser('debug'));
89
+    }
90
+
91
+    // Erreur ou appel final ?
92
+    if ($message) {
93
+        $message = debusquer_compose_message($message);
94
+        $tableau_des_erreurs[] = [$message, $lieu];
95
+        set_request('var_mode', 'debug');
96
+        $GLOBALS['bouton_admin_debug'] = true;
97
+        // Permettre a la compil de continuer
98
+        if (is_object($lieu) && (!isset($lieu->code) || !$lieu->code)) {
99
+            $lieu->code = "''";
100
+        }
101
+        // loger si personne ne verra l'erreur
102
+        if ($should_log) {
103
+            debusquer_loger_erreur($message, $lieu);
104
+        }
105
+        // forcer l'appel au debusqueur en cas de boucles infernales
106
+        $urgence = (_DEBUG_MAX_SQUELETTE_ERREURS && (is_countable($tableau_des_erreurs) ? count($tableau_des_erreurs) : 0) > _DEBUG_MAX_SQUELETTE_ERREURS);
107
+        if (!$urgence) {
108
+            return;
109
+        }
110
+    }
111
+    // espace public ?
112
+    if (empty($GLOBALS['debug_objets']['principal']) && isset($GLOBALS['fond'])) {
113
+        $GLOBALS['debug_objets']['principal'] = $GLOBALS['fond'];
114
+    }
115
+
116
+    include_spip('inc/autoriser');
117
+    if (!autoriser('debug')) {
118
+        return;
119
+    }
120
+    include_spip('inc/headers');
121
+    include_spip('inc/filtres');
122
+
123
+    lang_select($GLOBALS['visiteur_session']['lang'] ?? null);
124
+    $fonc = preg_replace(',\W,', '_', _request('var_mode_objet') ?? '');
125
+    $mode = preg_replace(',\W,', '_', _request('var_mode_affiche') ?? '');
126
+
127
+    $self = str_replace("\\'", '&#39;', (string) self());
128
+    $self = parametre_url($self, 'var_mode', 'debug');
129
+
130
+    $res = debusquer_bandeau($tableau_des_erreurs)
131
+        . '<br />'
132
+        . debusquer_squelette($fonc, $mode, $self);
133
+
134
+    if (!_DIR_RESTREINT || headers_sent()) {
135
+        return $res;
136
+    }
137
+    if ($tableau_des_erreurs) {
138
+        http_response_code(503);
139
+    }
140
+
141
+    http_no_cache();
142
+    if (isset($_GET['var_profile'])) {
143
+        $titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', '');
144
+        $titre = parametre_url($titre, 'var_mode', '');
145
+    } else {
146
+        if (!$fonc) {
147
+            $fonc = $GLOBALS['debug_objets']['principal'];
148
+        }
149
+        $titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
150
+    }
151
+    if ($message === false) {
152
+        lang_select();
153
+
154
+        return debusquer_entete($titre, $res);
155
+    } else {
156
+        echo debusquer_entete($titre, $res);
157
+    }
158
+    exit;
159 159
 }
160 160
 
161 161
 function debusquer_compose_message($msg) {
162
-	if (is_array($msg)) {
163
-		// si c'est un texte, c'est une traduction a faire, mais
164
-		// sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
165
-		$msg = !is_numeric($msg[0]) && count($msg) == 2 ? _T($msg[0], $msg[1], 'spip-debug-arg') : debusquer_requete($msg);
166
-	}
167
-	// FIXME: le fond n'est pas la si on n'est pas dans un squelette
168
-	// cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
169
-	$fond = $GLOBALS['fond'] ?? '';
170
-	// une erreur critique sort $message en array
171
-	$debug = is_array($msg) ? $msg[1] : $msg;
172
-	spip_log('Debug: ' . $debug . ' (' . $fond . ')');
173
-
174
-	return $msg;
162
+    if (is_array($msg)) {
163
+        // si c'est un texte, c'est une traduction a faire, mais
164
+        // sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments)
165
+        $msg = !is_numeric($msg[0]) && count($msg) == 2 ? _T($msg[0], $msg[1], 'spip-debug-arg') : debusquer_requete($msg);
166
+    }
167
+    // FIXME: le fond n'est pas la si on n'est pas dans un squelette
168
+    // cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur
169
+    $fond = $GLOBALS['fond'] ?? '';
170
+    // une erreur critique sort $message en array
171
+    $debug = is_array($msg) ? $msg[1] : $msg;
172
+    spip_log('Debug: ' . $debug . ' (' . $fond . ')');
173
+
174
+    return $msg;
175 175
 }
176 176
 
177 177
 function debusquer_bandeau($erreurs) {
178 178
 
179
-	if (!empty($erreurs)) {
180
-		$n = [(is_countable($erreurs) ? count($erreurs) : 0) . ' ' . _T('zbug_erreur_squelette')];
179
+    if (!empty($erreurs)) {
180
+        $n = [(is_countable($erreurs) ? count($erreurs) : 0) . ' ' . _T('zbug_erreur_squelette')];
181 181
 
182
-		return debusquer_navigation($erreurs, $n);
183
-	} elseif (!empty($GLOBALS['tableau_des_temps'])) {
184
-		include_spip('public/tracer');
185
-		[$temps, $nav] = chrono_requete($GLOBALS['tableau_des_temps']);
182
+        return debusquer_navigation($erreurs, $n);
183
+    } elseif (!empty($GLOBALS['tableau_des_temps'])) {
184
+        include_spip('public/tracer');
185
+        [$temps, $nav] = chrono_requete($GLOBALS['tableau_des_temps']);
186 186
 
187
-		return debusquer_navigation($temps, $nav, 'debug-profile');
188
-	} else {
189
-		return '';
190
-	}
187
+        return debusquer_navigation($temps, $nav, 'debug-profile');
188
+    } else {
189
+        return '';
190
+    }
191 191
 }
192 192
 
193 193
 /**
@@ -197,63 +197,63 @@  discard block
 block discarded – undo
197 197
  * @return string Code HTML
198 198
  **/
199 199
 function debusquer_contexte($env) {
200
-	if (is_string($env) && is_array($env_tab = @unserialize($env))) {
201
-		$env = $env_tab;
202
-	}
203
-
204
-	if (!$env) {
205
-		return '';
206
-	}
207
-	$res = '';
208
-	foreach ($env as $nom => $valeur) {
209
-		if (is_array($valeur)) {
210
-			$valeur_simple = [];
211
-			foreach ($valeur as $v) {
212
-				if (is_array($v)) {
213
-					$valeur_simple[] = 'array:' . count($v);
214
-				} elseif (is_object($v)) {
215
-					$valeur_simple[] = $v::class;
216
-				} elseif (is_string($v)) {
217
-					$valeur_simple[] = "'" . $v . "'";
218
-				} else {
219
-					$valeur_simple[] = $v;
220
-				}
221
-			}
222
-			$n = count($valeur);
223
-			$valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
224
-			$valeur .= '[' . implode(', ', $valeur_simple) . ']';
225
-		} elseif (is_object($valeur)) {
226
-			$valeur = $valeur::class;
227
-		} elseif (is_string($valeur)) {
228
-			$valeur = "'" . $valeur . "'";
229
-		}
230
-		$res .= "\n<tr><td><strong>" . nl2br((string) entites_html($nom))
231
-			. '</strong></td><td>:&nbsp;' . nl2br((string) entites_html($valeur))
232
-			. "</td></tr>\n";
233
-	}
234
-
235
-	return "<div class='spip-env'><fieldset><legend onclick=\"this.parentElement.classList.toggle('expanded');\">#ENV</legend>\n<div><table>$res</table></div></fieldset></div>\n";
200
+    if (is_string($env) && is_array($env_tab = @unserialize($env))) {
201
+        $env = $env_tab;
202
+    }
203
+
204
+    if (!$env) {
205
+        return '';
206
+    }
207
+    $res = '';
208
+    foreach ($env as $nom => $valeur) {
209
+        if (is_array($valeur)) {
210
+            $valeur_simple = [];
211
+            foreach ($valeur as $v) {
212
+                if (is_array($v)) {
213
+                    $valeur_simple[] = 'array:' . count($v);
214
+                } elseif (is_object($v)) {
215
+                    $valeur_simple[] = $v::class;
216
+                } elseif (is_string($v)) {
217
+                    $valeur_simple[] = "'" . $v . "'";
218
+                } else {
219
+                    $valeur_simple[] = $v;
220
+                }
221
+            }
222
+            $n = count($valeur);
223
+            $valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
224
+            $valeur .= '[' . implode(', ', $valeur_simple) . ']';
225
+        } elseif (is_object($valeur)) {
226
+            $valeur = $valeur::class;
227
+        } elseif (is_string($valeur)) {
228
+            $valeur = "'" . $valeur . "'";
229
+        }
230
+        $res .= "\n<tr><td><strong>" . nl2br((string) entites_html($nom))
231
+            . '</strong></td><td>:&nbsp;' . nl2br((string) entites_html($valeur))
232
+            . "</td></tr>\n";
233
+    }
234
+
235
+    return "<div class='spip-env'><fieldset><legend onclick=\"this.parentElement.classList.toggle('expanded');\">#ENV</legend>\n<div><table>$res</table></div></fieldset></div>\n";
236 236
 }
237 237
 
238 238
 
239 239
 function debusquer_loger_erreur($msg, $lieu) {
240
-	$boucle = $ligne = $skel = '';
241
-	if (is_object($lieu)) {
242
-		$ligne = ($lieu->ligne ?? '');
243
-		$boucle = ($lieu->id_boucle ?? '');
244
-		$skel = ($lieu->descr['sourcefile'] ?? '');
245
-	}
246
-	$msg = (is_array($msg) ? implode('', $msg) : $msg);
247
-	if ($skel) {
248
-		$msg .= " Squelette $skel";
249
-	}
250
-	if ($boucle) {
251
-		$msg .= " Boucle $boucle";
252
-	}
253
-	if ($ligne) {
254
-		$msg .= " L$ligne";
255
-	}
256
-	spip_log($msg, 'debusquer' . _LOG_ERREUR);
240
+    $boucle = $ligne = $skel = '';
241
+    if (is_object($lieu)) {
242
+        $ligne = ($lieu->ligne ?? '');
243
+        $boucle = ($lieu->id_boucle ?? '');
244
+        $skel = ($lieu->descr['sourcefile'] ?? '');
245
+    }
246
+    $msg = (is_array($msg) ? implode('', $msg) : $msg);
247
+    if ($skel) {
248
+        $msg .= " Squelette $skel";
249
+    }
250
+    if ($boucle) {
251
+        $msg .= " Boucle $boucle";
252
+    }
253
+    if ($ligne) {
254
+        $msg .= " L$ligne";
255
+    }
256
+    spip_log($msg, 'debusquer' . _LOG_ERREUR);
257 257
 }
258 258
 
259 259
 
@@ -262,66 +262,66 @@  discard block
 block discarded – undo
262 262
 
263 263
 function debusquer_navigation($tableau, $caption = [], $id = 'debug-nav') {
264 264
 
265
-	if (_request('exec') == 'valider_xml') {
266
-		return '';
267
-	}
268
-	$GLOBALS['bouton_admin_debug'] = true;
269
-	$res = '';
270
-	$href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug'));
271
-	foreach ($tableau as $i => $err) {
272
-		$boucle = $ligne = $skel = '';
273
-		[$msg, $lieu] = $err;
274
-		if (is_object($lieu)) {
275
-			$ligne = $lieu->ligne;
276
-			$boucle = empty($lieu->id_boucle) ? '' : $lieu->id_boucle;
277
-			if (isset($lieu->descr['nom'])) {
278
-				$nom_code = $lieu->descr['nom'];
279
-				$skel = $lieu->descr['sourcefile'];
280
-				$h2 = parametre_url($href, 'var_mode_objet', $nom_code);
281
-				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
282
-				$skel = "<a href='$h3'><b>$skel</b></a>";
283
-				if ($boucle) {
284
-					$h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
285
-					$boucle = "<a href='$h3'><b>$boucle</b></a>";
286
-				}
287
-			}
288
-		}
289
-
290
-		$j = ($i + 1);
291
-		$res .= "<tr id='req$j'><td style='text-align: right'>"
292
-			. $j
293
-			. "&nbsp;</td><td style='text-align: left'>"
294
-			. (is_array($msg) ? implode('', $msg) : $msg)
295
-			. "</td><td style='text-align: left'>"
296
-			. ($skel ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
297
-			. "</td><td class='spip-debug-arg' style='text-align: left'>"
298
-			. ($boucle ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
299
-			. "</td><td style='text-align: right'>"
300
-			. $ligne
301
-			. "</td></tr>\n";
302
-	}
303
-
304
-	return "\n<table id='$id'>"
305
-	. "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">"
306
-	. $caption[0]
265
+    if (_request('exec') == 'valider_xml') {
266
+        return '';
267
+    }
268
+    $GLOBALS['bouton_admin_debug'] = true;
269
+    $res = '';
270
+    $href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug'));
271
+    foreach ($tableau as $i => $err) {
272
+        $boucle = $ligne = $skel = '';
273
+        [$msg, $lieu] = $err;
274
+        if (is_object($lieu)) {
275
+            $ligne = $lieu->ligne;
276
+            $boucle = empty($lieu->id_boucle) ? '' : $lieu->id_boucle;
277
+            if (isset($lieu->descr['nom'])) {
278
+                $nom_code = $lieu->descr['nom'];
279
+                $skel = $lieu->descr['sourcefile'];
280
+                $h2 = parametre_url($href, 'var_mode_objet', $nom_code);
281
+                $h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
282
+                $skel = "<a href='$h3'><b>$skel</b></a>";
283
+                if ($boucle) {
284
+                    $h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
285
+                    $boucle = "<a href='$h3'><b>$boucle</b></a>";
286
+                }
287
+            }
288
+        }
289
+
290
+        $j = ($i + 1);
291
+        $res .= "<tr id='req$j'><td style='text-align: right'>"
292
+            . $j
293
+            . "&nbsp;</td><td style='text-align: left'>"
294
+            . (is_array($msg) ? implode('', $msg) : $msg)
295
+            . "</td><td style='text-align: left'>"
296
+            . ($skel ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
297
+            . "</td><td class='spip-debug-arg' style='text-align: left'>"
298
+            . ($boucle ?: '&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;')
299
+            . "</td><td style='text-align: right'>"
300
+            . $ligne
301
+            . "</td></tr>\n";
302
+    }
303
+
304
+    return "\n<table id='$id'>"
305
+    . "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">"
306
+    . $caption[0]
307 307
 ## aide locale courte a ecrire, avec lien vers une grosse page de documentation
308 308
 #		aider('erreur_compilation'),
309
-	. '</caption>'
310
-	//  fausse caption du chrono (mais vraie nav)
311
-	. (empty($caption[1]) ? '' : $caption[1])
312
-	. '<tr><th>'
313
-	. _T('numero')
314
-	. '</th><th>'
315
-	. _T('public:message')
316
-	. '</th><th>'
317
-	. _T('squelette')
318
-	. '</th><th>'
319
-	. _T('zbug_boucle')
320
-	. '</th><th>'
321
-	. _T('ligne')
322
-	. '</th></tr>'
323
-	. $res
324
-	. '</table>';
309
+    . '</caption>'
310
+    //  fausse caption du chrono (mais vraie nav)
311
+    . (empty($caption[1]) ? '' : $caption[1])
312
+    . '<tr><th>'
313
+    . _T('numero')
314
+    . '</th><th>'
315
+    . _T('public:message')
316
+    . '</th><th>'
317
+    . _T('squelette')
318
+    . '</th><th>'
319
+    . _T('zbug_boucle')
320
+    . '</th><th>'
321
+    . _T('ligne')
322
+    . '</th></tr>'
323
+    . $res
324
+    . '</table>';
325 325
 }
326 326
 
327 327
 
@@ -341,518 +341,518 @@  discard block
 block discarded – undo
341 341
  *    ou un tableau si l'erreur est critique
342 342
  **/
343 343
 function debusquer_requete($message) {
344
-	[$errno, $msg, $query] = $message;
345
-
346
-	// FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
347
-	// il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
348
-	if (preg_match(',err(no|code):?[[:space:]]*(\d+),i', (string) $msg, $regs)) {
349
-		$errno = $regs[2];
350
-	} elseif (
351
-		is_numeric($errno) && ($errno == 1030 || $errno <= 1026)
352
-		&& preg_match(',[^[:alnum:]](\d+)[^[:alnum:]],', (string) $msg, $regs)
353
-	) {
354
-		$errno = $regs[1];
355
-	}
356
-
357
-	// Erreur systeme
358
-	if (is_numeric($errno) && $errno > 0 && $errno < 200) {
359
-		$retour = '<tt><br /><br /><blink>'
360
-			. _T('info_erreur_systeme', ['errsys' => $errno])
361
-			. "</blink><br />\n<b>"
362
-			. _T(
363
-				'info_erreur_systeme2',
364
-				['script' => generer_url_ecrire('base_repair')]
365
-			)
366
-			. '</b><br />';
367
-		spip_log("Erreur systeme $errno");
368
-
369
-		return [$retour, ''];
370
-	}
371
-
372
-	// Requete erronee
373
-	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
374
-		. spip_htmlspecialchars($msg)
375
-		. "\n<br /><span style='color: red'><b>"
376
-		. spip_htmlspecialchars($query)
377
-		. '</b></span></tt><br />';
378
-
379
-	//. aider('erreur_mysql');
380
-
381
-	return $err;
344
+    [$errno, $msg, $query] = $message;
345
+
346
+    // FIXME: ces écritures mélangent divers syntaxe des moteurs SQL
347
+    // il serait plus prudent certainement d'avoir une fonction d'analyse par moteur
348
+    if (preg_match(',err(no|code):?[[:space:]]*(\d+),i', (string) $msg, $regs)) {
349
+        $errno = $regs[2];
350
+    } elseif (
351
+        is_numeric($errno) && ($errno == 1030 || $errno <= 1026)
352
+        && preg_match(',[^[:alnum:]](\d+)[^[:alnum:]],', (string) $msg, $regs)
353
+    ) {
354
+        $errno = $regs[1];
355
+    }
356
+
357
+    // Erreur systeme
358
+    if (is_numeric($errno) && $errno > 0 && $errno < 200) {
359
+        $retour = '<tt><br /><br /><blink>'
360
+            . _T('info_erreur_systeme', ['errsys' => $errno])
361
+            . "</blink><br />\n<b>"
362
+            . _T(
363
+                'info_erreur_systeme2',
364
+                ['script' => generer_url_ecrire('base_repair')]
365
+            )
366
+            . '</b><br />';
367
+        spip_log("Erreur systeme $errno");
368
+
369
+        return [$retour, ''];
370
+    }
371
+
372
+    // Requete erronee
373
+    $err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
374
+        . spip_htmlspecialchars($msg)
375
+        . "\n<br /><span style='color: red'><b>"
376
+        . spip_htmlspecialchars($query)
377
+        . '</b></span></tt><br />';
378
+
379
+    //. aider('erreur_mysql');
380
+
381
+    return $err;
382 382
 }
383 383
 
384 384
 
385 385
 function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = '') {
386 386
 
387
-	$id = $nom . $boucle;
388
-	if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
389
-		foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
390
-			if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', (string) $v[0], $r)) {
391
-				$y = substr_count((string) $v[0], "\n");
392
-			} else {
393
-				if ($v[1][0] == '#') { // balise dynamique
394
-				$incl = $GLOBALS['debug_objets']['resultat'][$v[2]];
395
-				} else // inclusion
396
-				{
397
-					$incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])];
398
-				}
399
-				$y = substr_count((string) $incl, "\n")
400
-					+ substr_count($r[1], "\n")
401
-					+ substr_count($r[3], "\n");
402
-			}
403
-			if ($n <= ($y + $debut)) {
404
-				if ($v[1][0] == '?') {
405
-					return trouve_boucle_debug($n, $nom, $debut, substr((string) $v[1], 1));
406
-				} elseif ($v[1][0] == '!') {
407
-					if ($incl = trouve_squelette_inclus($v[1])) {
408
-						return trouve_boucle_debug($n, $incl, $debut);
409
-					}
410
-				}
411
-
412
-				return [$nom, $boucle, $v[2] - 1 + $n - $debut];
413
-			}
414
-			$debut += $y;
415
-		}
416
-	}
417
-
418
-	return [$nom, $boucle, $n - $debut];
387
+    $id = $nom . $boucle;
388
+    if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
389
+        foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
390
+            if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', (string) $v[0], $r)) {
391
+                $y = substr_count((string) $v[0], "\n");
392
+            } else {
393
+                if ($v[1][0] == '#') { // balise dynamique
394
+                $incl = $GLOBALS['debug_objets']['resultat'][$v[2]];
395
+                } else // inclusion
396
+                {
397
+                    $incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])];
398
+                }
399
+                $y = substr_count((string) $incl, "\n")
400
+                    + substr_count($r[1], "\n")
401
+                    + substr_count($r[3], "\n");
402
+            }
403
+            if ($n <= ($y + $debut)) {
404
+                if ($v[1][0] == '?') {
405
+                    return trouve_boucle_debug($n, $nom, $debut, substr((string) $v[1], 1));
406
+                } elseif ($v[1][0] == '!') {
407
+                    if ($incl = trouve_squelette_inclus($v[1])) {
408
+                        return trouve_boucle_debug($n, $incl, $debut);
409
+                    }
410
+                }
411
+
412
+                return [$nom, $boucle, $v[2] - 1 + $n - $debut];
413
+            }
414
+            $debut += $y;
415
+        }
416
+    }
417
+
418
+    return [$nom, $boucle, $n - $debut];
419 419
 }
420 420
 
421 421
 function trouve_squelette_inclus($script) {
422 422
 
423
-	preg_match('/include\(.(.*).php3?.\);/', (string) $script, $reg);
424
-	// si le script X.php n'est pas ecrire/public.php
425
-	// on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
426
-	// si c'est bien ecrire/public on cherche le param 'fond'
427
-	// a defaut on cherche le param 'page'
428
-	if (
429
-		$reg[1] == 'ecrire/public'
430
-		&& !preg_match("/'fond' => '([^']*)'/", (string) $script, $reg)
431
-		&& !preg_match("/'param' => '([^']*)'/", (string) $script, $reg)
432
-	) {
433
-		$reg[1] = 'inconnu';
434
-	}
435
-	$incl = ',' . $reg[1] . '[.]\w$,';
436
-
437
-	foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
438
-		if (preg_match($incl, (string) $v)) {
439
-			return $k;
440
-		}
441
-	}
442
-
443
-	return '';
423
+    preg_match('/include\(.(.*).php3?.\);/', (string) $script, $reg);
424
+    // si le script X.php n'est pas ecrire/public.php
425
+    // on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux)
426
+    // si c'est bien ecrire/public on cherche le param 'fond'
427
+    // a defaut on cherche le param 'page'
428
+    if (
429
+        $reg[1] == 'ecrire/public'
430
+        && !preg_match("/'fond' => '([^']*)'/", (string) $script, $reg)
431
+        && !preg_match("/'param' => '([^']*)'/", (string) $script, $reg)
432
+    ) {
433
+        $reg[1] = 'inconnu';
434
+    }
435
+    $incl = ',' . $reg[1] . '[.]\w$,';
436
+
437
+    foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
438
+        if (preg_match($incl, (string) $v)) {
439
+            return $k;
440
+        }
441
+    }
442
+
443
+    return '';
444 444
 }
445 445
 
446 446
 function reference_boucle_debug($n, $nom, $self) {
447
-	[$skel, $boucle, $ligne] = trouve_boucle_debug($n, $nom);
448
-
449
-	if (!$boucle) {
450
-		return $ligne
451
-			? ' (' .
452
-				(($nom != $skel) ? _T('squelette_inclus_ligne') :
453
-					_T('squelette_ligne')) .
454
-				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
455
-			: '';
456
-	} else {
457
-		$self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
458
-
459
-		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
460
-			" (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
461
-	}
447
+    [$skel, $boucle, $ligne] = trouve_boucle_debug($n, $nom);
448
+
449
+    if (!$boucle) {
450
+        return $ligne
451
+            ? ' (' .
452
+                (($nom != $skel) ? _T('squelette_inclus_ligne') :
453
+                    _T('squelette_ligne')) .
454
+                " <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
455
+            : '';
456
+    } else {
457
+        $self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
458
+
459
+        return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
460
+            " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
461
+    }
462 462
 }
463 463
 
464 464
 // affiche un texte avec numero de ligne et ancre.
465 465
 
466 466
 function ancre_texte($texte, $fautifs = [], $nocpt = false) {
467 467
 
468
-	$var_mode_ligne = _request('var_mode_ligne');
469
-	if ($var_mode_ligne) {
470
-		$fautifs[] = [$var_mode_ligne];
471
-	}
472
-	$res = '';
473
-
474
-	$s = highlight_string($texte, true);
475
-	if (str_starts_with($s, '<code>')) {
476
-		$s = substr($s, 6);
477
-		$res = '<code>';
478
-	}
479
-
480
-	$s = preg_replace(
481
-		',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
482
-		'<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
483
-		$s
484
-	);
485
-
486
-
487
-	$tableau = explode('<br />', $s);
488
-
489
-	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
490
-
491
-	$format10 = str_replace('white', 'lightgrey', $format);
492
-	$formaterr = 'color: red;';
493
-	$i = 1;
494
-	$flignes = [];
495
-	$loc = [0, 0];
496
-	foreach ($fautifs as $lc) {
497
-		if (is_array($lc)) {
498
-			$l = array_shift($lc);
499
-			$flignes[$l] = $lc;
500
-		} else {
501
-			$flignes[$lc] = $loc;
502
-		}
503
-	}
504
-
505
-	$ancre = md5((string) $texte);
506
-	foreach ($tableau as $ligne) {
507
-		if (isset($flignes[$i])) {
508
-			$ligne = str_replace('&nbsp;', ' ', $ligne);
509
-			$indexmesg = $flignes[$i][1];
510
-			$err = textebrut($flignes[$i][2]);
511
-			// tentative de pointer sur la colonne fautive;
512
-			// marche pas car highlight_string rajoute des entites. A revoir.
513
-			// $m = $flignes[$i][0];
514
-			// $ligne = substr($ligne, 0, $m-1) .
515
-			// sprintf($formaterr, substr($ligne,$m));
516
-			$bg = $formaterr;
517
-		} else {
518
-			$indexmesg = $ancre;
519
-			$err = $bg = '';
520
-		}
521
-		$res .= sprintf((($i % 10) ? $format : $format10), $i, $bg, $indexmesg, $err, $i, $ligne);
522
-		$i++;
523
-	}
524
-
525
-	return "<div id='T$ancre'>"
526
-	. '<div onclick="'
527
-	. "jQuery(this).parent().find('a').toggle();"
528
-	. '" title="'
529
-	. _T('masquer_colonne')
530
-	. '" style="cursor: pointer;">'
531
-	. ($nocpt ? '' : _T('info_numero_abbreviation'))
532
-	. '</div>
468
+    $var_mode_ligne = _request('var_mode_ligne');
469
+    if ($var_mode_ligne) {
470
+        $fautifs[] = [$var_mode_ligne];
471
+    }
472
+    $res = '';
473
+
474
+    $s = highlight_string($texte, true);
475
+    if (str_starts_with($s, '<code>')) {
476
+        $s = substr($s, 6);
477
+        $res = '<code>';
478
+    }
479
+
480
+    $s = preg_replace(
481
+        ',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
482
+        '<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
483
+        $s
484
+    );
485
+
486
+
487
+    $tableau = explode('<br />', $s);
488
+
489
+    $format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
490
+
491
+    $format10 = str_replace('white', 'lightgrey', $format);
492
+    $formaterr = 'color: red;';
493
+    $i = 1;
494
+    $flignes = [];
495
+    $loc = [0, 0];
496
+    foreach ($fautifs as $lc) {
497
+        if (is_array($lc)) {
498
+            $l = array_shift($lc);
499
+            $flignes[$l] = $lc;
500
+        } else {
501
+            $flignes[$lc] = $loc;
502
+        }
503
+    }
504
+
505
+    $ancre = md5((string) $texte);
506
+    foreach ($tableau as $ligne) {
507
+        if (isset($flignes[$i])) {
508
+            $ligne = str_replace('&nbsp;', ' ', $ligne);
509
+            $indexmesg = $flignes[$i][1];
510
+            $err = textebrut($flignes[$i][2]);
511
+            // tentative de pointer sur la colonne fautive;
512
+            // marche pas car highlight_string rajoute des entites. A revoir.
513
+            // $m = $flignes[$i][0];
514
+            // $ligne = substr($ligne, 0, $m-1) .
515
+            // sprintf($formaterr, substr($ligne,$m));
516
+            $bg = $formaterr;
517
+        } else {
518
+            $indexmesg = $ancre;
519
+            $err = $bg = '';
520
+        }
521
+        $res .= sprintf((($i % 10) ? $format : $format10), $i, $bg, $indexmesg, $err, $i, $ligne);
522
+        $i++;
523
+    }
524
+
525
+    return "<div id='T$ancre'>"
526
+    . '<div onclick="'
527
+    . "jQuery(this).parent().find('a').toggle();"
528
+    . '" title="'
529
+    . _T('masquer_colonne')
530
+    . '" style="cursor: pointer;">'
531
+    . ($nocpt ? '' : _T('info_numero_abbreviation'))
532
+    . '</div>
533 533
 	' . $res . "</div>\n";
534 534
 }
535 535
 
536 536
 // l'environnement graphique du debuggueur
537 537
 
538 538
 function debusquer_squelette($fonc, $mode, $self) {
539
-	$legend = null;
540
-	$texte = '';
541
-
542
-	if ($mode !== 'validation') {
543
-		if (isset($GLOBALS['debug_objets']['sourcefile']) && $GLOBALS['debug_objets']['sourcefile']) {
544
-			$res = "<div id='spip-boucles'>\n"
545
-				. debusquer_navigation_squelettes($self)
546
-				. '</div>';
547
-		} else {
548
-			$res = '';
549
-		}
550
-		if ($fonc) {
551
-			$id = " id='$fonc'";
552
-			if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
553
-				[$legend, $texte, $res2] = debusquer_source($fonc, $mode);
554
-				$texte .= $res2;
555
-			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
556
-				$legend = _T('zbug_' . $mode);
557
-				$texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
558
-				$texte = ancre_texte($texte, ['', '']);
559
-			}
560
-		} else {
561
-			if (strlen(trim($res))) {
562
-				return "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
563
-			} else {
564
-				// cas de l'appel sur erreur: montre la page
565
-				return $GLOBALS['debug_objets']['resultat']['tout'] ?? '';
566
-			}
567
-		}
568
-	} else {
569
-		$valider = charger_fonction('valider', 'xml');
570
-		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
571
-		// Si erreur, signaler leur nombre dans le formulaire admin
572
-		$GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
573
-		[$texte, $err] = emboite_texte($val, $fonc, $self);
574
-		if ($err === false) {
575
-			$err = _T('impossible');
576
-		} elseif ($err === true) {
577
-			$err = _T('correcte');
578
-		} else {
579
-			$err = ": $err";
580
-		}
581
-		$legend = _T('validation') . ' ' . $err;
582
-		$res = $id = '';
583
-	}
584
-
585
-	return trim((string) $texte)
586
-		? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
587
-			. "<div id='debug_boucle'><fieldset$id><legend>"
588
-			. "<a href='" . $self . '#f_' . substr((string) $fonc, 0, 37) . "'> &#8593; "
589
-			. ($legend ?: $mode)
590
-			. '</a></legend>'
591
-			. $texte
592
-			. '</fieldset></div>'
593
-			. '</div>'
594
-		: '';
539
+    $legend = null;
540
+    $texte = '';
541
+
542
+    if ($mode !== 'validation') {
543
+        if (isset($GLOBALS['debug_objets']['sourcefile']) && $GLOBALS['debug_objets']['sourcefile']) {
544
+            $res = "<div id='spip-boucles'>\n"
545
+                . debusquer_navigation_squelettes($self)
546
+                . '</div>';
547
+        } else {
548
+            $res = '';
549
+        }
550
+        if ($fonc) {
551
+            $id = " id='$fonc'";
552
+            if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
553
+                [$legend, $texte, $res2] = debusquer_source($fonc, $mode);
554
+                $texte .= $res2;
555
+            } elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
556
+                $legend = _T('zbug_' . $mode);
557
+                $texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
558
+                $texte = ancre_texte($texte, ['', '']);
559
+            }
560
+        } else {
561
+            if (strlen(trim($res))) {
562
+                return "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
563
+            } else {
564
+                // cas de l'appel sur erreur: montre la page
565
+                return $GLOBALS['debug_objets']['resultat']['tout'] ?? '';
566
+            }
567
+        }
568
+    } else {
569
+        $valider = charger_fonction('valider', 'xml');
570
+        $val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
571
+        // Si erreur, signaler leur nombre dans le formulaire admin
572
+        $GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
573
+        [$texte, $err] = emboite_texte($val, $fonc, $self);
574
+        if ($err === false) {
575
+            $err = _T('impossible');
576
+        } elseif ($err === true) {
577
+            $err = _T('correcte');
578
+        } else {
579
+            $err = ": $err";
580
+        }
581
+        $legend = _T('validation') . ' ' . $err;
582
+        $res = $id = '';
583
+    }
584
+
585
+    return trim((string) $texte)
586
+        ? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
587
+            . "<div id='debug_boucle'><fieldset$id><legend>"
588
+            . "<a href='" . $self . '#f_' . substr((string) $fonc, 0, 37) . "'> &#8593; "
589
+            . ($legend ?: $mode)
590
+            . '</a></legend>'
591
+            . $texte
592
+            . '</fieldset></div>'
593
+            . '</div>'
594
+        : '';
595 595
 }
596 596
 
597 597
 
598 598
 function emboite_texte($res, $fonc = '', $self = '') {
599
-	$errs = $res->err;
600
-	$texte = $res->entete . ($errs ? '' : $res->page);
601
-
602
-	if (!$texte && !$errs) {
603
-		return [ancre_texte('', ['', '']), false];
604
-	}
605
-	if (!$errs) {
606
-		return [ancre_texte($texte, ['', '']), true];
607
-	}
608
-
609
-	if (!isset($GLOBALS['debug_objets'])) {
610
-		$colors = ['#e0e0f0', '#f8f8ff'];
611
-		$encore = count_occ($errs);
612
-		$encore2 = [];
613
-		$fautifs = [];
614
-
615
-		$err = '<tr><th>'
616
-			. _T('numero')
617
-			. '</th><th>'
618
-			. _T('occurence')
619
-			. '</th><th>'
620
-			. _T('ligne')
621
-			. '</th><th>'
622
-			. _T('colonne')
623
-			. '</th><th>'
624
-			. _T('erreur')
625
-			. '</th></tr>';
626
-
627
-		$i = 0;
628
-		$style = "style='text-align: right; padding-right: 5px'";
629
-		foreach ($errs as $r) {
630
-			$i++;
631
-			[$msg, $ligne, $col] = $r;
632
-			#spip_log("$r = list($msg, $ligne, $col");
633
-			if (isset($encore2[$msg])) {
634
-				$ref = ++$encore2[$msg];
635
-			} else {
636
-				$encore2[$msg] = $ref = 1;
637
-			}
638
-			$err .= "<tr  style='background-color: "
639
-				. $colors[$i % 2]
640
-				. "'><td $style><a href='#debut_err'>"
641
-				. $i
642
-				. "</a></td><td $style>"
643
-				. "$ref/$encore[$msg]</td>"
644
-				. "<td $style><a href='#L"
645
-				. $ligne
646
-				. "' id='T$i'>"
647
-				. $ligne
648
-				. "</a></td><td $style>"
649
-				. $col
650
-				. "</td><td>$msg</td></tr>\n";
651
-			$fautifs[] = [$ligne, $col, $i, $msg];
652
-		}
653
-		$err = "<h2 style='text-align: center'>"
654
-			. $i
655
-			. "<a href='#fin_err'>"
656
-			. ' ' . _T('erreur_texte')
657
-			. "</a></h2><table id='debut_err' style='width: 100%'>"
658
-			. $err
659
-			. " </table><a id='fin_err'></a>";
660
-
661
-		return [ancre_texte($texte, $fautifs), $err];
662
-	} else {
663
-		[$msg, $fermant, $ouvrant] = $errs[0];
664
-		$rf = reference_boucle_debug($fermant, $fonc, $self);
665
-		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
666
-		$err = $msg .
667
-			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
668
-			"<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
669
-
670
-		return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
671
-	}
599
+    $errs = $res->err;
600
+    $texte = $res->entete . ($errs ? '' : $res->page);
601
+
602
+    if (!$texte && !$errs) {
603
+        return [ancre_texte('', ['', '']), false];
604
+    }
605
+    if (!$errs) {
606
+        return [ancre_texte($texte, ['', '']), true];
607
+    }
608
+
609
+    if (!isset($GLOBALS['debug_objets'])) {
610
+        $colors = ['#e0e0f0', '#f8f8ff'];
611
+        $encore = count_occ($errs);
612
+        $encore2 = [];
613
+        $fautifs = [];
614
+
615
+        $err = '<tr><th>'
616
+            . _T('numero')
617
+            . '</th><th>'
618
+            . _T('occurence')
619
+            . '</th><th>'
620
+            . _T('ligne')
621
+            . '</th><th>'
622
+            . _T('colonne')
623
+            . '</th><th>'
624
+            . _T('erreur')
625
+            . '</th></tr>';
626
+
627
+        $i = 0;
628
+        $style = "style='text-align: right; padding-right: 5px'";
629
+        foreach ($errs as $r) {
630
+            $i++;
631
+            [$msg, $ligne, $col] = $r;
632
+            #spip_log("$r = list($msg, $ligne, $col");
633
+            if (isset($encore2[$msg])) {
634
+                $ref = ++$encore2[$msg];
635
+            } else {
636
+                $encore2[$msg] = $ref = 1;
637
+            }
638
+            $err .= "<tr  style='background-color: "
639
+                . $colors[$i % 2]
640
+                . "'><td $style><a href='#debut_err'>"
641
+                . $i
642
+                . "</a></td><td $style>"
643
+                . "$ref/$encore[$msg]</td>"
644
+                . "<td $style><a href='#L"
645
+                . $ligne
646
+                . "' id='T$i'>"
647
+                . $ligne
648
+                . "</a></td><td $style>"
649
+                . $col
650
+                . "</td><td>$msg</td></tr>\n";
651
+            $fautifs[] = [$ligne, $col, $i, $msg];
652
+        }
653
+        $err = "<h2 style='text-align: center'>"
654
+            . $i
655
+            . "<a href='#fin_err'>"
656
+            . ' ' . _T('erreur_texte')
657
+            . "</a></h2><table id='debut_err' style='width: 100%'>"
658
+            . $err
659
+            . " </table><a id='fin_err'></a>";
660
+
661
+        return [ancre_texte($texte, $fautifs), $err];
662
+    } else {
663
+        [$msg, $fermant, $ouvrant] = $errs[0];
664
+        $rf = reference_boucle_debug($fermant, $fonc, $self);
665
+        $ro = reference_boucle_debug($ouvrant, $fonc, $self);
666
+        $err = $msg .
667
+            "<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
668
+            "<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
669
+
670
+        return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
671
+    }
672 672
 }
673 673
 
674 674
 function count_occ($regs) {
675
-	$encore = [];
676
-	foreach ($regs as $r) {
677
-		if (isset($encore[$r[0]])) {
678
-			$encore[$r[0]]++;
679
-		} else {
680
-			$encore[$r[0]] = 1;
681
-		}
682
-	}
683
-
684
-	return $encore;
675
+    $encore = [];
676
+    foreach ($regs as $r) {
677
+        if (isset($encore[$r[0]])) {
678
+            $encore[$r[0]]++;
679
+        } else {
680
+            $encore[$r[0]] = 1;
681
+        }
682
+    }
683
+
684
+    return $encore;
685 685
 }
686 686
 
687 687
 function debusquer_navigation_squelettes($self) {
688 688
 
689
-	$res = '';
690
-	$boucles = empty($GLOBALS['debug_objets']['boucle']) ? '' : $GLOBALS['debug_objets']['boucle'];
691
-	$contexte = $GLOBALS['debug_objets']['contexte'];
692
-	$t_skel = _T('squelette');
693
-	foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
694
-		$self2 = parametre_url($self, 'var_mode_objet', $nom);
695
-		$nav = $boucles ? debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile) : '';
696
-		$temps = isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? _T(
697
-			'zbug_profile',
698
-			['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
699
-		) : '';
700
-
701
-		$res .= "<fieldset id='f_" . $nom . "'><legend>"
702
-			. $t_skel
703
-			. ' '
704
-			. $sourcefile
705
-			. "&nbsp;:\n<a href='$self2&amp;var_mode_affiche=squelette#f_$nom'>"
706
-			. $t_skel
707
-			. "</a>\n<a href='$self2&amp;var_mode_affiche=resultat#f_$nom'>"
708
-			. _T('zbug_resultat')
709
-			. "</a>\n<a href='$self2&amp;var_mode_affiche=code#f_$nom'>"
710
-			. _T('zbug_code')
711
-			. "</a>\n<a href='"
712
-			. str_replace('var_mode=debug', 'var_profile=1&amp;var_mode=recalcul', (string) $self)
713
-			. "'>"
714
-			. _T('zbug_calcul')
715
-			. '</a></legend>'
716
-			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
717
-			. debusquer_contexte($contexte[$sourcefile])
718
-		. ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
719
-		. "</fieldset>\n";
720
-	}
721
-
722
-	return $res;
689
+    $res = '';
690
+    $boucles = empty($GLOBALS['debug_objets']['boucle']) ? '' : $GLOBALS['debug_objets']['boucle'];
691
+    $contexte = $GLOBALS['debug_objets']['contexte'];
692
+    $t_skel = _T('squelette');
693
+    foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) {
694
+        $self2 = parametre_url($self, 'var_mode_objet', $nom);
695
+        $nav = $boucles ? debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile) : '';
696
+        $temps = isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? _T(
697
+            'zbug_profile',
698
+            ['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
699
+        ) : '';
700
+
701
+        $res .= "<fieldset id='f_" . $nom . "'><legend>"
702
+            . $t_skel
703
+            . ' '
704
+            . $sourcefile
705
+            . "&nbsp;:\n<a href='$self2&amp;var_mode_affiche=squelette#f_$nom'>"
706
+            . $t_skel
707
+            . "</a>\n<a href='$self2&amp;var_mode_affiche=resultat#f_$nom'>"
708
+            . _T('zbug_resultat')
709
+            . "</a>\n<a href='$self2&amp;var_mode_affiche=code#f_$nom'>"
710
+            . _T('zbug_code')
711
+            . "</a>\n<a href='"
712
+            . str_replace('var_mode=debug', 'var_profile=1&amp;var_mode=recalcul', (string) $self)
713
+            . "'>"
714
+            . _T('zbug_calcul')
715
+            . '</a></legend>'
716
+            . ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
717
+            . debusquer_contexte($contexte[$sourcefile])
718
+        . ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
719
+        . "</fieldset>\n";
720
+    }
721
+
722
+    return $res;
723 723
 }
724 724
 
725 725
 function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source) {
726
-	$i = 0;
727
-	$res = '';
728
-	$var_mode_objet = _request('var_mode_objet');
729
-	$gram = preg_match('/[.](\w+)$/', (string) $nom_source, $r) ? $r[1] : '';
730
-
731
-	foreach ($boucles as $objet => $boucle) {
732
-		if (str_starts_with((string) $objet, (string) $nom_skel)) {
733
-			$i++;
734
-			$nom = $boucle->id_boucle;
735
-			$req = $boucle->type_requete;
736
-			$crit = public_decompiler($boucle, $gram, 0, 'criteres');
737
-			$self2 = $self . '&amp;var_mode_objet=' . $objet;
738
-
739
-			$res .= "\n<tr style='background-color: " .
740
-				($i % 2 ? '#e0e0f0' : '#f8f8ff') .
741
-				"'><td  align='right'>$i</td><td>\n" .
742
-				"<a  class='debug_link_boucle' href='" .
743
-				$self2 .
744
-				"&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
745
-				_T('zbug_boucle') .
746
-				"</a></td><td>\n<a class='debug_link_boucle' href='" .
747
-				$self2 .
748
-				"&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
749
-				_T('zbug_resultat') .
750
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
751
-				$self2 .
752
-				"&amp;var_mode_affiche=code#f_$nom_skel'>" .
753
-				_T('zbug_code') .
754
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
755
-				str_replace('var_mode=', 'var_profile=', $self2) .
756
-				"'>" .
757
-				_T('zbug_calcul') .
758
-				"</a></td><td>\n" .
759
-				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
760
-				"</td><td>\n" .
761
-				$req .
762
-				"</td><td>\n" .
763
-				spip_htmlspecialchars($crit) .
764
-				'</td></tr>';
765
-		}
766
-	}
767
-
768
-	return $res;
726
+    $i = 0;
727
+    $res = '';
728
+    $var_mode_objet = _request('var_mode_objet');
729
+    $gram = preg_match('/[.](\w+)$/', (string) $nom_source, $r) ? $r[1] : '';
730
+
731
+    foreach ($boucles as $objet => $boucle) {
732
+        if (str_starts_with((string) $objet, (string) $nom_skel)) {
733
+            $i++;
734
+            $nom = $boucle->id_boucle;
735
+            $req = $boucle->type_requete;
736
+            $crit = public_decompiler($boucle, $gram, 0, 'criteres');
737
+            $self2 = $self . '&amp;var_mode_objet=' . $objet;
738
+
739
+            $res .= "\n<tr style='background-color: " .
740
+                ($i % 2 ? '#e0e0f0' : '#f8f8ff') .
741
+                "'><td  align='right'>$i</td><td>\n" .
742
+                "<a  class='debug_link_boucle' href='" .
743
+                $self2 .
744
+                "&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
745
+                _T('zbug_boucle') .
746
+                "</a></td><td>\n<a class='debug_link_boucle' href='" .
747
+                $self2 .
748
+                "&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
749
+                _T('zbug_resultat') .
750
+                "</a></td><td>\n<a class='debug_link_resultat' href='" .
751
+                $self2 .
752
+                "&amp;var_mode_affiche=code#f_$nom_skel'>" .
753
+                _T('zbug_code') .
754
+                "</a></td><td>\n<a class='debug_link_resultat' href='" .
755
+                str_replace('var_mode=', 'var_profile=', $self2) .
756
+                "'>" .
757
+                _T('zbug_calcul') .
758
+                "</a></td><td>\n" .
759
+                (($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
760
+                "</td><td>\n" .
761
+                $req .
762
+                "</td><td>\n" .
763
+                spip_htmlspecialchars($crit) .
764
+                '</td></tr>';
765
+        }
766
+    }
767
+
768
+    return $res;
769 769
 }
770 770
 
771 771
 function debusquer_source($objet, $affiche) {
772
-	$quoi = $GLOBALS['debug_objets'][$affiche][$objet];
773
-	if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) {
774
-		$nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle;
775
-	} else {
776
-		$nom = $GLOBALS['debug_objets']['sourcefile'][$objet];
777
-	}
778
-	$res2 = '';
779
-
780
-	if ($affiche == 'resultat') {
781
-		$legend = $nom;
782
-		$req = $GLOBALS['debug_objets']['requete'][$objet];
783
-		if (function_exists('_mysql_traite_query')) {
784
-			$c = strtolower(_request('connect') ?? '');
785
-			$c = $GLOBALS['connexions'][$c ?: 0]['prefixe'];
786
-			$req = _mysql_traite_query($req, '', $c);
787
-		}
788
-		//  permettre le copier/coller facile
789
-		// $res = ancre_texte($req, array(), true);
790
-		$res = "<div id='T" . md5((string) $req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
791
-		//  formatage et affichage des resultats bruts de la requete
792
-		$ress_req = spip_query($req);
793
-		$brut_sql = '';
794
-		$num = 1;
795
-		//  eviter l'affichage de milliers de lignes
796
-		//  personnalisation possible dans mes_options
797
-		$max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
798
-		while ($retours_sql = sql_fetch($ress_req)) {
799
-			if ($num <= $max_aff) {
800
-				$brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
801
-				$brut_sql .= '<p>';
802
-				foreach ($retours_sql as $key => $val) {
803
-					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
804
-				}
805
-				$brut_sql .= '</p>';
806
-			}
807
-			$num++;
808
-		}
809
-		$res2 = interdire_scripts($brut_sql);
810
-		foreach ($quoi as $view) {
811
-			//  ne pas afficher les $contexte_inclus
812
-			$view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
813
-			if ($view) {
814
-				$res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
815
-			}
816
-		}
817
-	} elseif ($affiche == 'code') {
818
-		$legend = $nom;
819
-		$res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
820
-	} elseif ($affiche == 'boucle') {
821
-		$legend = _T('zbug_boucle') . ' ' . $nom;
822
-		// Le compilateur prefixe le nom des boucles par l'extension du fichier source.
823
-		$gram = preg_match('/^([^_]+)_/', (string) $objet, $r) ? $r[1] : '';
824
-		$res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
825
-	} elseif ($affiche == 'squelette') {
826
-		$legend = $GLOBALS['debug_objets']['sourcefile'][$objet];
827
-		$res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]);
828
-	}
829
-
830
-	return [$legend, $res, $res2];
772
+    $quoi = $GLOBALS['debug_objets'][$affiche][$objet];
773
+    if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) {
774
+        $nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle;
775
+    } else {
776
+        $nom = $GLOBALS['debug_objets']['sourcefile'][$objet];
777
+    }
778
+    $res2 = '';
779
+
780
+    if ($affiche == 'resultat') {
781
+        $legend = $nom;
782
+        $req = $GLOBALS['debug_objets']['requete'][$objet];
783
+        if (function_exists('_mysql_traite_query')) {
784
+            $c = strtolower(_request('connect') ?? '');
785
+            $c = $GLOBALS['connexions'][$c ?: 0]['prefixe'];
786
+            $req = _mysql_traite_query($req, '', $c);
787
+        }
788
+        //  permettre le copier/coller facile
789
+        // $res = ancre_texte($req, array(), true);
790
+        $res = "<div id='T" . md5((string) $req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
791
+        //  formatage et affichage des resultats bruts de la requete
792
+        $ress_req = spip_query($req);
793
+        $brut_sql = '';
794
+        $num = 1;
795
+        //  eviter l'affichage de milliers de lignes
796
+        //  personnalisation possible dans mes_options
797
+        $max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
798
+        while ($retours_sql = sql_fetch($ress_req)) {
799
+            if ($num <= $max_aff) {
800
+                $brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
801
+                $brut_sql .= '<p>';
802
+                foreach ($retours_sql as $key => $val) {
803
+                    $brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
804
+                }
805
+                $brut_sql .= '</p>';
806
+            }
807
+            $num++;
808
+        }
809
+        $res2 = interdire_scripts($brut_sql);
810
+        foreach ($quoi as $view) {
811
+            //  ne pas afficher les $contexte_inclus
812
+            $view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
813
+            if ($view) {
814
+                $res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
815
+            }
816
+        }
817
+    } elseif ($affiche == 'code') {
818
+        $legend = $nom;
819
+        $res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
820
+    } elseif ($affiche == 'boucle') {
821
+        $legend = _T('zbug_boucle') . ' ' . $nom;
822
+        // Le compilateur prefixe le nom des boucles par l'extension du fichier source.
823
+        $gram = preg_match('/^([^_]+)_/', (string) $objet, $r) ? $r[1] : '';
824
+        $res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
825
+    } elseif ($affiche == 'squelette') {
826
+        $legend = $GLOBALS['debug_objets']['sourcefile'][$objet];
827
+        $res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]);
828
+    }
829
+
830
+    return [$legend, $res, $res2];
831 831
 }
832 832
 
833 833
 function debusquer_entete($titre, $corps) {
834 834
 
835
-	include_spip('balise/formulaire_admin');
836
-	include_spip('public/assembler'); // pour inclure_balise_dynamique
837
-	include_spip('inc/texte'); // pour corriger_typo
838
-
839
-	return _DOCTYPE_ECRIRE .
840
-	html_lang_attributes() .
841
-	"<head>\n<title>" .
842
-	('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
843
-		_T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' .
844
-		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
845
-	")</title>\n" .
846
-	"<meta http-equiv='Content-Type' content='text/html" .
847
-	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
848
-	"' />\n" .
849
-	http_script('', 'jquery.js')
850
-	. "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
851
-	. "' type='text/css' />" .
852
-	"</head>\n" .
853
-	"<body style='margin:0 10px;'>\n" .
854
-	"<div id='spip-debug-header'>" .
855
-	$corps .
856
-	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
857
-	'</div></body></html>';
835
+    include_spip('balise/formulaire_admin');
836
+    include_spip('public/assembler'); // pour inclure_balise_dynamique
837
+    include_spip('inc/texte'); // pour corriger_typo
838
+
839
+    return _DOCTYPE_ECRIRE .
840
+    html_lang_attributes() .
841
+    "<head>\n<title>" .
842
+    ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
843
+        _T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' .
844
+        supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
845
+    ")</title>\n" .
846
+    "<meta http-equiv='Content-Type' content='text/html" .
847
+    (($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
848
+    "' />\n" .
849
+    http_script('', 'jquery.js')
850
+    . "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
851
+    . "' type='text/css' />" .
852
+    "</head>\n" .
853
+    "<body style='margin:0 10px;'>\n" .
854
+    "<div id='spip-debug-header'>" .
855
+    $corps .
856
+    inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
857
+    '</div></body></html>';
858 858
 }
Please login to merge, or discard this patch.
Spacing   +87 added lines, -89 removed lines patch added patch discarded remove patch
@@ -146,7 +146,7 @@  discard block
 block discarded – undo
146 146
 		if (!$fonc) {
147 147
 			$fonc = $GLOBALS['debug_objets']['principal'];
148 148
 		}
149
-		$titre = $mode ? $mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' ' . $GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
149
+		$titre = $mode ? $mode.(isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? ' '.$GLOBALS['debug_objets']['sourcefile'][$fonc] : '') : ($fonc);
150 150
 	}
151 151
 	if ($message === false) {
152 152
 		lang_select();
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 	$fond = $GLOBALS['fond'] ?? '';
170 170
 	// une erreur critique sort $message en array
171 171
 	$debug = is_array($msg) ? $msg[1] : $msg;
172
-	spip_log('Debug: ' . $debug . ' (' . $fond . ')');
172
+	spip_log('Debug: '.$debug.' ('.$fond.')');
173 173
 
174 174
 	return $msg;
175 175
 }
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
 function debusquer_bandeau($erreurs) {
178 178
 
179 179
 	if (!empty($erreurs)) {
180
-		$n = [(is_countable($erreurs) ? count($erreurs) : 0) . ' ' . _T('zbug_erreur_squelette')];
180
+		$n = [(is_countable($erreurs) ? count($erreurs) : 0).' '._T('zbug_erreur_squelette')];
181 181
 
182 182
 		return debusquer_navigation($erreurs, $n);
183 183
 	} elseif (!empty($GLOBALS['tableau_des_temps'])) {
@@ -210,25 +210,25 @@  discard block
 block discarded – undo
210 210
 			$valeur_simple = [];
211 211
 			foreach ($valeur as $v) {
212 212
 				if (is_array($v)) {
213
-					$valeur_simple[] = 'array:' . count($v);
213
+					$valeur_simple[] = 'array:'.count($v);
214 214
 				} elseif (is_object($v)) {
215 215
 					$valeur_simple[] = $v::class;
216 216
 				} elseif (is_string($v)) {
217
-					$valeur_simple[] = "'" . $v . "'";
217
+					$valeur_simple[] = "'".$v."'";
218 218
 				} else {
219 219
 					$valeur_simple[] = $v;
220 220
 				}
221 221
 			}
222 222
 			$n = count($valeur);
223
-			$valeur = (($n > 3) ? 'array:' . $n . ' ' : '');
224
-			$valeur .= '[' . implode(', ', $valeur_simple) . ']';
223
+			$valeur = (($n > 3) ? 'array:'.$n.' ' : '');
224
+			$valeur .= '['.implode(', ', $valeur_simple).']';
225 225
 		} elseif (is_object($valeur)) {
226 226
 			$valeur = $valeur::class;
227 227
 		} elseif (is_string($valeur)) {
228
-			$valeur = "'" . $valeur . "'";
228
+			$valeur = "'".$valeur."'";
229 229
 		}
230
-		$res .= "\n<tr><td><strong>" . nl2br((string) entites_html($nom))
231
-			. '</strong></td><td>:&nbsp;' . nl2br((string) entites_html($valeur))
230
+		$res .= "\n<tr><td><strong>".nl2br((string) entites_html($nom))
231
+			. '</strong></td><td>:&nbsp;'.nl2br((string) entites_html($valeur))
232 232
 			. "</td></tr>\n";
233 233
 	}
234 234
 
@@ -253,7 +253,7 @@  discard block
 block discarded – undo
253 253
 	if ($ligne) {
254 254
 		$msg .= " L$ligne";
255 255
 	}
256
-	spip_log($msg, 'debusquer' . _LOG_ERREUR);
256
+	spip_log($msg, 'debusquer'._LOG_ERREUR);
257 257
 }
258 258
 
259 259
 
@@ -278,10 +278,10 @@  discard block
 block discarded – undo
278 278
 				$nom_code = $lieu->descr['nom'];
279 279
 				$skel = $lieu->descr['sourcefile'];
280 280
 				$h2 = parametre_url($href, 'var_mode_objet', $nom_code);
281
-				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne;
281
+				$h3 = parametre_url($h2, 'var_mode_affiche', 'squelette').'#L'.$ligne;
282 282
 				$skel = "<a href='$h3'><b>$skel</b></a>";
283 283
 				if ($boucle) {
284
-					$h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle');
284
+					$h3 = parametre_url($h2.$boucle, 'var_mode_affiche', 'boucle');
285 285
 					$boucle = "<a href='$h3'><b>$boucle</b></a>";
286 286
 				}
287 287
 			}
@@ -370,7 +370,7 @@  discard block
 block discarded – undo
370 370
 	}
371 371
 
372 372
 	// Requete erronee
373
-	$err = '<b>' . _T('avis_erreur_mysql') . " $errno</b><br /><tt>\n"
373
+	$err = '<b>'._T('avis_erreur_mysql')." $errno</b><br /><tt>\n"
374 374
 		. spip_htmlspecialchars($msg)
375 375
 		. "\n<br /><span style='color: red'><b>"
376 376
 		. spip_htmlspecialchars($query)
@@ -384,7 +384,7 @@  discard block
 block discarded – undo
384 384
 
385 385
 function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = '') {
386 386
 
387
-	$id = $nom . $boucle;
387
+	$id = $nom.$boucle;
388 388
 	if (is_array($GLOBALS['debug_objets']['sequence'][$id])) {
389 389
 		foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) {
390 390
 			if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', (string) $v[0], $r)) {
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
 	) {
433 433
 		$reg[1] = 'inconnu';
434 434
 	}
435
-	$incl = ',' . $reg[1] . '[.]\w$,';
435
+	$incl = ','.$reg[1].'[.]\w$,';
436 436
 
437 437
 	foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) {
438 438
 		if (preg_match($incl, (string) $v)) {
@@ -448,16 +448,14 @@  discard block
 block discarded – undo
448 448
 
449 449
 	if (!$boucle) {
450 450
 		return $ligne
451
-			? ' (' .
452
-				(($nom != $skel) ? _T('squelette_inclus_ligne') :
453
-					_T('squelette_ligne')) .
451
+			? ' ('.
452
+				(($nom != $skel) ? _T('squelette_inclus_ligne') : _T('squelette_ligne')).
454 453
 				" <a href='$self&amp;var_mode_objet=$skel&amp;var_mode_affiche=squelette&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"
455 454
 			: '';
456 455
 	} else {
457 456
 		$self .= "&amp;var_mode_objet=$skel$boucle&amp;var_mode_affiche=boucle";
458 457
 
459
-		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" :
460
-			" (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
458
+		return $ligne ? " (boucle $boucle ligne\n<a href='$self&amp;var_mode_ligne=$ligne#L$ligne'>$ligne</a>)" : " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)";
461 459
 	}
462 460
 }
463 461
 
@@ -479,14 +477,14 @@  discard block
 block discarded – undo
479 477
 
480 478
 	$s = preg_replace(
481 479
 		',<(\w[^<>]*)>([^<]*)<br />([^<]*)</\1>,',
482
-		'<\1>\2</\1><br />' . "\n" . '<\1>\3</\1>',
480
+		'<\1>\2</\1><br />'."\n".'<\1>\3</\1>',
483 481
 		$s
484 482
 	);
485 483
 
486 484
 
487 485
 	$tableau = explode('<br />', $s);
488 486
 
489
-	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: " . ($nocpt ? 'hidden' : 'visible') . ";%s' href='#T%s' title=\"%s\">%0" . (string) @strlen(count($tableau)) . "d</a></span> %s<br />\n";
487
+	$format = "<span style='float:left;display:block;width:50px;height:1px'><a id='L%d' style='background-color: white; visibility: ".($nocpt ? 'hidden' : 'visible').";%s' href='#T%s' title=\"%s\">%0".(string) @strlen(count($tableau))."d</a></span> %s<br />\n";
490 488
 
491 489
 	$format10 = str_replace('white', 'lightgrey', $format);
492 490
 	$formaterr = 'color: red;';
@@ -530,7 +528,7 @@  discard block
 block discarded – undo
530 528
 	. '" style="cursor: pointer;">'
531 529
 	. ($nocpt ? '' : _T('info_numero_abbreviation'))
532 530
 	. '</div>
533
-	' . $res . "</div>\n";
531
+	' . $res."</div>\n";
534 532
 }
535 533
 
536 534
 // l'environnement graphique du debuggueur
@@ -552,14 +550,14 @@  discard block
 block discarded – undo
552 550
 			if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) {
553 551
 				[$legend, $texte, $res2] = debusquer_source($fonc, $mode);
554 552
 				$texte .= $res2;
555
-			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) {
556
-				$legend = _T('zbug_' . $mode);
557
-				$texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout'];
553
+			} elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc.'tout'])) {
554
+				$legend = _T('zbug_'.$mode);
555
+				$texte = $GLOBALS['debug_objets'][$mode][$fonc.'tout'];
558 556
 				$texte = ancre_texte($texte, ['', '']);
559 557
 			}
560 558
 		} else {
561 559
 			if (strlen(trim($res))) {
562
-				return "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
560
+				return "<img src='".chemin_image('debug-xx.svg')."' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>";
563 561
 			} else {
564 562
 				// cas de l'appel sur erreur: montre la page
565 563
 				return $GLOBALS['debug_objets']['resultat']['tout'] ?? '';
@@ -567,7 +565,7 @@  discard block
 block discarded – undo
567 565
 		}
568 566
 	} else {
569 567
 		$valider = charger_fonction('valider', 'xml');
570
-		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']);
568
+		$val = $valider($GLOBALS['debug_objets']['validation'][$fonc.'tout']);
571 569
 		// Si erreur, signaler leur nombre dans le formulaire admin
572 570
 		$GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : '';
573 571
 		[$texte, $err] = emboite_texte($val, $fonc, $self);
@@ -578,14 +576,14 @@  discard block
 block discarded – undo
578 576
 		} else {
579 577
 			$err = ": $err";
580 578
 		}
581
-		$legend = _T('validation') . ' ' . $err;
579
+		$legend = _T('validation').' '.$err;
582 580
 		$res = $id = '';
583 581
 	}
584 582
 
585 583
 	return trim((string) $texte)
586
-		? "<img src='" . chemin_image('debug-xx.svg') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
584
+		? "<img src='".chemin_image('debug-xx.svg')."' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res"
587 585
 			. "<div id='debug_boucle'><fieldset$id><legend>"
588
-			. "<a href='" . $self . '#f_' . substr((string) $fonc, 0, 37) . "'> &#8593; "
586
+			. "<a href='".$self.'#f_'.substr((string) $fonc, 0, 37)."'> &#8593; "
589 587
 			. ($legend ?: $mode)
590 588
 			. '</a></legend>'
591 589
 			. $texte
@@ -597,7 +595,7 @@  discard block
 block discarded – undo
597 595
 
598 596
 function emboite_texte($res, $fonc = '', $self = '') {
599 597
 	$errs = $res->err;
600
-	$texte = $res->entete . ($errs ? '' : $res->page);
598
+	$texte = $res->entete.($errs ? '' : $res->page);
601 599
 
602 600
 	if (!$texte && !$errs) {
603 601
 		return [ancre_texte('', ['', '']), false];
@@ -653,7 +651,7 @@  discard block
 block discarded – undo
653 651
 		$err = "<h2 style='text-align: center'>"
654 652
 			. $i
655 653
 			. "<a href='#fin_err'>"
656
-			. ' ' . _T('erreur_texte')
654
+			. ' '._T('erreur_texte')
657 655
 			. "</a></h2><table id='debut_err' style='width: 100%'>"
658 656
 			. $err
659 657
 			. " </table><a id='fin_err'></a>";
@@ -663,9 +661,9 @@  discard block
 block discarded – undo
663 661
 		[$msg, $fermant, $ouvrant] = $errs[0];
664 662
 		$rf = reference_boucle_debug($fermant, $fonc, $self);
665 663
 		$ro = reference_boucle_debug($ouvrant, $fonc, $self);
666
-		$err = $msg .
667
-			"<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" .
668
-			"<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro";
664
+		$err = $msg.
665
+			"<a href='#L".$fermant."'>$fermant</a>$rf<br />".
666
+			"<a href='#L".$ouvrant."'>$ouvrant</a>$ro";
669 667
 
670 668
 		return [ancre_texte($texte, [[$ouvrant], [$fermant]]), $err];
671 669
 	}
@@ -698,7 +696,7 @@  discard block
 block discarded – undo
698 696
 			['time' => $GLOBALS['debug_objets']['profile'][$sourcefile]]
699 697
 		) : '';
700 698
 
701
-		$res .= "<fieldset id='f_" . $nom . "'><legend>"
699
+		$res .= "<fieldset id='f_".$nom."'><legend>"
702 700
 			. $t_skel
703 701
 			. ' '
704 702
 			. $sourcefile
@@ -713,7 +711,7 @@  discard block
 block discarded – undo
713 711
 			. "'>"
714 712
 			. _T('zbug_calcul')
715 713
 			. '</a></legend>'
716
-			. ($temps ? "\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />" : (''))
714
+			. ($temps ? "\n<span style='display:block;float:".$GLOBALS['spip_lang_right']."'>$temps</span><br />" : (''))
717 715
 			. debusquer_contexte($contexte[$sourcefile])
718 716
 		. ($nav ? "<table width='100%'>\n$nav</table>\n" : (''))
719 717
 		. "</fieldset>\n";
@@ -734,33 +732,33 @@  discard block
 block discarded – undo
734 732
 			$nom = $boucle->id_boucle;
735 733
 			$req = $boucle->type_requete;
736 734
 			$crit = public_decompiler($boucle, $gram, 0, 'criteres');
737
-			$self2 = $self . '&amp;var_mode_objet=' . $objet;
738
-
739
-			$res .= "\n<tr style='background-color: " .
740
-				($i % 2 ? '#e0e0f0' : '#f8f8ff') .
741
-				"'><td  align='right'>$i</td><td>\n" .
742
-				"<a  class='debug_link_boucle' href='" .
743
-				$self2 .
744
-				"&amp;var_mode_affiche=boucle#f_$nom_skel'>" .
745
-				_T('zbug_boucle') .
746
-				"</a></td><td>\n<a class='debug_link_boucle' href='" .
747
-				$self2 .
748
-				"&amp;var_mode_affiche=resultat#f_$nom_skel'>" .
749
-				_T('zbug_resultat') .
750
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
751
-				$self2 .
752
-				"&amp;var_mode_affiche=code#f_$nom_skel'>" .
753
-				_T('zbug_code') .
754
-				"</a></td><td>\n<a class='debug_link_resultat' href='" .
755
-				str_replace('var_mode=', 'var_profile=', $self2) .
756
-				"'>" .
757
-				_T('zbug_calcul') .
758
-				"</a></td><td>\n" .
759
-				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) .
760
-				"</td><td>\n" .
761
-				$req .
762
-				"</td><td>\n" .
763
-				spip_htmlspecialchars($crit) .
735
+			$self2 = $self.'&amp;var_mode_objet='.$objet;
736
+
737
+			$res .= "\n<tr style='background-color: ".
738
+				($i % 2 ? '#e0e0f0' : '#f8f8ff').
739
+				"'><td  align='right'>$i</td><td>\n".
740
+				"<a  class='debug_link_boucle' href='".
741
+				$self2.
742
+				"&amp;var_mode_affiche=boucle#f_$nom_skel'>".
743
+				_T('zbug_boucle').
744
+				"</a></td><td>\n<a class='debug_link_boucle' href='".
745
+				$self2.
746
+				"&amp;var_mode_affiche=resultat#f_$nom_skel'>".
747
+				_T('zbug_resultat').
748
+				"</a></td><td>\n<a class='debug_link_resultat' href='".
749
+				$self2.
750
+				"&amp;var_mode_affiche=code#f_$nom_skel'>".
751
+				_T('zbug_code').
752
+				"</a></td><td>\n<a class='debug_link_resultat' href='".
753
+				str_replace('var_mode=', 'var_profile=', $self2).
754
+				"'>".
755
+				_T('zbug_calcul').
756
+				"</a></td><td>\n".
757
+				(($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom).
758
+				"</td><td>\n".
759
+				$req.
760
+				"</td><td>\n".
761
+				spip_htmlspecialchars($crit).
764 762
 				'</td></tr>';
765 763
 		}
766 764
 	}
@@ -787,7 +785,7 @@  discard block
 block discarded – undo
787 785
 		}
788 786
 		//  permettre le copier/coller facile
789 787
 		// $res = ancre_texte($req, array(), true);
790
-		$res = "<div id='T" . md5((string) $req) . "'>\n<pre>\n" . $req . "</pre>\n</div>\n";
788
+		$res = "<div id='T".md5((string) $req)."'>\n<pre>\n".$req."</pre>\n</div>\n";
791 789
 		//  formatage et affichage des resultats bruts de la requete
792 790
 		$ress_req = spip_query($req);
793 791
 		$brut_sql = '';
@@ -797,10 +795,10 @@  discard block
 block discarded – undo
797 795
 		$max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50;
798 796
 		while ($retours_sql = sql_fetch($ress_req)) {
799 797
 			if ($num <= $max_aff) {
800
-				$brut_sql .= '<h3>' . ($num == 1 ? $num . ' sur ' . sql_count($ress_req) : $num) . '</h3>';
798
+				$brut_sql .= '<h3>'.($num == 1 ? $num.' sur '.sql_count($ress_req) : $num).'</h3>';
801 799
 				$brut_sql .= '<p>';
802 800
 				foreach ($retours_sql as $key => $val) {
803
-					$brut_sql .= '<strong>' . $key . '</strong> => ' . spip_htmlspecialchars(couper($val, 150)) . "<br />\n";
801
+					$brut_sql .= '<strong>'.$key.'</strong> => '.spip_htmlspecialchars(couper($val, 150))."<br />\n";
804 802
 				}
805 803
 				$brut_sql .= '</p>';
806 804
 			}
@@ -811,14 +809,14 @@  discard block
 block discarded – undo
811 809
 			//  ne pas afficher les $contexte_inclus
812 810
 			$view = preg_replace(',<\?php.+\?[>],Uims', '', (string) $view);
813 811
 			if ($view) {
814
-				$res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . '</fieldset>';
812
+				$res2 .= "\n<br /><fieldset>".interdire_scripts($view).'</fieldset>';
815 813
 			}
816 814
 		}
817 815
 	} elseif ($affiche == 'code') {
818 816
 		$legend = $nom;
819
-		$res = ancre_texte('<' . "?php\n" . $quoi . "\n?" . '>');
817
+		$res = ancre_texte('<'."?php\n".$quoi."\n?".'>');
820 818
 	} elseif ($affiche == 'boucle') {
821
-		$legend = _T('zbug_boucle') . ' ' . $nom;
819
+		$legend = _T('zbug_boucle').' '.$nom;
822 820
 		// Le compilateur prefixe le nom des boucles par l'extension du fichier source.
823 821
 		$gram = preg_match('/^([^_]+)_/', (string) $objet, $r) ? $r[1] : '';
824 822
 		$res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle'));
@@ -836,23 +834,23 @@  discard block
 block discarded – undo
836 834
 	include_spip('public/assembler'); // pour inclure_balise_dynamique
837 835
 	include_spip('inc/texte'); // pour corriger_typo
838 836
 
839
-	return _DOCTYPE_ECRIRE .
840
-	html_lang_attributes() .
841
-	"<head>\n<title>" .
842
-	('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' .
843
-		_T('admin_debug') . ' ' . spip_htmlspecialchars($titre) . ' (' .
844
-		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) .
845
-	")</title>\n" .
846
-	"<meta http-equiv='Content-Type' content='text/html" .
847
-	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') .
848
-	"' />\n" .
837
+	return _DOCTYPE_ECRIRE.
838
+	html_lang_attributes().
839
+	"<head>\n<title>".
840
+	('SPIP '.$GLOBALS['spip_version_affichee'].' '.
841
+		_T('admin_debug').' '.spip_htmlspecialchars($titre).' ('.
842
+		supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))).
843
+	")</title>\n".
844
+	"<meta http-equiv='Content-Type' content='text/html".
845
+	(($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '').
846
+	"' />\n".
849 847
 	http_script('', 'jquery.js')
850
-	. "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css'))
851
-	. "' type='text/css' />" .
852
-	"</head>\n" .
853
-	"<body style='margin:0 10px;'>\n" .
854
-	"<div id='spip-debug-header'>" .
855
-	$corps .
856
-	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) .
848
+	. "<link rel='stylesheet' href='".url_absolue(find_in_path('spip_admin.css'))
849
+	. "' type='text/css' />".
850
+	"</head>\n".
851
+	"<body style='margin:0 10px;'>\n".
852
+	"<div id='spip-debug-header'>".
853
+	$corps.
854
+	inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false).
857 855
 	'</div></body></html>';
858 856
 }
Please login to merge, or discard this patch.
ecrire/public/format_html.php 2 patches
Indentation   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -10,123 +10,123 @@
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 function format_boucle_html($preaff, $avant, $nom, $type, $crit, $corps, $apres, $altern, $postaff, $prof) {
17
-	$preaff = $preaff ? "<BB$nom>$preaff" : '';
18
-	$avant = $avant ? "<B$nom>$avant" : '';
19
-	$apres = $apres ? "$apres</B$nom>" : '';
20
-	$altern = $altern ? "$altern<//B$nom>" : '';
21
-	$postaff = $postaff ? "$postaff</BB$nom>" : '';
22
-	$corps = $corps ? ">$corps</BOUCLE$nom>" : ' />';
23
-
24
-	return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
17
+    $preaff = $preaff ? "<BB$nom>$preaff" : '';
18
+    $avant = $avant ? "<B$nom>$avant" : '';
19
+    $apres = $apres ? "$apres</B$nom>" : '';
20
+    $altern = $altern ? "$altern<//B$nom>" : '';
21
+    $postaff = $postaff ? "$postaff</BB$nom>" : '';
22
+    $corps = $corps ? ">$corps</BOUCLE$nom>" : ' />';
23
+
24
+    return "$preaff$avant<BOUCLE$nom($type)$crit$corps$apres$altern$postaff";
25 25
 }
26 26
 
27 27
 function format_inclure_html($file, $args, $prof) {
28
-	if (!str_contains((string) $file, '#')) {
29
-		$t = $file ? ('(' . $file . ')') : '';
30
-	} else {
31
-		$t = '{fond=' . $file . '}';
32
-	}
33
-	$args = $args ? '{' . implode(', ', $args) . '}' : ('');
34
-
35
-	return ('<INCLURE' . $t . $args . '>');
28
+    if (!str_contains((string) $file, '#')) {
29
+        $t = $file ? ('(' . $file . ')') : '';
30
+    } else {
31
+        $t = '{fond=' . $file . '}';
32
+    }
33
+    $args = $args ? '{' . implode(', ', $args) . '}' : ('');
34
+
35
+    return ('<INCLURE' . $t . $args . '>');
36 36
 }
37 37
 
38 38
 function format_polyglotte_html($args, $prof) {
39
-	$contenu = [];
40
-	foreach ($args as $l => $t) {
41
-		$contenu[] = ($l ? "[$l]" : '') . $t;
42
-	}
39
+    $contenu = [];
40
+    foreach ($args as $l => $t) {
41
+        $contenu[] = ($l ? "[$l]" : '') . $t;
42
+    }
43 43
 
44
-	return ('<multi>' . implode(' ', $contenu) . '</multi>');
44
+    return ('<multi>' . implode(' ', $contenu) . '</multi>');
45 45
 }
46 46
 
47 47
 function format_idiome_html($nom, $module, $args, $filtres, $prof) {
48
-	foreach ($args as $k => $v) {
49
-		$args[$k] = "$k=$v";
50
-	}
51
-	$args = ($args ? '{' . implode(',', $args) . '}' : (''));
48
+    foreach ($args as $k => $v) {
49
+        $args[$k] = "$k=$v";
50
+    }
51
+    $args = ($args ? '{' . implode(',', $args) . '}' : (''));
52 52
 
53
-	return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
53
+    return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
54 54
 }
55 55
 
56 56
 function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) {
57
-	$nom = '#'
58
-		. ($boucle ? ($boucle . ':') : '')
59
-		. $nom
60
-		. $etoile
61
-		. $args
62
-		. $filtres;
57
+    $nom = '#'
58
+        . ($boucle ? ($boucle . ':') : '')
59
+        . $nom
60
+        . $etoile
61
+        . $args
62
+        . $filtres;
63 63
 
64
-	// Determiner si c'est un champ etendu,
64
+    // Determiner si c'est un champ etendu,
65 65
 
66
-	$s = ($avant || $apres || $filtres || str_contains((string) $args, '(#'));
66
+    $s = ($avant || $apres || $filtres || str_contains((string) $args, '(#'));
67 67
 
68
-	return ($s ? "[$avant($nom)$apres]" : $nom);
68
+    return ($s ? "[$avant($nom)$apres]" : $nom);
69 69
 }
70 70
 
71 71
 function format_critere_html($critere) {
72
-	foreach ($critere as $k => $crit) {
73
-		$crit_s = '';
74
-		foreach ($crit as $operande) {
75
-			[$type, $valeur] = $operande;
76
-			if ($type == 'champ' && $valeur[0] == '[') {
77
-				$valeur = substr((string) $valeur, 1, -1);
78
-				if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
79
-					$valeur = substr($valeur, 1, -1);
80
-				}
81
-			}
82
-			$crit_s .= $valeur;
83
-		}
84
-		$critere[$k] = $crit_s;
85
-	}
86
-
87
-	return ($critere ? '{' . implode(',', $critere) . '}' : (''));
72
+    foreach ($critere as $k => $crit) {
73
+        $crit_s = '';
74
+        foreach ($crit as $operande) {
75
+            [$type, $valeur] = $operande;
76
+            if ($type == 'champ' && $valeur[0] == '[') {
77
+                $valeur = substr((string) $valeur, 1, -1);
78
+                if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) {
79
+                    $valeur = substr($valeur, 1, -1);
80
+                }
81
+            }
82
+            $crit_s .= $valeur;
83
+        }
84
+        $critere[$k] = $crit_s;
85
+    }
86
+
87
+    return ($critere ? '{' . implode(',', $critere) . '}' : (''));
88 88
 }
89 89
 
90 90
 function format_liste_html($fonc, $args, $prof) {
91
-	return ((($fonc !== '') ? "|$fonc" : $fonc)
92
-		. ($args ? '{' . implode(',', $args) . '}' : ('')));
91
+    return ((($fonc !== '') ? "|$fonc" : $fonc)
92
+        . ($args ? '{' . implode(',', $args) . '}' : ('')));
93 93
 }
94 94
 
95 95
 // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes
96 96
 function format_suite_html($args) {
97
-	$argsCount = is_countable($args) ? count($args) : 0;
98
-	for ($i = 0; $i < $argsCount - 1; $i++) {
99
-		[$texte, $type] = $args[$i];
100
-		[$texte2, $type2] = $args[$i + 1];
101
-		if (!$texte || !$texte2) {
102
-			continue;
103
-		}
104
-		$c1 = substr((string) $texte, -1);
105
-		if ($type2 !== 'texte') {
106
-			// si un texte se termine par ( et est suivi d'un champ
107
-			// ou assimiles, forcer la notation pleine
108
-			if ($c1 == '(' && str_starts_with((string) $texte2, '#')) {
109
-				$args[$i + 1][0] = '[(' . $texte2 . ')]';
110
-			}
111
-		} else {
112
-			if ($type == 'texte') {
113
-				continue;
114
-			}
115
-			// si un champ ou assimiles est suivi d'un texte
116
-			// et si celui-ci commence par un caractere de champ
117
-			// forcer la notation pleine
118
-			if (
119
-				$c1 == '}' && str_starts_with(ltrim((string) $texte2), '|')
120
-				|| preg_match('/[\w\d_*]/', $c1) && preg_match('/^[\w\d_*{|]/', (string) $texte2)
121
-			) {
122
-				$args[$i][0] = '[(' . $texte . ')]';
123
-			}
124
-		}
125
-	}
126
-
127
-	return implode('', array_map(fn($arg) => reset($arg), $args));
97
+    $argsCount = is_countable($args) ? count($args) : 0;
98
+    for ($i = 0; $i < $argsCount - 1; $i++) {
99
+        [$texte, $type] = $args[$i];
100
+        [$texte2, $type2] = $args[$i + 1];
101
+        if (!$texte || !$texte2) {
102
+            continue;
103
+        }
104
+        $c1 = substr((string) $texte, -1);
105
+        if ($type2 !== 'texte') {
106
+            // si un texte se termine par ( et est suivi d'un champ
107
+            // ou assimiles, forcer la notation pleine
108
+            if ($c1 == '(' && str_starts_with((string) $texte2, '#')) {
109
+                $args[$i + 1][0] = '[(' . $texte2 . ')]';
110
+            }
111
+        } else {
112
+            if ($type == 'texte') {
113
+                continue;
114
+            }
115
+            // si un champ ou assimiles est suivi d'un texte
116
+            // et si celui-ci commence par un caractere de champ
117
+            // forcer la notation pleine
118
+            if (
119
+                $c1 == '}' && str_starts_with(ltrim((string) $texte2), '|')
120
+                || preg_match('/[\w\d_*]/', $c1) && preg_match('/^[\w\d_*{|]/', (string) $texte2)
121
+            ) {
122
+                $args[$i][0] = '[(' . $texte . ')]';
123
+            }
124
+        }
125
+    }
126
+
127
+    return implode('', array_map(fn($arg) => reset($arg), $args));
128 128
 }
129 129
 
130 130
 function format_texte_html($texte) {
131
-	return $texte;
131
+    return $texte;
132 132
 }
Please login to merge, or discard this patch.
Spacing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -26,36 +26,36 @@  discard block
 block discarded – undo
26 26
 
27 27
 function format_inclure_html($file, $args, $prof) {
28 28
 	if (!str_contains((string) $file, '#')) {
29
-		$t = $file ? ('(' . $file . ')') : '';
29
+		$t = $file ? ('('.$file.')') : '';
30 30
 	} else {
31
-		$t = '{fond=' . $file . '}';
31
+		$t = '{fond='.$file.'}';
32 32
 	}
33
-	$args = $args ? '{' . implode(', ', $args) . '}' : ('');
33
+	$args = $args ? '{'.implode(', ', $args).'}' : ('');
34 34
 
35
-	return ('<INCLURE' . $t . $args . '>');
35
+	return ('<INCLURE'.$t.$args.'>');
36 36
 }
37 37
 
38 38
 function format_polyglotte_html($args, $prof) {
39 39
 	$contenu = [];
40 40
 	foreach ($args as $l => $t) {
41
-		$contenu[] = ($l ? "[$l]" : '') . $t;
41
+		$contenu[] = ($l ? "[$l]" : '').$t;
42 42
 	}
43 43
 
44
-	return ('<multi>' . implode(' ', $contenu) . '</multi>');
44
+	return ('<multi>'.implode(' ', $contenu).'</multi>');
45 45
 }
46 46
 
47 47
 function format_idiome_html($nom, $module, $args, $filtres, $prof) {
48 48
 	foreach ($args as $k => $v) {
49 49
 		$args[$k] = "$k=$v";
50 50
 	}
51
-	$args = ($args ? '{' . implode(',', $args) . '}' : (''));
51
+	$args = ($args ? '{'.implode(',', $args).'}' : (''));
52 52
 
53
-	return ('<:' . ($module ? "$module:" : '') . $nom . $args . $filtres . ':>');
53
+	return ('<:'.($module ? "$module:" : '').$nom.$args.$filtres.':>');
54 54
 }
55 55
 
56 56
 function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) {
57 57
 	$nom = '#'
58
-		. ($boucle ? ($boucle . ':') : '')
58
+		. ($boucle ? ($boucle.':') : '')
59 59
 		. $nom
60 60
 		. $etoile
61 61
 		. $args
@@ -84,12 +84,12 @@  discard block
 block discarded – undo
84 84
 		$critere[$k] = $crit_s;
85 85
 	}
86 86
 
87
-	return ($critere ? '{' . implode(',', $critere) . '}' : (''));
87
+	return ($critere ? '{'.implode(',', $critere).'}' : (''));
88 88
 }
89 89
 
90 90
 function format_liste_html($fonc, $args, $prof) {
91 91
 	return ((($fonc !== '') ? "|$fonc" : $fonc)
92
-		. ($args ? '{' . implode(',', $args) . '}' : ('')));
92
+		. ($args ? '{'.implode(',', $args).'}' : ('')));
93 93
 }
94 94
 
95 95
 // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
 			// si un texte se termine par ( et est suivi d'un champ
107 107
 			// ou assimiles, forcer la notation pleine
108 108
 			if ($c1 == '(' && str_starts_with((string) $texte2, '#')) {
109
-				$args[$i + 1][0] = '[(' . $texte2 . ')]';
109
+				$args[$i + 1][0] = '[('.$texte2.')]';
110 110
 			}
111 111
 		} else {
112 112
 			if ($type == 'texte') {
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
 				$c1 == '}' && str_starts_with(ltrim((string) $texte2), '|')
120 120
 				|| preg_match('/[\w\d_*]/', $c1) && preg_match('/^[\w\d_*{|]/', (string) $texte2)
121 121
 			) {
122
-				$args[$i][0] = '[(' . $texte . ')]';
122
+				$args[$i][0] = '[('.$texte.')]';
123 123
 			}
124 124
 		}
125 125
 	}
Please login to merge, or discard this patch.
ecrire/public/styliser_par_z.php 2 patches
Indentation   +303 added lines, -303 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  * @package SPIP\Core\Public\Styliser
19 19
  **/
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /**
@@ -28,188 +28,188 @@  discard block
 block discarded – undo
28 28
  * @return array Données modifiées du pipeline
29 29
  */
30 30
 function public_styliser_par_z_dist($flux) {
31
-	static $prefix_path = null;
32
-	static $prefix_length;
33
-	static $z_blocs;
34
-	static $apl_constant;
35
-	static $page;
36
-	static $disponible = [];
37
-	static $echafauder;
38
-	static $prepend = '';
39
-
40
-	if (!isset($prefix_path)) {
41
-		$z_blocs = z_blocs(test_espace_prive());
42
-		if (test_espace_prive()) {
43
-			$prefix_path = 'prive/squelettes/';
44
-			$prefix_length = strlen($prefix_path);
45
-			$apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
46
-			$page = 'exec';
47
-			$echafauder = charger_fonction('echafauder', 'prive', true);
48
-			define('_ZCORE_EXCLURE_PATH', '');
49
-		} else {
50
-			$prefix_path = '';
51
-			$prefix_length = 0;
52
-			$apl_constant = '_Z_AJAX_PARALLEL_LOAD';
53
-			$page = _SPIP_PAGE;
54
-			$echafauder = charger_fonction('echafauder', 'public', true);
55
-			define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
56
-				(string) _DIR_PLUGIN_DIST,
57
-				'/'
58
-			) : ''));
59
-		}
60
-		$prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
61
-	}
62
-	$z_contenu = reset($z_blocs); // contenu par defaut
63
-
64
-	$fond = $flux['args']['fond'];
65
-
66
-	if ($prepend || strncmp((string) $fond, (string) $prefix_path, $prefix_length) == 0) {
67
-		$fond = substr((string) $fond, $prefix_length);
68
-		$squelette = $flux['data'];
69
-		$ext = $flux['args']['ext'];
70
-		// Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
71
-		if (
72
-			defined('_Z_AJAX_PARALLEL_LOAD_OK')
73
-			&& ($dir = explode('/', $fond))
74
-			&& count($dir) == 2 // pas un sous repertoire
75
-			&& ($dir = reset($dir))
76
-			&& in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
77
-			&& defined($apl_constant)
78
-			&& in_array($dir, explode(',', (string) constant($apl_constant))) // et dans un demande en APL
79
-			&& ($pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
80
-		) {
81
-			$flux['data'] = $pipe;
82
-
83
-			return $flux;
84
-		}
85
-
86
-		// surcharger aussi les squelettes venant de squelettes-dist/
87
-		if ($squelette && !z_fond_valide($squelette)) {
88
-			$squelette = '';
89
-			$echafauder = '';
90
-		}
91
-		if ($prepend) {
92
-			$squelette = substr((string) find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
93
-			if ($squelette) {
94
-				$flux['data'] = $squelette;
95
-			}
96
-		}
97
-
98
-		// gerer les squelettes non trouves
99
-		// -> router vers les /dist.html
100
-		// ou scaffolding ou page automatique les contenus
101
-		if (!$squelette) {
102
-			// si on est sur un ?page=XX non trouve
103
-			if (
104
-				isset($flux['args']['contexte'][$page]) && $flux['args']['contexte'][$page] == $fond
105
-				|| isset($flux['args']['contexte']['type-page']) && $flux['args']['contexte']['type-page'] == $fond
106
-				|| $fond == 'sommaire' && (!isset($flux['args']['contexte'][$page]) || !$flux['args']['contexte'][$page])
107
-			) {
108
-				// si on est sur un ?page=XX non trouve
109
-				// se brancher sur contenu/xx si il existe
110
-				// ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
111
-				if (!isset($disponible[$fond])) {
112
-					$disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
113
-				}
114
-
115
-				if ($disponible[$fond]) {
116
-					$flux['data'] = substr((string) find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
117
-				}
118
-			}
119
-
120
-			// echafaudage :
121
-			// si c'est un fond de contenu d'un objet en base
122
-			// generer un fond automatique a la volee pour les webmestres
123
-			elseif (strncmp($fond, "$z_contenu/", strlen((string) $z_contenu) + 1) == 0) {
124
-				$type = substr($fond, strlen((string) $z_contenu) + 1);
125
-				if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
126
-					$type = $flux['args']['contexte'][$page];
127
-				}
128
-				if (!isset($disponible[$type])) {
129
-					$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
130
-				}
131
-				if (is_string($disponible[$type])) {
132
-					$flux['data'] = $disponible[$type];
133
-				} elseif (
134
-					$echafauder
135
-					&& include_spip('inc/autoriser')
136
-					&& isset($GLOBALS['visiteur_session']['statut'])
137
-					&& autoriser('echafauder', $type)
138
-					&& ($is = $disponible[$type])
139
-					&& is_array($is)
140
-				) {
141
-					$flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
142
-				} else {
143
-					$flux['data'] = ($disponible['404'] = z_contenu_disponible(
144
-						$prefix_path . $prepend,
145
-						$z_contenu,
146
-						'404',
147
-						$ext,
148
-						$echafauder
149
-					));
150
-				}
151
-			}
152
-
153
-			// sinon, si on demande un fond non trouve dans un des autres blocs
154
-			// et si il y a bien un contenu correspondant ou echafaudable
155
-			// se rabbatre sur le dist.html du bloc concerne
156
-			else {
157
-				if (
158
-					($dir = explode('/', $fond))
159
-					&& ($dir = reset($dir))
160
-					&& $dir !== $z_contenu
161
-					&& in_array($dir, $z_blocs)
162
-				) {
163
-					$type = substr($fond, strlen("$dir/"));
164
-					if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
165
-						$type = $flux['args']['contexte'][$page];
166
-					}
167
-					if ($type !== 'page' && !isset($disponible[$type])) {
168
-						$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
169
-					}
170
-					if ($type == 'page' || $disponible[$type]) {
171
-						$flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
172
-					}
173
-				}
174
-			}
175
-			$squelette = $flux['data'];
176
-		}
177
-		// layout specifiques par type et compositions :
178
-		// body-article.html
179
-		// body-sommaire.html
180
-		// pour des raisons de perfo, les declinaisons doivent etre dans le
181
-		// meme dossier que body.html
182
-		if ($fond == 'body' && str_ends_with((string) $squelette, $fond)) {
183
-			if (
184
-				isset($flux['args']['contexte']['type-page'])
185
-				&& (
186
-					isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")
187
-					|| file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
188
-				)
189
-			) {
190
-				$flux['data'] = $f;
191
-			}
192
-		} elseif (
193
-			$fond == 'structure'
194
-			&& z_sanitize_var_zajax()
195
-			&& ($f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext"))
196
-		) {
197
-			$flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
198
-		} // chercher le fond correspondant a la composition
199
-		elseif (
200
-			isset($flux['args']['contexte']['composition'])
201
-			&& (basename($fond) == 'page' || $squelette && str_ends_with((string) $squelette, $fond))
202
-			&& ($dir = substr($fond, $prefix_length))
203
-			&& ($dir = explode('/', $dir))
204
-			&& ($dir = reset($dir))
205
-			&& in_array($dir, $z_blocs)
206
-			&& ($f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext"))
207
-		) {
208
-			$flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
209
-		}
210
-	}
211
-
212
-	return $flux;
31
+    static $prefix_path = null;
32
+    static $prefix_length;
33
+    static $z_blocs;
34
+    static $apl_constant;
35
+    static $page;
36
+    static $disponible = [];
37
+    static $echafauder;
38
+    static $prepend = '';
39
+
40
+    if (!isset($prefix_path)) {
41
+        $z_blocs = z_blocs(test_espace_prive());
42
+        if (test_espace_prive()) {
43
+            $prefix_path = 'prive/squelettes/';
44
+            $prefix_length = strlen($prefix_path);
45
+            $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
46
+            $page = 'exec';
47
+            $echafauder = charger_fonction('echafauder', 'prive', true);
48
+            define('_ZCORE_EXCLURE_PATH', '');
49
+        } else {
50
+            $prefix_path = '';
51
+            $prefix_length = 0;
52
+            $apl_constant = '_Z_AJAX_PARALLEL_LOAD';
53
+            $page = _SPIP_PAGE;
54
+            $echafauder = charger_fonction('echafauder', 'public', true);
55
+            define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
56
+                (string) _DIR_PLUGIN_DIST,
57
+                '/'
58
+            ) : ''));
59
+        }
60
+        $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
61
+    }
62
+    $z_contenu = reset($z_blocs); // contenu par defaut
63
+
64
+    $fond = $flux['args']['fond'];
65
+
66
+    if ($prepend || strncmp((string) $fond, (string) $prefix_path, $prefix_length) == 0) {
67
+        $fond = substr((string) $fond, $prefix_length);
68
+        $squelette = $flux['data'];
69
+        $ext = $flux['args']['ext'];
70
+        // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
71
+        if (
72
+            defined('_Z_AJAX_PARALLEL_LOAD_OK')
73
+            && ($dir = explode('/', $fond))
74
+            && count($dir) == 2 // pas un sous repertoire
75
+            && ($dir = reset($dir))
76
+            && in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
77
+            && defined($apl_constant)
78
+            && in_array($dir, explode(',', (string) constant($apl_constant))) // et dans un demande en APL
79
+            && ($pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
80
+        ) {
81
+            $flux['data'] = $pipe;
82
+
83
+            return $flux;
84
+        }
85
+
86
+        // surcharger aussi les squelettes venant de squelettes-dist/
87
+        if ($squelette && !z_fond_valide($squelette)) {
88
+            $squelette = '';
89
+            $echafauder = '';
90
+        }
91
+        if ($prepend) {
92
+            $squelette = substr((string) find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
93
+            if ($squelette) {
94
+                $flux['data'] = $squelette;
95
+            }
96
+        }
97
+
98
+        // gerer les squelettes non trouves
99
+        // -> router vers les /dist.html
100
+        // ou scaffolding ou page automatique les contenus
101
+        if (!$squelette) {
102
+            // si on est sur un ?page=XX non trouve
103
+            if (
104
+                isset($flux['args']['contexte'][$page]) && $flux['args']['contexte'][$page] == $fond
105
+                || isset($flux['args']['contexte']['type-page']) && $flux['args']['contexte']['type-page'] == $fond
106
+                || $fond == 'sommaire' && (!isset($flux['args']['contexte'][$page]) || !$flux['args']['contexte'][$page])
107
+            ) {
108
+                // si on est sur un ?page=XX non trouve
109
+                // se brancher sur contenu/xx si il existe
110
+                // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
111
+                if (!isset($disponible[$fond])) {
112
+                    $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
113
+                }
114
+
115
+                if ($disponible[$fond]) {
116
+                    $flux['data'] = substr((string) find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
117
+                }
118
+            }
119
+
120
+            // echafaudage :
121
+            // si c'est un fond de contenu d'un objet en base
122
+            // generer un fond automatique a la volee pour les webmestres
123
+            elseif (strncmp($fond, "$z_contenu/", strlen((string) $z_contenu) + 1) == 0) {
124
+                $type = substr($fond, strlen((string) $z_contenu) + 1);
125
+                if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
126
+                    $type = $flux['args']['contexte'][$page];
127
+                }
128
+                if (!isset($disponible[$type])) {
129
+                    $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
130
+                }
131
+                if (is_string($disponible[$type])) {
132
+                    $flux['data'] = $disponible[$type];
133
+                } elseif (
134
+                    $echafauder
135
+                    && include_spip('inc/autoriser')
136
+                    && isset($GLOBALS['visiteur_session']['statut'])
137
+                    && autoriser('echafauder', $type)
138
+                    && ($is = $disponible[$type])
139
+                    && is_array($is)
140
+                ) {
141
+                    $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
142
+                } else {
143
+                    $flux['data'] = ($disponible['404'] = z_contenu_disponible(
144
+                        $prefix_path . $prepend,
145
+                        $z_contenu,
146
+                        '404',
147
+                        $ext,
148
+                        $echafauder
149
+                    ));
150
+                }
151
+            }
152
+
153
+            // sinon, si on demande un fond non trouve dans un des autres blocs
154
+            // et si il y a bien un contenu correspondant ou echafaudable
155
+            // se rabbatre sur le dist.html du bloc concerne
156
+            else {
157
+                if (
158
+                    ($dir = explode('/', $fond))
159
+                    && ($dir = reset($dir))
160
+                    && $dir !== $z_contenu
161
+                    && in_array($dir, $z_blocs)
162
+                ) {
163
+                    $type = substr($fond, strlen("$dir/"));
164
+                    if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
165
+                        $type = $flux['args']['contexte'][$page];
166
+                    }
167
+                    if ($type !== 'page' && !isset($disponible[$type])) {
168
+                        $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
169
+                    }
170
+                    if ($type == 'page' || $disponible[$type]) {
171
+                        $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
172
+                    }
173
+                }
174
+            }
175
+            $squelette = $flux['data'];
176
+        }
177
+        // layout specifiques par type et compositions :
178
+        // body-article.html
179
+        // body-sommaire.html
180
+        // pour des raisons de perfo, les declinaisons doivent etre dans le
181
+        // meme dossier que body.html
182
+        if ($fond == 'body' && str_ends_with((string) $squelette, $fond)) {
183
+            if (
184
+                isset($flux['args']['contexte']['type-page'])
185
+                && (
186
+                    isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")
187
+                    || file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
188
+                )
189
+            ) {
190
+                $flux['data'] = $f;
191
+            }
192
+        } elseif (
193
+            $fond == 'structure'
194
+            && z_sanitize_var_zajax()
195
+            && ($f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext"))
196
+        ) {
197
+            $flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
198
+        } // chercher le fond correspondant a la composition
199
+        elseif (
200
+            isset($flux['args']['contexte']['composition'])
201
+            && (basename($fond) == 'page' || $squelette && str_ends_with((string) $squelette, $fond))
202
+            && ($dir = substr($fond, $prefix_length))
203
+            && ($dir = explode('/', $dir))
204
+            && ($dir = reset($dir))
205
+            && in_array($dir, $z_blocs)
206
+            && ($f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext"))
207
+        ) {
208
+            $flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
209
+        }
210
+    }
211
+
212
+    return $flux;
213 213
 }
214 214
 
215 215
 /**
@@ -219,18 +219,18 @@  discard block
 block discarded – undo
219 219
  * @return array
220 220
  */
221 221
 function z_blocs($espace_prive = false) {
222
-	if ($espace_prive) {
223
-		return ($GLOBALS['z_blocs_ecrire'] ?? [
224
-			'contenu',
225
-			'navigation',
226
-			'extra',
227
-			'head',
228
-			'hierarchie',
229
-			'top'
230
-		]);
231
-	}
232
-
233
-	return ($GLOBALS['z_blocs'] ?? ['contenu']);
222
+    if ($espace_prive) {
223
+        return ($GLOBALS['z_blocs_ecrire'] ?? [
224
+            'contenu',
225
+            'navigation',
226
+            'extra',
227
+            'head',
228
+            'hierarchie',
229
+            'top'
230
+        ]);
231
+    }
232
+
233
+    return ($GLOBALS['z_blocs'] ?? ['contenu']);
234 234
 }
235 235
 
236 236
 /**
@@ -245,11 +245,11 @@  discard block
 block discarded – undo
245 245
  * @return mixed
246 246
  */
247 247
 function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) {
248
-	if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
249
-		return $d;
250
-	}
248
+    if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
249
+        return $d;
250
+    }
251 251
 
252
-	return $echafauder ? z_echafaudable($type) : false;
252
+    return $echafauder ? z_echafaudable($type) : false;
253 253
 }
254 254
 
255 255
 /**
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
  *   `true` si on peut l'utiliser, `false` sinon.
264 264
  **/
265 265
 function z_fond_valide($squelette) {
266
-	return !_ZCORE_EXCLURE_PATH || !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette);
266
+    return !_ZCORE_EXCLURE_PATH || !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette);
267 267
 }
268 268
 
269 269
 /**
@@ -281,14 +281,14 @@  discard block
 block discarded – undo
281 281
  * @return string
282 282
  */
283 283
 function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) {
284
-	if (
285
-		defined('_ZCORE_BLOC_PREFIX_SKEL') && ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext")) && z_fond_valide($f)
286
-		|| ($f = find_in_path("$prefix_path$bloc/$fond.$ext")) && z_fond_valide($f)
287
-	) {
288
-		return substr((string) $f, 0, -strlen(".$ext"));
289
-	}
290
-
291
-	return '';
284
+    if (
285
+        defined('_ZCORE_BLOC_PREFIX_SKEL') && ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext")) && z_fond_valide($f)
286
+        || ($f = find_in_path("$prefix_path$bloc/$fond.$ext")) && z_fond_valide($f)
287
+    ) {
288
+        return substr((string) $f, 0, -strlen(".$ext"));
289
+    }
290
+
291
+    return '';
292 292
 }
293 293
 
294 294
 /**
@@ -300,52 +300,52 @@  discard block
 block discarded – undo
300 300
  * @return bool
301 301
  */
302 302
 function z_echafaudable($type) {
303
-	static $pages = null;
304
-	static $echafaudable = [];
305
-	if (isset($echafaudable[$type])) {
306
-		return $echafaudable[$type];
307
-	}
308
-	if (preg_match(',[^\w],', $type)) {
309
-		return $echafaudable[$type] = false;
310
-	}
311
-
312
-	if (test_espace_prive()) {
313
-		if (!function_exists('trouver_objet_exec')) {
314
-			include_spip('inc/pipelines_ecrire');
315
-		}
316
-		if ($e = trouver_objet_exec($type)) {
317
-			return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
318
-		} else {
319
-			// peut etre c'est un exec=types qui liste tous les objets "type"
320
-			if (
321
-				($t = objet_type($type, false)) !== $type
322
-				&& ($e = trouver_objet_exec($t))
323
-			) {
324
-				return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
325
-			}
326
-		}
327
-	} else {
328
-		if (is_null($pages)) {
329
-			$pages = [];
330
-			$liste = lister_tables_objets_sql();
331
-			foreach ($liste as $t => $d) {
332
-				if ($d['page']) {
333
-					$pages[$d['page']] = [$d['table_objet'], $t];
334
-				}
335
-			}
336
-		}
337
-		if (!isset($pages[$type])) {
338
-			return $echafaudable[$type] = false;
339
-		}
340
-		if ((is_countable($pages[$type]) ? count($pages[$type]) : 0) == 2) {
341
-			$trouver_table = charger_fonction('trouver_table', 'base');
342
-			$pages[$type][] = $trouver_table(reset($pages[$type]));
343
-		}
344
-
345
-		return $echafaudable[$type] = $pages[$type];
346
-	}
347
-
348
-	return $echafaudable[$type] = false;
303
+    static $pages = null;
304
+    static $echafaudable = [];
305
+    if (isset($echafaudable[$type])) {
306
+        return $echafaudable[$type];
307
+    }
308
+    if (preg_match(',[^\w],', $type)) {
309
+        return $echafaudable[$type] = false;
310
+    }
311
+
312
+    if (test_espace_prive()) {
313
+        if (!function_exists('trouver_objet_exec')) {
314
+            include_spip('inc/pipelines_ecrire');
315
+        }
316
+        if ($e = trouver_objet_exec($type)) {
317
+            return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
318
+        } else {
319
+            // peut etre c'est un exec=types qui liste tous les objets "type"
320
+            if (
321
+                ($t = objet_type($type, false)) !== $type
322
+                && ($e = trouver_objet_exec($t))
323
+            ) {
324
+                return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
325
+            }
326
+        }
327
+    } else {
328
+        if (is_null($pages)) {
329
+            $pages = [];
330
+            $liste = lister_tables_objets_sql();
331
+            foreach ($liste as $t => $d) {
332
+                if ($d['page']) {
333
+                    $pages[$d['page']] = [$d['table_objet'], $t];
334
+                }
335
+            }
336
+        }
337
+        if (!isset($pages[$type])) {
338
+            return $echafaudable[$type] = false;
339
+        }
340
+        if ((is_countable($pages[$type]) ? count($pages[$type]) : 0) == 2) {
341
+            $trouver_table = charger_fonction('trouver_table', 'base');
342
+            $pages[$type][] = $trouver_table(reset($pages[$type]));
343
+        }
344
+
345
+        return $echafaudable[$type] = $pages[$type];
346
+    }
347
+
348
+    return $echafaudable[$type] = false;
349 349
 }
350 350
 
351 351
 
@@ -362,42 +362,42 @@  discard block
 block discarded – undo
362 362
  * @return string
363 363
  */
364 364
 function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) {
365
-	$scaffold = '';
366
-
367
-	// page objet ou objet_edit
368
-	if (is_array($desc_exec)) {
369
-		$type = $desc_exec['type'];
370
-		$primary = $desc_exec['id_table_objet'];
371
-
372
-		if ($desc_exec['edition'] === false) {
373
-			$fond = 'objet';
374
-		} else {
375
-			$trouver_table = charger_fonction('trouver_table', 'base');
376
-			$desc = $trouver_table($table_sql);
377
-			$fond = isset($desc['field']['id_rubrique']) ? 'objet_edit' : 'objet_edit.sans_rubrique';
378
-		}
379
-		$dir = z_blocs(test_espace_prive());
380
-		$dir = reset($dir);
381
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper((string) $primary) . ',env}>';
382
-	} // page objets
383
-	elseif (($type = $desc_exec) && !str_contains($type, '/')) {
384
-		$dir = z_blocs(test_espace_prive());
385
-		$dir = reset($dir);
386
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
387
-	}
388
-	// morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
389
-	// et objet et tire de $table
390
-	elseif ($fond = $desc_exec) {
391
-		$dir = md5(dirname($fond));
392
-		$scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
393
-	}
394
-
395
-	$base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
396
-	$base_dir = sous_repertoire($base_dir, $dir, false);
397
-	$f = $base_dir . "$exec";
398
-	ecrire_fichier("$f.$ext", $scaffold);
399
-
400
-	return $f;
365
+    $scaffold = '';
366
+
367
+    // page objet ou objet_edit
368
+    if (is_array($desc_exec)) {
369
+        $type = $desc_exec['type'];
370
+        $primary = $desc_exec['id_table_objet'];
371
+
372
+        if ($desc_exec['edition'] === false) {
373
+            $fond = 'objet';
374
+        } else {
375
+            $trouver_table = charger_fonction('trouver_table', 'base');
376
+            $desc = $trouver_table($table_sql);
377
+            $fond = isset($desc['field']['id_rubrique']) ? 'objet_edit' : 'objet_edit.sans_rubrique';
378
+        }
379
+        $dir = z_blocs(test_espace_prive());
380
+        $dir = reset($dir);
381
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper((string) $primary) . ',env}>';
382
+    } // page objets
383
+    elseif (($type = $desc_exec) && !str_contains($type, '/')) {
384
+        $dir = z_blocs(test_espace_prive());
385
+        $dir = reset($dir);
386
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
387
+    }
388
+    // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
389
+    // et objet et tire de $table
390
+    elseif ($fond = $desc_exec) {
391
+        $dir = md5(dirname($fond));
392
+        $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
393
+    }
394
+
395
+    $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
396
+    $base_dir = sous_repertoire($base_dir, $dir, false);
397
+    $f = $base_dir . "$exec";
398
+    ecrire_fichier("$f.$ext", $scaffold);
399
+
400
+    return $f;
401 401
 }
402 402
 
403 403
 /**
@@ -406,17 +406,17 @@  discard block
 block discarded – undo
406 406
  * @return bool|string
407 407
  */
408 408
 function z_sanitize_var_zajax() {
409
-	$z_ajax = _request('var_zajax');
410
-	if (!$z_ajax) {
411
-		return false;
412
-	}
413
-	if (
414
-		!($z_blocs = z_blocs(test_espace_prive()))
415
-		|| !in_array($z_ajax, $z_blocs)
416
-	) {
417
-		set_request('var_zajax'); // enlever cette demande incongrue
418
-		$z_ajax = false;
419
-	}
420
-
421
-	return $z_ajax;
409
+    $z_ajax = _request('var_zajax');
410
+    if (!$z_ajax) {
411
+        return false;
412
+    }
413
+    if (
414
+        !($z_blocs = z_blocs(test_espace_prive()))
415
+        || !in_array($z_ajax, $z_blocs)
416
+    ) {
417
+        set_request('var_zajax'); // enlever cette demande incongrue
418
+        $z_ajax = false;
419
+    }
420
+
421
+    return $z_ajax;
422 422
 }
Please login to merge, or discard this patch.
Spacing   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -52,7 +52,7 @@  discard block
 block discarded – undo
52 52
 			$apl_constant = '_Z_AJAX_PARALLEL_LOAD';
53 53
 			$page = _SPIP_PAGE;
54 54
 			$echafauder = charger_fonction('echafauder', 'public', true);
55
-			define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
55
+			define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist'.(defined('_DIR_PLUGIN_DIST') ? '|\b'.rtrim(
56 56
 				(string) _DIR_PLUGIN_DIST,
57 57
 				'/'
58 58
 			) : ''));
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
 			&& in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
77 77
 			&& defined($apl_constant)
78 78
 			&& in_array($dir, explode(',', (string) constant($apl_constant))) // et dans un demande en APL
79
-			&& ($pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
79
+			&& ($pipe = z_trouver_bloc($prefix_path.$prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
80 80
 		) {
81 81
 			$flux['data'] = $pipe;
82 82
 
@@ -89,7 +89,7 @@  discard block
 block discarded – undo
89 89
 			$echafauder = '';
90 90
 		}
91 91
 		if ($prepend) {
92
-			$squelette = substr((string) find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
92
+			$squelette = substr((string) find_in_path($prefix_path.$prepend."$fond.$ext"), 0, -strlen(".$ext"));
93 93
 			if ($squelette) {
94 94
 				$flux['data'] = $squelette;
95 95
 			}
@@ -109,11 +109,11 @@  discard block
 block discarded – undo
109 109
 				// se brancher sur contenu/xx si il existe
110 110
 				// ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
111 111
 				if (!isset($disponible[$fond])) {
112
-					$disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder);
112
+					$disponible[$fond] = z_contenu_disponible($prefix_path.$prepend, $z_contenu, $fond, $ext, $echafauder);
113 113
 				}
114 114
 
115 115
 				if ($disponible[$fond]) {
116
-					$flux['data'] = substr((string) find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
116
+					$flux['data'] = substr((string) find_in_path($prefix_path."page.$ext"), 0, -strlen(".$ext"));
117 117
 				}
118 118
 			}
119 119
 
@@ -126,7 +126,7 @@  discard block
 block discarded – undo
126 126
 					$type = $flux['args']['contexte'][$page];
127 127
 				}
128 128
 				if (!isset($disponible[$type])) {
129
-					$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
129
+					$disponible[$type] = z_contenu_disponible($prefix_path.$prepend, $z_contenu, $type, $ext, $echafauder);
130 130
 				}
131 131
 				if (is_string($disponible[$type])) {
132 132
 					$flux['data'] = $disponible[$type];
@@ -141,7 +141,7 @@  discard block
 block discarded – undo
141 141
 					$flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
142 142
 				} else {
143 143
 					$flux['data'] = ($disponible['404'] = z_contenu_disponible(
144
-						$prefix_path . $prepend,
144
+						$prefix_path.$prepend,
145 145
 						$z_contenu,
146 146
 						'404',
147 147
 						$ext,
@@ -165,10 +165,10 @@  discard block
 block discarded – undo
165 165
 						$type = $flux['args']['contexte'][$page];
166 166
 					}
167 167
 					if ($type !== 'page' && !isset($disponible[$type])) {
168
-						$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder);
168
+						$disponible[$type] = z_contenu_disponible($prefix_path.$prepend, $z_contenu, $type, $ext, $echafauder);
169 169
 					}
170 170
 					if ($type == 'page' || $disponible[$type]) {
171
-						$flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
171
+						$flux['data'] = z_trouver_bloc($prefix_path.$prepend, $dir, 'dist', $ext);
172 172
 					}
173 173
 				}
174 174
 			}
@@ -183,8 +183,8 @@  discard block
 block discarded – undo
183 183
 			if (
184 184
 				isset($flux['args']['contexte']['type-page'])
185 185
 				&& (
186
-					isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")
187
-					|| file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
186
+					isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette.'-'.$flux['args']['contexte']['type-page'].'-'.$flux['args']['contexte']['composition']).".$ext")
187
+					|| file_exists(($f = $squelette.'-'.$flux['args']['contexte']['type-page']).".$ext")
188 188
 				)
189 189
 			) {
190 190
 				$flux['data'] = $f;
@@ -192,7 +192,7 @@  discard block
 block discarded – undo
192 192
 		} elseif (
193 193
 			$fond == 'structure'
194 194
 			&& z_sanitize_var_zajax()
195
-			&& ($f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext"))
195
+			&& ($f = find_in_path($prefix_path.$prepend.'ajax'.".$ext"))
196 196
 		) {
197 197
 			$flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
198 198
 		} // chercher le fond correspondant a la composition
@@ -203,7 +203,7 @@  discard block
 block discarded – undo
203 203
 			&& ($dir = explode('/', $dir))
204 204
 			&& ($dir = reset($dir))
205 205
 			&& in_array($dir, $z_blocs)
206
-			&& ($f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext"))
206
+			&& ($f = find_in_path($prefix_path.$prepend.$fond.'-'.$flux['args']['contexte']['composition'].".$ext"))
207 207
 		) {
208 208
 			$flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
209 209
 		}
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
  *   `true` si on peut l'utiliser, `false` sinon.
264 264
  **/
265 265
 function z_fond_valide($squelette) {
266
-	return !_ZCORE_EXCLURE_PATH || !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette);
266
+	return !_ZCORE_EXCLURE_PATH || !preg_match(',('._ZCORE_EXCLURE_PATH.')/,', $squelette);
267 267
 }
268 268
 
269 269
 /**
@@ -378,23 +378,23 @@  discard block
 block discarded – undo
378 378
 		}
379 379
 		$dir = z_blocs(test_espace_prive());
380 380
 		$dir = reset($dir);
381
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper((string) $primary) . ',env}>';
381
+		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/".$fond.',objet='.$type.',id_objet=#'.strtoupper((string) $primary).',env}>';
382 382
 	} // page objets
383 383
 	elseif (($type = $desc_exec) && !str_contains($type, '/')) {
384 384
 		$dir = z_blocs(test_espace_prive());
385 385
 		$dir = reset($dir);
386
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
386
+		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=".$type.',env} />';
387 387
 	}
388 388
 	// morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
389 389
 	// et objet et tire de $table
390 390
 	elseif ($fond = $desc_exec) {
391 391
 		$dir = md5(dirname($fond));
392
-		$scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
392
+		$scaffold = "<INCLURE{fond=$fond,objet=".objet_type($table).',env} />';
393 393
 	}
394 394
 
395 395
 	$base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
396 396
 	$base_dir = sous_repertoire($base_dir, $dir, false);
397
-	$f = $base_dir . "$exec";
397
+	$f = $base_dir."$exec";
398 398
 	ecrire_fichier("$f.$ext", $scaffold);
399 399
 
400 400
 	return $f;
Please login to merge, or discard this patch.
ecrire/public/sandbox.php 2 patches
Indentation   +89 added lines, -89 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
  **/
23 23
 
24 24
 if (!defined('_ECRIRE_INC_VERSION')) {
25
-	return;
25
+    return;
26 26
 }
27 27
 
28 28
 /**
@@ -40,7 +40,7 @@  discard block
 block discarded – undo
40 40
  *     texte
41 41
  */
42 42
 function sandbox_composer_texte($texte, &$p) {
43
-	return "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
43
+    return "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
44 44
 }
45 45
 
46 46
 
@@ -56,38 +56,38 @@  discard block
 block discarded – undo
56 56
  * @return string
57 57
  */
58 58
 function sandbox_composer_filtre($fonc, $code, $arglist, &$p, $nb_arg_droite = 1000): string {
59
-	if (isset($GLOBALS['spip_matrice'][$fonc])) {
60
-		$code = "filtrer('$fonc',$code$arglist)";
61
-	}
62
-
63
-	// le filtre est defini sous forme de fonction ou de methode
64
-	// par ex. dans inc_texte, inc_filtres ou mes_fonctions
65
-	elseif ($f = chercher_filtre($fonc)) {
66
-		// cas particulier : le filtre |set doit acceder a la $Pile
67
-		// proto: filtre_set(&$Pile, $val, $args...)
68
-		$refl = strpbrk((string) $f, ':') ? new ReflectionMethod($f) : new ReflectionFunction($f);
69
-		$refs = $refl->getParameters();
70
-		if (isset($refs[0]) && $refs[0]->name == 'Pile') {
71
-			$code = "$f(\$Pile,$code$arglist)";
72
-			$nb_arg_gauche = 2; // la balise à laquelle s'applique le filtre + $Pile
73
-		} else {
74
-			$code = "$f($code$arglist)";
75
-			$nb_arg_gauche = 1; // la balise à laquelle s'applique le filtre
76
-		}
77
-		$nb_args_f = $nb_arg_gauche + $nb_arg_droite;
78
-		$min_f = $refl->getNumberOfRequiredParameters();
79
-		if (($nb_args_f < $min_f)) {
80
-			$msg_args = ['filtre' => texte_script($fonc), 'nb' => $min_f - $nb_args_f];
81
-			erreur_squelette([ 'zbug_erreur_filtre_nbarg_min', $msg_args], $p);
82
-		}
83
-	}
84
-	// le filtre n'existe pas,
85
-	// on le notifie
86
-	else {
87
-		erreur_squelette(['zbug_erreur_filtre', ['filtre' => texte_script($fonc)]], $p);
88
-	}
89
-
90
-	return $code;
59
+    if (isset($GLOBALS['spip_matrice'][$fonc])) {
60
+        $code = "filtrer('$fonc',$code$arglist)";
61
+    }
62
+
63
+    // le filtre est defini sous forme de fonction ou de methode
64
+    // par ex. dans inc_texte, inc_filtres ou mes_fonctions
65
+    elseif ($f = chercher_filtre($fonc)) {
66
+        // cas particulier : le filtre |set doit acceder a la $Pile
67
+        // proto: filtre_set(&$Pile, $val, $args...)
68
+        $refl = strpbrk((string) $f, ':') ? new ReflectionMethod($f) : new ReflectionFunction($f);
69
+        $refs = $refl->getParameters();
70
+        if (isset($refs[0]) && $refs[0]->name == 'Pile') {
71
+            $code = "$f(\$Pile,$code$arglist)";
72
+            $nb_arg_gauche = 2; // la balise à laquelle s'applique le filtre + $Pile
73
+        } else {
74
+            $code = "$f($code$arglist)";
75
+            $nb_arg_gauche = 1; // la balise à laquelle s'applique le filtre
76
+        }
77
+        $nb_args_f = $nb_arg_gauche + $nb_arg_droite;
78
+        $min_f = $refl->getNumberOfRequiredParameters();
79
+        if (($nb_args_f < $min_f)) {
80
+            $msg_args = ['filtre' => texte_script($fonc), 'nb' => $min_f - $nb_args_f];
81
+            erreur_squelette([ 'zbug_erreur_filtre_nbarg_min', $msg_args], $p);
82
+        }
83
+    }
84
+    // le filtre n'existe pas,
85
+    // on le notifie
86
+    else {
87
+        erreur_squelette(['zbug_erreur_filtre', ['filtre' => texte_script($fonc)]], $p);
88
+    }
89
+
90
+    return $code;
91 91
 }
92 92
 
93 93
 // Calculer un <INCLURE(xx.php)>
@@ -110,11 +110,11 @@  discard block
 block discarded – undo
110 110
  * @return string
111 111
  */
112 112
 function sandbox_composer_inclure_php($fichier, &$p, $_contexte) {
113
-	$compil = texte_script(memoriser_contexte_compil($p));
114
-	// si inexistant, on essaiera a l'execution
115
-	$path = ($path = find_in_path($fichier)) ? "\"$path\"" : "find_in_path(\"$fichier\")";
113
+    $compil = texte_script(memoriser_contexte_compil($p));
114
+    // si inexistant, on essaiera a l'execution
115
+    $path = ($path = find_in_path($fichier)) ? "\"$path\"" : "find_in_path(\"$fichier\")";
116 116
 
117
-	return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte);
117
+    return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte);
118 118
 }
119 119
 
120 120
 /**
@@ -126,20 +126,20 @@  discard block
 block discarded – undo
126 126
  * @return string
127 127
  */
128 128
 function sandbox_composer_interdire_scripts($code, &$p) {
129
-	// Securite
130
-	if (
131
-		$p->interdire_scripts
132
-		&& $p->etoile != '**'
133
-	) {
134
-		if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) {
135
-			$code = "interdire_scripts($code)";
136
-		} else {
137
-			$code = interdire_scripts($r[2]);
138
-			$code = "sinon(interdire_scripts($r[1]),'$code')";
139
-		}
140
-	}
141
-
142
-	return $code;
129
+    // Securite
130
+    if (
131
+        $p->interdire_scripts
132
+        && $p->etoile != '**'
133
+    ) {
134
+        if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) {
135
+            $code = "interdire_scripts($code)";
136
+        } else {
137
+            $code = interdire_scripts($r[2]);
138
+            $code = "sinon(interdire_scripts($r[1]),'$code')";
139
+        }
140
+    }
141
+
142
+    return $code;
143 143
 }
144 144
 
145 145
 
@@ -158,30 +158,30 @@  discard block
 block discarded – undo
158 158
  * @return mixed|string
159 159
  */
160 160
 function sandbox_filtrer_squelette($skel, $corps, $filtres) {
161
-	$series_filtres = func_get_args();
162
-	array_shift($series_filtres);// skel
163
-	array_shift($series_filtres);// corps
164
-
165
-	// proteger les <INCLUDE> et tous les morceaux de php licites
166
-	if ($skel['process_ins'] == 'php') {
167
-		$corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps);
168
-	}
169
-
170
-	// recuperer les couples de remplacement
171
-	$replace = echapper_php_callback();
172
-
173
-	foreach ($series_filtres as $filtres) {
174
-		if (is_countable($filtres) ? count($filtres) : 0) {
175
-			foreach ($filtres as $filtre) {
176
-				if ($filtre && ($f = chercher_filtre($filtre))) {
177
-					$corps = $f($corps);
178
-				}
179
-			}
180
-		}
181
-	}
182
-
183
-	// restaurer les echappements
184
-	return str_replace($replace[0], $replace[1], (string) $corps);
161
+    $series_filtres = func_get_args();
162
+    array_shift($series_filtres);// skel
163
+    array_shift($series_filtres);// corps
164
+
165
+    // proteger les <INCLUDE> et tous les morceaux de php licites
166
+    if ($skel['process_ins'] == 'php') {
167
+        $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps);
168
+    }
169
+
170
+    // recuperer les couples de remplacement
171
+    $replace = echapper_php_callback();
172
+
173
+    foreach ($series_filtres as $filtres) {
174
+        if (is_countable($filtres) ? count($filtres) : 0) {
175
+            foreach ($filtres as $filtre) {
176
+                if ($filtre && ($f = chercher_filtre($filtre))) {
177
+                    $corps = $f($corps);
178
+                }
179
+            }
180
+        }
181
+    }
182
+
183
+    // restaurer les echappements
184
+    return str_replace($replace[0], $replace[1], (string) $corps);
185 185
 }
186 186
 
187 187
 
@@ -200,21 +200,21 @@  discard block
 block discarded – undo
200 200
  *     - array : Liste( liste des codes PHP, liste des substitutions )
201 201
  **/
202 202
 function echapper_php_callback($r = null) {
203
-	static $src = [];
204
-	static $dst = [];
203
+    static $src = [];
204
+    static $dst = [];
205 205
 
206
-	// si on recoit un tableau, on est en mode echappement
207
-	// on enregistre le code a echapper dans dst, et le code echappe dans src
208
-	if (is_array($r)) {
209
-		$dst[] = $r[0];
206
+    // si on recoit un tableau, on est en mode echappement
207
+    // on enregistre le code a echapper dans dst, et le code echappe dans src
208
+    if (is_array($r)) {
209
+        $dst[] = $r[0];
210 210
 
211
-		return $src[] = '___' . md5((string) $r[0]) . '___';
212
-	}
211
+        return $src[] = '___' . md5((string) $r[0]) . '___';
212
+    }
213 213
 
214
-	// si on recoit pas un tableau, on renvoit les couples de substitution
215
-	// et on RAZ les remplacements
216
-	$r = [$src, $dst];
217
-	$src = $dst = [];
214
+    // si on recoit pas un tableau, on renvoit les couples de substitution
215
+    // et on RAZ les remplacements
216
+    $r = [$src, $dst];
217
+    $src = $dst = [];
218 218
 
219
-	return $r;
219
+    return $r;
220 220
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -40,7 +40,7 @@  discard block
 block discarded – undo
40 40
  *     texte
41 41
  */
42 42
 function sandbox_composer_texte($texte, &$p) {
43
-	return "'" . str_replace(['\\', "'"], ['\\\\', "\\'"], $texte) . "'";
43
+	return "'".str_replace(['\\', "'"], ['\\\\', "\\'"], $texte)."'";
44 44
 }
45 45
 
46 46
 
@@ -78,7 +78,7 @@  discard block
 block discarded – undo
78 78
 		$min_f = $refl->getNumberOfRequiredParameters();
79 79
 		if (($nb_args_f < $min_f)) {
80 80
 			$msg_args = ['filtre' => texte_script($fonc), 'nb' => $min_f - $nb_args_f];
81
-			erreur_squelette([ 'zbug_erreur_filtre_nbarg_min', $msg_args], $p);
81
+			erreur_squelette(['zbug_erreur_filtre_nbarg_min', $msg_args], $p);
82 82
 		}
83 83
 	}
84 84
 	// le filtre n'existe pas,
@@ -159,8 +159,8 @@  discard block
 block discarded – undo
159 159
  */
160 160
 function sandbox_filtrer_squelette($skel, $corps, $filtres) {
161 161
 	$series_filtres = func_get_args();
162
-	array_shift($series_filtres);// skel
163
-	array_shift($series_filtres);// corps
162
+	array_shift($series_filtres); // skel
163
+	array_shift($series_filtres); // corps
164 164
 
165 165
 	// proteger les <INCLUDE> et tous les morceaux de php licites
166 166
 	if ($skel['process_ins'] == 'php') {
@@ -208,7 +208,7 @@  discard block
 block discarded – undo
208 208
 	if (is_array($r)) {
209 209
 		$dst[] = $r[0];
210 210
 
211
-		return $src[] = '___' . md5((string) $r[0]) . '___';
211
+		return $src[] = '___'.md5((string) $r[0]).'___';
212 212
 	}
213 213
 
214 214
 	// si on recoit pas un tableau, on renvoit les couples de substitution
Please login to merge, or discard this patch.
ecrire/public/styliser.php 1 patch
Indentation   +123 added lines, -123 removed lines patch added patch discarded remove patch
@@ -19,7 +19,7 @@  discard block
 block discarded – undo
19 19
  **/
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 // Ce fichier doit imperativement definir la fonction ci-dessous:
@@ -38,59 +38,59 @@  discard block
 block discarded – undo
38 38
  * @return array
39 39
  */
40 40
 function public_styliser_dist($fond, $contexte, $lang = '', string $connect = '') {
41
-	static $styliser_par_z;
42
-
43
-	// s'assurer que le fond est licite
44
-	// car il peut etre construit a partir d'une variable d'environnement
45
-	if (str_contains($fond, '../') || str_starts_with($fond, '/')) {
46
-		$fond = '404';
47
-	}
48
-
49
-	if (str_starts_with($fond, 'modeles/')) {
50
-		$modele = substr($fond, 8);
51
-		$modele = styliser_modele($modele, null, $contexte);
52
-		$fond = "modeles/$modele";
53
-	}
54
-
55
-	// Choisir entre $fond-dist.html, $fond=7.html, etc?
56
-	$id_rubrique = 0;
57
-	// Chercher le fond qui va servir de squelette
58
-	if ($r = quete_rubrique_fond($contexte)) {
59
-		[$id_rubrique, $lang] = $r;
60
-	}
61
-
62
-	// trouver un squelette du nom demande
63
-	// ne rien dire si on ne trouve pas,
64
-	// c'est l'appelant qui sait comment gerer la situation
65
-	// ou les plugins qui feront mieux dans le pipeline
66
-	$squelette = trouver_fond($fond, '', true);
67
-	$ext = $squelette['extension'];
68
-
69
-	$flux = [
70
-		'args' => [
71
-			'id_rubrique' => $id_rubrique,
72
-			'ext' => $ext,
73
-			'fond' => $fond,
74
-			'lang' => $lang,
75
-			'contexte' => $contexte, // le style d'un objet peut dependre de lui meme
76
-			'connect' => $connect
77
-		],
78
-		'data' => $squelette['fond'],
79
-	];
80
-
81
-	if (test_espace_prive() || defined('_ZPIP')) {
82
-		if (!$styliser_par_z) {
83
-			$styliser_par_z = charger_fonction('styliser_par_z', 'public');
84
-		}
85
-		$flux = $styliser_par_z($flux);
86
-	}
87
-
88
-	$flux = styliser_par_objets($flux);
89
-
90
-	// pipeline styliser
91
-	$squelette = pipeline('styliser', $flux);
92
-
93
-	return [$squelette, $ext, $ext, "$squelette.$ext"];
41
+    static $styliser_par_z;
42
+
43
+    // s'assurer que le fond est licite
44
+    // car il peut etre construit a partir d'une variable d'environnement
45
+    if (str_contains($fond, '../') || str_starts_with($fond, '/')) {
46
+        $fond = '404';
47
+    }
48
+
49
+    if (str_starts_with($fond, 'modeles/')) {
50
+        $modele = substr($fond, 8);
51
+        $modele = styliser_modele($modele, null, $contexte);
52
+        $fond = "modeles/$modele";
53
+    }
54
+
55
+    // Choisir entre $fond-dist.html, $fond=7.html, etc?
56
+    $id_rubrique = 0;
57
+    // Chercher le fond qui va servir de squelette
58
+    if ($r = quete_rubrique_fond($contexte)) {
59
+        [$id_rubrique, $lang] = $r;
60
+    }
61
+
62
+    // trouver un squelette du nom demande
63
+    // ne rien dire si on ne trouve pas,
64
+    // c'est l'appelant qui sait comment gerer la situation
65
+    // ou les plugins qui feront mieux dans le pipeline
66
+    $squelette = trouver_fond($fond, '', true);
67
+    $ext = $squelette['extension'];
68
+
69
+    $flux = [
70
+        'args' => [
71
+            'id_rubrique' => $id_rubrique,
72
+            'ext' => $ext,
73
+            'fond' => $fond,
74
+            'lang' => $lang,
75
+            'contexte' => $contexte, // le style d'un objet peut dependre de lui meme
76
+            'connect' => $connect
77
+        ],
78
+        'data' => $squelette['fond'],
79
+    ];
80
+
81
+    if (test_espace_prive() || defined('_ZPIP')) {
82
+        if (!$styliser_par_z) {
83
+            $styliser_par_z = charger_fonction('styliser_par_z', 'public');
84
+        }
85
+        $flux = $styliser_par_z($flux);
86
+    }
87
+
88
+    $flux = styliser_par_objets($flux);
89
+
90
+    // pipeline styliser
91
+    $squelette = pipeline('styliser', $flux);
92
+
93
+    return [$squelette, $ext, $ext, "$squelette.$ext"];
94 94
 }
95 95
 
96 96
 /**
@@ -109,32 +109,32 @@  discard block
 block discarded – undo
109 109
  *     Données du pipeline styliser
110 110
  **/
111 111
 function styliser_par_objets($flux) {
112
-	if (
113
-		test_espace_prive()
114
-		&& !($squelette = $flux['data'])
115
-		&& str_starts_with((string) $flux['args']['fond'], 'prive/objets/')
116
-		&& ($echafauder = charger_fonction('echafauder', 'prive', true))
117
-	) {
118
-		if (str_starts_with((string) $flux['args']['fond'], 'prive/objets/liste/')) {
119
-			$table = table_objet(substr((string) $flux['args']['fond'], 19));
120
-			$table_sql = table_objet_sql($table);
121
-			$objets = lister_tables_objets_sql();
122
-			if (isset($objets[$table_sql])) {
123
-				$flux['data'] = $echafauder($table, $table, $table_sql, 'prive/objets/liste/objets', $flux['args']['ext']);
124
-			}
125
-		}
126
-		if (str_starts_with((string) $flux['args']['fond'], 'prive/objets/contenu/')) {
127
-			$type = substr((string) $flux['args']['fond'], 21);
128
-			$table = table_objet($type);
129
-			$table_sql = table_objet_sql($table);
130
-			$objets = lister_tables_objets_sql();
131
-			if (isset($objets[$table_sql])) {
132
-				$flux['data'] = $echafauder($type, $table, $table_sql, 'prive/objets/contenu/objet', $flux['args']['ext']);
133
-			}
134
-		}
135
-	}
136
-
137
-	return $flux;
112
+    if (
113
+        test_espace_prive()
114
+        && !($squelette = $flux['data'])
115
+        && str_starts_with((string) $flux['args']['fond'], 'prive/objets/')
116
+        && ($echafauder = charger_fonction('echafauder', 'prive', true))
117
+    ) {
118
+        if (str_starts_with((string) $flux['args']['fond'], 'prive/objets/liste/')) {
119
+            $table = table_objet(substr((string) $flux['args']['fond'], 19));
120
+            $table_sql = table_objet_sql($table);
121
+            $objets = lister_tables_objets_sql();
122
+            if (isset($objets[$table_sql])) {
123
+                $flux['data'] = $echafauder($table, $table, $table_sql, 'prive/objets/liste/objets', $flux['args']['ext']);
124
+            }
125
+        }
126
+        if (str_starts_with((string) $flux['args']['fond'], 'prive/objets/contenu/')) {
127
+            $type = substr((string) $flux['args']['fond'], 21);
128
+            $table = table_objet($type);
129
+            $table_sql = table_objet_sql($table);
130
+            $objets = lister_tables_objets_sql();
131
+            if (isset($objets[$table_sql])) {
132
+                $flux['data'] = $echafauder($type, $table, $table_sql, 'prive/objets/contenu/objet', $flux['args']['ext']);
133
+            }
134
+        }
135
+    }
136
+
137
+    return $flux;
138 138
 }
139 139
 
140 140
 /**
@@ -150,47 +150,47 @@  discard block
 block discarded – undo
150 150
  * @return array|false
151 151
  */
152 152
 function quete_rubrique_fond($contexte) {
153
-	static $liste_objets = null;
154
-	static $quete = [];
155
-	if (is_null($liste_objets)) {
156
-		$liste_objets = [];
157
-		include_spip('inc/urls');
158
-		include_spip('public/quete');
159
-		$l = urls_liste_objets(false);
160
-		// placer la rubrique en tete des objets
161
-		$l = array_diff($l, ['rubrique']);
162
-		array_unshift($l, 'rubrique');
163
-		foreach ($l as $objet) {
164
-			$id = id_table_objet($objet);
165
-			if (!isset($liste_objets[$id])) {
166
-				$liste_objets[$id] = objet_type($objet, false);
167
-			}
168
-		}
169
-	}
170
-	$c = array_intersect_key($contexte, $liste_objets);
171
-	if ($c === []) {
172
-		return false;
173
-	}
174
-
175
-	$c = array_map('intval', $c);
176
-	$s = serialize($c);
177
-	if (isset($quete[$s])) {
178
-		return $quete[$s];
179
-	}
180
-
181
-	if (isset($c['id_rubrique']) && ($r = $c['id_rubrique'])) {
182
-		unset($c['id_rubrique']);
183
-		$c = ['id_rubrique' => $r] + $c;
184
-	}
185
-
186
-	foreach ($c as $_id => $id) {
187
-		if ($id && ($row = quete_parent_lang(table_objet_sql($liste_objets[$_id]), $id))) {
188
-			$lang = $row['lang'] ?? '';
189
-			if ($_id == 'id_rubrique' || isset($row['id_rubrique']) && ($id = $row['id_rubrique'])) {
190
-				return $quete[$s] = [$id, $lang];
191
-			}
192
-		}
193
-	}
194
-
195
-	return $quete[$s] = false;
153
+    static $liste_objets = null;
154
+    static $quete = [];
155
+    if (is_null($liste_objets)) {
156
+        $liste_objets = [];
157
+        include_spip('inc/urls');
158
+        include_spip('public/quete');
159
+        $l = urls_liste_objets(false);
160
+        // placer la rubrique en tete des objets
161
+        $l = array_diff($l, ['rubrique']);
162
+        array_unshift($l, 'rubrique');
163
+        foreach ($l as $objet) {
164
+            $id = id_table_objet($objet);
165
+            if (!isset($liste_objets[$id])) {
166
+                $liste_objets[$id] = objet_type($objet, false);
167
+            }
168
+        }
169
+    }
170
+    $c = array_intersect_key($contexte, $liste_objets);
171
+    if ($c === []) {
172
+        return false;
173
+    }
174
+
175
+    $c = array_map('intval', $c);
176
+    $s = serialize($c);
177
+    if (isset($quete[$s])) {
178
+        return $quete[$s];
179
+    }
180
+
181
+    if (isset($c['id_rubrique']) && ($r = $c['id_rubrique'])) {
182
+        unset($c['id_rubrique']);
183
+        $c = ['id_rubrique' => $r] + $c;
184
+    }
185
+
186
+    foreach ($c as $_id => $id) {
187
+        if ($id && ($row = quete_parent_lang(table_objet_sql($liste_objets[$_id]), $id))) {
188
+            $lang = $row['lang'] ?? '';
189
+            if ($_id == 'id_rubrique' || isset($row['id_rubrique']) && ($id = $row['id_rubrique'])) {
190
+                return $quete[$s] = [$id, $lang];
191
+            }
192
+        }
193
+    }
194
+
195
+    return $quete[$s] = false;
196 196
 }
Please login to merge, or discard this patch.
ecrire/public/tracer.php 2 patches
Indentation   +170 added lines, -170 removed lines patch added patch discarded remove patch
@@ -10,187 +10,187 @@
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 function trace_query_start() {
17
-	static $trace = '?';
18
-	if ($trace === '?' || defined('_DEBUG_TRACE_QUERIES')) {
19
-		if (defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
20
-			$trace = true;
21
-		}
22
-		else {
23
-			if (empty($GLOBALS['visiteur_session'])) {
24
-				// si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
25
-				// car ici on ne sait pas si c'est un hit anonyme
26
-				// ou une requete SQL faite avant chargement de la session
27
-				$trace = (empty($_GET['var_profile']) ? false : '?');
28
-			}
29
-			else {
30
-				include_spip('inc/autoriser');
31
-				// gare au bouclage sur calcul de droits au premier appel
32
-				// A fortiori quand on demande une trace
33
-				$trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
34
-				$trace = (!empty($_GET['var_profile']) && autoriser('debug'));
35
-			}
36
-		}
37
-	}
38
-
39
-	return $trace ? microtime() : 0;
17
+    static $trace = '?';
18
+    if ($trace === '?' || defined('_DEBUG_TRACE_QUERIES')) {
19
+        if (defined('_DEBUG_TRACE_QUERIES') && _DEBUG_TRACE_QUERIES) {
20
+            $trace = true;
21
+        }
22
+        else {
23
+            if (empty($GLOBALS['visiteur_session'])) {
24
+                // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
25
+                // car ici on ne sait pas si c'est un hit anonyme
26
+                // ou une requete SQL faite avant chargement de la session
27
+                $trace = (empty($_GET['var_profile']) ? false : '?');
28
+            }
29
+            else {
30
+                include_spip('inc/autoriser');
31
+                // gare au bouclage sur calcul de droits au premier appel
32
+                // A fortiori quand on demande une trace
33
+                $trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
34
+                $trace = (!empty($_GET['var_profile']) && autoriser('debug'));
35
+            }
36
+        }
37
+    }
38
+
39
+    return $trace ? microtime() : 0;
40 40
 }
41 41
 
42 42
 function trace_query_end($query, $start, $result, $erreur, $serveur = '') {
43
-	static $trace = '?';
44
-	if ($trace === '?') {
45
-		if (empty($GLOBALS['visiteur_session'])) {
46
-			// si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
47
-			// car ici on ne sait pas si c'est un hit anonyme
48
-			// ou une requete SQL faite avant chargement de la session
49
-			$trace = (empty($_GET['var_profile']) ? false : '?');
50
-		}
51
-		else {
52
-			include_spip('inc/autoriser');
53
-			// gare au bouclage sur calcul de droits au premier appel
54
-			// A fortiori quand on demande une trace
55
-			$trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
56
-			$trace = (!empty($_GET['var_profile']) && autoriser('debug'));
57
-		}
58
-	}
59
-	if ($start) {
60
-		$end = microtime();
61
-		[$usec, $sec] = explode(' ', (string) $start);
62
-		[$usec2, $sec2] = explode(' ', $end);
63
-		$dt = $sec2 + $usec2 - $sec - $usec;
64
-		pipeline('trig_trace_query', ['query' => $query, 'start' => $start, 'end' => $end, 'time' => $dt, 'result' => $result, 'erreur' => $erreur, 'serveur' => $serveur]);
65
-		if ($trace) {
66
-			trace_query_chrono($dt, $query, $result, $serveur);
67
-		}
68
-	}
69
-	// tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
70
-	if ($trace && $erreur && !preg_match('/^select\b/i', (string) $query)) {
71
-		erreur_squelette([sql_errno($serveur), $erreur, $query]);
72
-	}
73
-
74
-	return $result;
43
+    static $trace = '?';
44
+    if ($trace === '?') {
45
+        if (empty($GLOBALS['visiteur_session'])) {
46
+            // si un anonyme fait un var_profile on est oblige de remplir le tableau des temps en attendant de savoir
47
+            // car ici on ne sait pas si c'est un hit anonyme
48
+            // ou une requete SQL faite avant chargement de la session
49
+            $trace = (empty($_GET['var_profile']) ? false : '?');
50
+        }
51
+        else {
52
+            include_spip('inc/autoriser');
53
+            // gare au bouclage sur calcul de droits au premier appel
54
+            // A fortiori quand on demande une trace
55
+            $trace = false; // on ne trace pas la requete provoquee par autoriser('debug')
56
+            $trace = (!empty($_GET['var_profile']) && autoriser('debug'));
57
+        }
58
+    }
59
+    if ($start) {
60
+        $end = microtime();
61
+        [$usec, $sec] = explode(' ', (string) $start);
62
+        [$usec2, $sec2] = explode(' ', $end);
63
+        $dt = $sec2 + $usec2 - $sec - $usec;
64
+        pipeline('trig_trace_query', ['query' => $query, 'start' => $start, 'end' => $end, 'time' => $dt, 'result' => $result, 'erreur' => $erreur, 'serveur' => $serveur]);
65
+        if ($trace) {
66
+            trace_query_chrono($dt, $query, $result, $serveur);
67
+        }
68
+    }
69
+    // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql
70
+    if ($trace && $erreur && !preg_match('/^select\b/i', (string) $query)) {
71
+        erreur_squelette([sql_errno($serveur), $erreur, $query]);
72
+    }
73
+
74
+    return $result;
75 75
 }
76 76
 
77 77
 function trace_query_chrono($dt, $query, $result, $serveur = '') {
78
-	include_spip('inc/filtres_mini');
79
-	static $tt = 0, $nb = 0;
80
-
81
-	$x = _request('var_mode_objet');
82
-	if (isset($GLOBALS['debug']['aucasou'])) {
83
-		[, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou'];
84
-		if ($x && !preg_match("/$boucle\$/", (string) $x)) {
85
-			return;
86
-		}
87
-		if ($serveur) {
88
-			$boucle .= " ($serveur)";
89
-		}
90
-		$boucle = "<b>$boucle</b>";
91
-	} else {
92
-		if ($x) {
93
-			return;
94
-		}
95
-		$boucle = $contexte = '';
96
-	}
97
-
98
-	$tt += $dt;
99
-	$nb++;
100
-
101
-	$q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
102
-	$e = sql_explain($query, $serveur);
103
-	$r = str_replace('Resource id ', '', (is_object($result) ? $result::class : $result));
104
-	$GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte];
78
+    include_spip('inc/filtres_mini');
79
+    static $tt = 0, $nb = 0;
80
+
81
+    $x = _request('var_mode_objet');
82
+    if (isset($GLOBALS['debug']['aucasou'])) {
83
+        [, $boucle, $serveur, $contexte] = $GLOBALS['debug']['aucasou'];
84
+        if ($x && !preg_match("/$boucle\$/", (string) $x)) {
85
+            return;
86
+        }
87
+        if ($serveur) {
88
+            $boucle .= " ($serveur)";
89
+        }
90
+        $boucle = "<b>$boucle</b>";
91
+    } else {
92
+        if ($x) {
93
+            return;
94
+        }
95
+        $boucle = $contexte = '';
96
+    }
97
+
98
+    $tt += $dt;
99
+    $nb++;
100
+
101
+    $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query));
102
+    $e = sql_explain($query, $serveur);
103
+    $r = str_replace('Resource id ', '', (is_object($result) ? $result::class : $result));
104
+    $GLOBALS['tableau_des_temps'][] = [$dt, $nb, $boucle, $q, $e, $r, $contexte];
105 105
 }
106 106
 
107 107
 
108 108
 function chrono_requete($temps) {
109
-	$total = 0;
110
-	$hors = '<i>' . _T('zbug_hors_compilation') . '</i>';
111
-	$t = $q = $n = $d = [];
112
-	// Totaliser les temps et completer le Explain
113
-	foreach ($temps as $key => $v) {
114
-		[$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v;
115
-		if (is_array($contexte)) {
116
-			$k = ($contexte[0] . " $boucle");
117
-			include_spip('public/compiler');
118
-			$env = reconstruire_contexte_compil($contexte);
119
-		} else {
120
-			$k = $env = $boucle;
121
-		}
122
-
123
-		$total += $dt;
124
-		$t[$key] = $dt;
125
-		$q[$key] = $nb;
126
-		if (!isset($d[$k])) {
127
-			$d[$k] = 0;
128
-			$n[$k] = 0;
129
-		}
130
-		$d[$k] += $dt;
131
-		++$n[$k];
132
-
133
-		if (!is_array($explain)) {
134
-			$explain = [];
135
-		}
136
-		foreach ($explain as $j => $v) {
137
-			$explain[$j] = "<tr><th>$j</th><td>"
138
-				. str_replace(';', '<br />', (string) $v)
139
-				. '</td></tr>';
140
-		}
141
-		$e = "<table class='explain'>"
142
-			. '<caption>'
143
-			. $query
144
-			. '</caption>'
145
-			. "<tr><th>Time</th><td>$dt</td></tr>"
146
-			. "<tr><th>Order</th><td>$nb</td></tr>"
147
-			. "<tr><th>Res</th><td>$res</td></tr>"
148
-			. implode('', $explain)
149
-			. '</table>';
150
-
151
-		$temps[$key] = [$e, $env, $k];
152
-	}
153
-	// Trier par temps d'execution decroissant
154
-	array_multisort($t, SORT_DESC, $q, $temps);
155
-	arsort($d);
156
-	$i = 1;
157
-	$t = [];
158
-	// Fabriquer les liens de navigations dans le tableau des temps
159
-	foreach ($temps as $k => $v) {
160
-		$titre = strip_tags((string) $v[2]);
161
-		$href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
162
-		$href = str_replace("\\'", '&#39;', $href);
163
-
164
-		if (!isset($t[$v[2]])) {
165
-			$t[$v[2]] = [];
166
-		}
167
-		$t[$v[2]][] = "<span class='spip-debug-arg'> "
168
-			. "<a title='$titre' href='$href'>$i</a>"
169
-			. '</span>'
170
-			. ((count($t[$v[2]]) % 10 == 9) ? '<br />' : '');
171
-		$i++;
172
-	}
173
-
174
-	if ($d['']) {
175
-		$d[$hors] = $d[''];
176
-		$n[$hors] = $n[''];
177
-		$t[$hors] = $t[''];
178
-	}
179
-	unset($d['']);
180
-	// Fabriquer le tableau des liens de navigation dans le grand tableau
181
-	foreach ($d as $k => $v) {
182
-		$d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
183
-			. implode('', $t[$k]);
184
-	}
185
-
186
-	$navigation = [
187
-		_T('zbug_statistiques'),
188
-		'<tr><td>'
189
-		. implode("</td></tr>\n<tr><td>", $d)
190
-		. "</td></tr>\n"
191
-		. (# _request('var_mode_objet') ? '' :
192
-		('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>'))
193
-	];
194
-
195
-	return [$temps, $navigation];
109
+    $total = 0;
110
+    $hors = '<i>' . _T('zbug_hors_compilation') . '</i>';
111
+    $t = $q = $n = $d = [];
112
+    // Totaliser les temps et completer le Explain
113
+    foreach ($temps as $key => $v) {
114
+        [$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v;
115
+        if (is_array($contexte)) {
116
+            $k = ($contexte[0] . " $boucle");
117
+            include_spip('public/compiler');
118
+            $env = reconstruire_contexte_compil($contexte);
119
+        } else {
120
+            $k = $env = $boucle;
121
+        }
122
+
123
+        $total += $dt;
124
+        $t[$key] = $dt;
125
+        $q[$key] = $nb;
126
+        if (!isset($d[$k])) {
127
+            $d[$k] = 0;
128
+            $n[$k] = 0;
129
+        }
130
+        $d[$k] += $dt;
131
+        ++$n[$k];
132
+
133
+        if (!is_array($explain)) {
134
+            $explain = [];
135
+        }
136
+        foreach ($explain as $j => $v) {
137
+            $explain[$j] = "<tr><th>$j</th><td>"
138
+                . str_replace(';', '<br />', (string) $v)
139
+                . '</td></tr>';
140
+        }
141
+        $e = "<table class='explain'>"
142
+            . '<caption>'
143
+            . $query
144
+            . '</caption>'
145
+            . "<tr><th>Time</th><td>$dt</td></tr>"
146
+            . "<tr><th>Order</th><td>$nb</td></tr>"
147
+            . "<tr><th>Res</th><td>$res</td></tr>"
148
+            . implode('', $explain)
149
+            . '</table>';
150
+
151
+        $temps[$key] = [$e, $env, $k];
152
+    }
153
+    // Trier par temps d'execution decroissant
154
+    array_multisort($t, SORT_DESC, $q, $temps);
155
+    arsort($d);
156
+    $i = 1;
157
+    $t = [];
158
+    // Fabriquer les liens de navigations dans le tableau des temps
159
+    foreach ($temps as $k => $v) {
160
+        $titre = strip_tags((string) $v[2]);
161
+        $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
162
+        $href = str_replace("\\'", '&#39;', $href);
163
+
164
+        if (!isset($t[$v[2]])) {
165
+            $t[$v[2]] = [];
166
+        }
167
+        $t[$v[2]][] = "<span class='spip-debug-arg'> "
168
+            . "<a title='$titre' href='$href'>$i</a>"
169
+            . '</span>'
170
+            . ((count($t[$v[2]]) % 10 == 9) ? '<br />' : '');
171
+        $i++;
172
+    }
173
+
174
+    if ($d['']) {
175
+        $d[$hors] = $d[''];
176
+        $n[$hors] = $n[''];
177
+        $t[$hors] = $t[''];
178
+    }
179
+    unset($d['']);
180
+    // Fabriquer le tableau des liens de navigation dans le grand tableau
181
+    foreach ($d as $k => $v) {
182
+        $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
183
+            . implode('', $t[$k]);
184
+    }
185
+
186
+    $navigation = [
187
+        _T('zbug_statistiques'),
188
+        '<tr><td>'
189
+        . implode("</td></tr>\n<tr><td>", $d)
190
+        . "</td></tr>\n"
191
+        . (# _request('var_mode_objet') ? '' :
192
+        ('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>'))
193
+    ];
194
+
195
+    return [$temps, $navigation];
196 196
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -107,13 +107,13 @@  discard block
 block discarded – undo
107 107
 
108 108
 function chrono_requete($temps) {
109 109
 	$total = 0;
110
-	$hors = '<i>' . _T('zbug_hors_compilation') . '</i>';
110
+	$hors = '<i>'._T('zbug_hors_compilation').'</i>';
111 111
 	$t = $q = $n = $d = [];
112 112
 	// Totaliser les temps et completer le Explain
113 113
 	foreach ($temps as $key => $v) {
114 114
 		[$dt, $nb, $boucle, $query, $explain, $res, $contexte] = $v;
115 115
 		if (is_array($contexte)) {
116
-			$k = ($contexte[0] . " $boucle");
116
+			$k = ($contexte[0]." $boucle");
117 117
 			include_spip('public/compiler');
118 118
 			$env = reconstruire_contexte_compil($contexte);
119 119
 		} else {
@@ -158,7 +158,7 @@  discard block
 block discarded – undo
158 158
 	// Fabriquer les liens de navigations dans le tableau des temps
159 159
 	foreach ($temps as $k => $v) {
160 160
 		$titre = strip_tags((string) $v[2]);
161
-		$href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i";
161
+		$href = quote_amp($GLOBALS['REQUEST_URI'])."#req$i";
162 162
 		$href = str_replace("\\'", '&#39;', $href);
163 163
 
164 164
 		if (!isset($t[$v[2]])) {
@@ -179,7 +179,7 @@  discard block
 block discarded – undo
179 179
 	unset($d['']);
180 180
 	// Fabriquer le tableau des liens de navigation dans le grand tableau
181 181
 	foreach ($d as $k => $v) {
182
-		$d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
182
+		$d[$k] = $n[$k]."</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>"
183 183
 			. implode('', $t[$k]);
184 184
 	}
185 185
 
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
 		. implode("</td></tr>\n<tr><td>", $d)
190 190
 		. "</td></tr>\n"
191 191
 		. (# _request('var_mode_objet') ? '' :
192
-		('<tr><td>' . (is_countable($temps) ? count($temps) : 0) . '</td><td>' . _T('info_total') . '</td><td class="time">' . $total . '</td><td></td></tr>'))
192
+		('<tr><td>'.(is_countable($temps) ? count($temps) : 0).'</td><td>'._T('info_total').'</td><td class="time">'.$total.'</td><td></td></tr>'))
193 193
 	];
194 194
 
195 195
 	return [$temps, $navigation];
Please login to merge, or discard this patch.
ecrire/public/phraser_html.php 3 patches
Indentation   +1029 added lines, -1029 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
  **/
28 28
 
29 29
 if (!defined('_ECRIRE_INC_VERSION')) {
30
-	return;
30
+    return;
31 31
 }
32 32
 
33 33
 /** Début de la partie principale d'une boucle */
@@ -71,82 +71,82 @@  discard block
 block discarded – undo
71 71
 
72 72
 function phraser_inclure($texte, $ligne, $result) {
73 73
 
74
-	while (preg_match(BALISE_INCLURE, (string) $texte, $match)) {
75
-		$match = array_pad($match, 3, null);
76
-		$p = strpos((string) $texte, (string) $match[0]);
77
-		$debut = substr((string) $texte, 0, $p);
78
-		if ($p) {
79
-			$result = phraser_idiomes($debut, $ligne, $result);
80
-		}
81
-		$ligne += substr_count($debut, "\n");
82
-		$champ = new Inclure();
83
-		$champ->ligne = $ligne;
84
-		$ligne += substr_count((string) $match[0], "\n");
85
-		$fichier = $match[2];
86
-		# assurer ici la migration .php3 => .php
87
-		# et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
88
-		if ($fichier && preg_match(',^(.*[.]php)3$,', (string) $fichier, $r)) {
89
-			$fichier = $r[1];
90
-		}
91
-		$champ->texte = ($fichier !== 'page.php') ? $fichier : '';
92
-		$texte = substr((string) $texte, $p + strlen((string) $match[0]));
93
-		// on assimile {var=val} a une liste de un argument sans fonction
94
-		$pos_apres = 0;
95
-		phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
96
-		if (!$champ->texte || (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
97
-			if (!function_exists('normaliser_inclure')) {
98
-				include_spip('public/normaliser');
99
-			}
100
-			normaliser_inclure($champ);
101
-		}
102
-		$texte = substr($texte, strpos($texte, '>', $pos_apres) + 1);
103
-		$texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
104
-		$result[] = $champ;
105
-	}
106
-
107
-	return (($texte === '') ? $result : phraser_idiomes($texte, $ligne, $result));
74
+    while (preg_match(BALISE_INCLURE, (string) $texte, $match)) {
75
+        $match = array_pad($match, 3, null);
76
+        $p = strpos((string) $texte, (string) $match[0]);
77
+        $debut = substr((string) $texte, 0, $p);
78
+        if ($p) {
79
+            $result = phraser_idiomes($debut, $ligne, $result);
80
+        }
81
+        $ligne += substr_count($debut, "\n");
82
+        $champ = new Inclure();
83
+        $champ->ligne = $ligne;
84
+        $ligne += substr_count((string) $match[0], "\n");
85
+        $fichier = $match[2];
86
+        # assurer ici la migration .php3 => .php
87
+        # et de l'ancienne syntaxe INCLURE(page.php3) devenue surperflue
88
+        if ($fichier && preg_match(',^(.*[.]php)3$,', (string) $fichier, $r)) {
89
+            $fichier = $r[1];
90
+        }
91
+        $champ->texte = ($fichier !== 'page.php') ? $fichier : '';
92
+        $texte = substr((string) $texte, $p + strlen((string) $match[0]));
93
+        // on assimile {var=val} a une liste de un argument sans fonction
94
+        $pos_apres = 0;
95
+        phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
96
+        if (!$champ->texte || (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
97
+            if (!function_exists('normaliser_inclure')) {
98
+                include_spip('public/normaliser');
99
+            }
100
+            normaliser_inclure($champ);
101
+        }
102
+        $texte = substr($texte, strpos($texte, '>', $pos_apres) + 1);
103
+        $texte = preg_replace(',^</INCLU[DR]E>,', '', $texte);
104
+        $result[] = $champ;
105
+    }
106
+
107
+    return (($texte === '') ? $result : phraser_idiomes($texte, $ligne, $result));
108 108
 }
109 109
 
110 110
 function phraser_polyglotte($texte, $ligne, $result) {
111 111
 
112
-	if (preg_match_all(BALISE_POLYGLOTTE, (string) $texte, $m, PREG_SET_ORDER)) {
113
-		foreach ($m as $match) {
114
-			$p = strpos((string) $texte, (string) $match[0]);
115
-			$debut = substr((string) $texte, 0, $p);
116
-			if ($p) {
117
-				$champ = new Texte();
118
-				$champ->texte = $debut;
119
-				$champ->ligne = $ligne;
120
-				$result[] = $champ;
121
-				$ligne += substr_count($champ->texte, "\n");
122
-			}
123
-
124
-			$champ = new Polyglotte();
125
-			$champ->ligne = $ligne;
126
-			$ligne += substr_count($match[0], "\n");
127
-			$lang = '';
128
-			$bloc = $match[1];
129
-			$texte = substr((string) $texte, $p + strlen($match[0]));
130
-			while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
131
-				$trad = $regs[1];
132
-				if ($trad || $lang) {
133
-					$champ->traductions[$lang] = $trad;
134
-				}
135
-				$lang = $regs[2];
136
-				$bloc = $regs[3];
137
-			}
138
-			$champ->traductions[$lang] = $bloc;
139
-			$result[] = $champ;
140
-		}
141
-	}
142
-	if ($texte !== '') {
143
-		$champ = new Texte();
144
-		$champ->texte = $texte;
145
-		$champ->ligne = $ligne;
146
-		$result[] = $champ;
147
-	}
148
-
149
-	return $result;
112
+    if (preg_match_all(BALISE_POLYGLOTTE, (string) $texte, $m, PREG_SET_ORDER)) {
113
+        foreach ($m as $match) {
114
+            $p = strpos((string) $texte, (string) $match[0]);
115
+            $debut = substr((string) $texte, 0, $p);
116
+            if ($p) {
117
+                $champ = new Texte();
118
+                $champ->texte = $debut;
119
+                $champ->ligne = $ligne;
120
+                $result[] = $champ;
121
+                $ligne += substr_count($champ->texte, "\n");
122
+            }
123
+
124
+            $champ = new Polyglotte();
125
+            $champ->ligne = $ligne;
126
+            $ligne += substr_count($match[0], "\n");
127
+            $lang = '';
128
+            $bloc = $match[1];
129
+            $texte = substr((string) $texte, $p + strlen($match[0]));
130
+            while (preg_match('/^[[:space:]]*([^[{]*)[[:space:]]*[[{]([a-z_]+)[]}](.*)$/si', $bloc, $regs)) {
131
+                $trad = $regs[1];
132
+                if ($trad || $lang) {
133
+                    $champ->traductions[$lang] = $trad;
134
+                }
135
+                $lang = $regs[2];
136
+                $bloc = $regs[3];
137
+            }
138
+            $champ->traductions[$lang] = $bloc;
139
+            $result[] = $champ;
140
+        }
141
+    }
142
+    if ($texte !== '') {
143
+        $champ = new Texte();
144
+        $champ->texte = $texte;
145
+        $champ->ligne = $ligne;
146
+        $result[] = $champ;
147
+    }
148
+
149
+    return $result;
150 150
 }
151 151
 
152 152
 
@@ -168,43 +168,43 @@  discard block
 block discarded – undo
168 168
  * @return array
169 169
  **/
170 170
 function phraser_idiomes($texte, $ligne, $result) {
171
-	while (preg_match(BALISE_IDIOMES, $texte, $match)) {
172
-		$match = array_pad($match, 8, null);
173
-		$p = strpos($texte, (string) $match[0]);
174
-		$ko = (!$match[3] && ($match[5][0] !== '='));
175
-		$debut = substr($texte, 0, $p + ($ko ? strlen((string) $match[0]) : 0));
176
-		if ($debut) {
177
-			$result = phraser_champs($debut, $ligne, $result);
178
-		}
179
-		$texte = substr($texte, $p + strlen((string) $match[0]));
180
-		$ligne += substr_count($debut, "\n");
181
-		if ($ko) {
182
-			continue;
183
-		} // faux idiome
184
-		$champ = new Idiome();
185
-		$champ->ligne = $ligne;
186
-		$ligne += substr_count((string) $match[0], "\n");
187
-		// Stocker les arguments de la balise de traduction
188
-		$args = [];
189
-		$largs = $match[5];
190
-		while (preg_match(BALISE_IDIOMES_ARGS, (string) $largs, $r)) {
191
-			$args[$r[1]] = phraser_champs($r[2], 0, []);
192
-			$largs = substr((string) $largs, strlen($r[0]));
193
-		}
194
-		$champ->arg = $args;
195
-		$champ->nom_champ = strtolower((string) $match[3]);
196
-		$champ->module = $match[2];
197
-		// pas d'imbrication pour les filtres sur langue
198
-		$pos_apres = 0;
199
-		phraser_args($match[7] ?? '', ':', '', [], $champ, $pos_apres);
200
-		$champ->apres = substr($match[7] ?? '', $pos_apres);
201
-		$result[] = $champ;
202
-	}
203
-	if ($texte !== '') {
204
-		$result = phraser_champs($texte, $ligne, $result);
205
-	}
206
-
207
-	return $result;
171
+    while (preg_match(BALISE_IDIOMES, $texte, $match)) {
172
+        $match = array_pad($match, 8, null);
173
+        $p = strpos($texte, (string) $match[0]);
174
+        $ko = (!$match[3] && ($match[5][0] !== '='));
175
+        $debut = substr($texte, 0, $p + ($ko ? strlen((string) $match[0]) : 0));
176
+        if ($debut) {
177
+            $result = phraser_champs($debut, $ligne, $result);
178
+        }
179
+        $texte = substr($texte, $p + strlen((string) $match[0]));
180
+        $ligne += substr_count($debut, "\n");
181
+        if ($ko) {
182
+            continue;
183
+        } // faux idiome
184
+        $champ = new Idiome();
185
+        $champ->ligne = $ligne;
186
+        $ligne += substr_count((string) $match[0], "\n");
187
+        // Stocker les arguments de la balise de traduction
188
+        $args = [];
189
+        $largs = $match[5];
190
+        while (preg_match(BALISE_IDIOMES_ARGS, (string) $largs, $r)) {
191
+            $args[$r[1]] = phraser_champs($r[2], 0, []);
192
+            $largs = substr((string) $largs, strlen($r[0]));
193
+        }
194
+        $champ->arg = $args;
195
+        $champ->nom_champ = strtolower((string) $match[3]);
196
+        $champ->module = $match[2];
197
+        // pas d'imbrication pour les filtres sur langue
198
+        $pos_apres = 0;
199
+        phraser_args($match[7] ?? '', ':', '', [], $champ, $pos_apres);
200
+        $champ->apres = substr($match[7] ?? '', $pos_apres);
201
+        $result[] = $champ;
202
+    }
203
+    if ($texte !== '') {
204
+        $result = phraser_champs($texte, $ligne, $result);
205
+    }
206
+
207
+    return $result;
208 208
 }
209 209
 
210 210
 /**
@@ -222,47 +222,47 @@  discard block
 block discarded – undo
222 222
  * @return array
223 223
  **/
224 224
 function phraser_champs($texte, $ligne, $result) {
225
-	while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
226
-		$p = strpos($texte, (string) $match[0]);
227
-		// texte après la balise
228
-		$suite = substr($texte, $p + strlen($match[0]));
229
-
230
-		$debut = substr($texte, 0, $p);
231
-		if ($p) {
232
-			$result = phraser_polyglotte($debut, $ligne, $result);
233
-		}
234
-		$ligne += substr_count($debut, "\n");
235
-		$champ = new Champ();
236
-		$champ->ligne = $ligne;
237
-		$ligne += substr_count($match[0], "\n");
238
-		$champ->nom_boucle = $match[2];
239
-		$champ->nom_champ = $match[3];
240
-		$champ->etoile = $match[5];
241
-
242
-		if ($suite && $suite[0] == '{') {
243
-			phraser_arg($suite, '', [], $champ);
244
-			// ce ltrim est une ereur de conception
245
-			// mais on le conserve par souci de compatibilite
246
-			$texte = ltrim((string) $suite);
247
-			// Il faudrait le normaliser dans l'arbre de syntaxe abstraite
248
-			// pour faire sauter ce cas particulier a la decompilation.
249
-			/* Ce qui suit est malheureusement incomplet pour cela:
225
+    while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
226
+        $p = strpos($texte, (string) $match[0]);
227
+        // texte après la balise
228
+        $suite = substr($texte, $p + strlen($match[0]));
229
+
230
+        $debut = substr($texte, 0, $p);
231
+        if ($p) {
232
+            $result = phraser_polyglotte($debut, $ligne, $result);
233
+        }
234
+        $ligne += substr_count($debut, "\n");
235
+        $champ = new Champ();
236
+        $champ->ligne = $ligne;
237
+        $ligne += substr_count($match[0], "\n");
238
+        $champ->nom_boucle = $match[2];
239
+        $champ->nom_champ = $match[3];
240
+        $champ->etoile = $match[5];
241
+
242
+        if ($suite && $suite[0] == '{') {
243
+            phraser_arg($suite, '', [], $champ);
244
+            // ce ltrim est une ereur de conception
245
+            // mais on le conserve par souci de compatibilite
246
+            $texte = ltrim((string) $suite);
247
+            // Il faudrait le normaliser dans l'arbre de syntaxe abstraite
248
+            // pour faire sauter ce cas particulier a la decompilation.
249
+            /* Ce qui suit est malheureusement incomplet pour cela:
250 250
 			if ($n = (strlen($suite) - strlen($texte))) {
251 251
 				$champ->apres = array(new Texte);
252 252
 				$champ->apres[0]->texte = substr($suite,0,$n);
253 253
 			}
254 254
 			*/
255
-		} else {
256
-			$texte = $suite;
257
-		}
258
-		phraser_vieux($champ);
259
-		$result[] = $champ;
260
-	}
261
-	if ($texte !== '') {
262
-		$result = phraser_polyglotte($texte, $ligne, $result);
263
-	}
264
-
265
-	return $result;
255
+        } else {
256
+            $texte = $suite;
257
+        }
258
+        phraser_vieux($champ);
259
+        $result[] = $champ;
260
+    }
261
+    if ($texte !== '') {
262
+        $result = phraser_polyglotte($texte, $ligne, $result);
263
+    }
264
+
265
+    return $result;
266 266
 }
267 267
 
268 268
 // Gestion des imbrications:
@@ -271,15 +271,15 @@  discard block
 block discarded – undo
271 271
 // on recommence tant qu'il y a des [...] en substituant a l'appel suivant
272 272
 
273 273
 function phraser_champs_etendus($texte, $ligne, $result) {
274
-	if ($texte === '') {
275
-		return $result;
276
-	}
277
-	$sep = '##';
278
-	while (str_contains((string) $texte, (string) $sep)) {
279
-		$sep .= '#';
280
-	}
281
-
282
-	return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, []));
274
+    if ($texte === '') {
275
+        return $result;
276
+    }
277
+    $sep = '##';
278
+    while (str_contains((string) $texte, (string) $sep)) {
279
+        $sep .= '#';
280
+    }
281
+
282
+    return array_merge($result, phraser_champs_interieurs($texte, $ligne, $sep, []));
283 283
 }
284 284
 
285 285
 /**
@@ -297,275 +297,275 @@  discard block
 block discarded – undo
297 297
  * @return array
298 298
  */
299 299
 function phraser_args(string $texte, $fin, $sep, $result, &$pointeur_champ, &$pos_debut) {
300
-	$length = strlen($texte);
301
-	while ($pos_debut < $length && trim($texte[$pos_debut]) === '') {
302
-		$pos_debut++;
303
-	}
304
-	while (($pos_debut < $length) && !str_contains($fin, $texte[$pos_debut])) {
305
-		// phraser_arg modifie directement le $texte, on fait donc avec ici en passant par une sous chaine
306
-		$st = substr($texte, $pos_debut);
307
-		$result = phraser_arg($st, $sep, $result, $pointeur_champ);
308
-		$pos_debut = $length - strlen((string) $st);
309
-		while ($pos_debut < $length && trim($texte[$pos_debut]) === '') {
310
-			$pos_debut++;
311
-		}
312
-	}
313
-
314
-	return $result;
300
+    $length = strlen($texte);
301
+    while ($pos_debut < $length && trim($texte[$pos_debut]) === '') {
302
+        $pos_debut++;
303
+    }
304
+    while (($pos_debut < $length) && !str_contains($fin, $texte[$pos_debut])) {
305
+        // phraser_arg modifie directement le $texte, on fait donc avec ici en passant par une sous chaine
306
+        $st = substr($texte, $pos_debut);
307
+        $result = phraser_arg($st, $sep, $result, $pointeur_champ);
308
+        $pos_debut = $length - strlen((string) $st);
309
+        while ($pos_debut < $length && trim($texte[$pos_debut]) === '') {
310
+            $pos_debut++;
311
+        }
312
+    }
313
+
314
+    return $result;
315 315
 }
316 316
 
317 317
 function phraser_arg(&$texte, $sep, $result, &$pointeur_champ) {
318
-	preg_match(',^(\|?[^}{)|]*)(.*)$,ms', (string) $texte, $match);
319
-	$suite = ltrim($match[2]);
320
-	$fonc = trim($match[1]);
321
-	if ($fonc && $fonc[0] == '|') {
322
-		$fonc = ltrim(substr($fonc, 1));
323
-	}
324
-	$res = [$fonc];
325
-	$err_f = '';
326
-	// cas du filtre sans argument ou du critere /
327
-	if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
328
-		// si pas d'argument, alors il faut une fonction ou un double |
329
-		if (!$match[1]) {
330
-			$err_f = ['zbug_erreur_filtre', ['filtre' => $texte]];
331
-			erreur_squelette($err_f, $pointeur_champ);
332
-			$texte = '';
333
-		} else {
334
-			$texte = $suite;
335
-		}
336
-		if ($err_f) {
337
-			$pointeur_champ->param = false;
338
-		} elseif ($fonc !== '') {
339
-			$pointeur_champ->param[] = $res;
340
-		}
341
-		// pour les balises avec faux filtres qui boudent ce dur larbeur
342
-		$pointeur_champ->fonctions[] = [$fonc, ''];
343
-
344
-		return $result;
345
-	}
346
-	$args = ltrim(substr($suite, 1)); // virer le '(' initial
347
-	$collecte = [];
348
-	while ($args && $args[0] != '}') {
349
-		if ($args[0] == '"') {
350
-			preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
351
-		} elseif ($args[0] == "'") {
352
-			preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
353
-		} else {
354
-			preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
355
-			if (!isset($regs[2]) || !strlen($regs[2])) {
356
-				$err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
357
-				erreur_squelette($err_f, $pointeur_champ);
358
-				$champ = new Texte();
359
-				$champ->apres = $champ->avant = $args = '';
360
-				break;
361
-			}
362
-		}
363
-		$arg = $regs[2];
364
-		if (trim($regs[1])) {
365
-			$champ = new Texte();
366
-			$champ->texte = $arg;
367
-			$champ->apres = $champ->avant = $regs[1];
368
-			$result[] = $champ;
369
-			$collecte[] = $champ;
370
-			$args = ltrim($regs[count($regs) - 1]);
371
-		} else {
372
-			if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
373
-				// 0 est un aveu d'impuissance. A completer
374
-				$arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
375
-
376
-				$args = ltrim($regs[count($regs) - 1]);
377
-				$collecte = array_merge($collecte, $arg);
378
-				$result = array_merge($result, $arg);
379
-			} else {
380
-				$n = strpos($args, (string) $r[0]);
381
-				$pred = substr($args, 0, $n);
382
-				$par = ',}';
383
-				if (preg_match('/^(.*)\($/', $pred, $m)) {
384
-					$pred = $m[1];
385
-					$par = ')';
386
-				}
387
-				if ($pred) {
388
-					$champ = new Texte();
389
-					$champ->texte = $pred;
390
-					$champ->apres = $champ->avant = '';
391
-					$result[] = $champ;
392
-					$collecte[] = $champ;
393
-				}
394
-				$rec = substr($args, $n + strlen($r[0]) - 1);
395
-				$champ = new Champ();
396
-				$champ->nom_boucle = $r[2];
397
-				$champ->nom_champ = $r[3];
398
-				$champ->etoile = $r[5];
399
-				$next = $r[6];
400
-				while ($next == '{') {
401
-					phraser_arg($rec, $sep, [], $champ);
402
-					$args = ltrim((string) $rec);
403
-					$next = $args[0] ?? '';
404
-				}
405
-				while ($next == '|') {
406
-					$pos_apres = 0;
407
-					phraser_args($rec, $par, $sep, [], $champ, $pos_apres);
408
-					$args = substr((string) $rec, $pos_apres);
409
-					$next = $args[0] ?? '';
410
-				}
411
-				// Si erreur de syntaxe dans un sous-argument, propager.
412
-				if ($champ->param === false) {
413
-					$err_f = true;
414
-				} else {
415
-					phraser_vieux($champ);
416
-				}
417
-				if ($par == ')') {
418
-					$args = substr($args, 1);
419
-				}
420
-				$collecte[] = $champ;
421
-				$result[] = $champ;
422
-			}
423
-		}
424
-		if (isset($args[0]) && $args[0] == ',') {
425
-			$args = ltrim(substr($args, 1));
426
-			if ($collecte) {
427
-				$res[] = $collecte;
428
-				$collecte = [];
429
-			}
430
-		}
431
-	}
432
-	if ($collecte) {
433
-		$res[] = $collecte;
434
-		$collecte = [];
435
-	}
436
-	$texte = substr($args, 1);
437
-	$source = substr($suite, 0, strlen($suite) - strlen($texte));
438
-	// propager les erreurs, et ignorer les param vides
439
-	if ($pointeur_champ->param !== false) {
440
-		if ($err_f) {
441
-			$pointeur_champ->param = false;
442
-		} elseif ($fonc !== '' || count($res) > 1) {
443
-			$pointeur_champ->param[] = $res;
444
-		}
445
-	}
446
-	// pour les balises avec faux filtres qui boudent ce dur larbeur
447
-	$pointeur_champ->fonctions[] = [$fonc, $source];
448
-
449
-	return $result;
318
+    preg_match(',^(\|?[^}{)|]*)(.*)$,ms', (string) $texte, $match);
319
+    $suite = ltrim($match[2]);
320
+    $fonc = trim($match[1]);
321
+    if ($fonc && $fonc[0] == '|') {
322
+        $fonc = ltrim(substr($fonc, 1));
323
+    }
324
+    $res = [$fonc];
325
+    $err_f = '';
326
+    // cas du filtre sans argument ou du critere /
327
+    if (($suite && ($suite[0] != '{')) || ($fonc && $fonc[0] == '/')) {
328
+        // si pas d'argument, alors il faut une fonction ou un double |
329
+        if (!$match[1]) {
330
+            $err_f = ['zbug_erreur_filtre', ['filtre' => $texte]];
331
+            erreur_squelette($err_f, $pointeur_champ);
332
+            $texte = '';
333
+        } else {
334
+            $texte = $suite;
335
+        }
336
+        if ($err_f) {
337
+            $pointeur_champ->param = false;
338
+        } elseif ($fonc !== '') {
339
+            $pointeur_champ->param[] = $res;
340
+        }
341
+        // pour les balises avec faux filtres qui boudent ce dur larbeur
342
+        $pointeur_champ->fonctions[] = [$fonc, ''];
343
+
344
+        return $result;
345
+    }
346
+    $args = ltrim(substr($suite, 1)); // virer le '(' initial
347
+    $collecte = [];
348
+    while ($args && $args[0] != '}') {
349
+        if ($args[0] == '"') {
350
+            preg_match('/^(")([^"]*)(")(.*)$/ms', $args, $regs);
351
+        } elseif ($args[0] == "'") {
352
+            preg_match("/^(')([^']*)(')(.*)$/ms", $args, $regs);
353
+        } else {
354
+            preg_match('/^([[:space:]]*)([^,([{}]*([(\[{][^])}]*[])}])?[^,}]*)([,}].*)$/ms', $args, $regs);
355
+            if (!isset($regs[2]) || !strlen($regs[2])) {
356
+                $err_f = ['zbug_erreur_filtre', ['filtre' => $args]];
357
+                erreur_squelette($err_f, $pointeur_champ);
358
+                $champ = new Texte();
359
+                $champ->apres = $champ->avant = $args = '';
360
+                break;
361
+            }
362
+        }
363
+        $arg = $regs[2];
364
+        if (trim($regs[1])) {
365
+            $champ = new Texte();
366
+            $champ->texte = $arg;
367
+            $champ->apres = $champ->avant = $regs[1];
368
+            $result[] = $champ;
369
+            $collecte[] = $champ;
370
+            $args = ltrim($regs[count($regs) - 1]);
371
+        } else {
372
+            if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
373
+                // 0 est un aveu d'impuissance. A completer
374
+                $arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
375
+
376
+                $args = ltrim($regs[count($regs) - 1]);
377
+                $collecte = array_merge($collecte, $arg);
378
+                $result = array_merge($result, $arg);
379
+            } else {
380
+                $n = strpos($args, (string) $r[0]);
381
+                $pred = substr($args, 0, $n);
382
+                $par = ',}';
383
+                if (preg_match('/^(.*)\($/', $pred, $m)) {
384
+                    $pred = $m[1];
385
+                    $par = ')';
386
+                }
387
+                if ($pred) {
388
+                    $champ = new Texte();
389
+                    $champ->texte = $pred;
390
+                    $champ->apres = $champ->avant = '';
391
+                    $result[] = $champ;
392
+                    $collecte[] = $champ;
393
+                }
394
+                $rec = substr($args, $n + strlen($r[0]) - 1);
395
+                $champ = new Champ();
396
+                $champ->nom_boucle = $r[2];
397
+                $champ->nom_champ = $r[3];
398
+                $champ->etoile = $r[5];
399
+                $next = $r[6];
400
+                while ($next == '{') {
401
+                    phraser_arg($rec, $sep, [], $champ);
402
+                    $args = ltrim((string) $rec);
403
+                    $next = $args[0] ?? '';
404
+                }
405
+                while ($next == '|') {
406
+                    $pos_apres = 0;
407
+                    phraser_args($rec, $par, $sep, [], $champ, $pos_apres);
408
+                    $args = substr((string) $rec, $pos_apres);
409
+                    $next = $args[0] ?? '';
410
+                }
411
+                // Si erreur de syntaxe dans un sous-argument, propager.
412
+                if ($champ->param === false) {
413
+                    $err_f = true;
414
+                } else {
415
+                    phraser_vieux($champ);
416
+                }
417
+                if ($par == ')') {
418
+                    $args = substr($args, 1);
419
+                }
420
+                $collecte[] = $champ;
421
+                $result[] = $champ;
422
+            }
423
+        }
424
+        if (isset($args[0]) && $args[0] == ',') {
425
+            $args = ltrim(substr($args, 1));
426
+            if ($collecte) {
427
+                $res[] = $collecte;
428
+                $collecte = [];
429
+            }
430
+        }
431
+    }
432
+    if ($collecte) {
433
+        $res[] = $collecte;
434
+        $collecte = [];
435
+    }
436
+    $texte = substr($args, 1);
437
+    $source = substr($suite, 0, strlen($suite) - strlen($texte));
438
+    // propager les erreurs, et ignorer les param vides
439
+    if ($pointeur_champ->param !== false) {
440
+        if ($err_f) {
441
+            $pointeur_champ->param = false;
442
+        } elseif ($fonc !== '' || count($res) > 1) {
443
+            $pointeur_champ->param[] = $res;
444
+        }
445
+    }
446
+    // pour les balises avec faux filtres qui boudent ce dur larbeur
447
+    $pointeur_champ->fonctions[] = [$fonc, $source];
448
+
449
+    return $result;
450 450
 }
451 451
 
452 452
 
453 453
 function phraser_champs_exterieurs($texte, $ligne, $sep, $nested) {
454
-	$res = [];
455
-	while (($p = strpos((string) $texte, (string) "%$sep")) !== false) {
456
-		if (!preg_match(',^%' . preg_quote((string) $sep, ',') . '([0-9]+)@,', substr((string) $texte, $p), $m)) {
457
-			break;
458
-		}
459
-		$debut = substr((string) $texte, 0, $p);
460
-		$texte = substr((string) $texte, $p + strlen($m[0]));
461
-		if ($p) {
462
-			$res = phraser_inclure($debut, $ligne, $res);
463
-		}
464
-		$ligne += substr_count($debut, "\n");
465
-		$res[] = $nested[$m[1]];
466
-	}
467
-
468
-	return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
454
+    $res = [];
455
+    while (($p = strpos((string) $texte, (string) "%$sep")) !== false) {
456
+        if (!preg_match(',^%' . preg_quote((string) $sep, ',') . '([0-9]+)@,', substr((string) $texte, $p), $m)) {
457
+            break;
458
+        }
459
+        $debut = substr((string) $texte, 0, $p);
460
+        $texte = substr((string) $texte, $p + strlen($m[0]));
461
+        if ($p) {
462
+            $res = phraser_inclure($debut, $ligne, $res);
463
+        }
464
+        $ligne += substr_count($debut, "\n");
465
+        $res[] = $nested[$m[1]];
466
+    }
467
+
468
+    return (($texte === '') ? $res : phraser_inclure($texte, $ligne, $res));
469 469
 }
470 470
 
471 471
 function phraser_champs_interieurs($texte, $ligne, $sep, $result) {
472
-	$i = 0; // en fait count($result)
473
-	$x = '';
474
-
475
-	while (true) {
476
-		$j = $i;
477
-		$n = $ligne;
478
-		while (preg_match(CHAMP_ETENDU, (string) $texte, $match)) {
479
-			$p = strpos((string) $texte, (string) $match[0]);
480
-			$debut = substr((string) $texte, 0, $p);
481
-			if ($p) {
482
-				$result[$i] = $debut;
483
-				$i++;
484
-			}
485
-			$nom = $match[4];
486
-			$champ = new Champ();
487
-			// ca ne marche pas encore en cas de champ imbrique
488
-			$champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
489
-			$champ->nom_boucle = $match[3];
490
-			$champ->nom_champ = $nom;
491
-			$champ->etoile = $match[6];
492
-			// phraser_args indiquera ou commence apres
493
-			$pos_apres = 0;
494
-			$result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
495
-			phraser_vieux($champ);
496
-			$champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
497
-			$debut = substr($match[7], $pos_apres + 1);
498
-			if (!empty($debut)) {
499
-				$n += substr_count(substr((string) $texte, 0, strpos((string) $texte, $debut)), "\n");
500
-			}
501
-			$champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
502
-
503
-			// reinjecter la boucle si c'en est une
504
-			phraser_boucle_placeholder($champ);
505
-
506
-			$result[$i] = $champ;
507
-			$i++;
508
-			$texte = substr((string) $texte, $p + strlen($match[0]));
509
-		}
510
-		if ($texte !== '') {
511
-			$result[$i] = $texte;
512
-			$i++;
513
-		}
514
-		$x = '';
515
-
516
-		while ($j < $i) {
517
-			$z = $result[$j];
518
-			// j'aurais besoin de connaitre le nombre de lignes...
519
-			if (is_object($z)) {
520
-				$x .= "%$sep$j@";
521
-			} else {
522
-				$x .= $z;
523
-			}
524
-			$j++;
525
-		}
526
-		if (preg_match(CHAMP_ETENDU, $x)) {
527
-			$texte = $x;
528
-		} else {
529
-			return phraser_champs_exterieurs($x, $ligne, $sep, $result);
530
-		}
531
-	}
472
+    $i = 0; // en fait count($result)
473
+    $x = '';
474
+
475
+    while (true) {
476
+        $j = $i;
477
+        $n = $ligne;
478
+        while (preg_match(CHAMP_ETENDU, (string) $texte, $match)) {
479
+            $p = strpos((string) $texte, (string) $match[0]);
480
+            $debut = substr((string) $texte, 0, $p);
481
+            if ($p) {
482
+                $result[$i] = $debut;
483
+                $i++;
484
+            }
485
+            $nom = $match[4];
486
+            $champ = new Champ();
487
+            // ca ne marche pas encore en cas de champ imbrique
488
+            $champ->ligne = $x ? 0 : ($n + substr_count($debut, "\n"));
489
+            $champ->nom_boucle = $match[3];
490
+            $champ->nom_champ = $nom;
491
+            $champ->etoile = $match[6];
492
+            // phraser_args indiquera ou commence apres
493
+            $pos_apres = 0;
494
+            $result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
495
+            phraser_vieux($champ);
496
+            $champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
497
+            $debut = substr($match[7], $pos_apres + 1);
498
+            if (!empty($debut)) {
499
+                $n += substr_count(substr((string) $texte, 0, strpos((string) $texte, $debut)), "\n");
500
+            }
501
+            $champ->apres = phraser_champs_exterieurs($debut, $n, $sep, $result);
502
+
503
+            // reinjecter la boucle si c'en est une
504
+            phraser_boucle_placeholder($champ);
505
+
506
+            $result[$i] = $champ;
507
+            $i++;
508
+            $texte = substr((string) $texte, $p + strlen($match[0]));
509
+        }
510
+        if ($texte !== '') {
511
+            $result[$i] = $texte;
512
+            $i++;
513
+        }
514
+        $x = '';
515
+
516
+        while ($j < $i) {
517
+            $z = $result[$j];
518
+            // j'aurais besoin de connaitre le nombre de lignes...
519
+            if (is_object($z)) {
520
+                $x .= "%$sep$j@";
521
+            } else {
522
+                $x .= $z;
523
+            }
524
+            $j++;
525
+        }
526
+        if (preg_match(CHAMP_ETENDU, $x)) {
527
+            $texte = $x;
528
+        } else {
529
+            return phraser_champs_exterieurs($x, $ligne, $sep, $result);
530
+        }
531
+    }
532 532
 }
533 533
 
534 534
 function phraser_vieux(&$champ) {
535
-	$nom = $champ->nom_champ;
536
-	if ($nom == 'EMBED_DOCUMENT') {
537
-		if (!function_exists('phraser_vieux_emb')) {
538
-			include_spip('public/normaliser');
539
-		}
540
-		phraser_vieux_emb($champ);
541
-	} elseif ($nom == 'EXPOSER') {
542
-		if (!function_exists('phraser_vieux_exposer')) {
543
-			include_spip('public/normaliser');
544
-		}
545
-		phraser_vieux_exposer($champ);
546
-	} elseif ($champ->param) {
547
-		if ($nom == 'FORMULAIRE_RECHERCHE') {
548
-			if (!function_exists('phraser_vieux_recherche')) {
549
-				include_spip('public/normaliser');
550
-			}
551
-			phraser_vieux_recherche($champ);
552
-		} elseif (preg_match(',^LOGO_[A-Z]+,', (string) $nom)) {
553
-			if (!function_exists('phraser_vieux_logos')) {
554
-				include_spip('public/normaliser');
555
-			}
556
-			phraser_vieux_logos($champ);
557
-		} elseif ($nom == 'MODELE') {
558
-			if (!function_exists('phraser_vieux_modele')) {
559
-				include_spip('public/normaliser');
560
-			}
561
-			phraser_vieux_modele($champ);
562
-		} elseif ($nom == 'INCLURE' || $nom == 'INCLUDE') {
563
-			if (!function_exists('phraser_vieux_inclu')) {
564
-				include_spip('public/normaliser');
565
-			}
566
-			phraser_vieux_inclu($champ);
567
-		}
568
-	}
535
+    $nom = $champ->nom_champ;
536
+    if ($nom == 'EMBED_DOCUMENT') {
537
+        if (!function_exists('phraser_vieux_emb')) {
538
+            include_spip('public/normaliser');
539
+        }
540
+        phraser_vieux_emb($champ);
541
+    } elseif ($nom == 'EXPOSER') {
542
+        if (!function_exists('phraser_vieux_exposer')) {
543
+            include_spip('public/normaliser');
544
+        }
545
+        phraser_vieux_exposer($champ);
546
+    } elseif ($champ->param) {
547
+        if ($nom == 'FORMULAIRE_RECHERCHE') {
548
+            if (!function_exists('phraser_vieux_recherche')) {
549
+                include_spip('public/normaliser');
550
+            }
551
+            phraser_vieux_recherche($champ);
552
+        } elseif (preg_match(',^LOGO_[A-Z]+,', (string) $nom)) {
553
+            if (!function_exists('phraser_vieux_logos')) {
554
+                include_spip('public/normaliser');
555
+            }
556
+            phraser_vieux_logos($champ);
557
+        } elseif ($nom == 'MODELE') {
558
+            if (!function_exists('phraser_vieux_modele')) {
559
+                include_spip('public/normaliser');
560
+            }
561
+            phraser_vieux_modele($champ);
562
+        } elseif ($nom == 'INCLURE' || $nom == 'INCLUDE') {
563
+            if (!function_exists('phraser_vieux_inclu')) {
564
+                include_spip('public/normaliser');
565
+            }
566
+            phraser_vieux_inclu($champ);
567
+        }
568
+    }
569 569
 }
570 570
 
571 571
 
@@ -593,199 +593,199 @@  discard block
 block discarded – undo
593 593
  **/
594 594
 function phraser_criteres($params, &$result) {
595 595
 
596
-	$err_ci = ''; // indiquera s'il y a eu une erreur
597
-	$args = [];
598
-	$type = $result->type_requete;
599
-	$doublons = [];
600
-	foreach ($params as $v) {
601
-		$var = $v[1][0];
602
-		$param = ($var->type != 'texte') ? '' : $var->texte;
603
-		if (((is_countable($v) ? count($v) : 0) > 2) && (!preg_match(',[^A-Za-z]IN[^A-Za-z],i', (string) $param))) {
604
-			// plus d'un argument et pas le critere IN:
605
-			// detecter comme on peut si c'est le critere implicite LIMIT debut, fin
606
-			if (
607
-				$var->type != 'texte' || preg_match('/^(n|n-|(n-)?\d+)$/S', (string) $param)
608
-			) {
609
-				$op = ',';
610
-				$not = false;
611
-				$cond = false;
612
-			} else {
613
-				// Le debut du premier argument est l'operateur
614
-				preg_match('/^([!]?)([a-zA-Z]\w*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', (string) $param, $m);
615
-				$op = $m[2];
616
-				$not = (bool) $m[1];
617
-				$cond = (bool) $m[3];
618
-				// virer le premier argument,
619
-				// et mettre son reliquat eventuel
620
-				// Recopier pour ne pas alterer le texte source
621
-				// utile au debusqueur
622
-				if ($m[4]) {
623
-					// une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
624
-					if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
625
-						$c = null;
626
-						eval('$c = ' . $m[4] . ';');
627
-						if (isset($c)) {
628
-							$m[4] = $c;
629
-						}
630
-					}
631
-					$texte = new Texte();
632
-					$texte->texte = $m[4];
633
-					$v[1][0] = $texte;
634
-				} else {
635
-					array_shift($v[1]);
636
-				}
637
-			}
638
-			array_shift($v); // $v[O] est vide
639
-			$crit = new Critere();
640
-			$crit->op = $op;
641
-			$crit->not = $not;
642
-			$crit->cond = $cond;
643
-			$crit->exclus = '';
644
-			$crit->param = $v;
645
-			$args[] = $crit;
646
-		} else {
647
-			if ($var->type != 'texte') {
648
-				// cas 1 seul arg ne commencant pas par du texte brut:
649
-				// erreur ou critere infixe "/"
650
-				if (($v[1][1]->type != 'texte') || (trim((string) $v[1][1]->texte) != '/')) {
651
-					$err_ci = [
652
-						'zbug_critere_inconnu',
653
-						['critere' => $var->nom_champ]
654
-					];
655
-					erreur_squelette($err_ci, $result);
656
-				} else {
657
-					$crit = new Critere();
658
-					$crit->op = '/';
659
-					$crit->not = false;
660
-					$crit->exclus = '';
661
-					$crit->param = [[$v[1][0]], [$v[1][2]]];
662
-					$args[] = $crit;
663
-				}
664
-			} else {
665
-				// traiter qq lexemes particuliers pour faciliter la suite
666
-				// les separateurs
667
-				if ($var->apres) {
668
-					$result->separateur[] = $param;
669
-				} elseif ($param == 'tout' || $param == 'tous') {
670
-					$result->modificateur['tout'] = true;
671
-				} elseif ($param == 'plat') {
672
-					$result->modificateur['plat'] = true;
673
-				}
674
-
675
-				// Boucle hierarchie, analyser le critere id_rubrique
676
-				// et les autres critères {id_x} pour forcer {tout} sur
677
-				// ceux-ci pour avoir la rubrique mere...
678
-				// Les autres critères de la boucle hierarchie doivent être
679
-				// traités normalement.
680
-				elseif (
681
-					strcasecmp($type, 'hierarchie') == 0
682
-					&& !preg_match(",^id_rubrique\b,", (string) $param)
683
-					&& preg_match(',^id_\w+\s*$,', (string) $param)
684
-				) {
685
-					$result->modificateur['tout'] = true;
686
-				} elseif (strcasecmp($type, 'hierarchie') == 0 && $param == 'id_rubrique') {
687
-					// rien a faire sur {id_rubrique} tout seul
688
-				} else {
689
-					// pas d'emplacement statique, faut un dynamique
690
-					// mais il y a 2 cas qui ont les 2 !
691
-					if (($param == 'unique') || (preg_match(',^!?doublons *,', (string) $param))) {
692
-						// cette variable sera inseree dans le code
693
-						// et son nom sert d'indicateur des maintenant
694
-						$result->doublons = '$doublons_index';
695
-						if ($param == 'unique') {
696
-							$param = 'doublons';
697
-						}
698
-					} elseif ($param == 'recherche') {
699
-						// meme chose (a cause de #nom_de_boucle:URL_*)
700
-						$result->hash = ' ';
701
-					}
702
-
703
-					if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', (string) $param, $m)) {
704
-						$crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
705
-					} elseif (
706
-						preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
707
-						')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', (string) $param, $m)
708
-					) {
709
-						$a2 = trim($m[8]);
710
-						if ($a2 && ($a2[0] == "'" || $a2[0] == '"') && $a2[0] == substr($a2, -1)) {
711
-							$a2 = substr($a2, 1, -1);
712
-						}
713
-						$crit = phraser_critere_infixe(
714
-							$m[2],
715
-							$a2,
716
-							$v,
717
-							(($m[2] == 'lang_select') ? $m[2] : $m[7]),
718
-							$m[6],
719
-							$m[5]
720
-						);
721
-						$crit->exclus = $m[1];
722
-					} elseif (
723
-						preg_match('/^([!]?)\s*(' .
724
-						CHAMP_SQL_PLUS_FONC .
725
-						')\s*(\??)(.*)$/is', (string) $param, $m)
726
-					) {
727
-						// contient aussi les comparaisons implicites !
728
-						// Comme ci-dessus:
729
-						// le premier arg contient l'operateur
730
-						array_shift($v);
731
-						if ($m[6]) {
732
-							$v[0][0] = new Texte();
733
-							$v[0][0]->texte = $m[6];
734
-						} else {
735
-							array_shift($v[0]);
736
-							if (!$v[0]) {
737
-								array_shift($v);
738
-							}
739
-						}
740
-						$crit = new Critere();
741
-						$crit->op = $m[2];
742
-						$crit->param = $v;
743
-						$crit->not = (bool) $m[1];
744
-						$crit->cond = (bool) $m[5];
745
-					} else {
746
-						$err_ci = [
747
-							'zbug_critere_inconnu',
748
-							['critere' => $param]
749
-						];
750
-						erreur_squelette($err_ci, $result);
751
-					}
752
-
753
-					if ((!preg_match(',^!?doublons *,', (string) $param)) || $crit->not) {
754
-						$args[] = $crit;
755
-					} else {
756
-						$doublons[] = $crit;
757
-					}
758
-				}
759
-			}
760
-		}
761
-	}
762
-
763
-	// les doublons non nies doivent etre le dernier critere
764
-	// pour que la variable $doublon_index ait la bonne valeur
765
-	// cf critere_doublon
766
-	if ($doublons) {
767
-		$args = [...$args, ...$doublons];
768
-	}
769
-
770
-	// Si erreur, laisser la chaine dans ce champ pour le HTTP 503
771
-	if (!$err_ci) {
772
-		$result->criteres = $args;
773
-	}
596
+    $err_ci = ''; // indiquera s'il y a eu une erreur
597
+    $args = [];
598
+    $type = $result->type_requete;
599
+    $doublons = [];
600
+    foreach ($params as $v) {
601
+        $var = $v[1][0];
602
+        $param = ($var->type != 'texte') ? '' : $var->texte;
603
+        if (((is_countable($v) ? count($v) : 0) > 2) && (!preg_match(',[^A-Za-z]IN[^A-Za-z],i', (string) $param))) {
604
+            // plus d'un argument et pas le critere IN:
605
+            // detecter comme on peut si c'est le critere implicite LIMIT debut, fin
606
+            if (
607
+                $var->type != 'texte' || preg_match('/^(n|n-|(n-)?\d+)$/S', (string) $param)
608
+            ) {
609
+                $op = ',';
610
+                $not = false;
611
+                $cond = false;
612
+            } else {
613
+                // Le debut du premier argument est l'operateur
614
+                preg_match('/^([!]?)([a-zA-Z]\w*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms', (string) $param, $m);
615
+                $op = $m[2];
616
+                $not = (bool) $m[1];
617
+                $cond = (bool) $m[3];
618
+                // virer le premier argument,
619
+                // et mettre son reliquat eventuel
620
+                // Recopier pour ne pas alterer le texte source
621
+                // utile au debusqueur
622
+                if ($m[4]) {
623
+                    // une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
624
+                    if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
625
+                        $c = null;
626
+                        eval('$c = ' . $m[4] . ';');
627
+                        if (isset($c)) {
628
+                            $m[4] = $c;
629
+                        }
630
+                    }
631
+                    $texte = new Texte();
632
+                    $texte->texte = $m[4];
633
+                    $v[1][0] = $texte;
634
+                } else {
635
+                    array_shift($v[1]);
636
+                }
637
+            }
638
+            array_shift($v); // $v[O] est vide
639
+            $crit = new Critere();
640
+            $crit->op = $op;
641
+            $crit->not = $not;
642
+            $crit->cond = $cond;
643
+            $crit->exclus = '';
644
+            $crit->param = $v;
645
+            $args[] = $crit;
646
+        } else {
647
+            if ($var->type != 'texte') {
648
+                // cas 1 seul arg ne commencant pas par du texte brut:
649
+                // erreur ou critere infixe "/"
650
+                if (($v[1][1]->type != 'texte') || (trim((string) $v[1][1]->texte) != '/')) {
651
+                    $err_ci = [
652
+                        'zbug_critere_inconnu',
653
+                        ['critere' => $var->nom_champ]
654
+                    ];
655
+                    erreur_squelette($err_ci, $result);
656
+                } else {
657
+                    $crit = new Critere();
658
+                    $crit->op = '/';
659
+                    $crit->not = false;
660
+                    $crit->exclus = '';
661
+                    $crit->param = [[$v[1][0]], [$v[1][2]]];
662
+                    $args[] = $crit;
663
+                }
664
+            } else {
665
+                // traiter qq lexemes particuliers pour faciliter la suite
666
+                // les separateurs
667
+                if ($var->apres) {
668
+                    $result->separateur[] = $param;
669
+                } elseif ($param == 'tout' || $param == 'tous') {
670
+                    $result->modificateur['tout'] = true;
671
+                } elseif ($param == 'plat') {
672
+                    $result->modificateur['plat'] = true;
673
+                }
674
+
675
+                // Boucle hierarchie, analyser le critere id_rubrique
676
+                // et les autres critères {id_x} pour forcer {tout} sur
677
+                // ceux-ci pour avoir la rubrique mere...
678
+                // Les autres critères de la boucle hierarchie doivent être
679
+                // traités normalement.
680
+                elseif (
681
+                    strcasecmp($type, 'hierarchie') == 0
682
+                    && !preg_match(",^id_rubrique\b,", (string) $param)
683
+                    && preg_match(',^id_\w+\s*$,', (string) $param)
684
+                ) {
685
+                    $result->modificateur['tout'] = true;
686
+                } elseif (strcasecmp($type, 'hierarchie') == 0 && $param == 'id_rubrique') {
687
+                    // rien a faire sur {id_rubrique} tout seul
688
+                } else {
689
+                    // pas d'emplacement statique, faut un dynamique
690
+                    // mais il y a 2 cas qui ont les 2 !
691
+                    if (($param == 'unique') || (preg_match(',^!?doublons *,', (string) $param))) {
692
+                        // cette variable sera inseree dans le code
693
+                        // et son nom sert d'indicateur des maintenant
694
+                        $result->doublons = '$doublons_index';
695
+                        if ($param == 'unique') {
696
+                            $param = 'doublons';
697
+                        }
698
+                    } elseif ($param == 'recherche') {
699
+                        // meme chose (a cause de #nom_de_boucle:URL_*)
700
+                        $result->hash = ' ';
701
+                    }
702
+
703
+                    if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', (string) $param, $m)) {
704
+                        $crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
705
+                    } elseif (
706
+                        preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
707
+                        ')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', (string) $param, $m)
708
+                    ) {
709
+                        $a2 = trim($m[8]);
710
+                        if ($a2 && ($a2[0] == "'" || $a2[0] == '"') && $a2[0] == substr($a2, -1)) {
711
+                            $a2 = substr($a2, 1, -1);
712
+                        }
713
+                        $crit = phraser_critere_infixe(
714
+                            $m[2],
715
+                            $a2,
716
+                            $v,
717
+                            (($m[2] == 'lang_select') ? $m[2] : $m[7]),
718
+                            $m[6],
719
+                            $m[5]
720
+                        );
721
+                        $crit->exclus = $m[1];
722
+                    } elseif (
723
+                        preg_match('/^([!]?)\s*(' .
724
+                        CHAMP_SQL_PLUS_FONC .
725
+                        ')\s*(\??)(.*)$/is', (string) $param, $m)
726
+                    ) {
727
+                        // contient aussi les comparaisons implicites !
728
+                        // Comme ci-dessus:
729
+                        // le premier arg contient l'operateur
730
+                        array_shift($v);
731
+                        if ($m[6]) {
732
+                            $v[0][0] = new Texte();
733
+                            $v[0][0]->texte = $m[6];
734
+                        } else {
735
+                            array_shift($v[0]);
736
+                            if (!$v[0]) {
737
+                                array_shift($v);
738
+                            }
739
+                        }
740
+                        $crit = new Critere();
741
+                        $crit->op = $m[2];
742
+                        $crit->param = $v;
743
+                        $crit->not = (bool) $m[1];
744
+                        $crit->cond = (bool) $m[5];
745
+                    } else {
746
+                        $err_ci = [
747
+                            'zbug_critere_inconnu',
748
+                            ['critere' => $param]
749
+                        ];
750
+                        erreur_squelette($err_ci, $result);
751
+                    }
752
+
753
+                    if ((!preg_match(',^!?doublons *,', (string) $param)) || $crit->not) {
754
+                        $args[] = $crit;
755
+                    } else {
756
+                        $doublons[] = $crit;
757
+                    }
758
+                }
759
+            }
760
+        }
761
+    }
762
+
763
+    // les doublons non nies doivent etre le dernier critere
764
+    // pour que la variable $doublon_index ait la bonne valeur
765
+    // cf critere_doublon
766
+    if ($doublons) {
767
+        $args = [...$args, ...$doublons];
768
+    }
769
+
770
+    // Si erreur, laisser la chaine dans ce champ pour le HTTP 503
771
+    if (!$err_ci) {
772
+        $result->criteres = $args;
773
+    }
774 774
 }
775 775
 
776 776
 function phraser_critere_infixe($arg1, $arg2, $args, $op, $not, $cond) {
777
-	$args[0] = new Texte();
778
-	$args[0]->texte = $arg1;
779
-	$args[0] = [$args[0]];
780
-	$args[1][0] = new Texte();
781
-	$args[1][0]->texte = $arg2;
782
-	$crit = new Critere();
783
-	$crit->op = $op;
784
-	$crit->not = $not;
785
-	$crit->cond = $cond;
786
-	$crit->param = $args;
787
-
788
-	return $crit;
777
+    $args[0] = new Texte();
778
+    $args[0]->texte = $arg1;
779
+    $args[0] = [$args[0]];
780
+    $args[1][0] = new Texte();
781
+    $args[1][0]->texte = $arg2;
782
+    $crit = new Critere();
783
+    $crit->op = $op;
784
+    $crit->not = $not;
785
+    $crit->cond = $cond;
786
+    $crit->param = $args;
787
+
788
+    return $crit;
789 789
 }
790 790
 
791 791
 /**
@@ -796,12 +796,12 @@  discard block
 block discarded – undo
796 796
  * @return int
797 797
  */
798 798
 function public_compte_ligne($texte, $debut = 0, $fin = null) {
799
-	if (is_null($fin)) {
800
-		return substr_count((string) $texte, "\n", $debut);
801
-	}
802
-	else {
803
-		return substr_count((string) $texte, "\n", $debut, $fin - $debut);
804
-	}
799
+    if (is_null($fin)) {
800
+        return substr_count((string) $texte, "\n", $debut);
801
+    }
802
+    else {
803
+        return substr_count((string) $texte, "\n", $debut, $fin - $debut);
804
+    }
805 805
 }
806 806
 
807 807
 
@@ -817,87 +817,87 @@  discard block
 block discarded – undo
817 817
  * @return array|null
818 818
  */
819 819
 function public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte = 0) {
820
-	$premiere_boucle = null;
821
-	$pos_derniere_boucle_anonyme = $pos_debut_texte;
822
-
823
-	$current_pos = $pos_debut_texte;
824
-	while (($pos_boucle = strpos((string) $texte, BALISE_BOUCLE, $current_pos)) !== false) {
825
-		$current_pos = $pos_boucle + 1;
826
-		$pos_parent = strpos((string) $texte, '(', $pos_boucle);
827
-
828
-		$id_boucle = '';
829
-		if ($pos_parent !== false) {
830
-			$id_boucle = trim(substr((string) $texte, $pos_boucle + strlen(BALISE_BOUCLE), $pos_parent - $pos_boucle - strlen(BALISE_BOUCLE)));
831
-		}
832
-		if (
833
-			$pos_parent === false
834
-			|| strlen($id_boucle) && (!is_numeric($id_boucle) && !str_starts_with($id_boucle, '_'))
835
-		) {
836
-			$result = new Boucle();
837
-			$result->id_parent = $id_parent;
838
-			$result->descr = $descr;
839
-
840
-			// un id_boucle pour l'affichage de l'erreur
841
-			if (!strlen($id_boucle)) {
842
-				$id_boucle = substr((string) $texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
843
-			}
844
-			$result->id_boucle = $id_boucle;
845
-			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
846
-			erreur_squelette($err_b, $result);
847
-
848
-			continue;
849
-		}
850
-		else {
851
-			$boucle = [
852
-				'id_boucle' => $id_boucle,
853
-				'id_boucle_err' => $id_boucle,
854
-				'debut_boucle' => $pos_boucle,
855
-				'pos_boucle' => $pos_boucle,
856
-				'pos_parent' => $pos_parent,
857
-				'pos_precond' => false,
858
-				'pos_precond_inside' => false,
859
-				'pos_preaff' => false,
860
-				'pos_preaff_inside' => false,
861
-			];
862
-
863
-			// un id_boucle pour l'affichage de l'erreur sur les boucle anonymes
864
-			if (!strlen($id_boucle)) {
865
-				$boucle['id_boucle_err'] = substr((string) $texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
866
-			}
867
-
868
-			// trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
869
-			$precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
870
-			$pos_precond = strpos((string) $texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
871
-			if (
872
-				$pos_precond !== false
873
-				&& $pos_precond < $boucle['debut_boucle']
874
-			) {
875
-				$boucle['debut_boucle'] = $pos_precond;
876
-				$boucle['pos_precond'] = $pos_precond;
877
-				$boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
878
-			}
879
-
880
-			$preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
881
-			$pos_preaff = strpos((string) $texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
882
-			if (
883
-				$pos_preaff !== false
884
-				&& $pos_preaff < $boucle['debut_boucle']
885
-			) {
886
-				$boucle['debut_boucle'] = $pos_preaff;
887
-				$boucle['pos_preaff'] = $pos_preaff;
888
-				$boucle['pos_preaff_inside'] = $pos_preaff + strlen($preaff_boucle);
889
-			}
890
-			if (!strlen($id_boucle)) {
891
-				$pos_derniere_boucle_anonyme = $pos_boucle;
892
-			}
893
-
894
-			if (is_null($premiere_boucle) || $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
895
-				$premiere_boucle = $boucle;
896
-			}
897
-		}
898
-	}
899
-
900
-	return $premiere_boucle;
820
+    $premiere_boucle = null;
821
+    $pos_derniere_boucle_anonyme = $pos_debut_texte;
822
+
823
+    $current_pos = $pos_debut_texte;
824
+    while (($pos_boucle = strpos((string) $texte, BALISE_BOUCLE, $current_pos)) !== false) {
825
+        $current_pos = $pos_boucle + 1;
826
+        $pos_parent = strpos((string) $texte, '(', $pos_boucle);
827
+
828
+        $id_boucle = '';
829
+        if ($pos_parent !== false) {
830
+            $id_boucle = trim(substr((string) $texte, $pos_boucle + strlen(BALISE_BOUCLE), $pos_parent - $pos_boucle - strlen(BALISE_BOUCLE)));
831
+        }
832
+        if (
833
+            $pos_parent === false
834
+            || strlen($id_boucle) && (!is_numeric($id_boucle) && !str_starts_with($id_boucle, '_'))
835
+        ) {
836
+            $result = new Boucle();
837
+            $result->id_parent = $id_parent;
838
+            $result->descr = $descr;
839
+
840
+            // un id_boucle pour l'affichage de l'erreur
841
+            if (!strlen($id_boucle)) {
842
+                $id_boucle = substr((string) $texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
843
+            }
844
+            $result->id_boucle = $id_boucle;
845
+            $err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
846
+            erreur_squelette($err_b, $result);
847
+
848
+            continue;
849
+        }
850
+        else {
851
+            $boucle = [
852
+                'id_boucle' => $id_boucle,
853
+                'id_boucle_err' => $id_boucle,
854
+                'debut_boucle' => $pos_boucle,
855
+                'pos_boucle' => $pos_boucle,
856
+                'pos_parent' => $pos_parent,
857
+                'pos_precond' => false,
858
+                'pos_precond_inside' => false,
859
+                'pos_preaff' => false,
860
+                'pos_preaff_inside' => false,
861
+            ];
862
+
863
+            // un id_boucle pour l'affichage de l'erreur sur les boucle anonymes
864
+            if (!strlen($id_boucle)) {
865
+                $boucle['id_boucle_err'] = substr((string) $texte, $pos_boucle + strlen(BALISE_BOUCLE), 15);
866
+            }
867
+
868
+            // trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
869
+            $precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
870
+            $pos_precond = strpos((string) $texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
871
+            if (
872
+                $pos_precond !== false
873
+                && $pos_precond < $boucle['debut_boucle']
874
+            ) {
875
+                $boucle['debut_boucle'] = $pos_precond;
876
+                $boucle['pos_precond'] = $pos_precond;
877
+                $boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
878
+            }
879
+
880
+            $preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
881
+            $pos_preaff = strpos((string) $texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
882
+            if (
883
+                $pos_preaff !== false
884
+                && $pos_preaff < $boucle['debut_boucle']
885
+            ) {
886
+                $boucle['debut_boucle'] = $pos_preaff;
887
+                $boucle['pos_preaff'] = $pos_preaff;
888
+                $boucle['pos_preaff_inside'] = $pos_preaff + strlen($preaff_boucle);
889
+            }
890
+            if (!strlen($id_boucle)) {
891
+                $pos_derniere_boucle_anonyme = $pos_boucle;
892
+            }
893
+
894
+            if (is_null($premiere_boucle) || $premiere_boucle['debut_boucle'] > $boucle['debut_boucle']) {
895
+                $premiere_boucle = $boucle;
896
+            }
897
+        }
898
+    }
899
+
900
+    return $premiere_boucle;
901 901
 }
902 902
 
903 903
 /**
@@ -912,68 +912,68 @@  discard block
 block discarded – undo
912 912
  * @return mixed
913 913
  */
914 914
 function public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_debut_texte, $result) {
915
-	$id_boucle = $boucle['id_boucle'];
916
-	$pos_courante = $pos_debut_texte;
917
-
918
-	$boucle['pos_postcond'] = false;
919
-	$boucle['pos_postcond_inside'] = false;
920
-	$boucle['pos_altern'] = false;
921
-	$boucle['pos_altern_inside'] = false;
922
-	$boucle['pos_postaff'] = false;
923
-	$boucle['pos_postaff_inside'] = false;
924
-
925
-	$pos_anonyme_next = null;
926
-	// si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
927
-	if (!strlen((string) $id_boucle)) {
928
-		$pos_anonyme_next = strpos((string) $texte, BALISE_BOUCLE . '(', $pos_courante);
929
-	}
930
-
931
-	//
932
-	// 1. Recuperer la partie conditionnelle apres
933
-	//
934
-	$apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
935
-	$pos_apres = strpos((string) $texte, $apres_boucle, $pos_courante);
936
-	if (
937
-		$pos_apres !== false
938
-		&& (!$pos_anonyme_next || $pos_apres < $pos_anonyme_next)
939
-	) {
940
-		$boucle['pos_postcond'] = $pos_apres;
941
-		$pos_apres += strlen($apres_boucle);
942
-		$boucle['pos_postcond_inside'] = $pos_apres;
943
-		$pos_courante = $pos_apres ;
944
-	}
945
-
946
-	//
947
-	// 2. Récuperer la partie alternative apres
948
-	//
949
-	$altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
950
-	$pos_altern = strpos((string) $texte, $altern_boucle, $pos_courante);
951
-	if (
952
-		$pos_altern !== false
953
-		&& (!$pos_anonyme_next || $pos_altern < $pos_anonyme_next)
954
-	) {
955
-		$boucle['pos_altern'] = $pos_altern;
956
-		$pos_altern += strlen($altern_boucle);
957
-		$boucle['pos_altern_inside'] = $pos_altern;
958
-		$pos_courante = $pos_altern;
959
-	}
960
-
961
-	//
962
-	// 3. Recuperer la partie footer non alternative
963
-	//
964
-	$postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
965
-	$pos_postaff = strpos((string) $texte, $postaff_boucle, $pos_courante);
966
-	if (
967
-		$pos_postaff !== false
968
-		&& (!$pos_anonyme_next || $pos_postaff < $pos_anonyme_next)
969
-	) {
970
-		$boucle['pos_postaff'] = $pos_postaff;
971
-		$pos_postaff += strlen($postaff_boucle);
972
-		$boucle['pos_postaff_inside'] = $pos_postaff;
973
-		$pos_courante = $pos_postaff ;
974
-	}
975
-
976
-	return $boucle;
915
+    $id_boucle = $boucle['id_boucle'];
916
+    $pos_courante = $pos_debut_texte;
917
+
918
+    $boucle['pos_postcond'] = false;
919
+    $boucle['pos_postcond_inside'] = false;
920
+    $boucle['pos_altern'] = false;
921
+    $boucle['pos_altern_inside'] = false;
922
+    $boucle['pos_postaff'] = false;
923
+    $boucle['pos_postaff_inside'] = false;
924
+
925
+    $pos_anonyme_next = null;
926
+    // si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
927
+    if (!strlen((string) $id_boucle)) {
928
+        $pos_anonyme_next = strpos((string) $texte, BALISE_BOUCLE . '(', $pos_courante);
929
+    }
930
+
931
+    //
932
+    // 1. Recuperer la partie conditionnelle apres
933
+    //
934
+    $apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
935
+    $pos_apres = strpos((string) $texte, $apres_boucle, $pos_courante);
936
+    if (
937
+        $pos_apres !== false
938
+        && (!$pos_anonyme_next || $pos_apres < $pos_anonyme_next)
939
+    ) {
940
+        $boucle['pos_postcond'] = $pos_apres;
941
+        $pos_apres += strlen($apres_boucle);
942
+        $boucle['pos_postcond_inside'] = $pos_apres;
943
+        $pos_courante = $pos_apres ;
944
+    }
945
+
946
+    //
947
+    // 2. Récuperer la partie alternative apres
948
+    //
949
+    $altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
950
+    $pos_altern = strpos((string) $texte, $altern_boucle, $pos_courante);
951
+    if (
952
+        $pos_altern !== false
953
+        && (!$pos_anonyme_next || $pos_altern < $pos_anonyme_next)
954
+    ) {
955
+        $boucle['pos_altern'] = $pos_altern;
956
+        $pos_altern += strlen($altern_boucle);
957
+        $boucle['pos_altern_inside'] = $pos_altern;
958
+        $pos_courante = $pos_altern;
959
+    }
960
+
961
+    //
962
+    // 3. Recuperer la partie footer non alternative
963
+    //
964
+    $postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
965
+    $pos_postaff = strpos((string) $texte, $postaff_boucle, $pos_courante);
966
+    if (
967
+        $pos_postaff !== false
968
+        && (!$pos_anonyme_next || $pos_postaff < $pos_anonyme_next)
969
+    ) {
970
+        $boucle['pos_postaff'] = $pos_postaff;
971
+        $pos_postaff += strlen($postaff_boucle);
972
+        $boucle['pos_postaff_inside'] = $pos_postaff;
973
+        $pos_courante = $pos_postaff ;
974
+    }
975
+
976
+    return $boucle;
977 977
 }
978 978
 
979 979
 
@@ -983,21 +983,21 @@  discard block
 block discarded – undo
983 983
  * @param null|object $boucle
984 984
  */
985 985
 function phraser_boucle_placeholder(&$champ, $boucle_placeholder = null, $boucle = null) {
986
-	static $boucles_connues = [];
987
-	// si c'est un appel pour memoriser une boucle, memorisons la
988
-	if (is_string($champ) && !empty($boucle_placeholder) && !empty($boucle)) {
989
-		$boucles_connues[$boucle_placeholder][$champ] = &$boucle;
990
-	}
991
-	else {
992
-		if (!empty($champ->nom_champ) && !empty($boucles_connues[$champ->nom_champ])) {
993
-			$placeholder = $champ->nom_champ;
994
-			$id = reset($champ->param[0][1]);
995
-			$id = $id->texte;
996
-			if (!empty($boucles_connues[$placeholder][$id])) {
997
-				$champ = $boucles_connues[$placeholder][$id];
998
-			}
999
-		}
1000
-	}
986
+    static $boucles_connues = [];
987
+    // si c'est un appel pour memoriser une boucle, memorisons la
988
+    if (is_string($champ) && !empty($boucle_placeholder) && !empty($boucle)) {
989
+        $boucles_connues[$boucle_placeholder][$champ] = &$boucle;
990
+    }
991
+    else {
992
+        if (!empty($champ->nom_champ) && !empty($boucles_connues[$champ->nom_champ])) {
993
+            $placeholder = $champ->nom_champ;
994
+            $id = reset($champ->param[0][1]);
995
+            $id = $id->texte;
996
+            if (!empty($boucles_connues[$placeholder][$id])) {
997
+                $champ = $boucles_connues[$placeholder][$id];
998
+            }
999
+        }
1000
+    }
1001 1001
 }
1002 1002
 
1003 1003
 
@@ -1010,272 +1010,272 @@  discard block
 block discarded – undo
1010 1010
  * @return string
1011 1011
  */
1012 1012
 function public_generer_boucle_placeholder($id_boucle, &$boucle, $boucle_placeholder, $nb_lignes) {
1013
-	$placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1014
-	//memoriser la boucle a reinjecter
1015
-	$id_boucle = "$id_boucle";
1016
-	phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
1017
-	return $placeholder;
1013
+    $placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1014
+    //memoriser la boucle a reinjecter
1015
+    $id_boucle = "$id_boucle";
1016
+    phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
1017
+    return $placeholder;
1018 1018
 }
1019 1019
 
1020 1020
 function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne_debut_texte = 1, $boucle_placeholder = null) {
1021 1021
 
1022
-	$all_res = [];
1023
-	// definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1024
-	if (is_null($boucle_placeholder)) {
1025
-		do {
1026
-			$boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1027
-		} while (str_contains((string) $texte, $boucle_placeholder));
1028
-	}
1029
-
1030
-	$ligne_debut_initial = $ligne_debut_texte;
1031
-	$pos_debut_texte = 0;
1032
-	while ($boucle = public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte)) {
1033
-		$err_b = ''; // indiquera s'il y a eu une erreur
1034
-		$result = new Boucle();
1035
-		$result->id_parent = $id_parent;
1036
-		$result->descr = $descr;
1037
-
1038
-		$pos_courante = $boucle['pos_boucle'];
1039
-		$pos_parent = $boucle['pos_parent'];
1040
-		$id_boucle_search = $id_boucle = $boucle['id_boucle'];
1041
-
1042
-		$ligne_preaff = $ligne_avant = $ligne_milieu = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_parent);
1043
-
1044
-		// boucle anonyme ?
1045
-		if (!strlen((string) $id_boucle)) {
1046
-			$id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle, JSON_THROW_ON_ERROR)), 0, 8);
1047
-		}
1048
-
1049
-		$pos_debut_boucle = $pos_courante;
1050
-
1051
-		$pos_milieu = $pos_parent;
1052
-
1053
-		// Regarder si on a une partie conditionnelle avant <B_xxx>
1054
-		if ($boucle['pos_precond'] !== false) {
1055
-			$pos_debut_boucle = $boucle['pos_precond'];
1056
-
1057
-			$pos_avant = $boucle['pos_precond_inside'];
1058
-			$result->avant = substr((string) $texte, $pos_avant, $pos_courante - $pos_avant);
1059
-			$ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1060
-		}
1061
-
1062
-		// Regarder si on a une partie inconditionnelle avant <BB_xxx>
1063
-		if ($boucle['pos_preaff'] !== false) {
1064
-			$end_preaff = $pos_debut_boucle;
1065
-
1066
-			$pos_preaff = $boucle['pos_preaff_inside'];
1067
-			$result->preaff = substr((string) $texte, $pos_preaff, $end_preaff - $pos_preaff);
1068
-			$ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1069
-		}
1070
-
1071
-		$result->id_boucle = $id_boucle;
1072
-
1073
-		if (
1074
-			!preg_match(SPEC_BOUCLE, (string) $texte, $match, 0, $pos_milieu)
1075
-			|| ($pos_match = strpos((string) $texte, (string) $match[0], $pos_milieu)) === false
1076
-			|| $pos_match > $pos_milieu
1077
-		) {
1078
-			$err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
1079
-			erreur_squelette($err_b, $result);
1080
-
1081
-			$ligne_debut_texte += public_compte_ligne($texte, $pos_debut_texte, $pos_courante + 1);
1082
-			$pos_debut_texte = $pos_courante + 1;
1083
-			continue;
1084
-		}
1085
-
1086
-		$result->type_requete = $match[0];
1087
-		$pos_milieu += strlen($match[0]);
1088
-		$pos_courante = $pos_milieu; // on s'en sert pour compter les lignes plus precisemment
1089
-
1090
-		$type = $match[1];
1091
-		$jointures = trim($match[2]);
1092
-		$table_optionnelle = ($match[3]);
1093
-		if ($jointures) {
1094
-			// on affecte pas ici les jointures explicites, mais dans la compilation
1095
-			// ou elles seront completees des jointures declarees
1096
-			$result->jointures_explicites = $jointures;
1097
-		}
1098
-
1099
-		if ($table_optionnelle) {
1100
-			$result->table_optionnelle = $type;
1101
-		}
1102
-
1103
-		// 1ere passe sur les criteres, vu comme des arguments sans fct
1104
-		// Resultat mis dans result->param
1105
-		$pos_fin_criteres = $pos_milieu;
1106
-		phraser_args($texte, '/>', '', $all_res, $result, $pos_fin_criteres);
1107
-
1108
-		// En 2e passe result->criteres contiendra un tableau
1109
-		// pour l'instant on met le source (chaine) :
1110
-		// si elle reste ici au final, c'est qu'elle contient une erreur
1111
-		$pos_courante = $pos_fin_criteres; // on s'en sert pour compter les lignes plus precisemment
1112
-		$result->criteres = substr((string) $texte, $pos_milieu, $pos_fin_criteres - $pos_milieu);
1113
-		$pos_milieu = $pos_fin_criteres;
1114
-
1115
-		//
1116
-		// Recuperer la fin :
1117
-		//
1118
-		if ($texte[$pos_milieu] === '/') {
1119
-			// boucle autofermante : pas de partie conditionnelle apres
1120
-			$pos_courante += 2;
1121
-			$result->milieu = '';
1122
-		} else {
1123
-			$pos_milieu += 1;
1124
-
1125
-			$fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1126
-			$pos_fin = strpos((string) $texte, $fin_boucle, $pos_milieu);
1127
-			if ($pos_fin === false) {
1128
-				$err_b = [
1129
-					'zbug_erreur_boucle_fermant',
1130
-					['id' => $id_boucle]
1131
-				];
1132
-				erreur_squelette($err_b, $result);
1133
-				$pos_courante += strlen($fin_boucle);
1134
-			}
1135
-			else {
1136
-				// verifier une eventuelle imbrication d'une boucle homonyme
1137
-				// (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1138
-				$search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1139
-				$search_from = $pos_milieu;
1140
-				$nb_open = 1;
1141
-				$nb_close = 1;
1142
-				$maxiter = 0;
1143
-				do {
1144
-					while (
1145
-						$nb_close < $nb_open
1146
-						&& ($p = strpos((string) $texte, $fin_boucle, $pos_fin + 1))
1147
-					) {
1148
-						$nb_close++;
1149
-						$pos_fin = $p;
1150
-					}
1151
-					// si on a pas trouve assez de boucles fermantes, sortir de la, on a fait de notre mieux
1152
-					if ($nb_close < $nb_open) {
1153
-						break;
1154
-					}
1155
-					while (
1156
-						($p = strpos((string) $texte, $search_debut_boucle, $search_from))
1157
-						&& $p < $pos_fin
1158
-					) {
1159
-						$nb_open++;
1160
-						$search_from = $p + 1;
1161
-					}
1162
-				} while ($nb_close < $nb_open && $maxiter++ < 5);
1163
-
1164
-				$pos_courante = $pos_fin + strlen($fin_boucle);
1165
-			}
1166
-			$result->milieu = substr((string) $texte, $pos_milieu, $pos_fin - $pos_milieu);
1167
-		}
1168
-
1169
-		$ligne_suite = $ligne_apres = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_courante);
1170
-		$boucle = public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_courante, $result);
1171
-
1172
-		//
1173
-		// 1. Partie conditionnelle apres ?
1174
-		//
1175
-		if ($boucle['pos_postcond']) {
1176
-			$result->apres = substr((string) $texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1177
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1178
-			$pos_courante = $boucle['pos_postcond_inside'] ;
1179
-		}
1180
-
1181
-
1182
-		//
1183
-		// 2. Partie alternative apres ?
1184
-		//
1185
-		$ligne_altern = $ligne_suite;
1186
-		if ($boucle['pos_altern']) {
1187
-			$result->altern = substr((string) $texte, $pos_courante, $boucle['pos_altern'] - $pos_courante);
1188
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_altern_inside']);
1189
-			$pos_courante = $boucle['pos_altern_inside'];
1190
-		}
1191
-
1192
-		//
1193
-		// 3. Partie footer non alternative ?
1194
-		//
1195
-		$ligne_postaff = $ligne_suite;
1196
-		if ($boucle['pos_postaff']) {
1197
-			$result->postaff = substr((string) $texte, $pos_courante, $boucle['pos_postaff'] - $pos_courante);
1198
-			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postaff_inside']);
1199
-			$pos_courante = $boucle['pos_postaff_inside'];
1200
-		}
1201
-
1202
-		$result->ligne = $ligne_preaff;
1203
-
1204
-		if ($p = strpos($type, ':')) {
1205
-			$result->sql_serveur = substr($type, 0, $p);
1206
-			$type = substr($type, $p + 1);
1207
-		}
1208
-		$soustype = strtolower($type);
1209
-
1210
-		if (!isset($GLOBALS['table_des_tables'][$soustype])) {
1211
-			$soustype = $type;
1212
-		}
1213
-
1214
-		$result->type_requete = $soustype;
1215
-		// Lancer la 2e passe sur les criteres si la 1ere etait bonne
1216
-		if (!is_array($result->param)) {
1217
-			$err_b = true;
1218
-		} else {
1219
-			phraser_criteres($result->param, $result);
1220
-			if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
1221
-				$result->type_requete = TYPE_RECURSIF;
1222
-				$args = $result->param;
1223
-				array_unshift(
1224
-					$args,
1225
-					substr($type, strlen(TYPE_RECURSIF))
1226
-				);
1227
-				$result->param = $args;
1228
-			}
1229
-		}
1230
-
1231
-		$descr['id_mere_contexte'] = $id_boucle;
1232
-		$result->milieu = public_phraser_html_dist($result->milieu, $id_boucle, $boucles, $descr, $ligne_milieu, $boucle_placeholder);
1233
-		// reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
1234
-		// ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
1235
-		// si il y a deja une boucle de ce nom, cela declenchera une erreur ensuite
1236
-		if (empty($boucles[$id_boucle])) {
1237
-			$boucles[$id_boucle] = null;
1238
-		}
1239
-		$result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff, $boucle_placeholder);
1240
-		$result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant, $boucle_placeholder);
1241
-		$result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres, $boucle_placeholder);
1242
-		$result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern, $boucle_placeholder);
1243
-		$result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff, $boucle_placeholder);
1244
-
1245
-		// Prevenir le generateur de code que le squelette est faux
1246
-		if ($err_b) {
1247
-			$result->type_requete = false;
1248
-		}
1249
-
1250
-		// Verifier qu'il n'y a pas double definition
1251
-		// apres analyse des sous-parties (pas avant).
1252
-		if (!empty($boucles[$id_boucle])) {
1253
-			if ($boucles[$id_boucle]->type_requete !== false) {
1254
-				$err_b_d = [
1255
-					'zbug_erreur_boucle_double',
1256
-					['id' => $id_boucle]
1257
-				];
1258
-				erreur_squelette($err_b_d, $result);
1259
-				// Prevenir le generateur de code que le squelette est faux
1260
-				$boucles[$id_boucle]->type_requete = false;
1261
-			}
1262
-		} else {
1263
-			$boucles[$id_boucle] = $result;
1264
-		}
1265
-
1266
-		// remplacer la boucle par un placeholder qui compte le meme nombre de lignes
1267
-		$placeholder = public_generer_boucle_placeholder($id_boucle, $boucles[$id_boucle], $boucle_placeholder, $ligne_suite - $ligne_debut_texte);
1268
-		$longueur_boucle = $pos_courante - $boucle['debut_boucle'];
1269
-		$texte = substr_replace((string) $texte, $placeholder, $boucle['debut_boucle'], $longueur_boucle);
1270
-		$pos_courante = $pos_courante - $longueur_boucle + strlen($placeholder);
1271
-
1272
-		// phraser la partie avant le debut de la boucle
1273
-		#$all_res = phraser_champs_etendus(substr($texte, $pos_debut_texte, $boucle['debut_boucle'] - $pos_debut_texte), $ligne_debut_texte, $all_res);
1274
-		#$all_res[] = &$boucles[$id_boucle];
1275
-
1276
-		$ligne_debut_texte = $ligne_suite;
1277
-		$pos_debut_texte = $pos_courante;
1278
-	}
1279
-
1280
-	return phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
1022
+    $all_res = [];
1023
+    // definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1024
+    if (is_null($boucle_placeholder)) {
1025
+        do {
1026
+            $boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1027
+        } while (str_contains((string) $texte, $boucle_placeholder));
1028
+    }
1029
+
1030
+    $ligne_debut_initial = $ligne_debut_texte;
1031
+    $pos_debut_texte = 0;
1032
+    while ($boucle = public_trouver_premiere_boucle($texte, $id_parent, $descr, $pos_debut_texte)) {
1033
+        $err_b = ''; // indiquera s'il y a eu une erreur
1034
+        $result = new Boucle();
1035
+        $result->id_parent = $id_parent;
1036
+        $result->descr = $descr;
1037
+
1038
+        $pos_courante = $boucle['pos_boucle'];
1039
+        $pos_parent = $boucle['pos_parent'];
1040
+        $id_boucle_search = $id_boucle = $boucle['id_boucle'];
1041
+
1042
+        $ligne_preaff = $ligne_avant = $ligne_milieu = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_parent);
1043
+
1044
+        // boucle anonyme ?
1045
+        if (!strlen((string) $id_boucle)) {
1046
+            $id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle, JSON_THROW_ON_ERROR)), 0, 8);
1047
+        }
1048
+
1049
+        $pos_debut_boucle = $pos_courante;
1050
+
1051
+        $pos_milieu = $pos_parent;
1052
+
1053
+        // Regarder si on a une partie conditionnelle avant <B_xxx>
1054
+        if ($boucle['pos_precond'] !== false) {
1055
+            $pos_debut_boucle = $boucle['pos_precond'];
1056
+
1057
+            $pos_avant = $boucle['pos_precond_inside'];
1058
+            $result->avant = substr((string) $texte, $pos_avant, $pos_courante - $pos_avant);
1059
+            $ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1060
+        }
1061
+
1062
+        // Regarder si on a une partie inconditionnelle avant <BB_xxx>
1063
+        if ($boucle['pos_preaff'] !== false) {
1064
+            $end_preaff = $pos_debut_boucle;
1065
+
1066
+            $pos_preaff = $boucle['pos_preaff_inside'];
1067
+            $result->preaff = substr((string) $texte, $pos_preaff, $end_preaff - $pos_preaff);
1068
+            $ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1069
+        }
1070
+
1071
+        $result->id_boucle = $id_boucle;
1072
+
1073
+        if (
1074
+            !preg_match(SPEC_BOUCLE, (string) $texte, $match, 0, $pos_milieu)
1075
+            || ($pos_match = strpos((string) $texte, (string) $match[0], $pos_milieu)) === false
1076
+            || $pos_match > $pos_milieu
1077
+        ) {
1078
+            $err_b = ['zbug_erreur_boucle_syntaxe', ['id' => $id_boucle]];
1079
+            erreur_squelette($err_b, $result);
1080
+
1081
+            $ligne_debut_texte += public_compte_ligne($texte, $pos_debut_texte, $pos_courante + 1);
1082
+            $pos_debut_texte = $pos_courante + 1;
1083
+            continue;
1084
+        }
1085
+
1086
+        $result->type_requete = $match[0];
1087
+        $pos_milieu += strlen($match[0]);
1088
+        $pos_courante = $pos_milieu; // on s'en sert pour compter les lignes plus precisemment
1089
+
1090
+        $type = $match[1];
1091
+        $jointures = trim($match[2]);
1092
+        $table_optionnelle = ($match[3]);
1093
+        if ($jointures) {
1094
+            // on affecte pas ici les jointures explicites, mais dans la compilation
1095
+            // ou elles seront completees des jointures declarees
1096
+            $result->jointures_explicites = $jointures;
1097
+        }
1098
+
1099
+        if ($table_optionnelle) {
1100
+            $result->table_optionnelle = $type;
1101
+        }
1102
+
1103
+        // 1ere passe sur les criteres, vu comme des arguments sans fct
1104
+        // Resultat mis dans result->param
1105
+        $pos_fin_criteres = $pos_milieu;
1106
+        phraser_args($texte, '/>', '', $all_res, $result, $pos_fin_criteres);
1107
+
1108
+        // En 2e passe result->criteres contiendra un tableau
1109
+        // pour l'instant on met le source (chaine) :
1110
+        // si elle reste ici au final, c'est qu'elle contient une erreur
1111
+        $pos_courante = $pos_fin_criteres; // on s'en sert pour compter les lignes plus precisemment
1112
+        $result->criteres = substr((string) $texte, $pos_milieu, $pos_fin_criteres - $pos_milieu);
1113
+        $pos_milieu = $pos_fin_criteres;
1114
+
1115
+        //
1116
+        // Recuperer la fin :
1117
+        //
1118
+        if ($texte[$pos_milieu] === '/') {
1119
+            // boucle autofermante : pas de partie conditionnelle apres
1120
+            $pos_courante += 2;
1121
+            $result->milieu = '';
1122
+        } else {
1123
+            $pos_milieu += 1;
1124
+
1125
+            $fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1126
+            $pos_fin = strpos((string) $texte, $fin_boucle, $pos_milieu);
1127
+            if ($pos_fin === false) {
1128
+                $err_b = [
1129
+                    'zbug_erreur_boucle_fermant',
1130
+                    ['id' => $id_boucle]
1131
+                ];
1132
+                erreur_squelette($err_b, $result);
1133
+                $pos_courante += strlen($fin_boucle);
1134
+            }
1135
+            else {
1136
+                // verifier une eventuelle imbrication d'une boucle homonyme
1137
+                // (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1138
+                $search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1139
+                $search_from = $pos_milieu;
1140
+                $nb_open = 1;
1141
+                $nb_close = 1;
1142
+                $maxiter = 0;
1143
+                do {
1144
+                    while (
1145
+                        $nb_close < $nb_open
1146
+                        && ($p = strpos((string) $texte, $fin_boucle, $pos_fin + 1))
1147
+                    ) {
1148
+                        $nb_close++;
1149
+                        $pos_fin = $p;
1150
+                    }
1151
+                    // si on a pas trouve assez de boucles fermantes, sortir de la, on a fait de notre mieux
1152
+                    if ($nb_close < $nb_open) {
1153
+                        break;
1154
+                    }
1155
+                    while (
1156
+                        ($p = strpos((string) $texte, $search_debut_boucle, $search_from))
1157
+                        && $p < $pos_fin
1158
+                    ) {
1159
+                        $nb_open++;
1160
+                        $search_from = $p + 1;
1161
+                    }
1162
+                } while ($nb_close < $nb_open && $maxiter++ < 5);
1163
+
1164
+                $pos_courante = $pos_fin + strlen($fin_boucle);
1165
+            }
1166
+            $result->milieu = substr((string) $texte, $pos_milieu, $pos_fin - $pos_milieu);
1167
+        }
1168
+
1169
+        $ligne_suite = $ligne_apres = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_courante);
1170
+        $boucle = public_trouver_fin_boucle($texte, $id_parent, $boucle, $pos_courante, $result);
1171
+
1172
+        //
1173
+        // 1. Partie conditionnelle apres ?
1174
+        //
1175
+        if ($boucle['pos_postcond']) {
1176
+            $result->apres = substr((string) $texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1177
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1178
+            $pos_courante = $boucle['pos_postcond_inside'] ;
1179
+        }
1180
+
1181
+
1182
+        //
1183
+        // 2. Partie alternative apres ?
1184
+        //
1185
+        $ligne_altern = $ligne_suite;
1186
+        if ($boucle['pos_altern']) {
1187
+            $result->altern = substr((string) $texte, $pos_courante, $boucle['pos_altern'] - $pos_courante);
1188
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_altern_inside']);
1189
+            $pos_courante = $boucle['pos_altern_inside'];
1190
+        }
1191
+
1192
+        //
1193
+        // 3. Partie footer non alternative ?
1194
+        //
1195
+        $ligne_postaff = $ligne_suite;
1196
+        if ($boucle['pos_postaff']) {
1197
+            $result->postaff = substr((string) $texte, $pos_courante, $boucle['pos_postaff'] - $pos_courante);
1198
+            $ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postaff_inside']);
1199
+            $pos_courante = $boucle['pos_postaff_inside'];
1200
+        }
1201
+
1202
+        $result->ligne = $ligne_preaff;
1203
+
1204
+        if ($p = strpos($type, ':')) {
1205
+            $result->sql_serveur = substr($type, 0, $p);
1206
+            $type = substr($type, $p + 1);
1207
+        }
1208
+        $soustype = strtolower($type);
1209
+
1210
+        if (!isset($GLOBALS['table_des_tables'][$soustype])) {
1211
+            $soustype = $type;
1212
+        }
1213
+
1214
+        $result->type_requete = $soustype;
1215
+        // Lancer la 2e passe sur les criteres si la 1ere etait bonne
1216
+        if (!is_array($result->param)) {
1217
+            $err_b = true;
1218
+        } else {
1219
+            phraser_criteres($result->param, $result);
1220
+            if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
1221
+                $result->type_requete = TYPE_RECURSIF;
1222
+                $args = $result->param;
1223
+                array_unshift(
1224
+                    $args,
1225
+                    substr($type, strlen(TYPE_RECURSIF))
1226
+                );
1227
+                $result->param = $args;
1228
+            }
1229
+        }
1230
+
1231
+        $descr['id_mere_contexte'] = $id_boucle;
1232
+        $result->milieu = public_phraser_html_dist($result->milieu, $id_boucle, $boucles, $descr, $ligne_milieu, $boucle_placeholder);
1233
+        // reserver la place dans la pile des boucles pour compiler ensuite dans le bon ordre
1234
+        // ie les boucles qui apparaissent dans les partie conditionnelles doivent etre compilees apres cette boucle
1235
+        // si il y a deja une boucle de ce nom, cela declenchera une erreur ensuite
1236
+        if (empty($boucles[$id_boucle])) {
1237
+            $boucles[$id_boucle] = null;
1238
+        }
1239
+        $result->preaff = public_phraser_html_dist($result->preaff, $id_parent, $boucles, $descr, $ligne_preaff, $boucle_placeholder);
1240
+        $result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $ligne_avant, $boucle_placeholder);
1241
+        $result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $ligne_apres, $boucle_placeholder);
1242
+        $result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $ligne_altern, $boucle_placeholder);
1243
+        $result->postaff = public_phraser_html_dist($result->postaff, $id_parent, $boucles, $descr, $ligne_postaff, $boucle_placeholder);
1244
+
1245
+        // Prevenir le generateur de code que le squelette est faux
1246
+        if ($err_b) {
1247
+            $result->type_requete = false;
1248
+        }
1249
+
1250
+        // Verifier qu'il n'y a pas double definition
1251
+        // apres analyse des sous-parties (pas avant).
1252
+        if (!empty($boucles[$id_boucle])) {
1253
+            if ($boucles[$id_boucle]->type_requete !== false) {
1254
+                $err_b_d = [
1255
+                    'zbug_erreur_boucle_double',
1256
+                    ['id' => $id_boucle]
1257
+                ];
1258
+                erreur_squelette($err_b_d, $result);
1259
+                // Prevenir le generateur de code que le squelette est faux
1260
+                $boucles[$id_boucle]->type_requete = false;
1261
+            }
1262
+        } else {
1263
+            $boucles[$id_boucle] = $result;
1264
+        }
1265
+
1266
+        // remplacer la boucle par un placeholder qui compte le meme nombre de lignes
1267
+        $placeholder = public_generer_boucle_placeholder($id_boucle, $boucles[$id_boucle], $boucle_placeholder, $ligne_suite - $ligne_debut_texte);
1268
+        $longueur_boucle = $pos_courante - $boucle['debut_boucle'];
1269
+        $texte = substr_replace((string) $texte, $placeholder, $boucle['debut_boucle'], $longueur_boucle);
1270
+        $pos_courante = $pos_courante - $longueur_boucle + strlen($placeholder);
1271
+
1272
+        // phraser la partie avant le debut de la boucle
1273
+        #$all_res = phraser_champs_etendus(substr($texte, $pos_debut_texte, $boucle['debut_boucle'] - $pos_debut_texte), $ligne_debut_texte, $all_res);
1274
+        #$all_res[] = &$boucles[$id_boucle];
1275
+
1276
+        $ligne_debut_texte = $ligne_suite;
1277
+        $pos_debut_texte = $pos_courante;
1278
+    }
1279
+
1280
+    return phraser_champs_etendus($texte, $ligne_debut_initial, $all_res);
1281 1281
 }
Please login to merge, or discard this patch.
Spacing   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -55,19 +55,19 @@  discard block
 block discarded – undo
55 55
  * Nom d'une balise #TOTO
56 56
  *
57 57
  * Écriture alambiquée pour rester compatible avec les hexadecimaux des vieux squelettes */
58
-define('NOM_DE_CHAMP', '#((' . NOM_DE_BOUCLE . "):)?(([A-F]*[G-Z_][A-Z_0-9]*)|[A-Z_]+)\b(\*{0,2})");
58
+define('NOM_DE_CHAMP', '#(('.NOM_DE_BOUCLE."):)?(([A-F]*[G-Z_][A-Z_0-9]*)|[A-Z_]+)\b(\*{0,2})");
59 59
 /** Balise complète [...(#TOTO) ... ] */
60
-define('CHAMP_ETENDU', '/\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^[)]*\)[^]\[]*)\]/S');
60
+define('CHAMP_ETENDU', '/\[([^]\[]*)\('.NOM_DE_CHAMP.'([^[)]*\)[^]\[]*)\]/S');
61 61
 
62 62
 define('BALISE_INCLURE', '/<INCLU[DR]E[[:space:]]*(\(([^)]*)\))?/S');
63 63
 define('BALISE_POLYGLOTTE', ',<multi>(.*)</multi>,Uims');
64 64
 define('BALISE_IDIOMES', ',<:(([a-z0-9_]+):)?([a-z0-9_]*)({([^\|=>]*=[^\|>]*)})?((\|[^>]*)?:/?>),iS');
65
-define('BALISE_IDIOMES_ARGS', '@^\s*([^= ]*)\s*=\s*((' . NOM_DE_CHAMP . '[{][^}]*})?[^,]*)\s*,?\s*@s');
65
+define('BALISE_IDIOMES_ARGS', '@^\s*([^= ]*)\s*=\s*(('.NOM_DE_CHAMP.'[{][^}]*})?[^,]*)\s*,?\s*@s');
66 66
 
67 67
 /** Champ sql dans parenthèse ex: (id_article) */
68 68
 define('SQL_ARGS', '(\([^)]*\))');
69 69
 /** Fonction SQL sur un champ ex: SUM(visites) */
70
-define('CHAMP_SQL_PLUS_FONC', '`?([A-Z_\/][A-Z_\/0-9.]*)' . SQL_ARGS . '?`?');
70
+define('CHAMP_SQL_PLUS_FONC', '`?([A-Z_\/][A-Z_\/0-9.]*)'.SQL_ARGS.'?`?');
71 71
 
72 72
 function phraser_inclure($texte, $ligne, $result) {
73 73
 
@@ -222,7 +222,7 @@  discard block
 block discarded – undo
222 222
  * @return array
223 223
  **/
224 224
 function phraser_champs($texte, $ligne, $result) {
225
-	while (preg_match('/' . NOM_DE_CHAMP . '/S', $texte, $match)) {
225
+	while (preg_match('/'.NOM_DE_CHAMP.'/S', $texte, $match)) {
226 226
 		$p = strpos($texte, (string) $match[0]);
227 227
 		// texte après la balise
228 228
 		$suite = substr($texte, $p + strlen($match[0]));
@@ -369,7 +369,7 @@  discard block
 block discarded – undo
369 369
 			$collecte[] = $champ;
370 370
 			$args = ltrim($regs[count($regs) - 1]);
371 371
 		} else {
372
-			if (!preg_match('/' . NOM_DE_CHAMP . '([{|])/', $arg, $r)) {
372
+			if (!preg_match('/'.NOM_DE_CHAMP.'([{|])/', $arg, $r)) {
373 373
 				// 0 est un aveu d'impuissance. A completer
374 374
 				$arg = phraser_champs_exterieurs($arg, 0, $sep, $result);
375 375
 
@@ -453,7 +453,7 @@  discard block
 block discarded – undo
453 453
 function phraser_champs_exterieurs($texte, $ligne, $sep, $nested) {
454 454
 	$res = [];
455 455
 	while (($p = strpos((string) $texte, (string) "%$sep")) !== false) {
456
-		if (!preg_match(',^%' . preg_quote((string) $sep, ',') . '([0-9]+)@,', substr((string) $texte, $p), $m)) {
456
+		if (!preg_match(',^%'.preg_quote((string) $sep, ',').'([0-9]+)@,', substr((string) $texte, $p), $m)) {
457 457
 			break;
458 458
 		}
459 459
 		$debut = substr((string) $texte, 0, $p);
@@ -493,7 +493,7 @@  discard block
 block discarded – undo
493 493
 			$pos_apres = 0;
494 494
 			$result = phraser_args($match[7], ')', $sep, $result, $champ, $pos_apres);
495 495
 			phraser_vieux($champ);
496
-			$champ->avant =	phraser_champs_exterieurs($match[1], $n, $sep, $result);
496
+			$champ->avant = phraser_champs_exterieurs($match[1], $n, $sep, $result);
497 497
 			$debut = substr($match[7], $pos_apres + 1);
498 498
 			if (!empty($debut)) {
499 499
 				$n += substr_count(substr((string) $texte, 0, strpos((string) $texte, $debut)), "\n");
@@ -623,7 +623,7 @@  discard block
 block discarded – undo
623 623
 					// une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
624 624
 					if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
625 625
 						$c = null;
626
-						eval('$c = ' . $m[4] . ';');
626
+						eval('$c = '.$m[4].';');
627 627
 						if (isset($c)) {
628 628
 							$m[4] = $c;
629 629
 						}
@@ -703,7 +703,7 @@  discard block
 block discarded – undo
703 703
 					if (preg_match(',^ *([0-9-]+) *(/) *(.+) *$,', (string) $param, $m)) {
704 704
 						$crit = phraser_critere_infixe($m[1], $m[3], $v, '/', '', '');
705 705
 					} elseif (
706
-						preg_match(',^([!]?)(' . CHAMP_SQL_PLUS_FONC .
706
+						preg_match(',^([!]?)('.CHAMP_SQL_PLUS_FONC.
707 707
 						')[[:space:]]*(\??)(!?)(<=?|>=?|==?|\b(?:IN|LIKE)\b)(.*)$,is', (string) $param, $m)
708 708
 					) {
709 709
 						$a2 = trim($m[8]);
@@ -720,8 +720,8 @@  discard block
 block discarded – undo
720 720
 						);
721 721
 						$crit->exclus = $m[1];
722 722
 					} elseif (
723
-						preg_match('/^([!]?)\s*(' .
724
-						CHAMP_SQL_PLUS_FONC .
723
+						preg_match('/^([!]?)\s*('.
724
+						CHAMP_SQL_PLUS_FONC.
725 725
 						')\s*(\??)(.*)$/is', (string) $param, $m)
726 726
 					) {
727 727
 						// contient aussi les comparaisons implicites !
@@ -866,7 +866,7 @@  discard block
 block discarded – undo
866 866
 			}
867 867
 
868 868
 			// trouver sa position de depart reelle : au <Bxx> ou au <BBxx>
869
-			$precond_boucle = BALISE_PRECOND_BOUCLE . $id_boucle . '>';
869
+			$precond_boucle = BALISE_PRECOND_BOUCLE.$id_boucle.'>';
870 870
 			$pos_precond = strpos((string) $texte, $precond_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
871 871
 			if (
872 872
 				$pos_precond !== false
@@ -877,7 +877,7 @@  discard block
 block discarded – undo
877 877
 				$boucle['pos_precond_inside'] = $pos_precond + strlen($precond_boucle);
878 878
 			}
879 879
 
880
-			$preaff_boucle = BALISE_PREAFF_BOUCLE . $id_boucle . '>';
880
+			$preaff_boucle = BALISE_PREAFF_BOUCLE.$id_boucle.'>';
881 881
 			$pos_preaff = strpos((string) $texte, $preaff_boucle, $id_boucle ? $pos_debut_texte : $pos_derniere_boucle_anonyme);
882 882
 			if (
883 883
 				$pos_preaff !== false
@@ -925,13 +925,13 @@  discard block
 block discarded – undo
925 925
 	$pos_anonyme_next = null;
926 926
 	// si c'est une boucle anonyme, chercher la position de la prochaine boucle anonyme
927 927
 	if (!strlen((string) $id_boucle)) {
928
-		$pos_anonyme_next = strpos((string) $texte, BALISE_BOUCLE . '(', $pos_courante);
928
+		$pos_anonyme_next = strpos((string) $texte, BALISE_BOUCLE.'(', $pos_courante);
929 929
 	}
930 930
 
931 931
 	//
932 932
 	// 1. Recuperer la partie conditionnelle apres
933 933
 	//
934
-	$apres_boucle = BALISE_POSTCOND_BOUCLE . $id_boucle . '>';
934
+	$apres_boucle = BALISE_POSTCOND_BOUCLE.$id_boucle.'>';
935 935
 	$pos_apres = strpos((string) $texte, $apres_boucle, $pos_courante);
936 936
 	if (
937 937
 		$pos_apres !== false
@@ -940,13 +940,13 @@  discard block
 block discarded – undo
940 940
 		$boucle['pos_postcond'] = $pos_apres;
941 941
 		$pos_apres += strlen($apres_boucle);
942 942
 		$boucle['pos_postcond_inside'] = $pos_apres;
943
-		$pos_courante = $pos_apres ;
943
+		$pos_courante = $pos_apres;
944 944
 	}
945 945
 
946 946
 	//
947 947
 	// 2. Récuperer la partie alternative apres
948 948
 	//
949
-	$altern_boucle = BALISE_ALT_BOUCLE . $id_boucle . '>';
949
+	$altern_boucle = BALISE_ALT_BOUCLE.$id_boucle.'>';
950 950
 	$pos_altern = strpos((string) $texte, $altern_boucle, $pos_courante);
951 951
 	if (
952 952
 		$pos_altern !== false
@@ -961,7 +961,7 @@  discard block
 block discarded – undo
961 961
 	//
962 962
 	// 3. Recuperer la partie footer non alternative
963 963
 	//
964
-	$postaff_boucle = BALISE_POSTAFF_BOUCLE . $id_boucle . '>';
964
+	$postaff_boucle = BALISE_POSTAFF_BOUCLE.$id_boucle.'>';
965 965
 	$pos_postaff = strpos((string) $texte, $postaff_boucle, $pos_courante);
966 966
 	if (
967 967
 		$pos_postaff !== false
@@ -970,7 +970,7 @@  discard block
 block discarded – undo
970 970
 		$boucle['pos_postaff'] = $pos_postaff;
971 971
 		$pos_postaff += strlen($postaff_boucle);
972 972
 		$boucle['pos_postaff_inside'] = $pos_postaff;
973
-		$pos_courante = $pos_postaff ;
973
+		$pos_courante = $pos_postaff;
974 974
 	}
975 975
 
976 976
 	return $boucle;
@@ -1010,7 +1010,7 @@  discard block
 block discarded – undo
1010 1010
  * @return string
1011 1011
  */
1012 1012
 function public_generer_boucle_placeholder($id_boucle, &$boucle, $boucle_placeholder, $nb_lignes) {
1013
-	$placeholder = "[(#{$boucle_placeholder}{" . $id_boucle . '})' . str_pad('', $nb_lignes, "\n") . ']';
1013
+	$placeholder = "[(#{$boucle_placeholder}{".$id_boucle.'})'.str_pad('', $nb_lignes, "\n").']';
1014 1014
 	//memoriser la boucle a reinjecter
1015 1015
 	$id_boucle = "$id_boucle";
1016 1016
 	phraser_boucle_placeholder($id_boucle, $boucle_placeholder, $boucle);
@@ -1023,7 +1023,7 @@  discard block
 block discarded – undo
1023 1023
 	// definir un placholder pour les boucles dont on est sur d'avoir aucune occurence dans le squelette
1024 1024
 	if (is_null($boucle_placeholder)) {
1025 1025
 		do {
1026
-			$boucle_placeholder = 'BOUCLE_PLACEHOLDER_' . strtoupper(md5(uniqid()));
1026
+			$boucle_placeholder = 'BOUCLE_PLACEHOLDER_'.strtoupper(md5(uniqid()));
1027 1027
 		} while (str_contains((string) $texte, $boucle_placeholder));
1028 1028
 	}
1029 1029
 
@@ -1043,7 +1043,7 @@  discard block
 block discarded – undo
1043 1043
 
1044 1044
 		// boucle anonyme ?
1045 1045
 		if (!strlen((string) $id_boucle)) {
1046
-			$id_boucle = '_anon_L' . $ligne_milieu . '_' . substr(md5('anonyme:' . $id_parent . ':' . json_encode($boucle, JSON_THROW_ON_ERROR)), 0, 8);
1046
+			$id_boucle = '_anon_L'.$ligne_milieu.'_'.substr(md5('anonyme:'.$id_parent.':'.json_encode($boucle, JSON_THROW_ON_ERROR)), 0, 8);
1047 1047
 		}
1048 1048
 
1049 1049
 		$pos_debut_boucle = $pos_courante;
@@ -1056,7 +1056,7 @@  discard block
 block discarded – undo
1056 1056
 
1057 1057
 			$pos_avant = $boucle['pos_precond_inside'];
1058 1058
 			$result->avant = substr((string) $texte, $pos_avant, $pos_courante - $pos_avant);
1059
-			$ligne_avant = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1059
+			$ligne_avant = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_avant);
1060 1060
 		}
1061 1061
 
1062 1062
 		// Regarder si on a une partie inconditionnelle avant <BB_xxx>
@@ -1065,7 +1065,7 @@  discard block
 block discarded – undo
1065 1065
 
1066 1066
 			$pos_preaff = $boucle['pos_preaff_inside'];
1067 1067
 			$result->preaff = substr((string) $texte, $pos_preaff, $end_preaff - $pos_preaff);
1068
-			$ligne_preaff = $ligne_debut_texte +  public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1068
+			$ligne_preaff = $ligne_debut_texte + public_compte_ligne($texte, $pos_debut_texte, $pos_preaff);
1069 1069
 		}
1070 1070
 
1071 1071
 		$result->id_boucle = $id_boucle;
@@ -1122,7 +1122,7 @@  discard block
 block discarded – undo
1122 1122
 		} else {
1123 1123
 			$pos_milieu += 1;
1124 1124
 
1125
-			$fin_boucle = BALISE_FIN_BOUCLE . $id_boucle_search . '>';
1125
+			$fin_boucle = BALISE_FIN_BOUCLE.$id_boucle_search.'>';
1126 1126
 			$pos_fin = strpos((string) $texte, $fin_boucle, $pos_milieu);
1127 1127
 			if ($pos_fin === false) {
1128 1128
 				$err_b = [
@@ -1135,7 +1135,7 @@  discard block
 block discarded – undo
1135 1135
 			else {
1136 1136
 				// verifier une eventuelle imbrication d'une boucle homonyme
1137 1137
 				// (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1138
-				$search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
1138
+				$search_debut_boucle = BALISE_BOUCLE.$id_boucle_search.'(';
1139 1139
 				$search_from = $pos_milieu;
1140 1140
 				$nb_open = 1;
1141 1141
 				$nb_close = 1;
@@ -1175,7 +1175,7 @@  discard block
 block discarded – undo
1175 1175
 		if ($boucle['pos_postcond']) {
1176 1176
 			$result->apres = substr((string) $texte, $pos_courante, $boucle['pos_postcond'] - $pos_courante);
1177 1177
 			$ligne_suite += public_compte_ligne($texte, $pos_courante, $boucle['pos_postcond_inside']);
1178
-			$pos_courante = $boucle['pos_postcond_inside'] ;
1178
+			$pos_courante = $boucle['pos_postcond_inside'];
1179 1179
 		}
1180 1180
 
1181 1181
 
Please login to merge, or discard this patch.
Braces   +4 added lines, -8 removed lines patch added patch discarded remove patch
@@ -798,8 +798,7 @@  discard block
 block discarded – undo
798 798
 function public_compte_ligne($texte, $debut = 0, $fin = null) {
799 799
 	if (is_null($fin)) {
800 800
 		return substr_count((string) $texte, "\n", $debut);
801
-	}
802
-	else {
801
+	} else {
803 802
 		return substr_count((string) $texte, "\n", $debut, $fin - $debut);
804 803
 	}
805 804
 }
@@ -846,8 +845,7 @@  discard block
 block discarded – undo
846 845
 			erreur_squelette($err_b, $result);
847 846
 
848 847
 			continue;
849
-		}
850
-		else {
848
+		} else {
851 849
 			$boucle = [
852 850
 				'id_boucle' => $id_boucle,
853 851
 				'id_boucle_err' => $id_boucle,
@@ -987,8 +985,7 @@  discard block
 block discarded – undo
987 985
 	// si c'est un appel pour memoriser une boucle, memorisons la
988 986
 	if (is_string($champ) && !empty($boucle_placeholder) && !empty($boucle)) {
989 987
 		$boucles_connues[$boucle_placeholder][$champ] = &$boucle;
990
-	}
991
-	else {
988
+	} else {
992 989
 		if (!empty($champ->nom_champ) && !empty($boucles_connues[$champ->nom_champ])) {
993 990
 			$placeholder = $champ->nom_champ;
994 991
 			$id = reset($champ->param[0][1]);
@@ -1131,8 +1128,7 @@  discard block
 block discarded – undo
1131 1128
 				];
1132 1129
 				erreur_squelette($err_b, $result);
1133 1130
 				$pos_courante += strlen($fin_boucle);
1134
-			}
1135
-			else {
1131
+			} else {
1136 1132
 				// verifier une eventuelle imbrication d'une boucle homonyme
1137 1133
 				// (interdite, generera une erreur plus loin, mais permet de signaler la bonne erreur)
1138 1134
 				$search_debut_boucle = BALISE_BOUCLE . $id_boucle_search . '(';
Please login to merge, or discard this patch.
ecrire/public/criteres.php 3 patches
Indentation   +1696 added lines, -1696 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 /**
@@ -46,12 +46,12 @@  discard block
 block discarded – undo
46 46
  **/
47 47
 function critere_racine_dist($idb, &$boucles, $crit) {
48 48
 
49
-	$not = $crit->not;
50
-	$boucle = &$boucles[$idb];
51
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
49
+    $not = $crit->not;
50
+    $boucle = &$boucles[$idb];
51
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
52 52
 
53
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
54
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
53
+    $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
54
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
55 55
 }
56 56
 
57 57
 
@@ -68,15 +68,15 @@  discard block
 block discarded – undo
68 68
  * @return void|array
69 69
  **/
70 70
 function critere_exclus_dist($idb, &$boucles, $crit) {
71
-	$not = $crit->not;
72
-	$boucle = &$boucles[$idb];
73
-	$id = $boucle->primary;
74
-
75
-	if ($not || !$id) {
76
-		return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
77
-	}
78
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
79
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
71
+    $not = $crit->not;
72
+    $boucle = &$boucles[$idb];
73
+    $id = $boucle->primary;
74
+
75
+    if ($not || !$id) {
76
+        return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
77
+    }
78
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
79
+    $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
80 80
 }
81 81
 
82 82
 
@@ -96,73 +96,73 @@  discard block
 block discarded – undo
96 96
  * @return void|array
97 97
  **/
98 98
 function critere_doublons_dist($idb, &$boucles, $crit) {
99
-	$boucle = &$boucles[$idb];
100
-	$primary = $boucle->primary;
101
-
102
-	// la table nécessite une clé primaire, non composée
103
-	if (!$primary || strpos((string) $primary, ',')) {
104
-		return ['zbug_doublon_sur_table_sans_cle_primaire'];
105
-	}
106
-
107
-	$not = ($crit->not ? '' : 'NOT');
108
-
109
-	// le doublon s'applique sur un type de boucle (article)
110
-	$nom = "'" . $boucle->type_requete . "'";
111
-
112
-	// compléter le nom avec un nom précisé {doublons nom}
113
-	// on obtient $nom = "'article' . 'nom'"
114
-	if (isset($crit->param[0])) {
115
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
116
-	}
117
-
118
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
119
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
120
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
121
-
122
-	// on crée un sql_in avec la clé primaire de la table
123
-	// et la collection des doublons déjà emmagasinés dans le tableau
124
-	// $doublons et son index, ici $nom
125
-
126
-	// debut du code "sql_in('articles.id_article', "
127
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
128
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
129
-	// Attention : boucle->doublons désigne une variable qu'on affecte
130
-	$debut_doub = '$doublons[' . ($not ? $boucle->doublons . '[]= ' : (''));
131
-
132
-	// le debut complet du code des doublons
133
-	$debut_doub = $debut_in . $debut_doub;
134
-
135
-	// nom du doublon "('article' . 'nom')]"
136
-	$fin_doub = "($nom)]";
137
-
138
-	// si on trouve un autre critère doublon,
139
-	// on fusionne pour avoir un seul IN, et on s'en va !
140
-	foreach ($boucle->where as $k => $w) {
141
-		if (str_starts_with((string) $w[0], $debut_doub)) {
142
-			// fusionner le sql_in (du where)
143
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr((string) $w[0], strlen($debut_in));
144
-			// fusionner l'initialisation (du hash) pour faire plus joli
145
-			$x = strpos((string) $boucle->hash, $init_comment);
146
-			$len = strlen($init_comment);
147
-			$boucle->hash =
148
-				substr((string) $boucle->hash, 0, $x + $len) . $init_code . substr((string) $boucle->hash, $x + $len);
149
-
150
-			return;
151
-		}
152
-	}
153
-
154
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
155
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
156
-
157
-	// déclarer le doublon s'il n'existe pas encore
158
-	$boucle->hash .= $init_comment . $init_code;
159
-
160
-
161
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
162
-	# mais elle fait planter une boucle a 2 critere doublons:
163
-	# {!doublons A}{doublons B}
164
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
165
-	#	if ($crit->not) $boucle->doublons = "";
99
+    $boucle = &$boucles[$idb];
100
+    $primary = $boucle->primary;
101
+
102
+    // la table nécessite une clé primaire, non composée
103
+    if (!$primary || strpos((string) $primary, ',')) {
104
+        return ['zbug_doublon_sur_table_sans_cle_primaire'];
105
+    }
106
+
107
+    $not = ($crit->not ? '' : 'NOT');
108
+
109
+    // le doublon s'applique sur un type de boucle (article)
110
+    $nom = "'" . $boucle->type_requete . "'";
111
+
112
+    // compléter le nom avec un nom précisé {doublons nom}
113
+    // on obtient $nom = "'article' . 'nom'"
114
+    if (isset($crit->param[0])) {
115
+        $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
116
+    }
117
+
118
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
119
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
120
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
121
+
122
+    // on crée un sql_in avec la clé primaire de la table
123
+    // et la collection des doublons déjà emmagasinés dans le tableau
124
+    // $doublons et son index, ici $nom
125
+
126
+    // debut du code "sql_in('articles.id_article', "
127
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
128
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
129
+    // Attention : boucle->doublons désigne une variable qu'on affecte
130
+    $debut_doub = '$doublons[' . ($not ? $boucle->doublons . '[]= ' : (''));
131
+
132
+    // le debut complet du code des doublons
133
+    $debut_doub = $debut_in . $debut_doub;
134
+
135
+    // nom du doublon "('article' . 'nom')]"
136
+    $fin_doub = "($nom)]";
137
+
138
+    // si on trouve un autre critère doublon,
139
+    // on fusionne pour avoir un seul IN, et on s'en va !
140
+    foreach ($boucle->where as $k => $w) {
141
+        if (str_starts_with((string) $w[0], $debut_doub)) {
142
+            // fusionner le sql_in (du where)
143
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr((string) $w[0], strlen($debut_in));
144
+            // fusionner l'initialisation (du hash) pour faire plus joli
145
+            $x = strpos((string) $boucle->hash, $init_comment);
146
+            $len = strlen($init_comment);
147
+            $boucle->hash =
148
+                substr((string) $boucle->hash, 0, $x + $len) . $init_code . substr((string) $boucle->hash, $x + $len);
149
+
150
+            return;
151
+        }
152
+    }
153
+
154
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
155
+    $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
156
+
157
+    // déclarer le doublon s'il n'existe pas encore
158
+    $boucle->hash .= $init_comment . $init_code;
159
+
160
+
161
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
162
+    # mais elle fait planter une boucle a 2 critere doublons:
163
+    # {!doublons A}{doublons B}
164
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
165
+    #	if ($crit->not) $boucle->doublons = "";
166 166
 }
167 167
 
168 168
 
@@ -183,14 +183,14 @@  discard block
 block discarded – undo
183 183
  * @return void
184 184
  **/
185 185
 function critere_lang_select_dist($idb, &$boucles, $crit) {
186
-	if (!isset($crit->param[1][0]) || !($param = $crit->param[1][0]->texte)) {
187
-		$param = 'oui';
188
-	}
189
-	if ($crit->not) {
190
-		$param = ($param == 'oui') ? 'non' : 'oui';
191
-	}
192
-	$boucle = &$boucles[$idb];
193
-	$boucle->lang_select = $param;
186
+    if (!isset($crit->param[1][0]) || !($param = $crit->param[1][0]->texte)) {
187
+        $param = 'oui';
188
+    }
189
+    if ($crit->not) {
190
+        $param = ($param == 'oui') ? 'non' : 'oui';
191
+    }
192
+    $boucle = &$boucles[$idb];
193
+    $boucle->lang_select = $param;
194 194
 }
195 195
 
196 196
 
@@ -212,15 +212,15 @@  discard block
 block discarded – undo
212 212
  * @return void
213 213
  **/
214 214
 function critere_debut_dist($idb, &$boucles, $crit) {
215
-	[$un, $deux] = $crit->param;
216
-	$un = $un[0]->texte;
217
-	$deux = $deux[0]->texte;
218
-	if ($deux) {
219
-		$boucles[$idb]->limit =
220
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
221
-	} else {
222
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
223
-	}
215
+    [$un, $deux] = $crit->param;
216
+    $un = $un[0]->texte;
217
+    $deux = $deux[0]->texte;
218
+    if ($deux) {
219
+        $boucles[$idb]->limit =
220
+            'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
221
+    } else {
222
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
223
+    }
224 224
 }
225 225
 
226 226
 
@@ -254,59 +254,59 @@  discard block
 block discarded – undo
254 254
  **/
255 255
 function critere_pagination_dist($idb, &$boucles, $crit) {
256 256
 
257
-	$boucle = &$boucles[$idb];
258
-	// definition de la taille de la page
259
-	$pas = isset($crit->param[0][0])
260
-		? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
261
-		: "''";
262
-
263
-	if (!preg_match(_CODE_QUOTE, (string) $pas, $r)) {
264
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
265
-	} else {
266
-		$r = (int) $r[2];
267
-		$pas = (string) ($r ?: 10);
268
-	}
269
-
270
-	// Calcul du nommage de la pagination si il existe.
271
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
272
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
273
-	$type = "'$idb'";
274
-	// Calcul d'un nommage spécifique de la pagination si précisé.
275
-	// Syntaxe {pagination 20, nom}
276
-	if (isset($crit->param[0][1])) {
277
-		$type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
278
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
279
-	elseif (isset($crit->param[1][0])) {
280
-		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281
-	}
282
-
283
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr((string) $type, 1));
284
-	$boucle->modificateur['debut_nom'] = $type;
285
-	$partie =
286
-		// tester si le numero de page demande est de la forme '@yyy'
287
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
288
-		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
-		. "\t\t" . '$iter->seek(0);' . "\n"
291
-		. "\t}\n"
292
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
293
-
294
-	$boucle->hash .= '
257
+    $boucle = &$boucles[$idb];
258
+    // definition de la taille de la page
259
+    $pas = isset($crit->param[0][0])
260
+        ? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
261
+        : "''";
262
+
263
+    if (!preg_match(_CODE_QUOTE, (string) $pas, $r)) {
264
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
265
+    } else {
266
+        $r = (int) $r[2];
267
+        $pas = (string) ($r ?: 10);
268
+    }
269
+
270
+    // Calcul du nommage de la pagination si il existe.
271
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
272
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
273
+    $type = "'$idb'";
274
+    // Calcul d'un nommage spécifique de la pagination si précisé.
275
+    // Syntaxe {pagination 20, nom}
276
+    if (isset($crit->param[0][1])) {
277
+        $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
278
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
279
+    elseif (isset($crit->param[1][0])) {
280
+        $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281
+    }
282
+
283
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr((string) $type, 1));
284
+    $boucle->modificateur['debut_nom'] = $type;
285
+    $partie =
286
+        // tester si le numero de page demande est de la forme '@yyy'
287
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
288
+        . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
+        . "\t\t" . '$iter->seek(0);' . "\n"
291
+        . "\t}\n"
292
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
293
+
294
+    $boucle->hash .= '
295 295
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
296 296
 
297
-	$boucle->total_parties = $pas;
298
-	calculer_parties($boucles, $idb, $partie, 'p+');
299
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300
-	// sauf si pas de primaire, ou si primaire composee
301
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
302
-	$t = $boucle->id_table . '.' . $boucle->primary;
303
-	if (
304
-		$boucle->primary
305
-		&& !preg_match('/[,\s]/', (string) $boucle->primary)
306
-		&& !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
297
+    $boucle->total_parties = $pas;
298
+    calculer_parties($boucles, $idb, $partie, 'p+');
299
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300
+    // sauf si pas de primaire, ou si primaire composee
301
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
302
+    $t = $boucle->id_table . '.' . $boucle->primary;
303
+    if (
304
+        $boucle->primary
305
+        && !preg_match('/[,\s]/', (string) $boucle->primary)
306
+        && !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary || strpos((string) $boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
333
+    if (!$boucle->primary || strpos((string) $boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		[
397
-			"'OR'",
398
-			[
399
-				"'AND'",
400
-				["'='", "'$table.id_trad'", 0],
401
-				["'='", "'$table.$prim'", $dprim]
402
-			],
403
-			[
404
-				"'AND'",
405
-				["'>'", "'$table.id_trad'", 0],
406
-				["'='", "'$table.id_trad'", $arg]
407
-			]
408
-		];
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        [
397
+            "'OR'",
398
+            [
399
+                "'AND'",
400
+                ["'='", "'$table.id_trad'", 0],
401
+                ["'='", "'$table.$prim'", $dprim]
402
+            ],
403
+            [
404
+                "'AND'",
405
+                ["'>'", "'$table.id_trad'", 0],
406
+                ["'='", "'$table.id_trad'", $arg]
407
+            ]
408
+        ];
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		[
432
-			"'OR'",
433
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
434
-			["'='", "'$table.id_trad'", "'0'"]
435
-		];
436
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        [
432
+            "'OR'",
433
+            ["'='", "'$table." . "id_trad'", "'$table.$prim'"],
434
+            ["'='", "'$table.id_trad'", "'0'"]
435
+        ];
436
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,17 +450,17 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
-	$mparent = $boucle->id_table . '.' . $id_parent;
457
-
458
-	if ($boucle->type_requete == 'rubriques' || isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459
-		$boucle->where[] = ["'='", "'$mparent'", $arg];
460
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461
-	else {
462
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
463
-	}
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
+    $mparent = $boucle->id_table . '.' . $id_parent;
457
+
458
+    if ($boucle->type_requete == 'rubriques' || isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459
+        $boucle->where[] = ["'='", "'$mparent'", $arg];
460
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461
+    else {
462
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
463
+    }
464 464
 }
465 465
 
466 466
 
@@ -491,38 +491,38 @@  discard block
 block discarded – undo
491 491
  **/
492 492
 function critere_branche_dist($idb, &$boucles, $crit) {
493 493
 
494
-	$not = $crit->not;
495
-	$boucle = &$boucles[$idb];
496
-	// prendre en priorite un identifiant en parametre {branche XX}
497
-	if (isset($crit->param[0])) {
498
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
499
-		// sinon on le prend chez une boucle parente
500
-	} else {
501
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
502
-	}
503
-
504
-	//Trouver une jointure
505
-	$champ = 'id_rubrique';
506
-	$desc = $boucle->show;
507
-	//Seulement si necessaire
508
-	if (!array_key_exists($champ, $desc['field'])) {
509
-		$cle = trouver_jointure_champ($champ, $boucle);
510
-		$trouver_table = charger_fonction('trouver_table', 'base');
511
-		$desc = $trouver_table($boucle->from[$cle]);
512
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513
-			$decompose = decompose_champ_id_objet($champ);
514
-			$champ = array_shift($decompose);
515
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
516
-		}
517
-	} else {
518
-		$cle = $boucle->id_table;
519
-	}
520
-
521
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
-		. ($not ? ", 'NOT'" : '') . ')';
523
-	$boucle->where[] = $crit->cond
524
-		? "($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'
525
-		: $c;
494
+    $not = $crit->not;
495
+    $boucle = &$boucles[$idb];
496
+    // prendre en priorite un identifiant en parametre {branche XX}
497
+    if (isset($crit->param[0])) {
498
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
499
+        // sinon on le prend chez une boucle parente
500
+    } else {
501
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
502
+    }
503
+
504
+    //Trouver une jointure
505
+    $champ = 'id_rubrique';
506
+    $desc = $boucle->show;
507
+    //Seulement si necessaire
508
+    if (!array_key_exists($champ, $desc['field'])) {
509
+        $cle = trouver_jointure_champ($champ, $boucle);
510
+        $trouver_table = charger_fonction('trouver_table', 'base');
511
+        $desc = $trouver_table($boucle->from[$cle]);
512
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513
+            $decompose = decompose_champ_id_objet($champ);
514
+            $champ = array_shift($decompose);
515
+            $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
516
+        }
517
+    } else {
518
+        $cle = $boucle->id_table;
519
+    }
520
+
521
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
+        . ($not ? ", 'NOT'" : '') . ')';
523
+    $boucle->where[] = $crit->cond
524
+        ? "($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'
525
+        : $c;
526 526
 }
527 527
 
528 528
 /**
@@ -538,15 +538,15 @@  discard block
 block discarded – undo
538 538
  **/
539 539
 function critere_logo_dist($idb, &$boucles, $crit) {
540 540
 
541
-	$boucle = &$boucles[$idb];
542
-	$not = ($crit->not ? 'NOT' : '');
543
-	$serveur = $boucle->sql_serveur;
541
+    $boucle = &$boucles[$idb];
542
+    $not = ($crit->not ? 'NOT' : '');
543
+    $serveur = $boucle->sql_serveur;
544 544
 
545
-	$c = "sql_in('" .
546
-		$boucle->id_table . '.' . $boucle->primary
547
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
545
+    $c = "sql_in('" .
546
+        $boucle->id_table . '.' . $boucle->primary
547
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
548 548
 
549
-	$boucle->where[] = $c;
549
+    $boucle->where[] = $c;
550 550
 }
551 551
 
552 552
 
@@ -568,31 +568,31 @@  discard block
 block discarded – undo
568 568
  * @return void|array
569 569
  **/
570 570
 function critere_fusion_dist($idb, &$boucles, $crit) {
571
-	if ($t = isset($crit->param[0])) {
572
-		$t = $crit->param[0];
573
-		if ($t[0]->type == 'texte') {
574
-			$t = $t[0]->texte;
575
-			if (preg_match('/^(.*)\.(.*)$/', (string) $t, $r)) {
576
-				$t = table_objet_sql($r[1]);
577
-				$t = array_search($t, $boucles[$idb]->from);
578
-				if ($t) {
579
-					$t .= '.' . $r[2];
580
-				}
581
-			}
582
-		} else {
583
-			$t = '".'
584
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
585
-				. '."';
586
-		}
587
-	}
588
-	if ($t) {
589
-		$boucles[$idb]->group[] = $t;
590
-		if (!in_array($t, $boucles[$idb]->select)) {
591
-			$boucles[$idb]->select[] = $t;
592
-		}
593
-	} else {
594
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
595
-	}
571
+    if ($t = isset($crit->param[0])) {
572
+        $t = $crit->param[0];
573
+        if ($t[0]->type == 'texte') {
574
+            $t = $t[0]->texte;
575
+            if (preg_match('/^(.*)\.(.*)$/', (string) $t, $r)) {
576
+                $t = table_objet_sql($r[1]);
577
+                $t = array_search($t, $boucles[$idb]->from);
578
+                if ($t) {
579
+                    $t .= '.' . $r[2];
580
+                }
581
+            }
582
+        } else {
583
+            $t = '".'
584
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
585
+                . '."';
586
+        }
587
+    }
588
+    if ($t) {
589
+        $boucles[$idb]->group[] = $t;
590
+        if (!in_array($t, $boucles[$idb]->select)) {
591
+            $boucles[$idb]->select[] = $t;
592
+        }
593
+    } else {
594
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
595
+    }
596 596
 }
597 597
 
598 598
 /**
@@ -612,7 +612,7 @@  discard block
 block discarded – undo
612 612
  * @return void
613 613
  **/
614 614
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
615
-	$boucles[$idb]->group = [];
615
+    $boucles[$idb]->group = [];
616 616
 }
617 617
 
618 618
 /**
@@ -649,44 +649,44 @@  discard block
 block discarded – undo
649 649
  * @param Critere $crit Paramètres du critère dans cette boucle
650 650
  */
651 651
 function critere_collecte_dist($idb, &$boucles, $crit) {
652
-	if (isset($crit->param[0])) {
653
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
654
-		$boucle = $boucles[$idb];
655
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
656
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
657
-		if ($n && (!str_contains((string) $boucle->order[$n - 1], 'COLLATE'))) {
658
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
659
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
660
-			if (
661
-				(false !== $i = strpos((string) $boucle->order[$n - 1], 'ASC'))
662
-				|| (false !== $i = strpos((string) $boucle->order[$n - 1], 'DESC'))
663
-			) {
664
-				$boucle->order[$n - 1] = substr_replace((string) $boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
665
-			} else {
666
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
667
-			}
668
-		}
669
-	} else {
670
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
671
-	}
652
+    if (isset($crit->param[0])) {
653
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
654
+        $boucle = $boucles[$idb];
655
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
656
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
657
+        if ($n && (!str_contains((string) $boucle->order[$n - 1], 'COLLATE'))) {
658
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
659
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
660
+            if (
661
+                (false !== $i = strpos((string) $boucle->order[$n - 1], 'ASC'))
662
+                || (false !== $i = strpos((string) $boucle->order[$n - 1], 'DESC'))
663
+            ) {
664
+                $boucle->order[$n - 1] = substr_replace((string) $boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
665
+            } else {
666
+                $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
667
+            }
668
+        }
669
+    } else {
670
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
671
+    }
672 672
 }
673 673
 
674 674
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
675
-	$boucle = $boucles[$idb];
676
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
677
-	$var = '$champs_' . $idb;
678
-	$desc = (str_contains((string) $boucle->in, (string) "static $var ="));
679
-	if (!$desc) {
680
-		$desc = $boucle->show['field'];
681
-		$desc = implode(',', array_map('_q', array_keys($desc)));
682
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
683
-	}
684
-	if ($desc) {
685
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
686
-	}
687
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
688
-
689
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
675
+    $boucle = $boucles[$idb];
676
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
677
+    $var = '$champs_' . $idb;
678
+    $desc = (str_contains((string) $boucle->in, (string) "static $var ="));
679
+    if (!$desc) {
680
+        $desc = $boucle->show['field'];
681
+        $desc = implode(',', array_map('_q', array_keys($desc)));
682
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
683
+    }
684
+    if ($desc) {
685
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
686
+    }
687
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
688
+
689
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
690 690
 }
691 691
 
692 692
 /**
@@ -725,7 +725,7 @@  discard block
 block discarded – undo
725 725
  * @param Critere $crit Paramètres du critère dans cette boucle
726 726
  */
727 727
 function critere_par_dist($idb, &$boucles, $crit) {
728
-	return critere_parinverse($idb, $boucles, $crit);
728
+    return critere_parinverse($idb, $boucles, $crit);
729 729
 }
730 730
 
731 731
 /**
@@ -747,91 +747,91 @@  discard block
 block discarded – undo
747 747
  * @param Critere $crit Paramètres du critère dans cette boucle
748 748
  */
749 749
 function critere_parinverse($idb, &$boucles, $crit) {
750
-	$boucle = &$boucles[$idb];
751
-
752
-	$sens = $collecte = '';
753
-	if ($crit->not) {
754
-		$sens = " . ' DESC'";
755
-	}
756
-	if (isset($boucle->modificateur['collate'])) {
757
-		$collecte = ' . ' . $boucle->modificateur['collate'];
758
-	}
759
-
760
-	// Pour chaque paramètre du critère
761
-	foreach ($crit->param as $tri) {
762
-		$order = $fct = '';
763
-		// tris specifiés dynamiquement {par #ENV{tri}}
764
-		if ($tri[0]->type != 'texte') {
765
-			// calculer le order dynamique qui verifie les champs
766
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
767
-			// ajouter 'hasard' comme possibilité de tri dynamique
768
-			calculer_critere_par_hasard($idb, $boucles, $crit);
769
-		}
770
-		// tris textuels {par titre}
771
-		else {
772
-			$par = array_shift($tri);
773
-			$par = $par->texte;
774
-
775
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
776
-			if (preg_match(',^(\w+)[\s]+(.*)$,', (string) $par, $m)) {
777
-				$expression = trim($m[1]);
778
-				$champ = trim($m[2]);
779
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
780
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
781
-				} else {
782
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
783
-				}
784
-
785
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
786
-			} elseif ($boucle->type_requete == 'DATA' || preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', (string) $par, $match)) {
787
-				// {par FONCTION(champ)}
788
-				if (isset($match) && count($match) > 2) {
789
-					$par = substr($match[2], 1, -1);
790
-					$fct = $match[1];
791
-				}
792
-				// quelques cas spécifiques {par hasard}, {par date}
793
-				if ($par == 'hasard') {
794
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
795
-				} elseif ($par == 'date' && !empty($boucle->show['date'])) {
796
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
797
-				} else {
798
-					// cas général {par champ}, {par table.champ}, ...
799
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
800
-				}
801
-			}
802
-
803
-			// on ne sait pas traiter…
804
-			else {
805
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
806
-			}
807
-
808
-			// En cas d'erreur de squelette retournée par une fonction
809
-			if (is_array($order)) {
810
-				return $order;
811
-			}
812
-		}
813
-
814
-		if (preg_match('/^\'([^"]*)\'$/', (string) $order, $m)) {
815
-			$t = $m[1];
816
-			if (strpos($t, '.') && !in_array($t, $boucle->select)) {
817
-				$boucle->select[] = $t;
818
-			}
819
-		} else {
820
-			$sens = '';
821
-		}
822
-
823
-		if ($fct) {
824
-			$order = preg_match("/^\s*'(.*)'\s*$/", (string) $order, $r)
825
-				? "'$fct(" . $r[1] . ")'"
826
-				: "'$fct(' . $order . ')'";
827
-		}
828
-		$t = $order . $collecte . $sens;
829
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
830
-			$t = $r[1] . $r[2];
831
-		}
832
-
833
-		$boucle->order[] = $t;
834
-	}
750
+    $boucle = &$boucles[$idb];
751
+
752
+    $sens = $collecte = '';
753
+    if ($crit->not) {
754
+        $sens = " . ' DESC'";
755
+    }
756
+    if (isset($boucle->modificateur['collate'])) {
757
+        $collecte = ' . ' . $boucle->modificateur['collate'];
758
+    }
759
+
760
+    // Pour chaque paramètre du critère
761
+    foreach ($crit->param as $tri) {
762
+        $order = $fct = '';
763
+        // tris specifiés dynamiquement {par #ENV{tri}}
764
+        if ($tri[0]->type != 'texte') {
765
+            // calculer le order dynamique qui verifie les champs
766
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
767
+            // ajouter 'hasard' comme possibilité de tri dynamique
768
+            calculer_critere_par_hasard($idb, $boucles, $crit);
769
+        }
770
+        // tris textuels {par titre}
771
+        else {
772
+            $par = array_shift($tri);
773
+            $par = $par->texte;
774
+
775
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
776
+            if (preg_match(',^(\w+)[\s]+(.*)$,', (string) $par, $m)) {
777
+                $expression = trim($m[1]);
778
+                $champ = trim($m[2]);
779
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
780
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
781
+                } else {
782
+                    return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
783
+                }
784
+
785
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
786
+            } elseif ($boucle->type_requete == 'DATA' || preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', (string) $par, $match)) {
787
+                // {par FONCTION(champ)}
788
+                if (isset($match) && count($match) > 2) {
789
+                    $par = substr($match[2], 1, -1);
790
+                    $fct = $match[1];
791
+                }
792
+                // quelques cas spécifiques {par hasard}, {par date}
793
+                if ($par == 'hasard') {
794
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
795
+                } elseif ($par == 'date' && !empty($boucle->show['date'])) {
796
+                    $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
797
+                } else {
798
+                    // cas général {par champ}, {par table.champ}, ...
799
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
800
+                }
801
+            }
802
+
803
+            // on ne sait pas traiter…
804
+            else {
805
+                return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
806
+            }
807
+
808
+            // En cas d'erreur de squelette retournée par une fonction
809
+            if (is_array($order)) {
810
+                return $order;
811
+            }
812
+        }
813
+
814
+        if (preg_match('/^\'([^"]*)\'$/', (string) $order, $m)) {
815
+            $t = $m[1];
816
+            if (strpos($t, '.') && !in_array($t, $boucle->select)) {
817
+                $boucle->select[] = $t;
818
+            }
819
+        } else {
820
+            $sens = '';
821
+        }
822
+
823
+        if ($fct) {
824
+            $order = preg_match("/^\s*'(.*)'\s*$/", (string) $order, $r)
825
+                ? "'$fct(" . $r[1] . ")'"
826
+                : "'$fct(' . $order . ')'";
827
+        }
828
+        $t = $order . $collecte . $sens;
829
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
830
+            $t = $r[1] . $r[2];
831
+        }
832
+
833
+        $boucle->order[] = $t;
834
+    }
835 835
 }
836 836
 
837 837
 /**
@@ -845,13 +845,13 @@  discard block
 block discarded – undo
845 845
  * @return string Clause pour le Order by
846 846
  */
847 847
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
848
-	$boucle = &$boucles[$idb];
849
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
850
-	$parha = 'rand() AS hasard';
851
-	if (!in_array($parha, $boucle->select)) {
852
-		$boucle->select[] = $parha;
853
-	}
854
-	return "'hasard'";
848
+    $boucle = &$boucles[$idb];
849
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
850
+    $parha = 'rand() AS hasard';
851
+    if (!in_array($parha, $boucle->select)) {
852
+        $boucle->select[] = $parha;
853
+    }
854
+    return "'hasard'";
855 855
 }
856 856
 
857 857
 /**
@@ -875,22 +875,22 @@  discard block
 block discarded – undo
875 875
  * @return string|array Clause pour le Order by (array si erreur)
876 876
  */
877 877
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
878
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
879
-	if (is_array($_champ)) {
880
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
881
-	}
882
-	$boucle = &$boucles[$idb];
883
-	$texte = '0+' . $_champ;
884
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
885
-	if ($suite !== "''") {
886
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
887
-	}
888
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
889
-	$boucle->select[] = $texte . " AS $asnum";
890
-
891
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
892
-	$orderassinum = trim($orderassinum, "'");
893
-	return "'$orderassinum, $asnum'";
878
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
879
+    if (is_array($_champ)) {
880
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
881
+    }
882
+    $boucle = &$boucles[$idb];
883
+    $texte = '0+' . $_champ;
884
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
885
+    if ($suite !== "''") {
886
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
887
+    }
888
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
889
+    $boucle->select[] = $texte . " AS $asnum";
890
+
891
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
892
+    $orderassinum = trim($orderassinum, "'");
893
+    return "'$orderassinum, $asnum'";
894 894
 }
895 895
 
896 896
 /**
@@ -911,34 +911,34 @@  discard block
 block discarded – undo
911 911
  * @return string|array Clause pour le Order by (array si erreur)
912 912
  */
913 913
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
914
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
915
-	if (is_array($_champ)) {
916
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
917
-	}
918
-	$boucle = &$boucles[$idb];
919
-	$texte = '0+' . $_champ;
920
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
921
-	if ($suite !== "''") {
922
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
923
-	}
924
-
925
-	$as = false;
926
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
927
-	foreach ($boucle->select as $s) {
928
-		if (str_starts_with((string) $s, $select)) {
929
-			$as = trim(substr((string) $s, strlen($select)));
930
-			if (!preg_match(',\W,', $as)) {
931
-				break;
932
-			}
933
-			$as = false;
934
-		}
935
-	}
936
-
937
-	if (!$as) {
938
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
939
-		$boucle->select[] = $select . $as;
940
-	}
941
-	return "'$as'";
914
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
915
+    if (is_array($_champ)) {
916
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
917
+    }
918
+    $boucle = &$boucles[$idb];
919
+    $texte = '0+' . $_champ;
920
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
921
+    if ($suite !== "''") {
922
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
923
+    }
924
+
925
+    $as = false;
926
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
927
+    foreach ($boucle->select as $s) {
928
+        if (str_starts_with((string) $s, $select)) {
929
+            $as = trim(substr((string) $s, strlen($select)));
930
+            if (!preg_match(',\W,', $as)) {
931
+                break;
932
+            }
933
+            $as = false;
934
+        }
935
+    }
936
+
937
+    if (!$as) {
938
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
939
+        $boucle->select[] = $select . $as;
940
+    }
941
+    return "'$as'";
942 942
 }
943 943
 
944 944
 
@@ -958,13 +958,13 @@  discard block
 block discarded – undo
958 958
  * @return string|array Clause pour le Order by (array si erreur)
959 959
  */
960 960
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
961
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
962
-	if (is_array($_champ)) {
963
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
964
-	}
965
-	$boucle = &$boucles[$idb];
966
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
967
-	return "'multi'";
961
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
962
+    if (is_array($_champ)) {
963
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
964
+    }
965
+    $boucle = &$boucles[$idb];
966
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
967
+    return "'multi'";
968 968
 }
969 969
 
970 970
 /**
@@ -983,56 +983,56 @@  discard block
 block discarded – undo
983 983
  * @return array|string
984 984
  */
985 985
 function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
986
-	$boucle = &$boucles[$idb];
987
-	$desc = $boucle->show;
988
-
989
-	// le champ existe dans la table, pas de souci (le plus commun)
990
-	if (isset($desc['field'][$par])) {
991
-		$par = $boucle->id_table . '.' . $par;
992
-	}
993
-	// le champ est peut être une jointure
994
-	else {
995
-		$table = $table_alias = false; // toutes les tables de jointure possibles
996
-		$champ = $par;
997
-
998
-		// le champ demandé est une exception de jointure {par titre_mot}
999
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1000
-			[$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1001
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1002
-		elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1003
-			[, $table, $champ] = $r;
1004
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1005
-			$table = table_objet_sql($table);
1006
-		}
1007
-
1008
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1009
-		// Sinon on cherche le champ dans les tables possibles de jointures
1010
-		// Si la table est déjà dans le from, on la réutilise.
1011
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1012
-			$par = $infos['alias'] . '.' . $champ;
1013
-		} elseif (
1014
-			$boucle->jointures_explicites
1015
-			&& ($alias = trouver_jointure_champ($champ, $boucle, explode(' ', (string) $boucle->jointures_explicites), false, $table))
1016
-		) {
1017
-			$par = $alias . '.' . $champ;
1018
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1019
-			$par = $alias . '.' . $champ;
1020
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1021
-		} elseif (
1022
-			$table_alias
1023
-			&& isset($boucle->from[$table_alias])
1024
-			&& ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]))
1025
-		) {
1026
-			$par = $infos['alias'] . '.' . $champ;
1027
-		} elseif ($table) {
1028
-			// On avait table + champ, mais on ne les a pas trouvés
1029
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1030
-		} else {
1031
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1032
-		}
1033
-	}
1034
-
1035
-	return $raw ? $par : "'$par'";
986
+    $boucle = &$boucles[$idb];
987
+    $desc = $boucle->show;
988
+
989
+    // le champ existe dans la table, pas de souci (le plus commun)
990
+    if (isset($desc['field'][$par])) {
991
+        $par = $boucle->id_table . '.' . $par;
992
+    }
993
+    // le champ est peut être une jointure
994
+    else {
995
+        $table = $table_alias = false; // toutes les tables de jointure possibles
996
+        $champ = $par;
997
+
998
+        // le champ demandé est une exception de jointure {par titre_mot}
999
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1000
+            [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1001
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1002
+        elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1003
+            [, $table, $champ] = $r;
1004
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1005
+            $table = table_objet_sql($table);
1006
+        }
1007
+
1008
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1009
+        // Sinon on cherche le champ dans les tables possibles de jointures
1010
+        // Si la table est déjà dans le from, on la réutilise.
1011
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1012
+            $par = $infos['alias'] . '.' . $champ;
1013
+        } elseif (
1014
+            $boucle->jointures_explicites
1015
+            && ($alias = trouver_jointure_champ($champ, $boucle, explode(' ', (string) $boucle->jointures_explicites), false, $table))
1016
+        ) {
1017
+            $par = $alias . '.' . $champ;
1018
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1019
+            $par = $alias . '.' . $champ;
1020
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1021
+        } elseif (
1022
+            $table_alias
1023
+            && isset($boucle->from[$table_alias])
1024
+            && ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]))
1025
+        ) {
1026
+            $par = $infos['alias'] . '.' . $champ;
1027
+        } elseif ($table) {
1028
+            // On avait table + champ, mais on ne les a pas trouvés
1029
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1030
+        } else {
1031
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1032
+        }
1033
+    }
1034
+
1035
+    return $raw ? $par : "'$par'";
1036 1036
 }
1037 1037
 
1038 1038
 /**
@@ -1046,11 +1046,11 @@  discard block
 block discarded – undo
1046 1046
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1047 1047
  */
1048 1048
 function critere_par_joint($table, $champ, &$boucle) {
1049
-	$t = array_search($table, $boucle->from);
1050
-	if (!$t) {
1051
-		$t = trouver_jointure_champ($champ, $boucle);
1052
-	}
1053
-	return $t ? "'" . $t . '.' . $champ . "'" : '';
1049
+    $t = array_search($table, $boucle->from);
1050
+    if (!$t) {
1051
+        $t = trouver_jointure_champ($champ, $boucle);
1052
+    }
1053
+    return $t ? "'" . $t . '.' . $champ . "'" : '';
1054 1054
 }
1055 1055
 
1056 1056
 /**
@@ -1075,33 +1075,33 @@  discard block
 block discarded – undo
1075 1075
  */
1076 1076
 function critere_inverse_dist($idb, &$boucles, $crit) {
1077 1077
 
1078
-	$boucle = &$boucles[$idb];
1079
-	// Classement par ordre inverse
1080
-	if ($crit->not) {
1081
-		critere_parinverse($idb, $boucles, $crit);
1082
-	} else {
1083
-		$order = "' DESC'";
1084
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1085
-		if (isset($crit->param[0])) {
1086
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1087
-			$order = "(($critere)?' DESC':'')";
1088
-		}
1089
-
1090
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
1091
-		if (!$n) {
1092
-			if (isset($boucle->default_order[0])) {
1093
-				$boucle->default_order[0] .= ' . " DESC"';
1094
-			} else {
1095
-				$boucle->default_order[] = ' DESC';
1096
-			}
1097
-		} else {
1098
-			$t = $boucle->order[$n - 1] . " . $order";
1099
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1100
-				$t = $r[1] . $r[2];
1101
-			}
1102
-			$boucle->order[$n - 1] = $t;
1103
-		}
1104
-	}
1078
+    $boucle = &$boucles[$idb];
1079
+    // Classement par ordre inverse
1080
+    if ($crit->not) {
1081
+        critere_parinverse($idb, $boucles, $crit);
1082
+    } else {
1083
+        $order = "' DESC'";
1084
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1085
+        if (isset($crit->param[0])) {
1086
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1087
+            $order = "(($critere)?' DESC':'')";
1088
+        }
1089
+
1090
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
1091
+        if (!$n) {
1092
+            if (isset($boucle->default_order[0])) {
1093
+                $boucle->default_order[0] .= ' . " DESC"';
1094
+            } else {
1095
+                $boucle->default_order[] = ' DESC';
1096
+            }
1097
+        } else {
1098
+            $t = $boucle->order[$n - 1] . " . $order";
1099
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1100
+                $t = $r[1] . $r[2];
1101
+            }
1102
+            $boucle->order[$n - 1] = $t;
1103
+        }
1104
+    }
1105 1105
 }
1106 1106
 
1107 1107
 /**
@@ -1113,139 +1113,139 @@  discard block
 block discarded – undo
1113 1113
  * @return void|array
1114 1114
  */
1115 1115
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1116
-	$boucle = &$boucles[$idb];
1116
+    $boucle = &$boucles[$idb];
1117 1117
 
1118
-	$sens = $collecte = '';
1119
-	if ($crit->not) {
1120
-		$sens = " . ' DESC'";
1121
-	}
1118
+    $sens = $collecte = '';
1119
+    if ($crit->not) {
1120
+        $sens = " . ' DESC'";
1121
+    }
1122 1122
 
1123
-	$crit2 = clone $crit;
1124
-	$crit2->not = false;
1125
-	$crit2->param = [reset($crit->param)];
1126
-	$res = critere_parinverse($idb, $boucles, $crit2);
1123
+    $crit2 = clone $crit;
1124
+    $crit2->not = false;
1125
+    $crit2->param = [reset($crit->param)];
1126
+    $res = critere_parinverse($idb, $boucles, $crit2);
1127 1127
 
1128
-	// erreur ?
1129
-	if (is_array($res)) {
1130
-		return $res;
1131
-	}
1128
+    // erreur ?
1129
+    if (is_array($res)) {
1130
+        return $res;
1131
+    }
1132 1132
 
1133
-	$_order = array_pop($boucle->order);
1133
+    $_order = array_pop($boucle->order);
1134 1134
 
1135
-	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1135
+    $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1136 1136
 
1137
-	$order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1138
-	$boucle->order[] = $order;
1137
+    $order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1138
+    $boucle->order[] = $order;
1139 1139
 }
1140 1140
 
1141 1141
 
1142 1142
 function critere_agenda_dist($idb, &$boucles, $crit) {
1143
-	$params = $crit->param;
1144
-
1145
-	if ((is_countable($params) ? count($params) : 0) < 1) {
1146
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1147
-	}
1148
-
1149
-	$boucle = &$boucles[$idb];
1150
-	$parent = $boucle->id_parent;
1151
-	$fields = $boucle->show['field'];
1152
-
1153
-	$date = array_shift($params);
1154
-	$type = array_shift($params);
1155
-
1156
-	// la valeur $type doit etre connue a la compilation
1157
-	// donc etre forcement reduite a un litteral unique dans le source
1158
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1159
-
1160
-	// La valeur date doit designer un champ de la table SQL.
1161
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1162
-	// sinon synthetiser le test de verif pour execution ulterieure
1163
-	// On prendra arbitrairement le premier champ si test negatif.
1164
-	if ((is_countable($date) ? count($date) : 0) == 1 && $date[0]->type == 'texte') {
1165
-		$date = $date[0]->texte;
1166
-		if (!isset($fields[$date])) {
1167
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1168
-		}
1169
-	} else {
1170
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1171
-		$noms = array_keys($fields);
1172
-		$defaut = $noms[0];
1173
-		$noms = implode(' ', $noms);
1174
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1175
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1176
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1177
-	}
1178
-	$annee = $params ? array_shift($params) : '';
1179
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1180
-		calculer_liste($annee, $idb, $boucles, $parent) .
1181
-		') ? $x : date("Y"))';
1182
-
1183
-	$mois = $params ? array_shift($params) : '';
1184
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1185
-		calculer_liste($mois, $idb, $boucles, $parent) .
1186
-		') ? $x : date("m"))';
1187
-
1188
-	$jour = $params ? array_shift($params) : '';
1189
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1190
-		calculer_liste($jour, $idb, $boucles, $parent) .
1191
-		') ? $x : date("d"))';
1192
-
1193
-	$annee2 = $params ? array_shift($params) : '';
1194
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1195
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1196
-		') ? $x : date("Y"))';
1197
-
1198
-	$mois2 = $params ? array_shift($params) : '';
1199
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1200
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1201
-		') ? $x : date("m"))';
1202
-
1203
-	$jour2 = $params ? array_shift($params) : '';
1204
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1205
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1206
-		') ? $x : date("d"))';
1207
-
1208
-	$date = $boucle->id_table . ".$date";
1209
-
1210
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1211
-	if ($type == 'jour') {
1212
-		$boucle->where[] = [
1213
-			"'='",
1214
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1215
-			("sql_quote($annee . $mois . $jour$quote_end)")
1216
-		];
1217
-	} elseif ($type == 'mois') {
1218
-		$boucle->where[] = [
1219
-			"'='",
1220
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1221
-			("sql_quote($annee . $mois$quote_end)")
1222
-		];
1223
-	} elseif ($type == 'semaine') {
1224
-		$boucle->where[] = [
1225
-			"'AND'",
1226
-			[
1227
-				"'>='",
1228
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1229
-				("date_debut_semaine($annee, $mois, $jour)")
1230
-			],
1231
-			[
1232
-				"'<='",
1233
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1234
-				("date_fin_semaine($annee, $mois, $jour)")
1235
-			]
1236
-		];
1237
-	} elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1238
-		$boucle->where[] = [
1239
-			"'AND'",
1240
-			[
1241
-				"'>='",
1242
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1243
-				("sql_quote($annee . $mois . $jour$quote_end)")
1244
-			],
1245
-			["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1246
-		];
1247
-	}
1248
-	// sinon on prend tout
1143
+    $params = $crit->param;
1144
+
1145
+    if ((is_countable($params) ? count($params) : 0) < 1) {
1146
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1147
+    }
1148
+
1149
+    $boucle = &$boucles[$idb];
1150
+    $parent = $boucle->id_parent;
1151
+    $fields = $boucle->show['field'];
1152
+
1153
+    $date = array_shift($params);
1154
+    $type = array_shift($params);
1155
+
1156
+    // la valeur $type doit etre connue a la compilation
1157
+    // donc etre forcement reduite a un litteral unique dans le source
1158
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1159
+
1160
+    // La valeur date doit designer un champ de la table SQL.
1161
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1162
+    // sinon synthetiser le test de verif pour execution ulterieure
1163
+    // On prendra arbitrairement le premier champ si test negatif.
1164
+    if ((is_countable($date) ? count($date) : 0) == 1 && $date[0]->type == 'texte') {
1165
+        $date = $date[0]->texte;
1166
+        if (!isset($fields[$date])) {
1167
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1168
+        }
1169
+    } else {
1170
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1171
+        $noms = array_keys($fields);
1172
+        $defaut = $noms[0];
1173
+        $noms = implode(' ', $noms);
1174
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1175
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1176
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1177
+    }
1178
+    $annee = $params ? array_shift($params) : '';
1179
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1180
+        calculer_liste($annee, $idb, $boucles, $parent) .
1181
+        ') ? $x : date("Y"))';
1182
+
1183
+    $mois = $params ? array_shift($params) : '';
1184
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1185
+        calculer_liste($mois, $idb, $boucles, $parent) .
1186
+        ') ? $x : date("m"))';
1187
+
1188
+    $jour = $params ? array_shift($params) : '';
1189
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1190
+        calculer_liste($jour, $idb, $boucles, $parent) .
1191
+        ') ? $x : date("d"))';
1192
+
1193
+    $annee2 = $params ? array_shift($params) : '';
1194
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1195
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1196
+        ') ? $x : date("Y"))';
1197
+
1198
+    $mois2 = $params ? array_shift($params) : '';
1199
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1200
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1201
+        ') ? $x : date("m"))';
1202
+
1203
+    $jour2 = $params ? array_shift($params) : '';
1204
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1205
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1206
+        ') ? $x : date("d"))';
1207
+
1208
+    $date = $boucle->id_table . ".$date";
1209
+
1210
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1211
+    if ($type == 'jour') {
1212
+        $boucle->where[] = [
1213
+            "'='",
1214
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1215
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1216
+        ];
1217
+    } elseif ($type == 'mois') {
1218
+        $boucle->where[] = [
1219
+            "'='",
1220
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1221
+            ("sql_quote($annee . $mois$quote_end)")
1222
+        ];
1223
+    } elseif ($type == 'semaine') {
1224
+        $boucle->where[] = [
1225
+            "'AND'",
1226
+            [
1227
+                "'>='",
1228
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1229
+                ("date_debut_semaine($annee, $mois, $jour)")
1230
+            ],
1231
+            [
1232
+                "'<='",
1233
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1234
+                ("date_fin_semaine($annee, $mois, $jour)")
1235
+            ]
1236
+        ];
1237
+    } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1238
+        $boucle->where[] = [
1239
+            "'AND'",
1240
+            [
1241
+                "'>='",
1242
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1243
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1244
+            ],
1245
+            ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1246
+        ];
1247
+    }
1248
+    // sinon on prend tout
1249 1249
 }
1250 1250
 
1251 1251
 
@@ -1270,33 +1270,33 @@  discard block
 block discarded – undo
1270 1270
  * @return void
1271 1271
  **/
1272 1272
 function calculer_critere_parties($idb, &$boucles, $crit) {
1273
-	$boucle = &$boucles[$idb];
1274
-	$a1 = $crit->param[0];
1275
-	$a2 = $crit->param[1];
1276
-	$op = $crit->op;
1277
-
1278
-	[$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1279
-	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1280
-
1281
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1282
-		$boucle->limit = $a11 . ',' . $a21;
1283
-	} else {
1284
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1285
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1286
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1287
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1288
-		$mode = (($op == '/') ? '/' :
1289
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1290
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1291
-		if ($a11 !== 'n' && $a21 !== 'n' && $mode == '++' && $op == ',') {
1292
-			$boucle->limit =
1293
-				(is_numeric($a11) ? "'$a11'" : $a11)
1294
-				. ".','."
1295
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1296
-		} else {
1297
-			calculer_parties($boucles, $idb, $partie, $mode);
1298
-		}
1299
-	}
1273
+    $boucle = &$boucles[$idb];
1274
+    $a1 = $crit->param[0];
1275
+    $a2 = $crit->param[1];
1276
+    $op = $crit->op;
1277
+
1278
+    [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1279
+    [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1280
+
1281
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1282
+        $boucle->limit = $a11 . ',' . $a21;
1283
+    } else {
1284
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1285
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1286
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1287
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1288
+        $mode = (($op == '/') ? '/' :
1289
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1290
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1291
+        if ($a11 !== 'n' && $a21 !== 'n' && $mode == '++' && $op == ',') {
1292
+            $boucle->limit =
1293
+                (is_numeric($a11) ? "'$a11'" : $a11)
1294
+                . ".','."
1295
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1296
+        } else {
1297
+            calculer_parties($boucles, $idb, $partie, $mode);
1298
+        }
1299
+    }
1300 1300
 }
1301 1301
 
1302 1302
 /**
@@ -1324,63 +1324,63 @@  discard block
 block discarded – undo
1324 1324
  * @return void
1325 1325
  **/
1326 1326
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1327
-	$total_parties = $boucles[$id_boucle]->total_parties;
1328
-
1329
-	preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1330
-	[, $op1, $op2] = array_pad($regs, 3, null);
1331
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1332
-	// {1/3}
1333
-	if ($op1 == '/') {
1334
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1335
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1336
-			"($total_parties ? $total_parties : 1)";
1337
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1338
-		$debut = $pmoins1 ? "ceil(($nombre_boucle * $pmoins1)/$totpos);" : 0;
1339
-	} else {
1340
-		// cas {n-1,x}
1341
-		if ($op1 == '-') {
1342
-			$debut = "$nombre_boucle - $debut;";
1343
-		}
1344
-
1345
-		// cas {x,n-1}
1346
-		if ($op2 == '-') {
1347
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1348
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1349
-					($total_parties . ' - 1'));
1350
-		} else {
1351
-			// {x,1} ou {pagination}
1352
-			$fin = '$debut_boucle'
1353
-				. (is_numeric($total_parties) ?
1354
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1355
-					('+' . $total_parties . ' - 1'));
1356
-		}
1357
-
1358
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1359
-		if ($op1 == 'p') {
1360
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1361
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1362
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1363
-		}
1364
-	}
1365
-
1366
-	// Notes :
1367
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1368
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1369
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1370
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1371
-
1372
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1373
-		. '$debut_boucle = ' . $debut . ";\n	"
1374
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1375
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1376
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1377
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1378
-		. "\n\tif (\$debut_boucle>0"
1379
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1380
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1381
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1382
-
1383
-	$boucles[$id_boucle]->partie = "
1327
+    $total_parties = $boucles[$id_boucle]->total_parties;
1328
+
1329
+    preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1330
+    [, $op1, $op2] = array_pad($regs, 3, null);
1331
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1332
+    // {1/3}
1333
+    if ($op1 == '/') {
1334
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1335
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1336
+            "($total_parties ? $total_parties : 1)";
1337
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1338
+        $debut = $pmoins1 ? "ceil(($nombre_boucle * $pmoins1)/$totpos);" : 0;
1339
+    } else {
1340
+        // cas {n-1,x}
1341
+        if ($op1 == '-') {
1342
+            $debut = "$nombre_boucle - $debut;";
1343
+        }
1344
+
1345
+        // cas {x,n-1}
1346
+        if ($op2 == '-') {
1347
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1348
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1349
+                    ($total_parties . ' - 1'));
1350
+        } else {
1351
+            // {x,1} ou {pagination}
1352
+            $fin = '$debut_boucle'
1353
+                . (is_numeric($total_parties) ?
1354
+                    (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1355
+                    ('+' . $total_parties . ' - 1'));
1356
+        }
1357
+
1358
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1359
+        if ($op1 == 'p') {
1360
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1361
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1362
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1363
+        }
1364
+    }
1365
+
1366
+    // Notes :
1367
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1368
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1369
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1370
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1371
+
1372
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1373
+        . '$debut_boucle = ' . $debut . ";\n	"
1374
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1375
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1376
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1377
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1378
+        . "\n\tif (\$debut_boucle>0"
1379
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1380
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1381
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1382
+
1383
+    $boucles[$id_boucle]->partie = "
1384 1384
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1385 1385
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1386 1386
 }
@@ -1397,26 +1397,26 @@  discard block
 block discarded – undo
1397 1397
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1398 1398
  **/
1399 1399
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1400
-	if ($param[0]->type != 'texte') {
1401
-		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1402
-		if (isset($param[1]->texte)) {
1403
-			preg_match(',^\s*(-(\d+))?\s*$,', (string) $param[1]->texte, $m);
1404
-
1405
-			return ["intval($a1)", ((isset($m[2]) && $m[2]) ? $m[2] : 0)];
1406
-		} else {
1407
-			return ["intval($a1)", 0];
1408
-		}
1409
-	} else {
1410
-		preg_match(',^\s*((\d+)|n)\s*(-\s*(\d+)?\s*)?$,', (string) $param[0]->texte, $m);
1411
-		$a1 = $m[1];
1412
-		if (empty($m[3])) {
1413
-			return [$a1, 0];
1414
-		} elseif (!empty($m[4])) {
1415
-			return [$a1, $m[4]];
1416
-		} else {
1417
-			return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1418
-		}
1419
-	}
1400
+    if ($param[0]->type != 'texte') {
1401
+        $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1402
+        if (isset($param[1]->texte)) {
1403
+            preg_match(',^\s*(-(\d+))?\s*$,', (string) $param[1]->texte, $m);
1404
+
1405
+            return ["intval($a1)", ((isset($m[2]) && $m[2]) ? $m[2] : 0)];
1406
+        } else {
1407
+            return ["intval($a1)", 0];
1408
+        }
1409
+    } else {
1410
+        preg_match(',^\s*((\d+)|n)\s*(-\s*(\d+)?\s*)?$,', (string) $param[0]->texte, $m);
1411
+        $a1 = $m[1];
1412
+        if (empty($m[3])) {
1413
+            return [$a1, 0];
1414
+        } elseif (!empty($m[4])) {
1415
+            return [$a1, $m[4]];
1416
+        } else {
1417
+            return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1418
+        }
1419
+    }
1420 1420
 }
1421 1421
 
1422 1422
 
@@ -1443,46 +1443,46 @@  discard block
 block discarded – undo
1443 1443
  *     array : Erreur sur un des critères
1444 1444
  **/
1445 1445
 function calculer_criteres($idb, &$boucles) {
1446
-	$msg = '';
1447
-	$boucle = $boucles[$idb];
1448
-	$table = strtoupper((string) $boucle->type_requete);
1449
-	$serveur = strtolower((string) $boucle->sql_serveur);
1450
-
1451
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1452
-	// s'il y avait une erreur de syntaxe, propager cette info
1453
-	if (!is_array($boucle->criteres)) {
1454
-		return [];
1455
-	}
1456
-
1457
-	foreach ($boucle->criteres as $crit) {
1458
-		$critere = $crit->op;
1459
-		// critere personnalise ?
1460
-		if (
1461
-			(!$serveur
1462
-				|| !function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)
1463
-				&& !function_exists($f .= '_dist')
1464
-				&& !function_exists($f = 'critere_' . $serveur . '_' . $critere)
1465
-				&& !function_exists($f .= '_dist')
1466
-			)
1467
-			&& !function_exists($f = 'critere_' . $table . '_' . $critere)
1468
-			&& !function_exists($f .= '_dist')
1469
-			&& !function_exists($f = 'critere_' . $critere)
1470
-			&& !function_exists($f .= '_dist')
1471
-		) {
1472
-			// fonction critere standard
1473
-			$f = $defaut;
1474
-		}
1475
-		// compile le critere
1476
-		$res = $f($idb, $boucles, $crit);
1477
-
1478
-		// Gestion centralisee des erreurs pour pouvoir propager
1479
-		if (is_array($res)) {
1480
-			$msg = $res;
1481
-			erreur_squelette($msg, $boucle);
1482
-		}
1483
-	}
1484
-
1485
-	return $msg;
1446
+    $msg = '';
1447
+    $boucle = $boucles[$idb];
1448
+    $table = strtoupper((string) $boucle->type_requete);
1449
+    $serveur = strtolower((string) $boucle->sql_serveur);
1450
+
1451
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1452
+    // s'il y avait une erreur de syntaxe, propager cette info
1453
+    if (!is_array($boucle->criteres)) {
1454
+        return [];
1455
+    }
1456
+
1457
+    foreach ($boucle->criteres as $crit) {
1458
+        $critere = $crit->op;
1459
+        // critere personnalise ?
1460
+        if (
1461
+            (!$serveur
1462
+                || !function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)
1463
+                && !function_exists($f .= '_dist')
1464
+                && !function_exists($f = 'critere_' . $serveur . '_' . $critere)
1465
+                && !function_exists($f .= '_dist')
1466
+            )
1467
+            && !function_exists($f = 'critere_' . $table . '_' . $critere)
1468
+            && !function_exists($f .= '_dist')
1469
+            && !function_exists($f = 'critere_' . $critere)
1470
+            && !function_exists($f .= '_dist')
1471
+        ) {
1472
+            // fonction critere standard
1473
+            $f = $defaut;
1474
+        }
1475
+        // compile le critere
1476
+        $res = $f($idb, $boucles, $crit);
1477
+
1478
+        // Gestion centralisee des erreurs pour pouvoir propager
1479
+        if (is_array($res)) {
1480
+            $msg = $res;
1481
+            erreur_squelette($msg, $boucle);
1482
+        }
1483
+    }
1484
+
1485
+    return $msg;
1486 1486
 }
1487 1487
 
1488 1488
 /**
@@ -1497,11 +1497,11 @@  discard block
 block discarded – undo
1497 1497
  * @return string         Code compilé rééchappé
1498 1498
  */
1499 1499
 function kwote($lisp, $serveur = '', $type = '') {
1500
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1501
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1502
-	} else {
1503
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1504
-	}
1500
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1501
+        return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1502
+    } else {
1503
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1504
+    }
1505 1505
 }
1506 1506
 
1507 1507
 
@@ -1520,81 +1520,81 @@  discard block
 block discarded – undo
1520 1520
  * @return void|array
1521 1521
  **/
1522 1522
 function critere_IN_dist($idb, &$boucles, $crit) {
1523
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1524
-	if (!$r) {
1525
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1526
-	}
1527
-	[$arg, $op, $val, $col, $where_complement] = $r;
1528
-
1529
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1530
-
1531
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1532
-	$where = $in;
1533
-	if ($crit->cond) {
1534
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1535
-		$where = ["'?'", $pred, $where, "''"];
1536
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1537
-		$where_complement = ["'?'", $pred, $where_complement, "''"];
1538
-		}
1539
-	}
1540
-	if ($crit->exclus) {
1541
-		if (!preg_match(',^L\d+[.],', (string) $arg)) {
1542
-			$where = ["'NOT'", $where];
1543
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1544
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1545
-		{
1546
-			$where = [
1547
-				"'NOT'",
1548
-				[
1549
-					"'IN'",
1550
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1551
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1552
-				]
1553
-			];
1554
-		}
1555
-	}
1556
-
1557
-	$boucles[$idb]->where[] = $where;
1558
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1559
-	$boucles[$idb]->where[] = $where_complement;
1560
-	}
1523
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1524
+    if (!$r) {
1525
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1526
+    }
1527
+    [$arg, $op, $val, $col, $where_complement] = $r;
1528
+
1529
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1530
+
1531
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1532
+    $where = $in;
1533
+    if ($crit->cond) {
1534
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1535
+        $where = ["'?'", $pred, $where, "''"];
1536
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1537
+        $where_complement = ["'?'", $pred, $where_complement, "''"];
1538
+        }
1539
+    }
1540
+    if ($crit->exclus) {
1541
+        if (!preg_match(',^L\d+[.],', (string) $arg)) {
1542
+            $where = ["'NOT'", $where];
1543
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1544
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1545
+        {
1546
+            $where = [
1547
+                "'NOT'",
1548
+                [
1549
+                    "'IN'",
1550
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1551
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1552
+                ]
1553
+            ];
1554
+        }
1555
+    }
1556
+
1557
+    $boucles[$idb]->where[] = $where;
1558
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1559
+    $boucles[$idb]->where[] = $where_complement;
1560
+    }
1561 1561
 }
1562 1562
 
1563 1563
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1564
-	static $num = [];
1565
-	$descr = $boucles[$idb]->descr;
1566
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1567
-
1568
-	$var = '$in' . $cpt++;
1569
-	$x = "\n\t$var = array();";
1570
-	foreach ($val as $k => $v) {
1571
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", (string) $v, $r)) {
1572
-			// optimiser le traitement des constantes
1573
-			if (is_numeric($r[2])) {
1574
-				$x .= "\n\t$var" . "[]= $r[2];";
1575
-			} else {
1576
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1577
-			}
1578
-		} else {
1579
-			// Pour permettre de passer des tableaux de valeurs
1580
-			// on repere l'utilisation brute de #ENV**{X},
1581
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1582
-			// et on deballe mais en rajoutant l'anti XSS
1583
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1584
-		}
1585
-	}
1586
-
1587
-	$boucles[$idb]->in .= $x;
1588
-
1589
-	// inserer le tri par defaut selon les ordres du IN ...
1590
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1591
-	// et que l'on limite donc strictement aux cas necessaires :
1592
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1593
-	if (!$crit2) {
1594
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1595
-	}
1596
-
1597
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1564
+    static $num = [];
1565
+    $descr = $boucles[$idb]->descr;
1566
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1567
+
1568
+    $var = '$in' . $cpt++;
1569
+    $x = "\n\t$var = array();";
1570
+    foreach ($val as $k => $v) {
1571
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", (string) $v, $r)) {
1572
+            // optimiser le traitement des constantes
1573
+            if (is_numeric($r[2])) {
1574
+                $x .= "\n\t$var" . "[]= $r[2];";
1575
+            } else {
1576
+                $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1577
+            }
1578
+        } else {
1579
+            // Pour permettre de passer des tableaux de valeurs
1580
+            // on repere l'utilisation brute de #ENV**{X},
1581
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1582
+            // et on deballe mais en rajoutant l'anti XSS
1583
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1584
+        }
1585
+    }
1586
+
1587
+    $boucles[$idb]->in .= $x;
1588
+
1589
+    // inserer le tri par defaut selon les ordres du IN ...
1590
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1591
+    // et que l'on limite donc strictement aux cas necessaires :
1592
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1593
+    if (!$crit2) {
1594
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1595
+    }
1596
+
1597
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1598 1598
 }
1599 1599
 
1600 1600
 /**
@@ -1610,22 +1610,22 @@  discard block
 block discarded – undo
1610 1610
  * @return void
1611 1611
  */
1612 1612
 function critere_where_dist($idb, &$boucles, $crit) {
1613
-	$boucle = &$boucles[$idb];
1614
-	if (isset($crit->param[0])) {
1615
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1616
-	} else {
1617
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1618
-	}
1619
-
1620
-	if ($crit->cond) {
1621
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1622
-	}
1623
-
1624
-	if ($crit->not) {
1625
-		$_where = "array('NOT',$_where)";
1626
-	}
1627
-
1628
-	$boucle->where[] = $_where;
1613
+    $boucle = &$boucles[$idb];
1614
+    if (isset($crit->param[0])) {
1615
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1616
+    } else {
1617
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1618
+    }
1619
+
1620
+    if ($crit->cond) {
1621
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1622
+    }
1623
+
1624
+    if ($crit->not) {
1625
+        $_where = "array('NOT',$_where)";
1626
+    }
1627
+
1628
+    $boucle->where[] = $_where;
1629 1629
 }
1630 1630
 
1631 1631
 /**
@@ -1653,31 +1653,31 @@  discard block
 block discarded – undo
1653 1653
  * @return void
1654 1654
  */
1655 1655
 function critere_id__dist($idb, &$boucles, $crit) {
1656
-	/** @var Boucle $boucle */
1657
-	$boucle = $boucles[$idb];
1658
-
1659
-	$champs = lister_champs_id_conditionnel(
1660
-		$boucle->show['table'],
1661
-		$boucle->show,
1662
-		$boucle->sql_serveur
1663
-	);
1664
-
1665
-	// ne pas tenir compte des critères identiques déjà présents.
1666
-	if (!empty($boucle->modificateur['criteres'])) {
1667
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1668
-	}
1669
-	// nous aider en mode debug.
1670
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1671
-	$boucle->modificateur['id_'] = $champs;
1672
-
1673
-	// créer un critère {id_xxx?} de chaque champ retenu
1674
-	foreach ($champs as $champ) {
1675
-		$critere_id_table = new Critere();
1676
-		$critere_id_table->op = $champ;
1677
-		$critere_id_table->cond = true;
1678
-		$critere_id_table->ligne = $crit->ligne;
1679
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1680
-	}
1656
+    /** @var Boucle $boucle */
1657
+    $boucle = $boucles[$idb];
1658
+
1659
+    $champs = lister_champs_id_conditionnel(
1660
+        $boucle->show['table'],
1661
+        $boucle->show,
1662
+        $boucle->sql_serveur
1663
+    );
1664
+
1665
+    // ne pas tenir compte des critères identiques déjà présents.
1666
+    if (!empty($boucle->modificateur['criteres'])) {
1667
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1668
+    }
1669
+    // nous aider en mode debug.
1670
+    $boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1671
+    $boucle->modificateur['id_'] = $champs;
1672
+
1673
+    // créer un critère {id_xxx?} de chaque champ retenu
1674
+    foreach ($champs as $champ) {
1675
+        $critere_id_table = new Critere();
1676
+        $critere_id_table->op = $champ;
1677
+        $critere_id_table->cond = true;
1678
+        $critere_id_table->ligne = $crit->ligne;
1679
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1680
+    }
1681 1681
 }
1682 1682
 
1683 1683
 /**
@@ -1697,74 +1697,74 @@  discard block
 block discarded – undo
1697 1697
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1698 1698
  */
1699 1699
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1700
-	// calculer la description de la table
1701
-	if (!is_array($desc)) {
1702
-		$desc = description_table($table, $serveur);
1703
-	}
1704
-	if (!$desc) {
1705
-		return [];
1706
-	}
1707
-
1708
-	// Les champs id_xx de la table demandée
1709
-	$champs = array_filter(
1710
-		array_keys($desc['field']),
1711
-		fn($champ) => str_starts_with($champ, 'id_') || $champ == 'objet'
1712
-	);
1713
-
1714
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1715
-	if (
1716
-		in_array('id_rubrique', $champs)
1717
-		&& !in_array('id_secteur', $champs)
1718
-	) {
1719
-		$champs[] = 'id_secteur';
1720
-	}
1721
-
1722
-	// On ne fera pas mieux pour les tables d’un autre serveur
1723
-	if ($serveur) {
1724
-		return $champs;
1725
-	}
1726
-
1727
-	$primary = false;
1728
-	$associable = false;
1729
-	include_spip('action/editer_liens');
1730
-
1731
-	if (isset($desc['type'])) {
1732
-		$primary = id_table_objet($desc['type']);
1733
-		$associable = objet_associable($desc['type']);
1734
-	}
1735
-	if (isset($desc['field']['id_objet']) && isset($desc['field']['objet'])) {
1736
-		$associable = true;
1737
-	}
1738
-
1739
-	// liste de toutes les tables principales, sauf la notre
1740
-	$tables = lister_tables_objets_sql();
1741
-	unset($tables[$table]);
1742
-
1743
-	foreach ($tables as $_table => $_desc) {
1744
-		if (
1745
-			$associable
1746
-			|| $primary && array_key_exists($primary, $_desc['field'])
1747
-			|| objet_associable($_desc['type'])
1748
-		) {
1749
-			$champs[] = id_table_objet($_table);
1750
-		}
1751
-	}
1752
-	$champs = array_values(array_unique($champs));
1753
-
1754
-	// Exclusions de certains id
1755
-	$exclusions = pipeline(
1756
-		'exclure_id_conditionnel',
1757
-		[
1758
-			'args' => [
1759
-				'table' => $table,
1760
-				'id_table_objet' => $primary,
1761
-				'associable' => $associable,
1762
-			],
1763
-			'data' => [],
1764
-		]
1765
-	);
1766
-
1767
-	return array_diff($champs, $exclusions);
1700
+    // calculer la description de la table
1701
+    if (!is_array($desc)) {
1702
+        $desc = description_table($table, $serveur);
1703
+    }
1704
+    if (!$desc) {
1705
+        return [];
1706
+    }
1707
+
1708
+    // Les champs id_xx de la table demandée
1709
+    $champs = array_filter(
1710
+        array_keys($desc['field']),
1711
+        fn($champ) => str_starts_with($champ, 'id_') || $champ == 'objet'
1712
+    );
1713
+
1714
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1715
+    if (
1716
+        in_array('id_rubrique', $champs)
1717
+        && !in_array('id_secteur', $champs)
1718
+    ) {
1719
+        $champs[] = 'id_secteur';
1720
+    }
1721
+
1722
+    // On ne fera pas mieux pour les tables d’un autre serveur
1723
+    if ($serveur) {
1724
+        return $champs;
1725
+    }
1726
+
1727
+    $primary = false;
1728
+    $associable = false;
1729
+    include_spip('action/editer_liens');
1730
+
1731
+    if (isset($desc['type'])) {
1732
+        $primary = id_table_objet($desc['type']);
1733
+        $associable = objet_associable($desc['type']);
1734
+    }
1735
+    if (isset($desc['field']['id_objet']) && isset($desc['field']['objet'])) {
1736
+        $associable = true;
1737
+    }
1738
+
1739
+    // liste de toutes les tables principales, sauf la notre
1740
+    $tables = lister_tables_objets_sql();
1741
+    unset($tables[$table]);
1742
+
1743
+    foreach ($tables as $_table => $_desc) {
1744
+        if (
1745
+            $associable
1746
+            || $primary && array_key_exists($primary, $_desc['field'])
1747
+            || objet_associable($_desc['type'])
1748
+        ) {
1749
+            $champs[] = id_table_objet($_table);
1750
+        }
1751
+    }
1752
+    $champs = array_values(array_unique($champs));
1753
+
1754
+    // Exclusions de certains id
1755
+    $exclusions = pipeline(
1756
+        'exclure_id_conditionnel',
1757
+        [
1758
+            'args' => [
1759
+                'table' => $table,
1760
+                'id_table_objet' => $primary,
1761
+                'associable' => $associable,
1762
+            ],
1763
+            'data' => [],
1764
+        ]
1765
+    );
1766
+
1767
+    return array_diff($champs, $exclusions);
1768 1768
 }
1769 1769
 
1770 1770
 /**
@@ -1819,31 +1819,31 @@  discard block
 block discarded – undo
1819 1819
  * @return void
1820 1820
  */
1821 1821
 function critere_tri_dist($idb, &$boucles, $crit) {
1822
-	$boucle = &$boucles[$idb];
1823
-
1824
-	// definition du champ par defaut
1825
-	$_champ_defaut = isset($crit->param[0][0])
1826
-		? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
1827
-		: "''";
1828
-	$_liste_sens_defaut = isset($crit->param[1][0])
1829
-		? calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent)
1830
-		: '1';
1831
-	$_variable = isset($crit->param[2][0])
1832
-		? calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent)
1833
-		: "'$idb'";
1834
-
1835
-	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1836
-
1837
-	$_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1838
-	$_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1839
-
1840
-	$boucle->modificateur['tri_champ'] = $_tri;
1841
-	$boucle->modificateur['tri_sens'] = $_sens;
1842
-	$boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1843
-	$boucle->modificateur['tri_nom'] = $_variable;
1844
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1845
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1846
-	$boucle->hash .= "
1822
+    $boucle = &$boucles[$idb];
1823
+
1824
+    // definition du champ par defaut
1825
+    $_champ_defaut = isset($crit->param[0][0])
1826
+        ? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
1827
+        : "''";
1828
+    $_liste_sens_defaut = isset($crit->param[1][0])
1829
+        ? calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent)
1830
+        : '1';
1831
+    $_variable = isset($crit->param[2][0])
1832
+        ? calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent)
1833
+        : "'$idb'";
1834
+
1835
+    $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1836
+
1837
+    $_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1838
+    $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1839
+
1840
+    $boucle->modificateur['tri_champ'] = $_tri;
1841
+    $boucle->modificateur['tri_sens'] = $_sens;
1842
+    $boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1843
+    $boucle->modificateur['tri_nom'] = $_variable;
1844
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1845
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1846
+    $boucle->hash .= "
1847 1847
 	\$senstri = '';
1848 1848
 	\$tri = $_tri;
1849 1849
 	if (\$tri){
@@ -1851,8 +1851,8 @@  discard block
 block discarded – undo
1851 1851
 		\$senstri = (\$senstri<0)?' DESC':'';
1852 1852
 	};
1853 1853
 	";
1854
-	$boucle->select[] = '".tri_champ_select($tri)."';
1855
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1854
+    $boucle->select[] = '".tri_champ_select($tri)."';
1855
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1856 1856
 }
1857 1857
 
1858 1858
 # criteres de comparaison
@@ -1869,21 +1869,21 @@  discard block
 block discarded – undo
1869 1869
  * @return void|array
1870 1870
  **/
1871 1871
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1872
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1873
-	if ($crit->op == ',' || $crit->op == '/') {
1874
-		calculer_critere_parties($idb, $boucles, $crit);
1875
-		return;
1876
-	}
1877
-
1878
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1879
-	if (!$r) {
1880
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1881
-		#	if (!$crit->cond) {
1882
-		return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1883
-		#	}
1884
-	} else {
1885
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1886
-	}
1872
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1873
+    if ($crit->op == ',' || $crit->op == '/') {
1874
+        calculer_critere_parties($idb, $boucles, $crit);
1875
+        return;
1876
+    }
1877
+
1878
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1879
+    if (!$r) {
1880
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1881
+        #	if (!$crit->cond) {
1882
+        return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1883
+        #	}
1884
+    } else {
1885
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1886
+    }
1887 1887
 }
1888 1888
 
1889 1889
 
@@ -1903,60 +1903,60 @@  discard block
 block discarded – undo
1903 1903
  * @return void
1904 1904
  **/
1905 1905
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1906
-	[$arg, $op, $val, $col, $where_complement] = $args;
1907
-
1908
-	$where = ["'$op'", "'$arg'", $val[0]];
1909
-
1910
-	// inserer la negation (cf !...)
1911
-
1912
-	if ($crit->not) {
1913
-		$where = ["'NOT'", $where];
1914
-	}
1915
-	if ($crit->exclus) {
1916
-		if (!preg_match(',^L\d+[.],', (string) $arg)) {
1917
-			$where = ["'NOT'", $where];
1918
-		} else {
1919
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1920
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1921
-			$where = [
1922
-				"'NOT'",
1923
-				[
1924
-					"'IN'",
1925
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1926
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1927
-				]
1928
-			];
1929
-		}
1930
-	}
1931
-
1932
-	// inserer la condition (cf {lang?})
1933
-	// traiter a part la date, elle est mise d'office par SPIP,
1934
-	if ($crit->cond) {
1935
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1936
-		if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['" . $col . "']") {
1937
-			$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1938
-		}
1939
-
1940
-		if ($op === '=' && !$crit->not) {
1941
-			$where = [
1942
-				"'?'",
1943
-				"(is_array($pred))",
1944
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1945
-				$where
1946
-			];
1947
-		}
1948
-		$where = ["'?'", "!is_whereable($pred)", "''", $where];
1949
-		if ($where_complement) {
1950
-			// condition annexe du type "AND (objet='article')"
1951
-			$where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1952
-		}
1953
-	}
1954
-
1955
-	$boucles[$idb]->where[] = $where;
1956
-	if ($where_complement) {
1957
-		// condition annexe du type "AND (objet='article')"
1958
-		$boucles[$idb]->where[] = $where_complement;
1959
-	}
1906
+    [$arg, $op, $val, $col, $where_complement] = $args;
1907
+
1908
+    $where = ["'$op'", "'$arg'", $val[0]];
1909
+
1910
+    // inserer la negation (cf !...)
1911
+
1912
+    if ($crit->not) {
1913
+        $where = ["'NOT'", $where];
1914
+    }
1915
+    if ($crit->exclus) {
1916
+        if (!preg_match(',^L\d+[.],', (string) $arg)) {
1917
+            $where = ["'NOT'", $where];
1918
+        } else {
1919
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1920
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1921
+            $where = [
1922
+                "'NOT'",
1923
+                [
1924
+                    "'IN'",
1925
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1926
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1927
+                ]
1928
+            ];
1929
+        }
1930
+    }
1931
+
1932
+    // inserer la condition (cf {lang?})
1933
+    // traiter a part la date, elle est mise d'office par SPIP,
1934
+    if ($crit->cond) {
1935
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1936
+        if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['" . $col . "']") {
1937
+            $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1938
+        }
1939
+
1940
+        if ($op === '=' && !$crit->not) {
1941
+            $where = [
1942
+                "'?'",
1943
+                "(is_array($pred))",
1944
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1945
+                $where
1946
+            ];
1947
+        }
1948
+        $where = ["'?'", "!is_whereable($pred)", "''", $where];
1949
+        if ($where_complement) {
1950
+            // condition annexe du type "AND (objet='article')"
1951
+            $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1952
+        }
1953
+    }
1954
+
1955
+    $boucles[$idb]->where[] = $where;
1956
+    if ($where_complement) {
1957
+        // condition annexe du type "AND (objet='article')"
1958
+        $boucles[$idb]->where[] = $where_complement;
1959
+    }
1960 1960
 }
1961 1961
 
1962 1962
 
@@ -1997,160 +1997,160 @@  discard block
 block discarded – undo
1997 1997
  **/
1998 1998
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1999 1999
 
2000
-	$boucle = &$boucles[$idb];
2001
-	$type = $boucle->type_requete;
2002
-	$table = $boucle->id_table;
2003
-	$desc = $boucle->show;
2004
-	$col_vraie = null;
2005
-
2006
-	[$fct, $col, $op, $val, $args_sql] =
2007
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2008
-
2009
-	$col_alias = $col;
2010
-	$where_complement = false;
2011
-
2012
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2013
-	if ($col == 'id_enfant') {
2014
-		$col = $boucle->primary;
2015
-	}
2016
-
2017
-	// Cas particulier : id_parent => verifier les exceptions de tables
2018
-	if (
2019
-		in_array($col, ['id_parent', 'id_secteur'])
2020
-		&& isset($GLOBALS['exceptions_des_tables'][$table][$col]) || isset($GLOBALS['exceptions_des_tables'][$table][$col]) && is_string($GLOBALS['exceptions_des_tables'][$table][$col])
2021
-	) {
2022
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2023
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2024
-	else {
2025
-		if ($col == 'id_secteur' && ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2026
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2027
-		}
2028
-
2029
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2030
-		// sauf si exception declaree : sauter cette etape
2031
-		else {
2032
-			if (
2033
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2034
-				&& !isset($GLOBALS['exceptions_des_jointures'][$col])
2035
-				&& count(trouver_champs_decomposes($col, $desc)) > 1
2036
-			) {
2037
-				$e = decompose_champ_id_objet($col);
2038
-				$col = array_shift($e);
2039
-				$where_complement = primary_doublee($e, $table);
2040
-			} // Cas particulier : expressions de date
2041
-			else {
2042
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2043
-					[$col, $col_vraie] = $c;
2044
-					$table = '';
2045
-				} // table explicitée {mots.titre}
2046
-				else {
2047
-					if (preg_match('/^(.*)\.(.*)$/', (string) $col, $r)) {
2048
-						[, $table, $col] = $r;
2049
-						$col_alias = $col;
2050
-
2051
-						$trouver_table = charger_fonction('trouver_table', 'base');
2052
-						if (
2053
-							($desc = $trouver_table($table, $boucle->sql_serveur))
2054
-							&& isset($desc['field'][$col])
2055
-							&& ($cle = array_search($desc['table'], $boucle->from))
2056
-						) {
2057
-							$table = $cle;
2058
-						} else {
2059
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond || $op != '='));
2060
-						}
2061
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2062
-						if (!$table) {
2063
-							return '';
2064
-						}
2065
-					}
2066
-					// si le champ n'est pas trouvé dans la table,
2067
-					// on cherche si une jointure peut l'obtenir
2068
-					elseif (@!array_key_exists($col, $desc['field'])) {
2069
-						// Champ joker * des iterateurs DATA qui accepte tout
2070
-						if (@array_key_exists('*', $desc['field'])) {
2071
-							$desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2072
-						}
2073
-						else {
2074
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2075
-							if (!$r) {
2076
-								return '';
2077
-							}
2078
-							[$col, $col_alias, $table, $where_complement, $desc] = $r;
2079
-						}
2080
-					}
2081
-				}
2082
-			}
2083
-		}
2084
-	}
2085
-
2086
-	$col_vraie = ($col_vraie ?: $col);
2087
-	// Dans tous les cas,
2088
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2089
-	// et passer dans sql_quote avec le type si connu
2090
-	// et int sinon si la valeur est numerique
2091
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2092
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2093
-	if ($op == '=' || in_array($op, $GLOBALS['table_criteres_infixes'])) {
2094
-		$type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2095
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2096
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2097
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", (string) $val[0], $r)) {
2098
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2099
-		}
2100
-		// sinon expliciter les
2101
-		// sql_quote(truc) en sql_quote(truc,'',type)
2102
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2103
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2104
-		// sans toucher aux
2105
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2106
-		// sql_quote(truc,'','varchar')
2107
-		elseif (
2108
-			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', (string) $val[0], $r)
2109
-			&& (!isset($r[3]) || !$r[3] || !trim($r[3], ", '"))
2110
-		) {
2111
-			$r = $r[1]
2112
-				. ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
2113
-				. ",'" . addslashes((string) $type_cast_quote) . "'";
2114
-			$val[0] = "sql_quote($r)";
2115
-		}
2116
-		elseif (
2117
-			str_contains((string) $val[0], '@@defaultcast@@')
2118
-			&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2119
-		) {
2120
-			$val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'" . addslashes((string) $type_cast_quote) . "')";
2121
-		}
2122
-	}
2123
-
2124
-	if (
2125
-		str_contains((string) $val[0], '@@defaultcast@@')
2126
-		&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2127
-	) {
2128
-		$val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'char')";
2129
-	}
2130
-
2131
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2132
-	// leurs requetes par defaut, notamment le champ statut
2133
-	// Ne pas confondre champs de la table principale et des jointures
2134
-	if ($table === $boucle->id_table) {
2135
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2136
-		if ($col_alias != $col_vraie) {
2137
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2138
-		}
2139
-	}
2140
-
2141
-	// inserer le nom de la table SQL devant le nom du champ
2142
-	if ($table) {
2143
-		$arg = $col[0] == '`' ? "$table." . substr((string) $col, 1, -1) : "$table.$col";
2144
-	} else {
2145
-		$arg = $col;
2146
-	}
2147
-
2148
-	// inserer la fonction SQL
2149
-	if ($fct) {
2150
-		$arg = "$fct($arg$args_sql)";
2151
-	}
2152
-
2153
-	return [$arg, $op, $val, $col_alias, $where_complement];
2000
+    $boucle = &$boucles[$idb];
2001
+    $type = $boucle->type_requete;
2002
+    $table = $boucle->id_table;
2003
+    $desc = $boucle->show;
2004
+    $col_vraie = null;
2005
+
2006
+    [$fct, $col, $op, $val, $args_sql] =
2007
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2008
+
2009
+    $col_alias = $col;
2010
+    $where_complement = false;
2011
+
2012
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2013
+    if ($col == 'id_enfant') {
2014
+        $col = $boucle->primary;
2015
+    }
2016
+
2017
+    // Cas particulier : id_parent => verifier les exceptions de tables
2018
+    if (
2019
+        in_array($col, ['id_parent', 'id_secteur'])
2020
+        && isset($GLOBALS['exceptions_des_tables'][$table][$col]) || isset($GLOBALS['exceptions_des_tables'][$table][$col]) && is_string($GLOBALS['exceptions_des_tables'][$table][$col])
2021
+    ) {
2022
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2023
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2024
+    else {
2025
+        if ($col == 'id_secteur' && ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2026
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2027
+        }
2028
+
2029
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2030
+        // sauf si exception declaree : sauter cette etape
2031
+        else {
2032
+            if (
2033
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2034
+                && !isset($GLOBALS['exceptions_des_jointures'][$col])
2035
+                && count(trouver_champs_decomposes($col, $desc)) > 1
2036
+            ) {
2037
+                $e = decompose_champ_id_objet($col);
2038
+                $col = array_shift($e);
2039
+                $where_complement = primary_doublee($e, $table);
2040
+            } // Cas particulier : expressions de date
2041
+            else {
2042
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2043
+                    [$col, $col_vraie] = $c;
2044
+                    $table = '';
2045
+                } // table explicitée {mots.titre}
2046
+                else {
2047
+                    if (preg_match('/^(.*)\.(.*)$/', (string) $col, $r)) {
2048
+                        [, $table, $col] = $r;
2049
+                        $col_alias = $col;
2050
+
2051
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2052
+                        if (
2053
+                            ($desc = $trouver_table($table, $boucle->sql_serveur))
2054
+                            && isset($desc['field'][$col])
2055
+                            && ($cle = array_search($desc['table'], $boucle->from))
2056
+                        ) {
2057
+                            $table = $cle;
2058
+                        } else {
2059
+                            $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond || $op != '='));
2060
+                        }
2061
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2062
+                        if (!$table) {
2063
+                            return '';
2064
+                        }
2065
+                    }
2066
+                    // si le champ n'est pas trouvé dans la table,
2067
+                    // on cherche si une jointure peut l'obtenir
2068
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2069
+                        // Champ joker * des iterateurs DATA qui accepte tout
2070
+                        if (@array_key_exists('*', $desc['field'])) {
2071
+                            $desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2072
+                        }
2073
+                        else {
2074
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2075
+                            if (!$r) {
2076
+                                return '';
2077
+                            }
2078
+                            [$col, $col_alias, $table, $where_complement, $desc] = $r;
2079
+                        }
2080
+                    }
2081
+                }
2082
+            }
2083
+        }
2084
+    }
2085
+
2086
+    $col_vraie = ($col_vraie ?: $col);
2087
+    // Dans tous les cas,
2088
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2089
+    // et passer dans sql_quote avec le type si connu
2090
+    // et int sinon si la valeur est numerique
2091
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2092
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2093
+    if ($op == '=' || in_array($op, $GLOBALS['table_criteres_infixes'])) {
2094
+        $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2095
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2096
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2097
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", (string) $val[0], $r)) {
2098
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2099
+        }
2100
+        // sinon expliciter les
2101
+        // sql_quote(truc) en sql_quote(truc,'',type)
2102
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2103
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2104
+        // sans toucher aux
2105
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2106
+        // sql_quote(truc,'','varchar')
2107
+        elseif (
2108
+            preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', (string) $val[0], $r)
2109
+            && (!isset($r[3]) || !$r[3] || !trim($r[3], ", '"))
2110
+        ) {
2111
+            $r = $r[1]
2112
+                . ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
2113
+                . ",'" . addslashes((string) $type_cast_quote) . "'";
2114
+            $val[0] = "sql_quote($r)";
2115
+        }
2116
+        elseif (
2117
+            str_contains((string) $val[0], '@@defaultcast@@')
2118
+            && preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2119
+        ) {
2120
+            $val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'" . addslashes((string) $type_cast_quote) . "')";
2121
+        }
2122
+    }
2123
+
2124
+    if (
2125
+        str_contains((string) $val[0], '@@defaultcast@@')
2126
+        && preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2127
+    ) {
2128
+        $val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'char')";
2129
+    }
2130
+
2131
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2132
+    // leurs requetes par defaut, notamment le champ statut
2133
+    // Ne pas confondre champs de la table principale et des jointures
2134
+    if ($table === $boucle->id_table) {
2135
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2136
+        if ($col_alias != $col_vraie) {
2137
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2138
+        }
2139
+    }
2140
+
2141
+    // inserer le nom de la table SQL devant le nom du champ
2142
+    if ($table) {
2143
+        $arg = $col[0] == '`' ? "$table." . substr((string) $col, 1, -1) : "$table.$col";
2144
+    } else {
2145
+        $arg = $col;
2146
+    }
2147
+
2148
+    // inserer la fonction SQL
2149
+    if ($fct) {
2150
+        $arg = "$fct($arg$args_sql)";
2151
+    }
2152
+
2153
+    return [$arg, $op, $val, $col_alias, $where_complement];
2154 2154
 }
2155 2155
 
2156 2156
 
@@ -2179,75 +2179,75 @@  discard block
 block discarded – undo
2179 2179
  **/
2180 2180
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2181 2181
 
2182
-	$where = '';
2183
-
2184
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2185
-	// gestion par les plugins des jointures tordues
2186
-	// pas automatiques mais necessaires
2187
-	$table_sql = table_objet_sql($table);
2188
-	if (
2189
-		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2190
-		&& is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2191
-		&& (
2192
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2193
-			|| isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2194
-		)
2195
-	) {
2196
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2197
-		$index = $t[$col] ?? $t[''] ?? [];
2198
-
2199
-		if ((is_countable($index) ? count($index) : 0) == 3) {
2200
-			[$t, $col, $calculer_critere_externe] = $index;
2201
-		} elseif ((is_countable($index) ? count($index) : 0) == 2) {
2202
-			[$t, $col] = $t[$col];
2203
-		} elseif ((is_countable($index) ? count($index) : 0) == 1) {
2204
-			[$calculer_critere_externe] = $index;
2205
-			$t = $table;
2206
-		} else {
2207
-			$t = '';
2208
-		} // jointure non declaree. La trouver.
2209
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2210
-		[$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2211
-	} else {
2212
-		$t = '';
2213
-	} // jointure non declaree. La trouver.
2214
-
2215
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2216
-
2217
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2218
-	// permet de forcer une table de lien quand il y a ambiguite
2219
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2220
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2221
-	$table = '';
2222
-	if ($boucle->jointures_explicites) {
2223
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2224
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond || $op != '='), $t);
2225
-	}
2226
-
2227
-	// et sinon on cherche parmi toutes les jointures declarees
2228
-	if (!$table) {
2229
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond || $op != '='), $t);
2230
-	}
2231
-
2232
-	if (!$table) {
2233
-		return '';
2234
-	}
2235
-
2236
-	// il ne reste plus qu'a trouver le champ dans les from
2237
-	[$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2238
-
2239
-	if ((is_countable($cle) ? count($cle) : 0) > 1 || reset($cle) !== $col) {
2240
-		$col_alias = $col; // id_article devient juste le nom d'origine
2241
-		if ((is_countable($cle) ? count($cle) : 0) > 1 && reset($cle) == 'id_objet') {
2242
-			$e = decompose_champ_id_objet($col);
2243
-			$col = array_shift($e);
2244
-			$where = primary_doublee($e, $table);
2245
-		} else {
2246
-			$col = reset($cle);
2247
-		}
2248
-	}
2249
-
2250
-	return [$col, $col_alias, $table, $where, $desc];
2182
+    $where = '';
2183
+
2184
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2185
+    // gestion par les plugins des jointures tordues
2186
+    // pas automatiques mais necessaires
2187
+    $table_sql = table_objet_sql($table);
2188
+    if (
2189
+        isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2190
+        && is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2191
+        && (
2192
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2193
+            || isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2194
+        )
2195
+    ) {
2196
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2197
+        $index = $t[$col] ?? $t[''] ?? [];
2198
+
2199
+        if ((is_countable($index) ? count($index) : 0) == 3) {
2200
+            [$t, $col, $calculer_critere_externe] = $index;
2201
+        } elseif ((is_countable($index) ? count($index) : 0) == 2) {
2202
+            [$t, $col] = $t[$col];
2203
+        } elseif ((is_countable($index) ? count($index) : 0) == 1) {
2204
+            [$calculer_critere_externe] = $index;
2205
+            $t = $table;
2206
+        } else {
2207
+            $t = '';
2208
+        } // jointure non declaree. La trouver.
2209
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2210
+        [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2211
+    } else {
2212
+        $t = '';
2213
+    } // jointure non declaree. La trouver.
2214
+
2215
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2216
+
2217
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2218
+    // permet de forcer une table de lien quand il y a ambiguite
2219
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2220
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2221
+    $table = '';
2222
+    if ($boucle->jointures_explicites) {
2223
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2224
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond || $op != '='), $t);
2225
+    }
2226
+
2227
+    // et sinon on cherche parmi toutes les jointures declarees
2228
+    if (!$table) {
2229
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond || $op != '='), $t);
2230
+    }
2231
+
2232
+    if (!$table) {
2233
+        return '';
2234
+    }
2235
+
2236
+    // il ne reste plus qu'a trouver le champ dans les from
2237
+    [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2238
+
2239
+    if ((is_countable($cle) ? count($cle) : 0) > 1 || reset($cle) !== $col) {
2240
+        $col_alias = $col; // id_article devient juste le nom d'origine
2241
+        if ((is_countable($cle) ? count($cle) : 0) > 1 && reset($cle) == 'id_objet') {
2242
+            $e = decompose_champ_id_objet($col);
2243
+            $col = array_shift($e);
2244
+            $where = primary_doublee($e, $table);
2245
+        } else {
2246
+            $col = reset($cle);
2247
+        }
2248
+    }
2249
+
2250
+    return [$col, $col_alias, $table, $where, $desc];
2251 2251
 }
2252 2252
 
2253 2253
 
@@ -2268,10 +2268,10 @@  discard block
 block discarded – undo
2268 2268
  *     - valeur
2269 2269
  **/
2270 2270
 function primary_doublee($decompose, $table) {
2271
-	$e1 = reset($decompose);
2272
-	$e2 = "sql_quote('" . end($decompose) . "')";
2271
+    $e1 = reset($decompose);
2272
+    $e2 = "sql_quote('" . end($decompose) . "')";
2273 2273
 
2274
-	return ["'='", "'$table." . $e1 . "'", $e2];
2274
+    return ["'='", "'$table." . $e1 . "'", $e2];
2275 2275
 }
2276 2276
 
2277 2277
 /**
@@ -2302,56 +2302,56 @@  discard block
 block discarded – undo
2302 2302
  *     Vide sinon.
2303 2303
  */
2304 2304
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2305
-	// si on demande un truc du genre spip_mots
2306
-	// avec aussi spip_mots_liens dans les jointures dispo
2307
-	// et qu'on est la
2308
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2309
-	if (
2310
-		$checkarrivee
2311
-		&& is_string($checkarrivee)
2312
-		&& ($a = table_objet($checkarrivee))
2313
-		&& in_array($a . '_liens', $joints)
2314
-		&& ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee))
2315
-	) {
2316
-		return $res;
2317
-	}
2318
-	foreach ($joints as $joint) {
2319
-		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2320
-			// alias de table dans le from
2321
-			$t = array_search($arrivee[0], $boucle->from);
2322
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2323
-			$cols = $arrivee[2];
2324
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2325
-			if ((is_countable($cols) ? count($cols) : 0) > 2) {
2326
-				array_pop($cols);
2327
-			}
2328
-			if ($t) {
2329
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2330
-				$joindre = false;
2331
-				foreach ($cols as $col) {
2332
-					$c = '/\b' . $t . ".$col" . '\b/';
2333
-					if (trouver_champ($c, $boucle->where)) {
2334
-						$joindre = true;
2335
-					} else {
2336
-						// mais ca peut etre dans le FIELD pour le Having
2337
-						$c = "/FIELD.$t" . ".$col,/";
2338
-						if (trouver_champ($c, $boucle->select)) {
2339
-							$joindre = true;
2340
-						}
2341
-					}
2342
-				}
2343
-				if (!$joindre) {
2344
-					return $t;
2345
-				}
2346
-			}
2347
-			array_pop($arrivee);
2348
-			if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2349
-				return $res;
2350
-			}
2351
-		}
2352
-	}
2353
-
2354
-	return '';
2305
+    // si on demande un truc du genre spip_mots
2306
+    // avec aussi spip_mots_liens dans les jointures dispo
2307
+    // et qu'on est la
2308
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2309
+    if (
2310
+        $checkarrivee
2311
+        && is_string($checkarrivee)
2312
+        && ($a = table_objet($checkarrivee))
2313
+        && in_array($a . '_liens', $joints)
2314
+        && ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee))
2315
+    ) {
2316
+        return $res;
2317
+    }
2318
+    foreach ($joints as $joint) {
2319
+        if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2320
+            // alias de table dans le from
2321
+            $t = array_search($arrivee[0], $boucle->from);
2322
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2323
+            $cols = $arrivee[2];
2324
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2325
+            if ((is_countable($cols) ? count($cols) : 0) > 2) {
2326
+                array_pop($cols);
2327
+            }
2328
+            if ($t) {
2329
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2330
+                $joindre = false;
2331
+                foreach ($cols as $col) {
2332
+                    $c = '/\b' . $t . ".$col" . '\b/';
2333
+                    if (trouver_champ($c, $boucle->where)) {
2334
+                        $joindre = true;
2335
+                    } else {
2336
+                        // mais ca peut etre dans le FIELD pour le Having
2337
+                        $c = "/FIELD.$t" . ".$col,/";
2338
+                        if (trouver_champ($c, $boucle->select)) {
2339
+                            $joindre = true;
2340
+                        }
2341
+                    }
2342
+                }
2343
+                if (!$joindre) {
2344
+                    return $t;
2345
+                }
2346
+            }
2347
+            array_pop($arrivee);
2348
+            if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2349
+                return $res;
2350
+            }
2351
+        }
2352
+    }
2353
+
2354
+    return '';
2355 2355
 }
2356 2356
 
2357 2357
 /**
@@ -2377,35 +2377,35 @@  discard block
 block discarded – undo
2377 2377
  *     Alias de la table de jointure (Lx)
2378 2378
  */
2379 2379
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2380
-	$primary_arrivee = id_table_objet($checkarrivee);
2381
-
2382
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2383
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2384
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2385
-
2386
-	if (!$intermediaire || !$arrivee) {
2387
-		return '';
2388
-	}
2389
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2390
-	array_pop($arrivee); // enlever la cle en 3eme argument
2391
-
2392
-	$res = fabrique_jointures(
2393
-		$boucle,
2394
-		[
2395
-			[
2396
-				$boucle->id_table,
2397
-				$intermediaire,
2398
-				[id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2399
-			],
2400
-			[reset($intermediaire), $arrivee, $primary_arrivee]
2401
-		],
2402
-		$cond,
2403
-		$desc,
2404
-		$boucle->id_table,
2405
-		[$col]
2406
-	);
2407
-
2408
-	return $res;
2380
+    $primary_arrivee = id_table_objet($checkarrivee);
2381
+
2382
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2383
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2384
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2385
+
2386
+    if (!$intermediaire || !$arrivee) {
2387
+        return '';
2388
+    }
2389
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2390
+    array_pop($arrivee); // enlever la cle en 3eme argument
2391
+
2392
+    $res = fabrique_jointures(
2393
+        $boucle,
2394
+        [
2395
+            [
2396
+                $boucle->id_table,
2397
+                $intermediaire,
2398
+                [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2399
+            ],
2400
+            [reset($intermediaire), $arrivee, $primary_arrivee]
2401
+        ],
2402
+        $cond,
2403
+        $desc,
2404
+        $boucle->id_table,
2405
+        [$col]
2406
+    );
2407
+
2408
+    return $res;
2409 2409
 }
2410 2410
 
2411 2411
 
@@ -2422,17 +2422,17 @@  discard block
 block discarded – undo
2422 2422
  *     false sinon.
2423 2423
  **/
2424 2424
 function trouver_champ($champ, $where) {
2425
-	if (!is_array($where)) {
2426
-		return preg_match($champ, $where);
2427
-	} else {
2428
-		foreach ($where as $clause) {
2429
-			if (trouver_champ($champ, $clause)) {
2430
-				return true;
2431
-			}
2432
-		}
2433
-
2434
-		return false;
2435
-	}
2425
+    if (!is_array($where)) {
2426
+        return preg_match($champ, $where);
2427
+    } else {
2428
+        foreach ($where as $clause) {
2429
+            if (trouver_champ($champ, $clause)) {
2430
+                return true;
2431
+            }
2432
+        }
2433
+
2434
+        return false;
2435
+    }
2436 2436
 }
2437 2437
 
2438 2438
 
@@ -2458,128 +2458,128 @@  discard block
 block discarded – undo
2458 2458
  *     - string $args_sql  Suite des arguments du critère. ?
2459 2459
  **/
2460 2460
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2461
-	// cas d'une valeur comparee a elle-meme ou son referent
2462
-	if ((is_countable($crit->param) ? count($crit->param) : 0) == 0) {
2463
-		$op = '=';
2464
-		$col = $val = $crit->op;
2465
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2466
-			$val = $r[2];
2467
-		}
2468
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2469
-		if ($val == 'lang') {
2470
-			$val = [kwote('$GLOBALS[\'spip_lang\']')];
2471
-		} else {
2472
-			$defaut = null;
2473
-			if ($val == 'id_parent') {
2474
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2475
-				// de la boucle superieure.... faudrait verifier qu'il existe
2476
-				// pour eviter l'erreur SQL
2477
-				$val = $boucles[$idb]->primary;
2478
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2479
-				$defaut = "(\$Pile[0]['id_parent'] ?? null)";
2480
-			} elseif ($val == 'id_enfant') {
2481
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2482
-				// de la boucle superieure
2483
-				$val = 'id_parent';
2484
-			} elseif ($crit->cond && ($col == 'date' || $col == 'date_redac')) {
2485
-				// un critere conditionnel sur date est traite a part
2486
-				// car la date est mise d'office par SPIP,
2487
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2488
-			}
2489
-
2490
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2491
-			$val = [kwote($val)];
2492
-		}
2493
-	} else {
2494
-		// comparaison explicite
2495
-		// le phraseur impose que le premier param soit du texte
2496
-		$params = $crit->param;
2497
-		$op = $crit->op;
2498
-		if ($op == '==') {
2499
-			$op = 'REGEXP';
2500
-		}
2501
-		$col = array_shift($params);
2502
-		$col = $col[0]->texte;
2503
-
2504
-		$val = [];
2505
-		$parent = $boucles[$idb]->id_parent;
2506
-
2507
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2508
-		// celui ne sachant pas ce qu'est un critere infixe
2509
-		// et a fortiori son 2e operande qu'entoure " ou '
2510
-		if (
2511
-			(is_countable($params) ? count($params) : 0) == 1
2512
-			&& (is_countable($params[0]) ? count($params[0]) : 0) == 3
2513
-			&& $params[0][0]->type == 'texte'
2514
-			&& $params[0][2]->type == 'texte'
2515
-			&& ($p = $params[0][0]->texte) == $params[0][2]->texte
2516
-			&& ($p == "'" || $p == '"')
2517
-			&& $params[0][1]->type == 'champ'
2518
-		) {
2519
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2520
-		} else {
2521
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2522
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2523
-				$val[] = strcasecmp($op, 'IN') == 0
2524
-					? $a
2525
-					// toujours quoter en char ici
2526
-					: kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2527
-			}
2528
-		}
2529
-	}
2530
-
2531
-	$fct = $args_sql = '';
2532
-	// fonction SQL ?
2533
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2534
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', (string) $col, $m)) {
2535
-		$fct = $m[1];
2536
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2537
-		$col = $a[1];
2538
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2539
-			$col = $m[1];
2540
-			$args_sql = $m[2];
2541
-		}
2542
-		$args_sql .= $a[2];
2543
-	}
2544
-
2545
-	return [$fct, $col, $op, $val, $args_sql];
2461
+    // cas d'une valeur comparee a elle-meme ou son referent
2462
+    if ((is_countable($crit->param) ? count($crit->param) : 0) == 0) {
2463
+        $op = '=';
2464
+        $col = $val = $crit->op;
2465
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2466
+            $val = $r[2];
2467
+        }
2468
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2469
+        if ($val == 'lang') {
2470
+            $val = [kwote('$GLOBALS[\'spip_lang\']')];
2471
+        } else {
2472
+            $defaut = null;
2473
+            if ($val == 'id_parent') {
2474
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2475
+                // de la boucle superieure.... faudrait verifier qu'il existe
2476
+                // pour eviter l'erreur SQL
2477
+                $val = $boucles[$idb]->primary;
2478
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2479
+                $defaut = "(\$Pile[0]['id_parent'] ?? null)";
2480
+            } elseif ($val == 'id_enfant') {
2481
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2482
+                // de la boucle superieure
2483
+                $val = 'id_parent';
2484
+            } elseif ($crit->cond && ($col == 'date' || $col == 'date_redac')) {
2485
+                // un critere conditionnel sur date est traite a part
2486
+                // car la date est mise d'office par SPIP,
2487
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2488
+            }
2489
+
2490
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2491
+            $val = [kwote($val)];
2492
+        }
2493
+    } else {
2494
+        // comparaison explicite
2495
+        // le phraseur impose que le premier param soit du texte
2496
+        $params = $crit->param;
2497
+        $op = $crit->op;
2498
+        if ($op == '==') {
2499
+            $op = 'REGEXP';
2500
+        }
2501
+        $col = array_shift($params);
2502
+        $col = $col[0]->texte;
2503
+
2504
+        $val = [];
2505
+        $parent = $boucles[$idb]->id_parent;
2506
+
2507
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2508
+        // celui ne sachant pas ce qu'est un critere infixe
2509
+        // et a fortiori son 2e operande qu'entoure " ou '
2510
+        if (
2511
+            (is_countable($params) ? count($params) : 0) == 1
2512
+            && (is_countable($params[0]) ? count($params[0]) : 0) == 3
2513
+            && $params[0][0]->type == 'texte'
2514
+            && $params[0][2]->type == 'texte'
2515
+            && ($p = $params[0][0]->texte) == $params[0][2]->texte
2516
+            && ($p == "'" || $p == '"')
2517
+            && $params[0][1]->type == 'champ'
2518
+        ) {
2519
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2520
+        } else {
2521
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2522
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2523
+                $val[] = strcasecmp($op, 'IN') == 0
2524
+                    ? $a
2525
+                    // toujours quoter en char ici
2526
+                    : kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2527
+            }
2528
+        }
2529
+    }
2530
+
2531
+    $fct = $args_sql = '';
2532
+    // fonction SQL ?
2533
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2534
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', (string) $col, $m)) {
2535
+        $fct = $m[1];
2536
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2537
+        $col = $a[1];
2538
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2539
+            $col = $m[1];
2540
+            $args_sql = $m[2];
2541
+        }
2542
+        $args_sql .= $a[2];
2543
+    }
2544
+
2545
+    return [$fct, $col, $op, $val, $args_sql];
2546 2546
 }
2547 2547
 
2548 2548
 // compatibilite ancienne version
2549 2549
 
2550 2550
 function calculer_vieux_in($params) {
2551
-	$deb = $params[0][0];
2552
-	$k = (is_countable($params) ? count($params) : 0) - 1;
2553
-	$last = $params[$k];
2554
-	$j = (is_countable($last) ? count($last) : 0) - 1;
2555
-	$last = $last[$j];
2556
-	$n = isset($last->texte) ? strlen((string) $last->texte) : 0;
2557
-
2558
-	if (
2559
-		!((isset($deb->texte[0]) && $deb->texte[0] == '(')
2560
-		&& (isset($last->texte[$n - 1]) && $last->texte[$n - 1] == ')'))
2561
-	) {
2562
-		return $params;
2563
-	}
2564
-	$params[0][0]->texte = substr((string) $deb->texte, 1);
2565
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2566
-	$last = $params[$k][$j];
2567
-	$n = strlen((string) $last->texte);
2568
-	$params[$k][$j]->texte = substr((string) $last->texte, 0, $n - 1);
2569
-	$newp = [];
2570
-	foreach ($params as $v) {
2571
-		if ($v[0]->type != 'texte') {
2572
-			$newp[] = $v;
2573
-		} else {
2574
-			foreach (explode(',', (string) $v[0]->texte) as $x) {
2575
-				$t = new Texte();
2576
-				$t->texte = $x;
2577
-				$newp[] = [$t];
2578
-			}
2579
-		}
2580
-	}
2581
-
2582
-	return $newp;
2551
+    $deb = $params[0][0];
2552
+    $k = (is_countable($params) ? count($params) : 0) - 1;
2553
+    $last = $params[$k];
2554
+    $j = (is_countable($last) ? count($last) : 0) - 1;
2555
+    $last = $last[$j];
2556
+    $n = isset($last->texte) ? strlen((string) $last->texte) : 0;
2557
+
2558
+    if (
2559
+        !((isset($deb->texte[0]) && $deb->texte[0] == '(')
2560
+        && (isset($last->texte[$n - 1]) && $last->texte[$n - 1] == ')'))
2561
+    ) {
2562
+        return $params;
2563
+    }
2564
+    $params[0][0]->texte = substr((string) $deb->texte, 1);
2565
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2566
+    $last = $params[$k][$j];
2567
+    $n = strlen((string) $last->texte);
2568
+    $params[$k][$j]->texte = substr((string) $last->texte, 0, $n - 1);
2569
+    $newp = [];
2570
+    foreach ($params as $v) {
2571
+        if ($v[0]->type != 'texte') {
2572
+            $newp[] = $v;
2573
+        } else {
2574
+            foreach (explode(',', (string) $v[0]->texte) as $x) {
2575
+                $t = new Texte();
2576
+                $t->texte = $x;
2577
+                $newp[] = [$t];
2578
+            }
2579
+        }
2580
+    }
2581
+
2582
+    return $newp;
2583 2583
 }
2584 2584
 
2585 2585
 /**
@@ -2598,91 +2598,91 @@  discard block
 block discarded – undo
2598 2598
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2599 2599
  **/
2600 2600
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2601
-	if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2602
-		return '';
2603
-	}
2604
-
2605
-	$boucle = $boucles[$idb];
2606
-	$table = $boucle->show;
2607
-
2608
-	// si c'est une colonne de la table, ne rien faire
2609
-	if (isset($table['field'][$col])) {
2610
-		return '';
2611
-	}
2612
-
2613
-	// Le type de critère à prendre en compte
2614
-	$col = $regs[1];
2615
-
2616
-	// Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2617
-	if (isset($regs[3]) && ($suite = $regs[3])) {
2618
-		# Recherche de l'existence du champ date_xxxx,
2619
-		# si oui choisir ce champ, sinon choisir xxxx
2620
-		$date_orig = isset($table['field']["date$suite"]) ? 'date' . $suite : substr($suite, 1);
2621
-
2622
-		$pred = $date_orig;
2623
-	} else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2624
-		// Si aucune déclaration trouvée, on quitte
2625
-		if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2626
-			return '';
2627
-		}
2628
-		// Par défaut, on prend le champ date déclaré dans l'API
2629
-		$pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2630
-
2631
-		// Si c'est pour du relatif
2632
-		if (isset($regs[2]) && ($rel = $regs[2])) {
2633
-			$pred = 'date';
2634
-		}
2635
-	}
2636
-
2637
-	$date_compare = "\"' . normaliser_date(" .
2638
-		calculer_argument_precedent($idb, $pred, $boucles) .
2639
-		") . '\"";
2640
-
2641
-	$col_vraie = $date_orig;
2642
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2643
-
2644
-	switch ($col) {
2645
-		case 'date':
2646
-			$col = $date_orig;
2647
-			break;
2648
-		case 'jour':
2649
-			$col = "DAYOFMONTH($date_orig)";
2650
-			break;
2651
-		case 'mois':
2652
-			$col = "MONTH($date_orig)";
2653
-			break;
2654
-		case 'annee':
2655
-			$col = "YEAR($date_orig)";
2656
-			break;
2657
-		case 'heure':
2658
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2659
-			break;
2660
-		case 'age':
2661
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2662
-			$col_vraie = '';// comparer a un int (par defaut)
2663
-			break;
2664
-		case 'age_relatif':
2665
-			$col = calculer_param_date($date_compare, $date_orig);
2666
-			$col_vraie = '';// comparer a un int (par defaut)
2667
-			break;
2668
-		case 'jour_relatif':
2669
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2670
-			$col_vraie = '';// comparer a un int (par defaut)
2671
-			break;
2672
-		case 'mois_relatif':
2673
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2674
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2675
-				')-YEAR(' . $date_orig . '))';
2676
-			$col_vraie = '';// comparer a un int (par defaut)
2677
-			break;
2678
-		case 'annee_relatif':
2679
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2680
-				$date_orig . ')';
2681
-			$col_vraie = '';// comparer a un int (par defaut)
2682
-			break;
2683
-	}
2684
-
2685
-	return [$col, $col_vraie];
2601
+    if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2602
+        return '';
2603
+    }
2604
+
2605
+    $boucle = $boucles[$idb];
2606
+    $table = $boucle->show;
2607
+
2608
+    // si c'est une colonne de la table, ne rien faire
2609
+    if (isset($table['field'][$col])) {
2610
+        return '';
2611
+    }
2612
+
2613
+    // Le type de critère à prendre en compte
2614
+    $col = $regs[1];
2615
+
2616
+    // Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2617
+    if (isset($regs[3]) && ($suite = $regs[3])) {
2618
+        # Recherche de l'existence du champ date_xxxx,
2619
+        # si oui choisir ce champ, sinon choisir xxxx
2620
+        $date_orig = isset($table['field']["date$suite"]) ? 'date' . $suite : substr($suite, 1);
2621
+
2622
+        $pred = $date_orig;
2623
+    } else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2624
+        // Si aucune déclaration trouvée, on quitte
2625
+        if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2626
+            return '';
2627
+        }
2628
+        // Par défaut, on prend le champ date déclaré dans l'API
2629
+        $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2630
+
2631
+        // Si c'est pour du relatif
2632
+        if (isset($regs[2]) && ($rel = $regs[2])) {
2633
+            $pred = 'date';
2634
+        }
2635
+    }
2636
+
2637
+    $date_compare = "\"' . normaliser_date(" .
2638
+        calculer_argument_precedent($idb, $pred, $boucles) .
2639
+        ") . '\"";
2640
+
2641
+    $col_vraie = $date_orig;
2642
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2643
+
2644
+    switch ($col) {
2645
+        case 'date':
2646
+            $col = $date_orig;
2647
+            break;
2648
+        case 'jour':
2649
+            $col = "DAYOFMONTH($date_orig)";
2650
+            break;
2651
+        case 'mois':
2652
+            $col = "MONTH($date_orig)";
2653
+            break;
2654
+        case 'annee':
2655
+            $col = "YEAR($date_orig)";
2656
+            break;
2657
+        case 'heure':
2658
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2659
+            break;
2660
+        case 'age':
2661
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2662
+            $col_vraie = '';// comparer a un int (par defaut)
2663
+            break;
2664
+        case 'age_relatif':
2665
+            $col = calculer_param_date($date_compare, $date_orig);
2666
+            $col_vraie = '';// comparer a un int (par defaut)
2667
+            break;
2668
+        case 'jour_relatif':
2669
+            $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2670
+            $col_vraie = '';// comparer a un int (par defaut)
2671
+            break;
2672
+        case 'mois_relatif':
2673
+            $col = 'MONTH(' . $date_compare . ')-MONTH(' .
2674
+                $date_orig . ')+12*(YEAR(' . $date_compare .
2675
+                ')-YEAR(' . $date_orig . '))';
2676
+            $col_vraie = '';// comparer a un int (par defaut)
2677
+            break;
2678
+        case 'annee_relatif':
2679
+            $col = 'YEAR(' . $date_compare . ')-YEAR(' .
2680
+                $date_orig . ')';
2681
+            $col_vraie = '';// comparer a un int (par defaut)
2682
+            break;
2683
+    }
2684
+
2685
+    return [$col, $col_vraie];
2686 2686
 }
2687 2687
 
2688 2688
 /**
@@ -2701,16 +2701,16 @@  discard block
 block discarded – undo
2701 2701
  *     de colonne SQL et une date.
2702 2702
  **/
2703 2703
 function calculer_param_date($date_compare, $date_orig) {
2704
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2705
-		$init = "'\" . (\$x = $r[1]) . \"'";
2706
-		$date_compare = '\'$x\'';
2707
-	} else {
2708
-		$init = $date_compare;
2709
-	}
2710
-
2711
-	return
2712
-		// optimisation : mais prevoir le support SQLite avant
2713
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2704
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2705
+        $init = "'\" . (\$x = $r[1]) . \"'";
2706
+        $date_compare = '\'$x\'';
2707
+    } else {
2708
+        $init = $date_compare;
2709
+    }
2710
+
2711
+    return
2712
+        // optimisation : mais prevoir le support SQLite avant
2713
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2714 2714
 }
2715 2715
 
2716 2716
 /**
@@ -2728,17 +2728,17 @@  discard block
 block discarded – undo
2728 2728
  * @param Critere $crit Paramètres du critère dans cette boucle
2729 2729
  */
2730 2730
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2731
-	$boucle = &$boucles[$idb];
2731
+    $boucle = &$boucles[$idb];
2732 2732
 
2733
-	$args = [];
2734
-	foreach ($crit->param as &$param) {
2735
-		$args[] = calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent);
2736
-	}
2733
+    $args = [];
2734
+    foreach ($crit->param as &$param) {
2735
+        $args[] = calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent);
2736
+    }
2737 2737
 
2738
-	$boucle->hash .= '
2738
+    $boucle->hash .= '
2739 2739
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2740 2740
 
2741
-	$boucle->hash .= '
2741
+    $boucle->hash .= '
2742 2742
 	$command[\'source\'] = array(' . implode(', ', $args) . ");\n";
2743 2743
 }
2744 2744
 
@@ -2756,8 +2756,8 @@  discard block
 block discarded – undo
2756 2756
  * @param Critere $crit Paramètres du critère dans cette boucle
2757 2757
  */
2758 2758
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2759
-	$boucle = &$boucles[$idb];
2760
-	$boucle->hash .= '
2759
+    $boucle = &$boucles[$idb];
2760
+    $boucle->hash .= '
2761 2761
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2762 2762
 }
2763 2763
 
@@ -2773,12 +2773,12 @@  discard block
 block discarded – undo
2773 2773
  * @param Critere $crit Paramètres du critère dans cette boucle
2774 2774
  */
2775 2775
 function critere_php_args_dist($idb, &$boucles, $crit) {
2776
-	$boucle = &$boucles[$idb];
2777
-	$boucle->hash .= '$command[\'args\']=array();';
2778
-	foreach ($crit->param as $param) {
2779
-		$boucle->hash .= '
2776
+    $boucle = &$boucles[$idb];
2777
+    $boucle->hash .= '$command[\'args\']=array();';
2778
+    foreach ($crit->param as $param) {
2779
+        $boucle->hash .= '
2780 2780
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2781
-	}
2781
+    }
2782 2782
 }
2783 2783
 
2784 2784
 /**
@@ -2795,16 +2795,16 @@  discard block
 block discarded – undo
2795 2795
  * @param Critere $crit Paramètres du critère dans cette boucle
2796 2796
  */
2797 2797
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2798
-	$boucle = &$boucles[$idb];
2799
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2800
-	foreach ($crit->param as $param) {
2801
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2802
-			$param,
2803
-			$idb,
2804
-			$boucles,
2805
-			$boucles[$idb]->id_parent
2806
-		) . ";\n";
2807
-	}
2798
+    $boucle = &$boucles[$idb];
2799
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2800
+    foreach ($crit->param as $param) {
2801
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2802
+            $param,
2803
+            $idb,
2804
+            $boucles,
2805
+            $boucles[$idb]->id_parent
2806
+        ) . ";\n";
2807
+    }
2808 2808
 }
2809 2809
 
2810 2810
 /**
@@ -2829,16 +2829,16 @@  discard block
 block discarded – undo
2829 2829
  * @param Critere $crit Paramètres du critère dans cette boucle
2830 2830
  */
2831 2831
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2832
-	$boucle = &$boucles[$idb];
2833
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2834
-	foreach ($crit->param as $param) {
2835
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2836
-			$param,
2837
-			$idb,
2838
-			$boucles,
2839
-			$boucles[$idb]->id_parent
2840
-		) . ";\n";
2841
-	}
2832
+    $boucle = &$boucles[$idb];
2833
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2834
+    foreach ($crit->param as $param) {
2835
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2836
+            $param,
2837
+            $idb,
2838
+            $boucles,
2839
+            $boucles[$idb]->id_parent
2840
+        ) . ";\n";
2841
+    }
2842 2842
 }
2843 2843
 
2844 2844
 /**
@@ -2853,11 +2853,11 @@  discard block
 block discarded – undo
2853 2853
  * @param Critere $crit Paramètres du critère dans cette boucle
2854 2854
  */
2855 2855
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2856
-	$boucle = &$boucles[$idb];
2857
-	foreach ($crit->param as $param) {
2858
-		$boucle->hash .= '
2856
+    $boucle = &$boucles[$idb];
2857
+    foreach ($crit->param as $param) {
2858
+        $boucle->hash .= '
2859 2859
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2860
-	}
2860
+    }
2861 2861
 }
2862 2862
 
2863 2863
 
@@ -2889,20 +2889,20 @@  discard block
 block discarded – undo
2889 2889
  * @param Critere $crit Paramètres du critère dans cette boucle
2890 2890
  */
2891 2891
 function critere_si_dist($idb, &$boucles, $crit) {
2892
-	$boucle = &$boucles[$idb];
2893
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2894
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2895
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2896
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2897
-	if ($crit->param) {
2898
-		foreach ($crit->param as $param) {
2899
-			$boucle->hash .= "\t\$command['si'][] = "
2900
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2901
-		}
2902
-		// interdire {si 0} aussi !
2903
-	} else {
2904
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2905
-	}
2892
+    $boucle = &$boucles[$idb];
2893
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2894
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2895
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2896
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2897
+    if ($crit->param) {
2898
+        foreach ($crit->param as $param) {
2899
+            $boucle->hash .= "\t\$command['si'][] = "
2900
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2901
+        }
2902
+        // interdire {si 0} aussi !
2903
+    } else {
2904
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2905
+    }
2906 2906
 }
2907 2907
 
2908 2908
 /**
@@ -2919,8 +2919,8 @@  discard block
 block discarded – undo
2919 2919
  * @param Critere $crit Paramètres du critère dans cette boucle
2920 2920
  */
2921 2921
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2922
-	$boucle = &$boucles[$idb];
2923
-	$boucle->hash .= '
2922
+    $boucle = &$boucles[$idb];
2923
+    $boucle->hash .= '
2924 2924
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2925 2925
 	$command[\'sourcemode\'] = \'table\';';
2926 2926
 }
@@ -2941,27 +2941,27 @@  discard block
 block discarded – undo
2941 2941
  */
2942 2942
 function critere_noeud_dist($idb, &$boucles, $crit) {
2943 2943
 
2944
-	$not = $crit->not;
2945
-	$boucle = &$boucles[$idb];
2946
-	$primary = $boucle->primary;
2944
+    $not = $crit->not;
2945
+    $boucle = &$boucles[$idb];
2946
+    $primary = $boucle->primary;
2947 2947
 
2948
-	if (!$primary || strpos((string) $primary, ',')) {
2949
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2948
+    if (!$primary || strpos((string) $primary, ',')) {
2949
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2950 2950
 
2951
-		return;
2952
-	}
2953
-	$table = $boucle->type_requete;
2954
-	$table_sql = table_objet_sql(objet_type($table));
2951
+        return;
2952
+    }
2953
+    $table = $boucle->type_requete;
2954
+    $table_sql = table_objet_sql(objet_type($table));
2955 2955
 
2956
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2956
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2957 2957
 
2958
-	$in = 'IN';
2959
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2960
-	if ($not) {
2961
-		$where = ["'NOT'", $where];
2962
-	}
2958
+    $in = 'IN';
2959
+    $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2960
+    if ($not) {
2961
+        $where = ["'NOT'", $where];
2962
+    }
2963 2963
 
2964
-	$boucle->where[] = $where;
2964
+    $boucle->where[] = $where;
2965 2965
 }
2966 2966
 
2967 2967
 /**
@@ -2977,8 +2977,8 @@  discard block
 block discarded – undo
2977 2977
  * @param Critere $crit Paramètres du critère dans cette boucle
2978 2978
  */
2979 2979
 function critere_feuille_dist($idb, &$boucles, $crit) {
2980
-	$not = $crit->not;
2981
-	$crit->not = !$not;
2982
-	critere_noeud_dist($idb, $boucles, $crit);
2983
-	$crit->not = $not;
2980
+    $not = $crit->not;
2981
+    $crit->not = !$not;
2982
+    critere_noeud_dist($idb, $boucles, $crit);
2983
+    $crit->not = $not;
2984 2984
 }
Please login to merge, or discard this patch.
Spacing   +161 added lines, -165 removed lines patch added patch discarded remove patch
@@ -50,7 +50,7 @@  discard block
 block discarded – undo
50 50
 	$boucle = &$boucles[$idb];
51 51
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
52 52
 
53
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
53
+	$c = ["'='", "'$boucle->id_table."."$id_parent'", 0];
54 54
 	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
55 55
 }
56 56
 
@@ -73,10 +73,10 @@  discard block
 block discarded – undo
73 73
 	$id = $boucle->primary;
74 74
 
75 75
 	if ($not || !$id) {
76
-		return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
76
+		return ['zbug_critere_inconnu', ['critere' => $not.$crit->op]];
77 77
 	}
78 78
 	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
79
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
79
+	$boucle->where[] = ["'!='", "'$boucle->id_table."."$id'", $arg];
80 80
 }
81 81
 
82 82
 
@@ -107,12 +107,12 @@  discard block
 block discarded – undo
107 107
 	$not = ($crit->not ? '' : 'NOT');
108 108
 
109 109
 	// le doublon s'applique sur un type de boucle (article)
110
-	$nom = "'" . $boucle->type_requete . "'";
110
+	$nom = "'".$boucle->type_requete."'";
111 111
 
112 112
 	// compléter le nom avec un nom précisé {doublons nom}
113 113
 	// on obtient $nom = "'article' . 'nom'"
114 114
 	if (isset($crit->param[0])) {
115
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
+		$nom .= '.'.calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
116 116
 	}
117 117
 
118 118
 	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
@@ -124,13 +124,13 @@  discard block
 block discarded – undo
124 124
 	// $doublons et son index, ici $nom
125 125
 
126 126
 	// debut du code "sql_in('articles.id_article', "
127
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
+	$debut_in = "sql_in('".$boucle->id_table.'.'.$primary."', ";
128 128
 	// lecture des données du doublon "$doublons[$doublon_index[] = "
129 129
 	// Attention : boucle->doublons désigne une variable qu'on affecte
130
-	$debut_doub = '$doublons[' . ($not ? $boucle->doublons . '[]= ' : (''));
130
+	$debut_doub = '$doublons['.($not ? $boucle->doublons.'[]= ' : (''));
131 131
 
132 132
 	// le debut complet du code des doublons
133
-	$debut_doub = $debut_in . $debut_doub;
133
+	$debut_doub = $debut_in.$debut_doub;
134 134
 
135 135
 	// nom du doublon "('article' . 'nom')]"
136 136
 	$fin_doub = "($nom)]";
@@ -140,22 +140,22 @@  discard block
 block discarded – undo
140 140
 	foreach ($boucle->where as $k => $w) {
141 141
 		if (str_starts_with((string) $w[0], $debut_doub)) {
142 142
 			// fusionner le sql_in (du where)
143
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr((string) $w[0], strlen($debut_in));
143
+			$boucle->where[$k][0] = $debut_doub.$fin_doub.' . '.substr((string) $w[0], strlen($debut_in));
144 144
 			// fusionner l'initialisation (du hash) pour faire plus joli
145 145
 			$x = strpos((string) $boucle->hash, $init_comment);
146 146
 			$len = strlen($init_comment);
147 147
 			$boucle->hash =
148
-				substr((string) $boucle->hash, 0, $x + $len) . $init_code . substr((string) $boucle->hash, $x + $len);
148
+				substr((string) $boucle->hash, 0, $x + $len).$init_code.substr((string) $boucle->hash, $x + $len);
149 149
 
150 150
 			return;
151 151
 		}
152 152
 	}
153 153
 
154 154
 	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
155
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
155
+	$boucle->where[] = [$debut_doub.$fin_doub.", '".$not."')"];
156 156
 
157 157
 	// déclarer le doublon s'il n'existe pas encore
158
-	$boucle->hash .= $init_comment . $init_code;
158
+	$boucle->hash .= $init_comment.$init_code;
159 159
 
160 160
 
161 161
 	# la ligne suivante avait l'intention d'eviter une collecte deja faite
@@ -217,7 +217,7 @@  discard block
 block discarded – undo
217 217
 	$deux = $deux[0]->texte;
218 218
 	if ($deux) {
219 219
 		$boucles[$idb]->limit =
220
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
220
+			'intval($Pile[0]["debut'.$un.'"]) . ",'.$deux.'"';
221 221
 	} else {
222 222
 		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
223 223
 	}
@@ -280,26 +280,26 @@  discard block
 block discarded – undo
280 280
 		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281 281
 	}
282 282
 
283
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr((string) $type, 1));
283
+	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut".substr((string) $type, 1));
284 284
 	$boucle->modificateur['debut_nom'] = $type;
285 285
 	$partie =
286 286
 		// tester si le numero de page demande est de la forme '@yyy'
287
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
287
+		'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n"
288 288
 		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
-		. "\t\t" . '$iter->seek(0);' . "\n"
289
+		. "\t\t".'$debut_boucle = $Pile[0]['.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$iter);'."\n"
290
+		. "\t\t".'$iter->seek(0);'."\n"
291 291
 		. "\t}\n"
292
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
292
+		. "\t".'$debut_boucle = intval($debut_boucle)';
293 293
 
294 294
 	$boucle->hash .= '
295
-	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
295
+	$command[\'pagination\'] = array((isset($Pile[0][' . $debut.']) ? $Pile[0]['.$debut.'] : null), '.$pas.');';
296 296
 
297 297
 	$boucle->total_parties = $pas;
298 298
 	calculer_parties($boucles, $idb, $partie, 'p+');
299 299
 	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300 300
 	// sauf si pas de primaire, ou si primaire composee
301 301
 	// dans ce cas, on ne sait pas gerer une pagination indirecte
302
-	$t = $boucle->id_table . '.' . $boucle->primary;
302
+	$t = $boucle->id_table.'.'.$boucle->primary;
303 303
 	if (
304 304
 		$boucle->primary
305 305
 		&& !preg_match('/[,\s]/', (string) $boucle->primary)
@@ -346,24 +346,24 @@  discard block
 block discarded – undo
346 346
 	$boucle->hash .= '
347 347
 	// RECHERCHE'
348 348
 		. ($crit->cond ? '
349
-	if (!strlen(' . $quoi . ')){
349
+	if (!strlen(' . $quoi.')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351
-	} else' : '') . '
351
+	} else' : '').'
352 352
 	{
353 353
 		$prepare_recherche = charger_fonction(\'prepare_recherche\', \'inc\');
354
-		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi . ', "' . $boucle->id_table . '", "' . $crit->cond . '","' . $boucle->sql_serveur . '",' . $_modificateur . ',"' . $boucle->primary . '");
354
+		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'","'.$boucle->sql_serveur.'",'.$_modificateur.',"'.$boucle->primary.'");
355 355
 	}
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
359
+	$t = $boucle->id_table.'.'.$boucle->primary;
360 360
 	if (!in_array($t, $boucles[$idb]->select)) {
361 361
 		$boucle->select[] = $t;
362 362
 	} # pour postgres, neuneu ici
363 363
 	// jointure uniquement sur le serveur principal
364 364
 	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365 365
 	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
366
+		$boucle->join['resultats'] = ["'".$boucle->id_table."'", "'id'", "'".$boucle->primary."'"];
367 367
 		$boucle->from['resultats'] = 'spip_resultats';
368 368
 	}
369 369
 	$boucle->select[] = '$rech_select';
@@ -430,7 +430,7 @@  discard block
 block discarded – undo
430 430
 	$c =
431 431
 		[
432 432
 			"'OR'",
433
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
433
+			["'='", "'$table."."id_trad'", "'$table.$prim'"],
434 434
 			["'='", "'$table.id_trad'", "'0'"]
435 435
 		];
436 436
 	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
@@ -453,13 +453,13 @@  discard block
 block discarded – undo
453 453
 	$boucle = &$boucles[$idb];
454 454
 	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455 455
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
-	$mparent = $boucle->id_table . '.' . $id_parent;
456
+	$mparent = $boucle->id_table.'.'.$id_parent;
457 457
 
458 458
 	if ($boucle->type_requete == 'rubriques' || isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459 459
 		$boucle->where[] = ["'='", "'$mparent'", $arg];
460 460
 	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461 461
 	else {
462
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
462
+		return ['zbug_critere_inconnu', ['critere' => $crit->op.' '.$boucle->type_requete]];
463 463
 	}
464 464
 }
465 465
 
@@ -512,16 +512,16 @@  discard block
 block discarded – undo
512 512
 		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513 513
 			$decompose = decompose_champ_id_objet($champ);
514 514
 			$champ = array_shift($decompose);
515
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
515
+			$boucle->where[] = ["'='", _q($cle.'.'.reset($decompose)), '"'.sql_quote(end($decompose)).'"'];
516 516
 		}
517 517
 	} else {
518 518
 		$cle = $boucle->id_table;
519 519
 	}
520 520
 
521
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
-		. ($not ? ", 'NOT'" : '') . ')';
521
+	$c = "sql_in('$cle".".$champ', calcul_branche_in($arg)"
522
+		. ($not ? ", 'NOT'" : '').')';
523 523
 	$boucle->where[] = $crit->cond
524
-		? "($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'
524
+		? "($arg ? $c : ".($not ? "'0=1'" : "'1=1'").')'
525 525
 		: $c;
526 526
 }
527 527
 
@@ -542,9 +542,9 @@  discard block
 block discarded – undo
542 542
 	$not = ($crit->not ? 'NOT' : '');
543 543
 	$serveur = $boucle->sql_serveur;
544 544
 
545
-	$c = "sql_in('" .
546
-		$boucle->id_table . '.' . $boucle->primary
547
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
545
+	$c = "sql_in('".
546
+		$boucle->id_table.'.'.$boucle->primary
547
+		. "', lister_objets_avec_logos('".$boucle->primary."'), '$not', '$serveur')";
548 548
 
549 549
 	$boucle->where[] = $c;
550 550
 }
@@ -576,7 +576,7 @@  discard block
 block discarded – undo
576 576
 				$t = table_objet_sql($r[1]);
577 577
 				$t = array_search($t, $boucles[$idb]->from);
578 578
 				if ($t) {
579
-					$t .= '.' . $r[2];
579
+					$t .= '.'.$r[2];
580 580
 				}
581 581
 			}
582 582
 		} else {
@@ -591,7 +591,7 @@  discard block
 block discarded – undo
591 591
 			$boucles[$idb]->select[] = $t;
592 592
 		}
593 593
 	} else {
594
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
594
+		return ['zbug_critere_inconnu', ['critere' => $crit->op.' ?']];
595 595
 	}
596 596
 }
597 597
 
@@ -661,25 +661,25 @@  discard block
 block discarded – undo
661 661
 				(false !== $i = strpos((string) $boucle->order[$n - 1], 'ASC'))
662 662
 				|| (false !== $i = strpos((string) $boucle->order[$n - 1], 'DESC'))
663 663
 			) {
664
-				$boucle->order[$n - 1] = substr_replace((string) $boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
664
+				$boucle->order[$n - 1] = substr_replace((string) $boucle->order[$n - 1], "' . ".$boucle->modificateur['collate']." . ' ", $i, 0);
665 665
 			} else {
666
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
666
+				$boucle->order[$n - 1] .= ' . '.$boucle->modificateur['collate'];
667 667
 			}
668 668
 		}
669 669
 	} else {
670
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
670
+		return (['zbug_critere_inconnu', ['critere' => $crit->op.' '.(is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
671 671
 	}
672 672
 }
673 673
 
674 674
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
675 675
 	$boucle = $boucles[$idb];
676
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
677
-	$var = '$champs_' . $idb;
676
+	$alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')';
677
+	$var = '$champs_'.$idb;
678 678
 	$desc = (str_contains((string) $boucle->in, (string) "static $var ="));
679 679
 	if (!$desc) {
680 680
 		$desc = $boucle->show['field'];
681 681
 		$desc = implode(',', array_map('_q', array_keys($desc)));
682
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
682
+		$boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.');';
683 683
 	}
684 684
 	if ($desc) {
685 685
 		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
@@ -754,7 +754,7 @@  discard block
 block discarded – undo
754 754
 		$sens = " . ' DESC'";
755 755
 	}
756 756
 	if (isset($boucle->modificateur['collate'])) {
757
-		$collecte = ' . ' . $boucle->modificateur['collate'];
757
+		$collecte = ' . '.$boucle->modificateur['collate'];
758 758
 	}
759 759
 
760 760
 	// Pour chaque paramètre du critère
@@ -776,14 +776,14 @@  discard block
 block discarded – undo
776 776
 			if (preg_match(',^(\w+)[\s]+(.*)$,', (string) $par, $m)) {
777 777
 				$expression = trim($m[1]);
778 778
 				$champ = trim($m[2]);
779
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
779
+				if (function_exists($f = 'calculer_critere_par_expression_'.$expression)) {
780 780
 					$order = $f($idb, $boucles, $crit, $tri, $champ);
781 781
 				} else {
782
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
782
+					return ['zbug_critere_inconnu', ['critere' => $crit->op." $par"]];
783 783
 				}
784 784
 
785 785
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
786
-			} elseif ($boucle->type_requete == 'DATA' || preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', (string) $par, $match)) {
786
+			} elseif ($boucle->type_requete == 'DATA' || preg_match(',^'.CHAMP_SQL_PLUS_FONC.'$,is', (string) $par, $match)) {
787 787
 				// {par FONCTION(champ)}
788 788
 				if (isset($match) && count($match) > 2) {
789 789
 					$par = substr($match[2], 1, -1);
@@ -793,7 +793,7 @@  discard block
 block discarded – undo
793 793
 				if ($par == 'hasard') {
794 794
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
795 795
 				} elseif ($par == 'date' && !empty($boucle->show['date'])) {
796
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
796
+					$order = "'".$boucle->id_table.'.'.$boucle->show['date']."'";
797 797
 				} else {
798 798
 					// cas général {par champ}, {par table.champ}, ...
799 799
 					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
@@ -802,7 +802,7 @@  discard block
 block discarded – undo
802 802
 
803 803
 			// on ne sait pas traiter…
804 804
 			else {
805
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
805
+				return ['zbug_critere_inconnu', ['critere' => $crit->op." $par"]];
806 806
 			}
807 807
 
808 808
 			// En cas d'erreur de squelette retournée par une fonction
@@ -822,12 +822,12 @@  discard block
 block discarded – undo
822 822
 
823 823
 		if ($fct) {
824 824
 			$order = preg_match("/^\s*'(.*)'\s*$/", (string) $order, $r)
825
-				? "'$fct(" . $r[1] . ")'"
825
+				? "'$fct(".$r[1].")'"
826 826
 				: "'$fct(' . $order . ')'";
827 827
 		}
828
-		$t = $order . $collecte . $sens;
828
+		$t = $order.$collecte.$sens;
829 829
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
830
-			$t = $r[1] . $r[2];
830
+			$t = $r[1].$r[2];
831 831
 		}
832 832
 
833 833
 		$boucle->order[] = $t;
@@ -877,16 +877,16 @@  discard block
 block discarded – undo
877 877
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
878 878
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
879 879
 	if (is_array($_champ)) {
880
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
880
+		return ['zbug_critere_inconnu', ['critere' => $crit->op." num $champ"]];
881 881
 	}
882 882
 	$boucle = &$boucles[$idb];
883
-	$texte = '0+' . $_champ;
883
+	$texte = '0+'.$_champ;
884 884
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
885 885
 	if ($suite !== "''") {
886
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
886
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')".' . "';
887 887
 	}
888
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
889
-	$boucle->select[] = $texte . " AS $asnum";
888
+	$asnum = 'num'.($boucle->order ? count($boucle->order) : '');
889
+	$boucle->select[] = $texte." AS $asnum";
890 890
 
891 891
 	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
892 892
 	$orderassinum = trim($orderassinum, "'");
@@ -913,13 +913,13 @@  discard block
 block discarded – undo
913 913
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
914 914
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
915 915
 	if (is_array($_champ)) {
916
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
916
+		return ['zbug_critere_inconnu', ['critere' => $crit->op." sinum $champ"]];
917 917
 	}
918 918
 	$boucle = &$boucles[$idb];
919
-	$texte = '0+' . $_champ;
919
+	$texte = '0+'.$_champ;
920 920
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
921 921
 	if ($suite !== "''") {
922
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
922
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')".' . "';
923 923
 	}
924 924
 
925 925
 	$as = false;
@@ -935,8 +935,8 @@  discard block
 block discarded – undo
935 935
 	}
936 936
 
937 937
 	if (!$as) {
938
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
939
-		$boucle->select[] = $select . $as;
938
+		$as = 'sinum'.($boucle->order ? count($boucle->order) : '');
939
+		$boucle->select[] = $select.$as;
940 940
 	}
941 941
 	return "'$as'";
942 942
 }
@@ -960,10 +960,10 @@  discard block
 block discarded – undo
960 960
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
961 961
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
962 962
 	if (is_array($_champ)) {
963
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
963
+		return ['zbug_critere_inconnu', ['critere' => $crit->op." multi $champ"]];
964 964
 	}
965 965
 	$boucle = &$boucles[$idb];
966
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
966
+	$boucle->select[] = "\".sql_multi('".$_champ."', \$GLOBALS['spip_lang']).\"";
967 967
 	return "'multi'";
968 968
 }
969 969
 
@@ -988,7 +988,7 @@  discard block
 block discarded – undo
988 988
 
989 989
 	// le champ existe dans la table, pas de souci (le plus commun)
990 990
 	if (isset($desc['field'][$par])) {
991
-		$par = $boucle->id_table . '.' . $par;
991
+		$par = $boucle->id_table.'.'.$par;
992 992
 	}
993 993
 	// le champ est peut être une jointure
994 994
 	else {
@@ -1009,24 +1009,24 @@  discard block
 block discarded – undo
1009 1009
 		// Sinon on cherche le champ dans les tables possibles de jointures
1010 1010
 		// Si la table est déjà dans le from, on la réutilise.
1011 1011
 		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1012
-			$par = $infos['alias'] . '.' . $champ;
1012
+			$par = $infos['alias'].'.'.$champ;
1013 1013
 		} elseif (
1014 1014
 			$boucle->jointures_explicites
1015 1015
 			&& ($alias = trouver_jointure_champ($champ, $boucle, explode(' ', (string) $boucle->jointures_explicites), false, $table))
1016 1016
 		) {
1017
-			$par = $alias . '.' . $champ;
1017
+			$par = $alias.'.'.$champ;
1018 1018
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1019
-			$par = $alias . '.' . $champ;
1019
+			$par = $alias.'.'.$champ;
1020 1020
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1021 1021
 		} elseif (
1022 1022
 			$table_alias
1023 1023
 			&& isset($boucle->from[$table_alias])
1024 1024
 			&& ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]))
1025 1025
 		) {
1026
-			$par = $infos['alias'] . '.' . $champ;
1026
+			$par = $infos['alias'].'.'.$champ;
1027 1027
 		} elseif ($table) {
1028 1028
 			// On avait table + champ, mais on ne les a pas trouvés
1029
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1029
+			return ['zbug_critere_inconnu', ['critere' => $crit->op." $par"]];
1030 1030
 		} else {
1031 1031
 			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1032 1032
 		}
@@ -1050,7 +1050,7 @@  discard block
 block discarded – undo
1050 1050
 	if (!$t) {
1051 1051
 		$t = trouver_jointure_champ($champ, $boucle);
1052 1052
 	}
1053
-	return $t ? "'" . $t . '.' . $champ . "'" : '';
1053
+	return $t ? "'".$t.'.'.$champ."'" : '';
1054 1054
 }
1055 1055
 
1056 1056
 /**
@@ -1095,9 +1095,9 @@  discard block
 block discarded – undo
1095 1095
 				$boucle->default_order[] = ' DESC';
1096 1096
 			}
1097 1097
 		} else {
1098
-			$t = $boucle->order[$n - 1] . " . $order";
1098
+			$t = $boucle->order[$n - 1]." . $order";
1099 1099
 			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1100
-				$t = $r[1] . $r[2];
1100
+				$t = $r[1].$r[2];
1101 1101
 			}
1102 1102
 			$boucle->order[$n - 1] = $t;
1103 1103
 		}
@@ -1134,7 +1134,7 @@  discard block
 block discarded – undo
1134 1134
 
1135 1135
 	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1136 1136
 
1137
-	$order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1137
+	$order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'".$boucle->sql_serveur."')) ? \$zl : '0').')'$sens";
1138 1138
 	$boucle->order[] = $order;
1139 1139
 }
1140 1140
 
@@ -1143,7 +1143,7 @@  discard block
 block discarded – undo
1143 1143
 	$params = $crit->param;
1144 1144
 
1145 1145
 	if ((is_countable($params) ? count($params) : 0) < 1) {
1146
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1146
+		return ['zbug_critere_inconnu', ['critere' => $crit->op.' ?']];
1147 1147
 	}
1148 1148
 
1149 1149
 	$boucle = &$boucles[$idb];
@@ -1164,7 +1164,7 @@  discard block
 block discarded – undo
1164 1164
 	if ((is_countable($date) ? count($date) : 0) == 1 && $date[0]->type == 'texte') {
1165 1165
 		$date = $date[0]->texte;
1166 1166
 		if (!isset($fields[$date])) {
1167
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1167
+			return ['zbug_critere_inconnu', ['critere' => $crit->op.' '.$date]];
1168 1168
 		}
1169 1169
 	} else {
1170 1170
 		$a = calculer_liste($date, $idb, $boucles, $parent);
@@ -1176,38 +1176,38 @@  discard block
 block discarded – undo
1176 1176
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1177 1177
 	}
1178 1178
 	$annee = $params ? array_shift($params) : '';
1179
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1180
-		calculer_liste($annee, $idb, $boucles, $parent) .
1179
+	$annee = "\n".'sprintf("%04d", ($x = '.
1180
+		calculer_liste($annee, $idb, $boucles, $parent).
1181 1181
 		') ? $x : date("Y"))';
1182 1182
 
1183 1183
 	$mois = $params ? array_shift($params) : '';
1184
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1185
-		calculer_liste($mois, $idb, $boucles, $parent) .
1184
+	$mois = "\n".'sprintf("%02d", ($x = '.
1185
+		calculer_liste($mois, $idb, $boucles, $parent).
1186 1186
 		') ? $x : date("m"))';
1187 1187
 
1188 1188
 	$jour = $params ? array_shift($params) : '';
1189
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1190
-		calculer_liste($jour, $idb, $boucles, $parent) .
1189
+	$jour = "\n".'sprintf("%02d", ($x = '.
1190
+		calculer_liste($jour, $idb, $boucles, $parent).
1191 1191
 		') ? $x : date("d"))';
1192 1192
 
1193 1193
 	$annee2 = $params ? array_shift($params) : '';
1194
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1195
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1194
+	$annee2 = "\n".'sprintf("%04d", ($x = '.
1195
+		calculer_liste($annee2, $idb, $boucles, $parent).
1196 1196
 		') ? $x : date("Y"))';
1197 1197
 
1198 1198
 	$mois2 = $params ? array_shift($params) : '';
1199
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1200
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1199
+	$mois2 = "\n".'sprintf("%02d", ($x = '.
1200
+		calculer_liste($mois2, $idb, $boucles, $parent).
1201 1201
 		') ? $x : date("m"))';
1202 1202
 
1203 1203
 	$jour2 = $params ? array_shift($params) : '';
1204
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1205
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1204
+	$jour2 = "\n".'sprintf("%02d", ($x = '.
1205
+		calculer_liste($jour2, $idb, $boucles, $parent).
1206 1206
 		') ? $x : date("d"))';
1207 1207
 
1208
-	$date = $boucle->id_table . ".$date";
1208
+	$date = $boucle->id_table.".$date";
1209 1209
 
1210
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1210
+	$quote_end = ",'".$boucle->sql_serveur."','text'";
1211 1211
 	if ($type == 'jour') {
1212 1212
 		$boucle->where[] = [
1213 1213
 			"'='",
@@ -1279,14 +1279,13 @@  discard block
 block discarded – undo
1279 1279
 	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1280 1280
 
1281 1281
 	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1282
-		$boucle->limit = $a11 . ',' . $a21;
1282
+		$boucle->limit = $a11.','.$a21;
1283 1283
 	} else {
1284 1284
 		// 3 dans {1/3}, {2,3} ou {1,n-3}
1285 1285
 		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1286 1286
 		// 2 dans {2/3}, {2,5}, {n-2,1}
1287 1287
 		$partie = ($a11 != 'n') ? $a11 : $a12;
1288
-		$mode = (($op == '/') ? '/' :
1289
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1288
+		$mode = (($op == '/') ? '/' : (($a11 == 'n') ? '-' : '+').(($a21 == 'n') ? '-' : '+'));
1290 1289
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1291 1290
 		if ($a11 !== 'n' && $a21 !== 'n' && $mode == '++' && $op == ',') {
1292 1291
 			$boucle->limit =
@@ -1332,8 +1331,7 @@  discard block
 block discarded – undo
1332 1331
 	// {1/3}
1333 1332
 	if ($op1 == '/') {
1334 1333
 		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1335
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1336
-			"($total_parties ? $total_parties : 1)";
1334
+		$totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)";
1337 1335
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1338 1336
 		$debut = $pmoins1 ? "ceil(($nombre_boucle * $pmoins1)/$totpos);" : 0;
1339 1337
 	} else {
@@ -1344,15 +1342,13 @@  discard block
 block discarded – undo
1344 1342
 
1345 1343
 		// cas {x,n-1}
1346 1344
 		if ($op2 == '-') {
1347
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1348
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1349
-					($total_parties . ' - 1'));
1345
+			$fin = '$debut_boucle + '.$nombre_boucle.' - '
1346
+				. (is_numeric($total_parties) ? ($total_parties + 1) : ($total_parties.' - 1'));
1350 1347
 		} else {
1351 1348
 			// {x,1} ou {pagination}
1352 1349
 			$fin = '$debut_boucle'
1353 1350
 				. (is_numeric($total_parties) ?
1354
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1355
-					('+' . $total_parties . ' - 1'));
1351
+					(($total_parties == 1) ? '' : (' + '.($total_parties - 1))) : ('+'.$total_parties.' - 1'));
1356 1352
 		}
1357 1353
 
1358 1354
 		// {pagination}, gerer le debut_xx=-1 pour tout voir
@@ -1370,11 +1366,11 @@  discard block
 block discarded – undo
1370 1366
 	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1371 1367
 
1372 1368
 	$boucles[$id_boucle]->mode_partie = "\n\t"
1373
-		. '$debut_boucle = ' . $debut . ";\n	"
1369
+		. '$debut_boucle = '.$debut.";\n	"
1374 1370
 		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1375
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1376
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1377
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1371
+		. '$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n	"
1372
+		. '$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1373
+		. '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1378 1374
 		. "\n\tif (\$debut_boucle>0"
1379 1375
 		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1380 1376
 		. " AND \$iter->seek(\$debut_boucle,'continue'))"
@@ -1459,14 +1455,14 @@  discard block
 block discarded – undo
1459 1455
 		// critere personnalise ?
1460 1456
 		if (
1461 1457
 			(!$serveur
1462
-				|| !function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)
1458
+				|| !function_exists($f = 'critere_'.$serveur.'_'.$table.'_'.$critere)
1463 1459
 				&& !function_exists($f .= '_dist')
1464
-				&& !function_exists($f = 'critere_' . $serveur . '_' . $critere)
1460
+				&& !function_exists($f = 'critere_'.$serveur.'_'.$critere)
1465 1461
 				&& !function_exists($f .= '_dist')
1466 1462
 			)
1467
-			&& !function_exists($f = 'critere_' . $table . '_' . $critere)
1463
+			&& !function_exists($f = 'critere_'.$table.'_'.$critere)
1468 1464
 			&& !function_exists($f .= '_dist')
1469
-			&& !function_exists($f = 'critere_' . $critere)
1465
+			&& !function_exists($f = 'critere_'.$critere)
1470 1466
 			&& !function_exists($f .= '_dist')
1471 1467
 		) {
1472 1468
 			// fonction critere standard
@@ -1498,9 +1494,9 @@  discard block
 block discarded – undo
1498 1494
  */
1499 1495
 function kwote($lisp, $serveur = '', $type = '') {
1500 1496
 	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1501
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1497
+		return $r[1].'"'.sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type).'"';
1502 1498
 	} else {
1503
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1499
+		return "sql_quote($lisp, '$serveur', '".str_replace("'", "\\'", $type)."')";
1504 1500
 	}
1505 1501
 }
1506 1502
 
@@ -1522,7 +1518,7 @@  discard block
 block discarded – undo
1522 1518
 function critere_IN_dist($idb, &$boucles, $crit) {
1523 1519
 	$r = calculer_critere_infixe($idb, $boucles, $crit);
1524 1520
 	if (!$r) {
1525
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1521
+		return ['zbug_critere_inconnu', ['critere' => $crit->op.' ?']];
1526 1522
 	}
1527 1523
 	[$arg, $op, $val, $col, $where_complement] = $r;
1528 1524
 
@@ -1547,8 +1543,8 @@  discard block
 block discarded – undo
1547 1543
 				"'NOT'",
1548 1544
 				[
1549 1545
 					"'IN'",
1550
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1551
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1546
+					"'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'",
1547
+					["'SELF'", "'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'", $where]
1552 1548
 				]
1553 1549
 			];
1554 1550
 		}
@@ -1565,22 +1561,22 @@  discard block
 block discarded – undo
1565 1561
 	$descr = $boucles[$idb]->descr;
1566 1562
 	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1567 1563
 
1568
-	$var = '$in' . $cpt++;
1564
+	$var = '$in'.$cpt++;
1569 1565
 	$x = "\n\t$var = array();";
1570 1566
 	foreach ($val as $k => $v) {
1571 1567
 		if (preg_match(",^(\n//.*\n)?'(.*)'$,", (string) $v, $r)) {
1572 1568
 			// optimiser le traitement des constantes
1573 1569
 			if (is_numeric($r[2])) {
1574
-				$x .= "\n\t$var" . "[]= $r[2];";
1570
+				$x .= "\n\t$var"."[]= $r[2];";
1575 1571
 			} else {
1576
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1572
+				$x .= "\n\t$var".'[]= '.sql_quote($r[2]).';';
1577 1573
 			}
1578 1574
 		} else {
1579 1575
 			// Pour permettre de passer des tableaux de valeurs
1580 1576
 			// on repere l'utilisation brute de #ENV**{X},
1581 1577
 			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1582 1578
 			// et on deballe mais en rajoutant l'anti XSS
1583
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1579
+			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);";
1584 1580
 		}
1585 1581
 	}
1586 1582
 
@@ -1594,7 +1590,7 @@  discard block
 block discarded – undo
1594 1590
 		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1595 1591
 	}
1596 1592
 
1597
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1593
+	return "sql_in('$arg', $var".($crit2 == 'NOT' ? ",'NOT'" : '').')';
1598 1594
 }
1599 1595
 
1600 1596
 /**
@@ -1667,7 +1663,7 @@  discard block
 block discarded – undo
1667 1663
 		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1668 1664
 	}
1669 1665
 	// nous aider en mode debug.
1670
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1666
+	$boucle->debug[] = 'id_ : '.implode(', ', $champs);
1671 1667
 	$boucle->modificateur['id_'] = $champs;
1672 1668
 
1673 1669
 	// créer un critère {id_xxx?} de chaque champ retenu
@@ -1922,8 +1918,8 @@  discard block
 block discarded – undo
1922 1918
 				"'NOT'",
1923 1919
 				[
1924 1920
 					"'IN'",
1925
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1926
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1921
+					"'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'",
1922
+					["'SELF'", "'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'", $where]
1927 1923
 				]
1928 1924
 			];
1929 1925
 		}
@@ -1933,7 +1929,7 @@  discard block
 block discarded – undo
1933 1929
 	// traiter a part la date, elle est mise d'office par SPIP,
1934 1930
 	if ($crit->cond) {
1935 1931
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
1936
-		if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['" . $col . "']") {
1932
+		if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['".$col."']") {
1937 1933
 			$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1938 1934
 		}
1939 1935
 
@@ -2095,7 +2091,7 @@  discard block
 block discarded – undo
2095 2091
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2096 2092
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2097 2093
 		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", (string) $val[0], $r)) {
2098
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2094
+			$val[0] = $r[1].'"'.sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote).'"';
2099 2095
 		}
2100 2096
 		// sinon expliciter les
2101 2097
 		// sql_quote(truc) en sql_quote(truc,'',type)
@@ -2110,14 +2106,14 @@  discard block
 block discarded – undo
2110 2106
 		) {
2111 2107
 			$r = $r[1]
2112 2108
 				. ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
2113
-				. ",'" . addslashes((string) $type_cast_quote) . "'";
2109
+				. ",'".addslashes((string) $type_cast_quote)."'";
2114 2110
 			$val[0] = "sql_quote($r)";
2115 2111
 		}
2116 2112
 		elseif (
2117 2113
 			str_contains((string) $val[0], '@@defaultcast@@')
2118 2114
 			&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2119 2115
 		) {
2120
-			$val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'" . addslashes((string) $type_cast_quote) . "')";
2116
+			$val[0] = substr((string) $val[0], 0, -strlen($r[0]))."'".addslashes((string) $type_cast_quote)."')";
2121 2117
 		}
2122 2118
 	}
2123 2119
 
@@ -2125,7 +2121,7 @@  discard block
 block discarded – undo
2125 2121
 		str_contains((string) $val[0], '@@defaultcast@@')
2126 2122
 		&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2127 2123
 	) {
2128
-		$val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'char')";
2124
+		$val[0] = substr((string) $val[0], 0, -strlen($r[0]))."'char')";
2129 2125
 	}
2130 2126
 
2131 2127
 	// Indicateur pour permettre aux fonctionx boucle_X de modifier
@@ -2140,7 +2136,7 @@  discard block
 block discarded – undo
2140 2136
 
2141 2137
 	// inserer le nom de la table SQL devant le nom du champ
2142 2138
 	if ($table) {
2143
-		$arg = $col[0] == '`' ? "$table." . substr((string) $col, 1, -1) : "$table.$col";
2139
+		$arg = $col[0] == '`' ? "$table.".substr((string) $col, 1, -1) : "$table.$col";
2144 2140
 	} else {
2145 2141
 		$arg = $col;
2146 2142
 	}
@@ -2269,9 +2265,9 @@  discard block
 block discarded – undo
2269 2265
  **/
2270 2266
 function primary_doublee($decompose, $table) {
2271 2267
 	$e1 = reset($decompose);
2272
-	$e2 = "sql_quote('" . end($decompose) . "')";
2268
+	$e2 = "sql_quote('".end($decompose)."')";
2273 2269
 
2274
-	return ["'='", "'$table." . $e1 . "'", $e2];
2270
+	return ["'='", "'$table.".$e1."'", $e2];
2275 2271
 }
2276 2272
 
2277 2273
 /**
@@ -2310,7 +2306,7 @@  discard block
 block discarded – undo
2310 2306
 		$checkarrivee
2311 2307
 		&& is_string($checkarrivee)
2312 2308
 		&& ($a = table_objet($checkarrivee))
2313
-		&& in_array($a . '_liens', $joints)
2309
+		&& in_array($a.'_liens', $joints)
2314 2310
 		&& ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee))
2315 2311
 	) {
2316 2312
 		return $res;
@@ -2329,12 +2325,12 @@  discard block
 block discarded – undo
2329 2325
 				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2330 2326
 				$joindre = false;
2331 2327
 				foreach ($cols as $col) {
2332
-					$c = '/\b' . $t . ".$col" . '\b/';
2328
+					$c = '/\b'.$t.".$col".'\b/';
2333 2329
 					if (trouver_champ($c, $boucle->where)) {
2334 2330
 						$joindre = true;
2335 2331
 					} else {
2336 2332
 						// mais ca peut etre dans le FIELD pour le Having
2337
-						$c = "/FIELD.$t" . ".$col,/";
2333
+						$c = "/FIELD.$t".".$col,/";
2338 2334
 						if (trouver_champ($c, $boucle->select)) {
2339 2335
 							$joindre = true;
2340 2336
 						}
@@ -2380,7 +2376,7 @@  discard block
 block discarded – undo
2380 2376
 	$primary_arrivee = id_table_objet($checkarrivee);
2381 2377
 
2382 2378
 	// [FIXME] $checkarrivee peut-il arriver avec false ????
2383
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2379
+	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee.'_liens');
2384 2380
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2385 2381
 
2386 2382
 	if (!$intermediaire || !$arrivee) {
@@ -2484,7 +2480,7 @@  discard block
 block discarded – undo
2484 2480
 			} elseif ($crit->cond && ($col == 'date' || $col == 'date_redac')) {
2485 2481
 				// un critere conditionnel sur date est traite a part
2486 2482
 				// car la date est mise d'office par SPIP,
2487
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2483
+				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])";
2488 2484
 			}
2489 2485
 
2490 2486
 			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
@@ -2516,7 +2512,7 @@  discard block
 block discarded – undo
2516 2512
 			&& ($p == "'" || $p == '"')
2517 2513
 			&& $params[0][1]->type == 'champ'
2518 2514
 		) {
2519
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2515
+			$val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p";
2520 2516
 		} else {
2521 2517
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2522 2518
 				$a = calculer_liste($p, $idb, $boucles, $parent);
@@ -2531,7 +2527,7 @@  discard block
 block discarded – undo
2531 2527
 	$fct = $args_sql = '';
2532 2528
 	// fonction SQL ?
2533 2529
 	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2534
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', (string) $col, $m)) {
2530
+	if (preg_match('/^(.*)'.SQL_ARGS.'$/', (string) $col, $m)) {
2535 2531
 		$fct = $m[1];
2536 2532
 		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2537 2533
 		$col = $a[1];
@@ -2617,7 +2613,7 @@  discard block
 block discarded – undo
2617 2613
 	if (isset($regs[3]) && ($suite = $regs[3])) {
2618 2614
 		# Recherche de l'existence du champ date_xxxx,
2619 2615
 		# si oui choisir ce champ, sinon choisir xxxx
2620
-		$date_orig = isset($table['field']["date$suite"]) ? 'date' . $suite : substr($suite, 1);
2616
+		$date_orig = isset($table['field']["date$suite"]) ? 'date'.$suite : substr($suite, 1);
2621 2617
 
2622 2618
 		$pred = $date_orig;
2623 2619
 	} else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
@@ -2634,12 +2630,12 @@  discard block
 block discarded – undo
2634 2630
 		}
2635 2631
 	}
2636 2632
 
2637
-	$date_compare = "\"' . normaliser_date(" .
2638
-		calculer_argument_precedent($idb, $pred, $boucles) .
2633
+	$date_compare = "\"' . normaliser_date(".
2634
+		calculer_argument_precedent($idb, $pred, $boucles).
2639 2635
 		") . '\"";
2640 2636
 
2641 2637
 	$col_vraie = $date_orig;
2642
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2638
+	$date_orig = $boucle->id_table.'.'.$date_orig;
2643 2639
 
2644 2640
 	switch ($col) {
2645 2641
 		case 'date':
@@ -2659,26 +2655,26 @@  discard block
 block discarded – undo
2659 2655
 			break;
2660 2656
 		case 'age':
2661 2657
 			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2662
-			$col_vraie = '';// comparer a un int (par defaut)
2658
+			$col_vraie = ''; // comparer a un int (par defaut)
2663 2659
 			break;
2664 2660
 		case 'age_relatif':
2665 2661
 			$col = calculer_param_date($date_compare, $date_orig);
2666
-			$col_vraie = '';// comparer a un int (par defaut)
2662
+			$col_vraie = ''; // comparer a un int (par defaut)
2667 2663
 			break;
2668 2664
 		case 'jour_relatif':
2669
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2670
-			$col_vraie = '';// comparer a un int (par defaut)
2665
+			$col = '(TO_DAYS('.$date_compare.')-TO_DAYS('.$date_orig.'))';
2666
+			$col_vraie = ''; // comparer a un int (par defaut)
2671 2667
 			break;
2672 2668
 		case 'mois_relatif':
2673
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2674
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2675
-				')-YEAR(' . $date_orig . '))';
2676
-			$col_vraie = '';// comparer a un int (par defaut)
2669
+			$col = 'MONTH('.$date_compare.')-MONTH('.
2670
+				$date_orig.')+12*(YEAR('.$date_compare.
2671
+				')-YEAR('.$date_orig.'))';
2672
+			$col_vraie = ''; // comparer a un int (par defaut)
2677 2673
 			break;
2678 2674
 		case 'annee_relatif':
2679
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2680
-				$date_orig . ')';
2681
-			$col_vraie = '';// comparer a un int (par defaut)
2675
+			$col = 'YEAR('.$date_compare.')-YEAR('.
2676
+				$date_orig.')';
2677
+			$col_vraie = ''; // comparer a un int (par defaut)
2682 2678
 			break;
2683 2679
 	}
2684 2680
 
@@ -2736,10 +2732,10 @@  discard block
 block discarded – undo
2736 2732
 	}
2737 2733
 
2738 2734
 	$boucle->hash .= '
2739
-	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2735
+	$command[\'sourcemode\'] = ' . array_shift($args).";\n";
2740 2736
 
2741 2737
 	$boucle->hash .= '
2742
-	$command[\'source\'] = array(' . implode(', ', $args) . ");\n";
2738
+	$command[\'source\'] = array(' . implode(', ', $args).");\n";
2743 2739
 }
2744 2740
 
2745 2741
 /**
@@ -2758,7 +2754,7 @@  discard block
 block discarded – undo
2758 2754
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2759 2755
 	$boucle = &$boucles[$idb];
2760 2756
 	$boucle->hash .= '
2761
-	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2757
+	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).';';
2762 2758
 }
2763 2759
 
2764 2760
 
@@ -2777,7 +2773,7 @@  discard block
 block discarded – undo
2777 2773
 	$boucle->hash .= '$command[\'args\']=array();';
2778 2774
 	foreach ($crit->param as $param) {
2779 2775
 		$boucle->hash .= '
2780
-			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2776
+			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2781 2777
 	}
2782 2778
 }
2783 2779
 
@@ -2796,14 +2792,14 @@  discard block
 block discarded – undo
2796 2792
  */
2797 2793
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2798 2794
 	$boucle = &$boucles[$idb];
2799
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2795
+	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
2800 2796
 	foreach ($crit->param as $param) {
2801
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2797
+		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste(
2802 2798
 			$param,
2803 2799
 			$idb,
2804 2800
 			$boucles,
2805 2801
 			$boucles[$idb]->id_parent
2806
-		) . ";\n";
2802
+		).";\n";
2807 2803
 	}
2808 2804
 }
2809 2805
 
@@ -2830,14 +2826,14 @@  discard block
 block discarded – undo
2830 2826
  */
2831 2827
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2832 2828
 	$boucle = &$boucles[$idb];
2833
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2829
+	$boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n";
2834 2830
 	foreach ($crit->param as $param) {
2835
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2831
+		$boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste(
2836 2832
 			$param,
2837 2833
 			$idb,
2838 2834
 			$boucles,
2839 2835
 			$boucles[$idb]->id_parent
2840
-		) . ";\n";
2836
+		).";\n";
2841 2837
 	}
2842 2838
 }
2843 2839
 
@@ -2856,7 +2852,7 @@  discard block
 block discarded – undo
2856 2852
 	$boucle = &$boucles[$idb];
2857 2853
 	foreach ($crit->param as $param) {
2858 2854
 		$boucle->hash .= '
2859
-			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2855
+			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2860 2856
 	}
2861 2857
 }
2862 2858
 
@@ -2897,7 +2893,7 @@  discard block
 block discarded – undo
2897 2893
 	if ($crit->param) {
2898 2894
 		foreach ($crit->param as $param) {
2899 2895
 			$boucle->hash .= "\t\$command['si'][] = "
2900
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2896
+				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).";\n";
2901 2897
 		}
2902 2898
 		// interdire {si 0} aussi !
2903 2899
 	} else {
@@ -2921,7 +2917,7 @@  discard block
 block discarded – undo
2921 2917
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2922 2918
 	$boucle = &$boucles[$idb];
2923 2919
 	$boucle->hash .= '
2924
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2920
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2925 2921
 	$command[\'sourcemode\'] = \'table\';';
2926 2922
 }
2927 2923
 
@@ -2956,7 +2952,7 @@  discard block
 block discarded – undo
2956 2952
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2957 2953
 
2958 2954
 	$in = 'IN';
2959
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2955
+	$where = ["'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2960 2956
 	if ($not) {
2961 2957
 		$where = ["'NOT'", $where];
2962 2958
 	}
Please login to merge, or discard this patch.
Braces   +2 added lines, -4 removed lines patch added patch discarded remove patch
@@ -2069,8 +2069,7 @@  discard block
 block discarded – undo
2069 2069
 						// Champ joker * des iterateurs DATA qui accepte tout
2070 2070
 						if (@array_key_exists('*', $desc['field'])) {
2071 2071
 							$desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2072
-						}
2073
-						else {
2072
+						} else {
2074 2073
 							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2075 2074
 							if (!$r) {
2076 2075
 								return '';
@@ -2112,8 +2111,7 @@  discard block
 block discarded – undo
2112 2111
 				. ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
2113 2112
 				. ",'" . addslashes((string) $type_cast_quote) . "'";
2114 2113
 			$val[0] = "sql_quote($r)";
2115
-		}
2116
-		elseif (
2114
+		} elseif (
2117 2115
 			str_contains((string) $val[0], '@@defaultcast@@')
2118 2116
 			&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2119 2117
 		) {
Please login to merge, or discard this patch.
ecrire/public/quete.php 2 patches
Indentation   +421 added lines, -421 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
 
@@ -32,16 +32,16 @@  discard block
 block discarded – undo
32 32
  * @return array|bool|null
33 33
  */
34 34
 function quete_virtuel($id_article, $connect) {
35
-	return sql_getfetsel(
36
-		'virtuel',
37
-		'spip_articles',
38
-		['id_article=' . (int) $id_article, "statut='publie'"],
39
-		'',
40
-		'',
41
-		'',
42
-		'',
43
-		$connect
44
-	);
35
+    return sql_getfetsel(
36
+        'virtuel',
37
+        'spip_articles',
38
+        ['id_article=' . (int) $id_article, "statut='publie'"],
39
+        '',
40
+        '',
41
+        '',
42
+        '',
43
+        $connect
44
+    );
45 45
 }
46 46
 
47 47
 /**
@@ -56,39 +56,39 @@  discard block
 block discarded – undo
56 56
  * @return array
57 57
  */
58 58
 function quete_parent_lang($table, $id, string $connect = '') {
59
-	static $cache_quete = [];
60
-
61
-	if (!isset($cache_quete[$connect][$table][$id])) {
62
-		if (!isset($cache_quete[$connect][$table]['_select'])) {
63
-			$trouver_table = charger_fonction('trouver_table', 'base');
64
-			if (
65
-				!($desc = $trouver_table($table, $connect))
66
-				|| !isset($desc['field']['id_rubrique'])
67
-			) {
68
-				// pas de parent rubrique, on passe
69
-				$cache_quete[$connect][$table]['_select'] = false;
70
-			} else {
71
-				$select = ($table == 'spip_rubriques' ? 'id_parent' : 'id_rubrique');
72
-				$select .= isset($desc['field']['lang']) ? ', lang' : '';
73
-				$cache_quete[$connect][$table]['_select'] = $select;
74
-				$cache_quete[$connect][$table]['_id'] = id_table_objet(objet_type($table));
75
-			}
76
-		}
77
-		if ($cache_quete[$connect][$table]['_select']) {
78
-			$cache_quete[$connect][$table][$id] = sql_fetsel(
79
-				$cache_quete[$connect][$table]['_select'],
80
-				$table,
81
-				$cache_quete[$connect][$table]['_id'] . '=' . (int) $id,
82
-				'',
83
-				'',
84
-				'',
85
-				'',
86
-				$connect
87
-			);
88
-		}
89
-	}
90
-
91
-	return $cache_quete[$connect][$table][$id] ?? null;
59
+    static $cache_quete = [];
60
+
61
+    if (!isset($cache_quete[$connect][$table][$id])) {
62
+        if (!isset($cache_quete[$connect][$table]['_select'])) {
63
+            $trouver_table = charger_fonction('trouver_table', 'base');
64
+            if (
65
+                !($desc = $trouver_table($table, $connect))
66
+                || !isset($desc['field']['id_rubrique'])
67
+            ) {
68
+                // pas de parent rubrique, on passe
69
+                $cache_quete[$connect][$table]['_select'] = false;
70
+            } else {
71
+                $select = ($table == 'spip_rubriques' ? 'id_parent' : 'id_rubrique');
72
+                $select .= isset($desc['field']['lang']) ? ', lang' : '';
73
+                $cache_quete[$connect][$table]['_select'] = $select;
74
+                $cache_quete[$connect][$table]['_id'] = id_table_objet(objet_type($table));
75
+            }
76
+        }
77
+        if ($cache_quete[$connect][$table]['_select']) {
78
+            $cache_quete[$connect][$table][$id] = sql_fetsel(
79
+                $cache_quete[$connect][$table]['_select'],
80
+                $table,
81
+                $cache_quete[$connect][$table]['_id'] . '=' . (int) $id,
82
+                '',
83
+                '',
84
+                '',
85
+                '',
86
+                $connect
87
+            );
88
+        }
89
+    }
90
+
91
+    return $cache_quete[$connect][$table][$id] ?? null;
92 92
 }
93 93
 
94 94
 
@@ -105,11 +105,11 @@  discard block
 block discarded – undo
105 105
  * @return int
106 106
  */
107 107
 function quete_parent($id_rubrique, string $connect = '') {
108
-	if (!$id_rubrique = (int) $id_rubrique) {
109
-		return 0;
110
-	}
111
-	$id_parent = quete_parent_lang('spip_rubriques', $id_rubrique, $connect);
112
-	return $id_parent ? $id_parent['id_parent'] : 0;
108
+    if (!$id_rubrique = (int) $id_rubrique) {
109
+        return 0;
110
+    }
111
+    $id_parent = quete_parent_lang('spip_rubriques', $id_rubrique, $connect);
112
+    return $id_parent ? $id_parent['id_parent'] : 0;
113 113
 }
114 114
 
115 115
 /**
@@ -125,9 +125,9 @@  discard block
 block discarded – undo
125 125
  * @return int
126 126
  */
127 127
 function quete_rubrique($id_article, $serveur) {
128
-	$id_parent = quete_parent_lang('spip_articles', $id_article, $serveur);
128
+    $id_parent = quete_parent_lang('spip_articles', $id_article, $serveur);
129 129
 
130
-	return $id_parent['id_rubrique'] ?? 0;
130
+    return $id_parent['id_rubrique'] ?? 0;
131 131
 }
132 132
 
133 133
 
@@ -140,13 +140,13 @@  discard block
 block discarded – undo
140 140
  * @return int
141 141
  */
142 142
 function quete_profondeur($id, string $connect = '') {
143
-	$n = 0;
144
-	while ($id) {
145
-		$n++;
146
-		$id = quete_parent($id, $connect);
147
-	}
143
+    $n = 0;
144
+    while ($id) {
145
+        $n++;
146
+        $id = quete_parent($id, $connect);
147
+    }
148 148
 
149
-	return $n;
149
+    return $n;
150 150
 }
151 151
 
152 152
 
@@ -162,15 +162,15 @@  discard block
 block discarded – undo
162 162
  *     Morceau de la requête SQL testant la date
163 163
  */
164 164
 function quete_condition_postdates($champ_date, $serveur = '', $ignore_previsu = false) {
165
-	if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && !$ignore_previsu) {
166
-		return '1=1';
167
-	}
168
-
169
-	return
170
-		(isset($GLOBALS['meta']['date_prochain_postdate'])
171
-			&& $GLOBALS['meta']['date_prochain_postdate'] > time())
172
-			? "$champ_date<" . sql_quote(date('Y-m-d H:i:s', $GLOBALS['meta']['date_prochain_postdate']), $serveur)
173
-			: '1=1';
165
+    if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && !$ignore_previsu) {
166
+        return '1=1';
167
+    }
168
+
169
+    return
170
+        (isset($GLOBALS['meta']['date_prochain_postdate'])
171
+            && $GLOBALS['meta']['date_prochain_postdate'] > time())
172
+            ? "$champ_date<" . sql_quote(date('Y-m-d H:i:s', $GLOBALS['meta']['date_prochain_postdate']), $serveur)
173
+            : '1=1';
174 174
 }
175 175
 
176 176
 
@@ -190,101 +190,101 @@  discard block
 block discarded – undo
190 190
  * @return array|string
191 191
  */
192 192
 function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ignore_previsu = false) {
193
-	static $cond = [];
194
-	$key = func_get_args();
195
-	$key = implode('-', $key);
196
-	if (isset($cond[$key])) {
197
-		return $cond[$key];
198
-	}
199
-
200
-	$liste_statuts = $publie;
201
-	if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && !$ignore_previsu) {
202
-		$liste_statuts = $previsu;
203
-	}
204
-	$not = false;
205
-	if (str_starts_with($liste_statuts, '!')) {
206
-		$not = true;
207
-		$liste_statuts = substr($liste_statuts, 1);
208
-	}
209
-	// '' => ne rien afficher, '!'=> ne rien filtrer
210
-	if (!strlen($liste_statuts)) {
211
-		return $cond[$key] = ($not ? '1=1' : '0=1');
212
-	}
213
-
214
-	$liste_statuts = explode(',', $liste_statuts);
215
-	$where = [];
216
-	foreach ($liste_statuts as $k => $v) {
217
-		// filtrage /auteur pour limiter les objets d'un statut (prepa en general)
218
-		// a ceux de l'auteur identifie
219
-		if (str_contains($v, '/')) {
220
-			$v = explode('/', $v);
221
-			$filtre = end($v);
222
-			$v = reset($v);
223
-			$v = preg_replace(',\W,', '', $v);
224
-			if (
225
-				$filtre == 'auteur'
226
-				&& str_contains($mstatut, '.')
227
-				&& ($objet = explode('.', $mstatut))
228
-				&& ($id_table = reset($objet))
229
-				&& ($objet = objet_type($id_table))
230
-			) {
231
-				$w = "$mstatut<>" . sql_quote($v);
232
-
233
-				// retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
234
-				// sinon l’auteur en session
235
-				include_spip('inc/securiser_action');
236
-				if ($desc = decrire_token_previsu()) {
237
-					$id_auteur = $desc['id_auteur'];
238
-				} elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
239
-					$id_auteur = (int) $GLOBALS['visiteur_session']['id_auteur'];
240
-				} else {
241
-					$id_auteur = null;
242
-				}
243
-
244
-				// dans ce cas (admin en general), pas de filtrage sur ce statut
245
-				if (!autoriser('previsualiser' . $v, $objet, '', $id_auteur)) {
246
-					// si pas d'auteur identifie pas de sous-requete car pas d'article qui matche
247
-					if (!$id_auteur) {
248
-						$where[] = $w;
249
-					} else {
250
-						$primary = id_table_objet($objet);
251
-						$where[] = "($w OR $id_table.$primary IN (" . sql_get_select(
252
-							'ssss.id_objet',
253
-							'spip_auteurs_liens AS ssss',
254
-							'ssss.objet=' . sql_quote($objet) . ' AND ssss.id_auteur=' . (int) $id_auteur,
255
-							'',
256
-							'',
257
-							'',
258
-							'',
259
-							$serveur
260
-						) . '))';
261
-					}
262
-				}
263
-			} // ignorer ce statut si on ne sait pas comment le filtrer
264
-			else {
265
-				$v = '';
266
-			}
267
-		}
268
-		// securite
269
-		$liste_statuts[$k] = preg_replace(',\W,', '', $v);
270
-	}
271
-	$liste_statuts = array_filter($liste_statuts);
272
-	if (count($liste_statuts) == 1) {
273
-		$where[] = ['=', $mstatut, sql_quote(reset($liste_statuts), $serveur)];
274
-	} else {
275
-		$where[] = sql_in($mstatut, $liste_statuts, $not, $serveur);
276
-	}
277
-
278
-	while (count($where) > 1) {
279
-		$and = ['AND', array_pop($where), array_pop($where)];
280
-		$where[] = $and;
281
-	}
282
-	$cond[$key] = reset($where);
283
-	if ($not) {
284
-		$cond[$key] = ['NOT', $cond[$key]];
285
-	}
286
-
287
-	return $cond[$key];
193
+    static $cond = [];
194
+    $key = func_get_args();
195
+    $key = implode('-', $key);
196
+    if (isset($cond[$key])) {
197
+        return $cond[$key];
198
+    }
199
+
200
+    $liste_statuts = $publie;
201
+    if (defined('_VAR_PREVIEW') && _VAR_PREVIEW && !$ignore_previsu) {
202
+        $liste_statuts = $previsu;
203
+    }
204
+    $not = false;
205
+    if (str_starts_with($liste_statuts, '!')) {
206
+        $not = true;
207
+        $liste_statuts = substr($liste_statuts, 1);
208
+    }
209
+    // '' => ne rien afficher, '!'=> ne rien filtrer
210
+    if (!strlen($liste_statuts)) {
211
+        return $cond[$key] = ($not ? '1=1' : '0=1');
212
+    }
213
+
214
+    $liste_statuts = explode(',', $liste_statuts);
215
+    $where = [];
216
+    foreach ($liste_statuts as $k => $v) {
217
+        // filtrage /auteur pour limiter les objets d'un statut (prepa en general)
218
+        // a ceux de l'auteur identifie
219
+        if (str_contains($v, '/')) {
220
+            $v = explode('/', $v);
221
+            $filtre = end($v);
222
+            $v = reset($v);
223
+            $v = preg_replace(',\W,', '', $v);
224
+            if (
225
+                $filtre == 'auteur'
226
+                && str_contains($mstatut, '.')
227
+                && ($objet = explode('.', $mstatut))
228
+                && ($id_table = reset($objet))
229
+                && ($objet = objet_type($id_table))
230
+            ) {
231
+                $w = "$mstatut<>" . sql_quote($v);
232
+
233
+                // retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
234
+                // sinon l’auteur en session
235
+                include_spip('inc/securiser_action');
236
+                if ($desc = decrire_token_previsu()) {
237
+                    $id_auteur = $desc['id_auteur'];
238
+                } elseif (isset($GLOBALS['visiteur_session']['id_auteur'])) {
239
+                    $id_auteur = (int) $GLOBALS['visiteur_session']['id_auteur'];
240
+                } else {
241
+                    $id_auteur = null;
242
+                }
243
+
244
+                // dans ce cas (admin en general), pas de filtrage sur ce statut
245
+                if (!autoriser('previsualiser' . $v, $objet, '', $id_auteur)) {
246
+                    // si pas d'auteur identifie pas de sous-requete car pas d'article qui matche
247
+                    if (!$id_auteur) {
248
+                        $where[] = $w;
249
+                    } else {
250
+                        $primary = id_table_objet($objet);
251
+                        $where[] = "($w OR $id_table.$primary IN (" . sql_get_select(
252
+                            'ssss.id_objet',
253
+                            'spip_auteurs_liens AS ssss',
254
+                            'ssss.objet=' . sql_quote($objet) . ' AND ssss.id_auteur=' . (int) $id_auteur,
255
+                            '',
256
+                            '',
257
+                            '',
258
+                            '',
259
+                            $serveur
260
+                        ) . '))';
261
+                    }
262
+                }
263
+            } // ignorer ce statut si on ne sait pas comment le filtrer
264
+            else {
265
+                $v = '';
266
+            }
267
+        }
268
+        // securite
269
+        $liste_statuts[$k] = preg_replace(',\W,', '', $v);
270
+    }
271
+    $liste_statuts = array_filter($liste_statuts);
272
+    if (count($liste_statuts) == 1) {
273
+        $where[] = ['=', $mstatut, sql_quote(reset($liste_statuts), $serveur)];
274
+    } else {
275
+        $where[] = sql_in($mstatut, $liste_statuts, $not, $serveur);
276
+    }
277
+
278
+    while (count($where) > 1) {
279
+        $and = ['AND', array_pop($where), array_pop($where)];
280
+        $where[] = $and;
281
+    }
282
+    $cond[$key] = reset($where);
283
+    if ($not) {
284
+        $cond[$key] = ['NOT', $cond[$key]];
285
+    }
286
+
287
+    return $cond[$key];
288 288
 }
289 289
 
290 290
 /**
@@ -295,7 +295,7 @@  discard block
 block discarded – undo
295 295
  * @return array|bool|null
296 296
  */
297 297
 function quete_fichier($id_document, $serveur = '') {
298
-	return sql_getfetsel('fichier', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
298
+    return sql_getfetsel('fichier', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
299 299
 }
300 300
 
301 301
 /**
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
  * @return array|bool
307 307
  */
308 308
 function quete_document($id_document, $serveur = '') {
309
-	return sql_fetsel('*', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
309
+    return sql_fetsel('*', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
310 310
 }
311 311
 
312 312
 /**
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
  * @return array|bool|null
318 318
  */
319 319
 function quete_meta($nom, $serveur) {
320
-	return sql_getfetsel('valeur', 'spip_meta', 'nom=' . sql_quote($nom), '', '', '', '', $serveur);
320
+    return sql_getfetsel('valeur', 'spip_meta', 'nom=' . sql_quote($nom), '', '', '', '', $serveur);
321 321
 }
322 322
 
323 323
 /**
@@ -343,67 +343,67 @@  discard block
 block discarded – undo
343 343
  *     Retourne soit un tableau, soit le chemin du fichier.
344 344
  */
345 345
 function quete_logo($cle_objet, $onoff, $id, $id_rubrique, $flag = false) {
346
-	include_spip('base/objets');
347
-	$nom = strtolower($onoff);
348
-
349
-	$cle_objet = id_table_objet($cle_objet);
350
-
351
-	while (1) {
352
-		$objet = objet_type($cle_objet);
353
-
354
-		$on = quete_logo_objet($id, $objet, $nom);
355
-
356
-		if ($on) {
357
-			if ($flag) {
358
-				return $on['fichier'];
359
-			} else {
360
-				$taille = @spip_getimagesize($on['chemin']);
361
-
362
-				// Si on a déjà demandé un survol directement ($onoff = off)
363
-				// ou qu'on a demandé uniquement le normal ($onoff = on)
364
-				// alors on ne cherche pas du tout le survol ici
365
-				$off = $onoff != 'ON' ? '' : quete_logo_objet($id, $objet, 'off');
366
-
367
-				// on retourne une url du type IMG/artonXX?timestamp
368
-				// qui permet de distinguer le changement de logo
369
-				// et placer un expire sur le dossier IMG/
370
-				$res = [
371
-					$on['chemin'] . ($on['timestamp'] ? "?{$on['timestamp']}" : ''),
372
-					($off ? $off['chemin'] . ($off['timestamp'] ? "?{$off['timestamp']}" : '') : ''),
373
-					($taille ? ' ' . $taille[3] : (''))
374
-				];
375
-				$res['src'] = $res[0];
376
-				$res['logo_on'] = $res[0];
377
-				$res['logo_off'] = $res[1];
378
-				$res['width'] = ($taille ? $taille[0] : '');
379
-				$res['height'] = ($taille ? $taille[1] : '');
380
-				$res['fichier'] = $on['fichier'];
381
-				$res['titre'] = ($on['titre'] ?? '');
382
-				$res['descriptif'] = ($on['descriptif'] ?? '');
383
-				$res['credits'] = ($on['credits'] ?? '');
384
-				$res['alt'] = ($on['alt'] ?? '');
385
-				$res['id'] = ($on['id_document'] ?? 0);
386
-
387
-				return $res;
388
-			}
389
-		} else {
390
-			if (defined('_LOGO_RUBRIQUE_DESACTIVER_HERITAGE')) {
391
-				return '';
392
-			} else {
393
-				if ($id_rubrique) {
394
-					$cle_objet = 'id_rubrique';
395
-					$id = $id_rubrique;
396
-					$id_rubrique = 0;
397
-				} else {
398
-					if ($id && $cle_objet == 'id_rubrique') {
399
-						$id = quete_parent($id);
400
-					} else {
401
-						return '';
402
-					}
403
-				}
404
-			}
405
-		}
406
-	}
346
+    include_spip('base/objets');
347
+    $nom = strtolower($onoff);
348
+
349
+    $cle_objet = id_table_objet($cle_objet);
350
+
351
+    while (1) {
352
+        $objet = objet_type($cle_objet);
353
+
354
+        $on = quete_logo_objet($id, $objet, $nom);
355
+
356
+        if ($on) {
357
+            if ($flag) {
358
+                return $on['fichier'];
359
+            } else {
360
+                $taille = @spip_getimagesize($on['chemin']);
361
+
362
+                // Si on a déjà demandé un survol directement ($onoff = off)
363
+                // ou qu'on a demandé uniquement le normal ($onoff = on)
364
+                // alors on ne cherche pas du tout le survol ici
365
+                $off = $onoff != 'ON' ? '' : quete_logo_objet($id, $objet, 'off');
366
+
367
+                // on retourne une url du type IMG/artonXX?timestamp
368
+                // qui permet de distinguer le changement de logo
369
+                // et placer un expire sur le dossier IMG/
370
+                $res = [
371
+                    $on['chemin'] . ($on['timestamp'] ? "?{$on['timestamp']}" : ''),
372
+                    ($off ? $off['chemin'] . ($off['timestamp'] ? "?{$off['timestamp']}" : '') : ''),
373
+                    ($taille ? ' ' . $taille[3] : (''))
374
+                ];
375
+                $res['src'] = $res[0];
376
+                $res['logo_on'] = $res[0];
377
+                $res['logo_off'] = $res[1];
378
+                $res['width'] = ($taille ? $taille[0] : '');
379
+                $res['height'] = ($taille ? $taille[1] : '');
380
+                $res['fichier'] = $on['fichier'];
381
+                $res['titre'] = ($on['titre'] ?? '');
382
+                $res['descriptif'] = ($on['descriptif'] ?? '');
383
+                $res['credits'] = ($on['credits'] ?? '');
384
+                $res['alt'] = ($on['alt'] ?? '');
385
+                $res['id'] = ($on['id_document'] ?? 0);
386
+
387
+                return $res;
388
+            }
389
+        } else {
390
+            if (defined('_LOGO_RUBRIQUE_DESACTIVER_HERITAGE')) {
391
+                return '';
392
+            } else {
393
+                if ($id_rubrique) {
394
+                    $cle_objet = 'id_rubrique';
395
+                    $id = $id_rubrique;
396
+                    $id_rubrique = 0;
397
+                } else {
398
+                    if ($id && $cle_objet == 'id_rubrique') {
399
+                        $id = quete_parent($id);
400
+                    } else {
401
+                        return '';
402
+                    }
403
+                }
404
+            }
405
+        }
406
+    }
407 407
 }
408 408
 
409 409
 /**
@@ -418,43 +418,43 @@  discard block
 block discarded – undo
418 418
  * @return bool|array
419 419
  **/
420 420
 function quete_logo_objet($id_objet, $objet, $mode) {
421
-	static $chercher_logo;
422
-	if (is_null($chercher_logo)) {
423
-		$chercher_logo = charger_fonction('chercher_logo', 'inc');
424
-	}
425
-	$cle_objet = id_table_objet($objet);
426
-
427
-	// On cherche pas la méthode classique
428
-	$infos_logo = $chercher_logo($id_objet, $cle_objet, $mode);
429
-
430
-	// Si la méthode classique a trouvé quelque chose, on utilise le nouveau format
431
-	if (!empty($infos_logo)) {
432
-		$infos = [
433
-			'chemin' => $infos_logo[0],
434
-			'timestamp' => $infos_logo[4],
435
-			'id_document' => ($infos_logo[5]['id_document'] ?? ''),
436
-		];
437
-		foreach (['fichier', 'titre', 'descriptif', 'credits', 'alt'] as $champ) {
438
-			$infos[$champ] = ($infos_logo[5][$champ] ?? '');
439
-		}
440
-		$infos_logo = $infos;
441
-	}
442
-
443
-	// On passe cette recherche de logo dans un pipeline
444
-	$infos_logo = pipeline(
445
-		'quete_logo_objet',
446
-		[
447
-			'args' => [
448
-				'id_objet' => $id_objet,
449
-				'objet' => $objet,
450
-				'cle_objet' => $cle_objet,
451
-				'mode' => $mode,
452
-			],
453
-			'data' => $infos_logo,
454
-		]
455
-	);
456
-
457
-	return $infos_logo;
421
+    static $chercher_logo;
422
+    if (is_null($chercher_logo)) {
423
+        $chercher_logo = charger_fonction('chercher_logo', 'inc');
424
+    }
425
+    $cle_objet = id_table_objet($objet);
426
+
427
+    // On cherche pas la méthode classique
428
+    $infos_logo = $chercher_logo($id_objet, $cle_objet, $mode);
429
+
430
+    // Si la méthode classique a trouvé quelque chose, on utilise le nouveau format
431
+    if (!empty($infos_logo)) {
432
+        $infos = [
433
+            'chemin' => $infos_logo[0],
434
+            'timestamp' => $infos_logo[4],
435
+            'id_document' => ($infos_logo[5]['id_document'] ?? ''),
436
+        ];
437
+        foreach (['fichier', 'titre', 'descriptif', 'credits', 'alt'] as $champ) {
438
+            $infos[$champ] = ($infos_logo[5][$champ] ?? '');
439
+        }
440
+        $infos_logo = $infos;
441
+    }
442
+
443
+    // On passe cette recherche de logo dans un pipeline
444
+    $infos_logo = pipeline(
445
+        'quete_logo_objet',
446
+        [
447
+            'args' => [
448
+                'id_objet' => $id_objet,
449
+                'objet' => $objet,
450
+                'cle_objet' => $cle_objet,
451
+                'mode' => $mode,
452
+            ],
453
+            'data' => $infos_logo,
454
+        ]
455
+    );
456
+
457
+    return $infos_logo;
458 458
 }
459 459
 
460 460
 /**
@@ -467,25 +467,25 @@  discard block
 block discarded – undo
467 467
  * @return bool|string
468 468
  */
469 469
 function quete_logo_file($row, $connect = null) {
470
-	include_spip('inc/documents');
471
-	$logo = vignette_logo_document($row, $connect);
472
-	if (!$logo) {
473
-		$logo = image_du_document($row, $connect);
474
-	}
475
-	if (!$logo) {
476
-		$f = charger_fonction('vignette', 'inc');
477
-		$logo = $f($row['extension'], false);
478
-	}
479
-	// si c'est une vignette type doc, la renvoyer direct
480
-	if (
481
-		strcmp((string) $logo, (string) _DIR_PLUGINS) == 0
482
-		|| strcmp((string) $logo, (string) _DIR_PLUGINS_DIST) == 0
483
-		|| strcmp((string) $logo, _DIR_RACINE . 'prive/') == 0
484
-	) {
485
-		return $logo;
486
-	}
487
-
488
-	return get_spip_doc($logo);
470
+    include_spip('inc/documents');
471
+    $logo = vignette_logo_document($row, $connect);
472
+    if (!$logo) {
473
+        $logo = image_du_document($row, $connect);
474
+    }
475
+    if (!$logo) {
476
+        $f = charger_fonction('vignette', 'inc');
477
+        $logo = $f($row['extension'], false);
478
+    }
479
+    // si c'est une vignette type doc, la renvoyer direct
480
+    if (
481
+        strcmp((string) $logo, (string) _DIR_PLUGINS) == 0
482
+        || strcmp((string) $logo, (string) _DIR_PLUGINS_DIST) == 0
483
+        || strcmp((string) $logo, _DIR_RACINE . 'prive/') == 0
484
+    ) {
485
+        return $logo;
486
+    }
487
+
488
+    return get_spip_doc($logo);
489 489
 }
490 490
 
491 491
 /**
@@ -513,20 +513,20 @@  discard block
 block discarded – undo
513 513
  */
514 514
 function quete_logo_document($row, $lien, $align, $mode_logo, $x, $y, string $connect = '') {
515 515
 
516
-	include_spip('inc/documents');
517
-	$logo = '';
518
-	if (!in_array($mode_logo, ['icone', 'apercu'])) {
519
-		$logo = vignette_logo_document($row, $connect);
520
-	}
521
-	// si on veut explicitement la vignette, ne rien renvoyer si il n'y en a pas
522
-	if ($mode_logo == 'vignette' && !$logo) {
523
-		return '';
524
-	}
525
-	if ($mode_logo == 'icone') {
526
-		$row['fichier'] = '';
527
-	}
528
-
529
-	return vignette_automatique($logo, $row, $lien, $x, $y, $align, null, $connect);
516
+    include_spip('inc/documents');
517
+    $logo = '';
518
+    if (!in_array($mode_logo, ['icone', 'apercu'])) {
519
+        $logo = vignette_logo_document($row, $connect);
520
+    }
521
+    // si on veut explicitement la vignette, ne rien renvoyer si il n'y en a pas
522
+    if ($mode_logo == 'vignette' && !$logo) {
523
+        return '';
524
+    }
525
+    if ($mode_logo == 'icone') {
526
+        $row['fichier'] = '';
527
+    }
528
+
529
+    return vignette_automatique($logo, $row, $lien, $x, $y, $align, null, $connect);
530 530
 }
531 531
 
532 532
 /**
@@ -538,26 +538,26 @@  discard block
 block discarded – undo
538 538
  */
539 539
 function quete_html_logo($logo, $align, $lien) {
540 540
 
541
-	if (!is_array($logo)) {
542
-		return '';
543
-	}
544
-
545
-	$contexte = [];
546
-	foreach ($logo as $k => $v) {
547
-		if (!is_numeric($k)) {
548
-			$contexte[$k] = $v;
549
-		}
550
-	}
551
-
552
-	foreach (['titre', 'descriptif', 'credits', 'alt'] as $champ) {
553
-		if (!empty($contexte[$champ])) {
554
-			$contexte[$champ] = appliquer_traitement_champ($contexte[$champ], $champ, 'document');
555
-		}
556
-	}
557
-
558
-	$contexte['align'] = $align;
559
-	$contexte['lien'] = $lien;
560
-	return recuperer_fond('modeles/logo', $contexte);
541
+    if (!is_array($logo)) {
542
+        return '';
543
+    }
544
+
545
+    $contexte = [];
546
+    foreach ($logo as $k => $v) {
547
+        if (!is_numeric($k)) {
548
+            $contexte[$k] = $v;
549
+        }
550
+    }
551
+
552
+    foreach (['titre', 'descriptif', 'credits', 'alt'] as $champ) {
553
+        if (!empty($contexte[$champ])) {
554
+            $contexte[$champ] = appliquer_traitement_champ($contexte[$champ], $champ, 'document');
555
+        }
556
+    }
557
+
558
+    $contexte['align'] = $align;
559
+    $contexte['lien'] = $lien;
560
+    return recuperer_fond('modeles/logo', $contexte);
561 561
 }
562 562
 
563 563
 /**
@@ -571,14 +571,14 @@  discard block
 block discarded – undo
571 571
  * @return string|false
572 572
  */
573 573
 function document_spip_externe($fichier, $connect) {
574
-	if ($connect) {
575
-		$site = quete_meta('adresse_site', $connect);
576
-		if ($site) {
577
-			$dir = quete_meta('dir_img', $connect);
578
-			return "$site/$dir$fichier";
579
-		}
580
-	}
581
-	return false;
574
+    if ($connect) {
575
+        $site = quete_meta('adresse_site', $connect);
576
+        if ($site) {
577
+            $dir = quete_meta('dir_img', $connect);
578
+            return "$site/$dir$fichier";
579
+        }
580
+    }
581
+    return false;
582 582
 }
583 583
 
584 584
 /**
@@ -591,23 +591,23 @@  discard block
 block discarded – undo
591 591
  */
592 592
 function vignette_logo_document($row, string $connect = '') {
593 593
 
594
-	if (!$row || empty($row['id_vignette'])) {
595
-		return '';
596
-	}
597
-	$fichier = quete_fichier($row['id_vignette'], $connect);
598
-	if ($url = document_spip_externe($fichier, $connect)) {
599
-		return $url;
600
-	}
601
-
602
-	$f = get_spip_doc($fichier);
603
-	if ($f && @file_exists($f)) {
604
-		return $f;
605
-	}
606
-	if ($row['mode'] !== 'vignette') {
607
-		return '';
608
-	}
609
-
610
-	return generer_objet_url($row['id_document'], 'document', '', '', null, '', $connect);
594
+    if (!$row || empty($row['id_vignette'])) {
595
+        return '';
596
+    }
597
+    $fichier = quete_fichier($row['id_vignette'], $connect);
598
+    if ($url = document_spip_externe($fichier, $connect)) {
599
+        return $url;
600
+    }
601
+
602
+    $f = get_spip_doc($fichier);
603
+    if ($f && @file_exists($f)) {
604
+        return $f;
605
+    }
606
+    if ($row['mode'] !== 'vignette') {
607
+        return '';
608
+    }
609
+
610
+    return generer_objet_url($row['id_document'], 'document', '', '', null, '', $connect);
611 611
 }
612 612
 
613 613
 /**
@@ -622,66 +622,66 @@  discard block
 block discarded – undo
622 622
  * @return bool|string
623 623
  */
624 624
 function calcul_exposer($id, $prim, $reference, $parent, $type, string $connect = '') {
625
-	static $exposer = [];
626
-
627
-	// Que faut-il exposer ? Tous les elements de $reference
628
-	// ainsi que leur hierarchie ; on ne fait donc ce calcul
629
-	// qu'une fois (par squelette) et on conserve le resultat
630
-	// en static.
631
-	if (!isset($exposer[$m = md5(serialize($reference))][$prim])) {
632
-		$principal = $reference[$type] ?? $reference["@$type"] ?? '';
633
-		// le parent fournit en argument est le parent de $id, pas celui de $principal
634
-		// il n'est donc pas utile
635
-		$parent = 0;
636
-		if (!$principal) { // regarder si un enfant est dans le contexte, auquel cas il expose peut etre le parent courant
637
-			$enfants = ['id_rubrique' => ['id_article'], 'id_groupe' => ['id_mot']];
638
-			if (isset($enfants[$type])) {
639
-				foreach ($enfants[$type] as $t) {
640
-					if (
641
-						isset($reference[$t])
642
-						// cas de la reference donnee dynamiquement par la pagination
643
-						|| isset($reference["@$t"])
644
-					) {
645
-						$type = $t;
646
-						$principal = $reference[$type] ?? $reference["@$type"];
647
-						continue;
648
-					}
649
-				}
650
-			}
651
-		}
652
-		$exposer[$m][$type] = [];
653
-		if ($principal) {
654
-			$principaux = is_array($principal) ? $principal : [$principal];
655
-			foreach ($principaux as $principal) {
656
-				$exposer[$m][$type][$principal] = true;
657
-				if ($type == 'id_mot') {
658
-					if (!$parent) {
659
-						$parent = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . (int) $principal, '', '', '', '', $connect);
660
-					}
661
-					if ($parent) {
662
-						$exposer[$m]['id_groupe'][$parent] = true;
663
-					}
664
-				} else {
665
-					if ($type != 'id_groupe') {
666
-						if (!$parent) {
667
-							if ($type == 'id_rubrique') {
668
-								$parent = $principal;
669
-							}
670
-							if ($type == 'id_article') {
671
-								$parent = quete_rubrique($principal, $connect);
672
-							}
673
-						}
674
-						do {
675
-							$exposer[$m]['id_rubrique'][$parent] = true;
676
-						} while ($parent = quete_parent($parent, $connect));
677
-					}
678
-				}
679
-			}
680
-		}
681
-	}
682
-
683
-	// And the winner is...
684
-	return isset($exposer[$m][$prim]) ? isset($exposer[$m][$prim][$id]) : '';
625
+    static $exposer = [];
626
+
627
+    // Que faut-il exposer ? Tous les elements de $reference
628
+    // ainsi que leur hierarchie ; on ne fait donc ce calcul
629
+    // qu'une fois (par squelette) et on conserve le resultat
630
+    // en static.
631
+    if (!isset($exposer[$m = md5(serialize($reference))][$prim])) {
632
+        $principal = $reference[$type] ?? $reference["@$type"] ?? '';
633
+        // le parent fournit en argument est le parent de $id, pas celui de $principal
634
+        // il n'est donc pas utile
635
+        $parent = 0;
636
+        if (!$principal) { // regarder si un enfant est dans le contexte, auquel cas il expose peut etre le parent courant
637
+            $enfants = ['id_rubrique' => ['id_article'], 'id_groupe' => ['id_mot']];
638
+            if (isset($enfants[$type])) {
639
+                foreach ($enfants[$type] as $t) {
640
+                    if (
641
+                        isset($reference[$t])
642
+                        // cas de la reference donnee dynamiquement par la pagination
643
+                        || isset($reference["@$t"])
644
+                    ) {
645
+                        $type = $t;
646
+                        $principal = $reference[$type] ?? $reference["@$type"];
647
+                        continue;
648
+                    }
649
+                }
650
+            }
651
+        }
652
+        $exposer[$m][$type] = [];
653
+        if ($principal) {
654
+            $principaux = is_array($principal) ? $principal : [$principal];
655
+            foreach ($principaux as $principal) {
656
+                $exposer[$m][$type][$principal] = true;
657
+                if ($type == 'id_mot') {
658
+                    if (!$parent) {
659
+                        $parent = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . (int) $principal, '', '', '', '', $connect);
660
+                    }
661
+                    if ($parent) {
662
+                        $exposer[$m]['id_groupe'][$parent] = true;
663
+                    }
664
+                } else {
665
+                    if ($type != 'id_groupe') {
666
+                        if (!$parent) {
667
+                            if ($type == 'id_rubrique') {
668
+                                $parent = $principal;
669
+                            }
670
+                            if ($type == 'id_article') {
671
+                                $parent = quete_rubrique($principal, $connect);
672
+                            }
673
+                        }
674
+                        do {
675
+                            $exposer[$m]['id_rubrique'][$parent] = true;
676
+                        } while ($parent = quete_parent($parent, $connect));
677
+                    }
678
+                }
679
+            }
680
+        }
681
+    }
682
+
683
+    // And the winner is...
684
+    return isset($exposer[$m][$prim]) ? isset($exposer[$m][$prim][$id]) : '';
685 685
 }
686 686
 
687 687
 /**
@@ -696,23 +696,23 @@  discard block
 block discarded – undo
696 696
  * @return int
697 697
  */
698 698
 function quete_debut_pagination($primary, $valeur, $pas, $iter) {
699
-	// on ne devrait pas arriver ici si la cle primaire est inexistante
700
-	// ou composee, mais verifions
701
-	if (!$primary || preg_match('/[,\s]/', $primary)) {
702
-		return 0;
703
-	}
704
-
705
-	$pos = 0;
706
-	while (($row = $iter->fetch()) && $row[$primary] != $valeur) {
707
-		$pos++;
708
-	}
709
-	// si on a pas trouve
710
-	if (!$row || $row[$primary] != $valeur) {
711
-		return 0;
712
-	}
713
-
714
-	// sinon, calculer le bon numero de page
715
-	return floor($pos / $pas) * $pas;
699
+    // on ne devrait pas arriver ici si la cle primaire est inexistante
700
+    // ou composee, mais verifions
701
+    if (!$primary || preg_match('/[,\s]/', $primary)) {
702
+        return 0;
703
+    }
704
+
705
+    $pos = 0;
706
+    while (($row = $iter->fetch()) && $row[$primary] != $valeur) {
707
+        $pos++;
708
+    }
709
+    // si on a pas trouve
710
+    if (!$row || $row[$primary] != $valeur) {
711
+        return 0;
712
+    }
713
+
714
+    // sinon, calculer le bon numero de page
715
+    return floor($pos / $pas) * $pas;
716 716
 }
717 717
 
718 718
 /**
@@ -722,8 +722,8 @@  discard block
 block discarded – undo
722 722
  * @return boolean
723 723
  */
724 724
 function is_whereable(mixed $value): bool {
725
-	if (is_array($value) && count($value)) {
726
-		return true;
727
-	}
728
-	return is_scalar($value) && strlen($value);
725
+    if (is_array($value) && count($value)) {
726
+        return true;
727
+    }
728
+    return is_scalar($value) && strlen($value);
729 729
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -35,7 +35,7 @@  discard block
 block discarded – undo
35 35
 	return sql_getfetsel(
36 36
 		'virtuel',
37 37
 		'spip_articles',
38
-		['id_article=' . (int) $id_article, "statut='publie'"],
38
+		['id_article='.(int) $id_article, "statut='publie'"],
39 39
 		'',
40 40
 		'',
41 41
 		'',
@@ -78,7 +78,7 @@  discard block
 block discarded – undo
78 78
 			$cache_quete[$connect][$table][$id] = sql_fetsel(
79 79
 				$cache_quete[$connect][$table]['_select'],
80 80
 				$table,
81
-				$cache_quete[$connect][$table]['_id'] . '=' . (int) $id,
81
+				$cache_quete[$connect][$table]['_id'].'='.(int) $id,
82 82
 				'',
83 83
 				'',
84 84
 				'',
@@ -169,7 +169,7 @@  discard block
 block discarded – undo
169 169
 	return
170 170
 		(isset($GLOBALS['meta']['date_prochain_postdate'])
171 171
 			&& $GLOBALS['meta']['date_prochain_postdate'] > time())
172
-			? "$champ_date<" . sql_quote(date('Y-m-d H:i:s', $GLOBALS['meta']['date_prochain_postdate']), $serveur)
172
+			? "$champ_date<".sql_quote(date('Y-m-d H:i:s', $GLOBALS['meta']['date_prochain_postdate']), $serveur)
173 173
 			: '1=1';
174 174
 }
175 175
 
@@ -228,7 +228,7 @@  discard block
 block discarded – undo
228 228
 				&& ($id_table = reset($objet))
229 229
 				&& ($objet = objet_type($id_table))
230 230
 			) {
231
-				$w = "$mstatut<>" . sql_quote($v);
231
+				$w = "$mstatut<>".sql_quote($v);
232 232
 
233 233
 				// retrouver l’id_auteur qui a filé un lien de prévisu éventuellement,
234 234
 				// sinon l’auteur en session
@@ -242,22 +242,22 @@  discard block
 block discarded – undo
242 242
 				}
243 243
 
244 244
 				// dans ce cas (admin en general), pas de filtrage sur ce statut
245
-				if (!autoriser('previsualiser' . $v, $objet, '', $id_auteur)) {
245
+				if (!autoriser('previsualiser'.$v, $objet, '', $id_auteur)) {
246 246
 					// si pas d'auteur identifie pas de sous-requete car pas d'article qui matche
247 247
 					if (!$id_auteur) {
248 248
 						$where[] = $w;
249 249
 					} else {
250 250
 						$primary = id_table_objet($objet);
251
-						$where[] = "($w OR $id_table.$primary IN (" . sql_get_select(
251
+						$where[] = "($w OR $id_table.$primary IN (".sql_get_select(
252 252
 							'ssss.id_objet',
253 253
 							'spip_auteurs_liens AS ssss',
254
-							'ssss.objet=' . sql_quote($objet) . ' AND ssss.id_auteur=' . (int) $id_auteur,
254
+							'ssss.objet='.sql_quote($objet).' AND ssss.id_auteur='.(int) $id_auteur,
255 255
 							'',
256 256
 							'',
257 257
 							'',
258 258
 							'',
259 259
 							$serveur
260
-						) . '))';
260
+						).'))';
261 261
 					}
262 262
 				}
263 263
 			} // ignorer ce statut si on ne sait pas comment le filtrer
@@ -295,7 +295,7 @@  discard block
 block discarded – undo
295 295
  * @return array|bool|null
296 296
  */
297 297
 function quete_fichier($id_document, $serveur = '') {
298
-	return sql_getfetsel('fichier', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
298
+	return sql_getfetsel('fichier', 'spip_documents', ('id_document='.(int) $id_document), '', [], '', '', $serveur);
299 299
 }
300 300
 
301 301
 /**
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
  * @return array|bool
307 307
  */
308 308
 function quete_document($id_document, $serveur = '') {
309
-	return sql_fetsel('*', 'spip_documents', ('id_document=' . (int) $id_document), '', [], '', '', $serveur);
309
+	return sql_fetsel('*', 'spip_documents', ('id_document='.(int) $id_document), '', [], '', '', $serveur);
310 310
 }
311 311
 
312 312
 /**
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
  * @return array|bool|null
318 318
  */
319 319
 function quete_meta($nom, $serveur) {
320
-	return sql_getfetsel('valeur', 'spip_meta', 'nom=' . sql_quote($nom), '', '', '', '', $serveur);
320
+	return sql_getfetsel('valeur', 'spip_meta', 'nom='.sql_quote($nom), '', '', '', '', $serveur);
321 321
 }
322 322
 
323 323
 /**
@@ -368,9 +368,9 @@  discard block
 block discarded – undo
368 368
 				// qui permet de distinguer le changement de logo
369 369
 				// et placer un expire sur le dossier IMG/
370 370
 				$res = [
371
-					$on['chemin'] . ($on['timestamp'] ? "?{$on['timestamp']}" : ''),
372
-					($off ? $off['chemin'] . ($off['timestamp'] ? "?{$off['timestamp']}" : '') : ''),
373
-					($taille ? ' ' . $taille[3] : (''))
371
+					$on['chemin'].($on['timestamp'] ? "?{$on['timestamp']}" : ''),
372
+					($off ? $off['chemin'].($off['timestamp'] ? "?{$off['timestamp']}" : '') : ''),
373
+					($taille ? ' '.$taille[3] : (''))
374 374
 				];
375 375
 				$res['src'] = $res[0];
376 376
 				$res['logo_on'] = $res[0];
@@ -480,7 +480,7 @@  discard block
 block discarded – undo
480 480
 	if (
481 481
 		strcmp((string) $logo, (string) _DIR_PLUGINS) == 0
482 482
 		|| strcmp((string) $logo, (string) _DIR_PLUGINS_DIST) == 0
483
-		|| strcmp((string) $logo, _DIR_RACINE . 'prive/') == 0
483
+		|| strcmp((string) $logo, _DIR_RACINE.'prive/') == 0
484 484
 	) {
485 485
 		return $logo;
486 486
 	}
@@ -656,7 +656,7 @@  discard block
 block discarded – undo
656 656
 				$exposer[$m][$type][$principal] = true;
657 657
 				if ($type == 'id_mot') {
658 658
 					if (!$parent) {
659
-						$parent = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot=' . (int) $principal, '', '', '', '', $connect);
659
+						$parent = sql_getfetsel('id_groupe', 'spip_mots', 'id_mot='.(int) $principal, '', '', '', '', $connect);
660 660
 					}
661 661
 					if ($parent) {
662 662
 						$exposer[$m]['id_groupe'][$parent] = true;
Please login to merge, or discard this patch.