Completed
Push — master ( c0b339...c772b7 )
by cam
02:00
created
ecrire/public/references.php 1 patch
Indentation   +535 added lines, -535 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  * @package SPIP\Core\Compilateur\References
19 19
  **/
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /**
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
  *     - '' si une référence explicite incorrecte est envoyée
44 44
  */
45 45
 function index_boucle($p) {
46
-	if (strlen($p->nom_boucle)) {
47
-		// retourne l’index explicite demandé s’il existe
48
-		if (!empty($p->boucles[$p->nom_boucle])) {
49
-			return $p->nom_boucle;
50
-		}
51
-		return '';
52
-	}
53
-	return $p->id_boucle;
46
+    if (strlen($p->nom_boucle)) {
47
+        // retourne l’index explicite demandé s’il existe
48
+        if (!empty($p->boucles[$p->nom_boucle])) {
49
+            return $p->nom_boucle;
50
+        }
51
+        return '';
52
+    }
53
+    return $p->id_boucle;
54 54
 }
55 55
 
56 56
 
@@ -73,17 +73,17 @@  discard block
 block discarded – undo
73 73
  *     - '' si une référence explicite incorrecte est envoyée
74 74
  */
75 75
 function index_boucle_mere($p) {
76
-	if (strlen($p->nom_boucle)) {
77
-		// retourne l’index explicite demandé s’il existe
78
-		if (!empty($p->boucles[$p->nom_boucle])) {
79
-			return $p->nom_boucle;
80
-		}
81
-		return '';
82
-	}
83
-	if (!empty($p->descr['id_mere'])) {
84
-		return $p->descr['id_mere'];
85
-	}
86
-	return '';
76
+    if (strlen($p->nom_boucle)) {
77
+        // retourne l’index explicite demandé s’il existe
78
+        if (!empty($p->boucles[$p->nom_boucle])) {
79
+            return $p->nom_boucle;
80
+        }
81
+        return '';
82
+    }
83
+    if (!empty($p->descr['id_mere'])) {
84
+        return $p->descr['id_mere'];
85
+    }
86
+    return '';
87 87
 }
88 88
 
89 89
 /**
@@ -117,74 +117,74 @@  discard block
 block discarded – undo
117 117
  *     Code PHP pour obtenir le champ SQL
118 118
  */
119 119
 function index_pile(
120
-	$idb,
121
-	$nom_champ,
122
-	&$boucles,
123
-	$explicite = '',
124
-	$defaut = null,
125
-	$remonte_pile = true,
126
-	$select = true
120
+    $idb,
121
+    $nom_champ,
122
+    &$boucles,
123
+    $explicite = '',
124
+    $defaut = null,
125
+    $remonte_pile = true,
126
+    $select = true
127 127
 ) {
128
-	if (!is_string($defaut)) {
129
-		$defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
130
-	}
131
-
132
-	$idb_origine = $idb;
133
-	$nom_champ_origine = $nom_champ;
134
-
135
-	$i = 0;
136
-	if (strlen($explicite)) {
137
-		// Recherche d'un champ dans un etage superieur
138
-		while (($idb !== $explicite) && ($idb !== '')) {
139
-			#	spip_logger()->info("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
140
-			$i++;
141
-			$idb = $boucles[$idb]->id_parent;
142
-		}
143
-	}
144
-
145
-	#	spip_logger()->info("Cherche: $nom_champ a partir de '$idb'");
146
-	$nom_champ = strtolower($nom_champ);
147
-	$conditionnel = [];
148
-	// attention: entre la boucle nommee 0, "" et le tableau vide,
149
-	// il y a incoherences qu'il vaut mieux eviter
150
-	while (isset($boucles[$idb])) {
151
-		$joker = true;
152
-		// modifie $joker si tous les champs sont autorisés.
153
-		// $t = le select pour le champ, si on l'a trouvé (ou si joker)
154
-		// $c = le nom du champ demandé
155
-		[$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
156
-		if ($t) {
157
-			if ($select && !in_array($t, $boucles[$idb]->select)) {
158
-				$boucles[$idb]->select[] = $t;
159
-			}
160
-			// renseigner la boucle source de ce champ pour les traitements
161
-			$boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
162
-			$champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
163
-			if (!$joker) {
164
-				return index_compose($conditionnel, $champ);
165
-			}
166
-
167
-			// tant que l'on trouve des tables avec joker, on continue
168
-			// avec la boucle parente et on conditionne à l'exécution
169
-			// la présence du champ. Si le champ existe à l'exécution
170
-			// dans une boucle, il est pris, sinon on le cherche dans le parent...
171
-			$conditionnel[] = "isset($champ)?$champ";
172
-		}
173
-
174
-		if ($remonte_pile) {
175
-			#	spip_logger()->info("On remonte vers $i");
176
-			// Sinon on remonte d'un cran
177
-			$idb = $boucles[$idb]->id_parent;
178
-			$i++;
179
-		} else {
180
-			$idb = null;
181
-		}
182
-	}
183
-
184
-	#	spip_logger()->info("Pas vu $nom_champ");
185
-	// esperons qu'il y sera
186
-	// ou qu'on a fourni une valeur par "defaut" plus pertinent
187
-	return index_compose($conditionnel, $defaut);
128
+    if (!is_string($defaut)) {
129
+        $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)';
130
+    }
131
+
132
+    $idb_origine = $idb;
133
+    $nom_champ_origine = $nom_champ;
134
+
135
+    $i = 0;
136
+    if (strlen($explicite)) {
137
+        // Recherche d'un champ dans un etage superieur
138
+        while (($idb !== $explicite) && ($idb !== '')) {
139
+            #	spip_logger()->info("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'");
140
+            $i++;
141
+            $idb = $boucles[$idb]->id_parent;
142
+        }
143
+    }
144
+
145
+    #	spip_logger()->info("Cherche: $nom_champ a partir de '$idb'");
146
+    $nom_champ = strtolower($nom_champ);
147
+    $conditionnel = [];
148
+    // attention: entre la boucle nommee 0, "" et le tableau vide,
149
+    // il y a incoherences qu'il vaut mieux eviter
150
+    while (isset($boucles[$idb])) {
151
+        $joker = true;
152
+        // modifie $joker si tous les champs sont autorisés.
153
+        // $t = le select pour le champ, si on l'a trouvé (ou si joker)
154
+        // $c = le nom du champ demandé
155
+        [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker);
156
+        if ($t) {
157
+            if ($select && !in_array($t, $boucles[$idb]->select)) {
158
+                $boucles[$idb]->select[] = $t;
159
+            }
160
+            // renseigner la boucle source de ce champ pour les traitements
161
+            $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb;
162
+            $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']';
163
+            if (!$joker) {
164
+                return index_compose($conditionnel, $champ);
165
+            }
166
+
167
+            // tant que l'on trouve des tables avec joker, on continue
168
+            // avec la boucle parente et on conditionne à l'exécution
169
+            // la présence du champ. Si le champ existe à l'exécution
170
+            // dans une boucle, il est pris, sinon on le cherche dans le parent...
171
+            $conditionnel[] = "isset($champ)?$champ";
172
+        }
173
+
174
+        if ($remonte_pile) {
175
+            #	spip_logger()->info("On remonte vers $i");
176
+            // Sinon on remonte d'un cran
177
+            $idb = $boucles[$idb]->id_parent;
178
+            $i++;
179
+        } else {
180
+            $idb = null;
181
+        }
182
+    }
183
+
184
+    #	spip_logger()->info("Pas vu $nom_champ");
185
+    // esperons qu'il y sera
186
+    // ou qu'on a fourni une valeur par "defaut" plus pertinent
187
+    return index_compose($conditionnel, $defaut);
188 188
 }
189 189
 
190 190
 /**
@@ -198,12 +198,12 @@  discard block
 block discarded – undo
198 198
  * @return string              Code PHP complet de recherche d'un champ
199 199
  */
200 200
 function index_compose($conditionnel, $defaut) {
201
-	while ($c = array_pop($conditionnel)) {
202
-		// si on passe defaut = '', ne pas générer d'erreur de compilation.
203
-		$defaut = "($c:(" . ($defaut ?: "''") . '))';
204
-	}
201
+    while ($c = array_pop($conditionnel)) {
202
+        // si on passe defaut = '', ne pas générer d'erreur de compilation.
203
+        $defaut = "($c:(" . ($defaut ?: "''") . '))';
204
+    }
205 205
 
206
-	return $defaut;
206
+    return $defaut;
207 207
 }
208 208
 
209 209
 /**
@@ -239,98 +239,98 @@  discard block
 block discarded – undo
239 239
  **/
240 240
 function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) {
241 241
 
242
-	$r = $boucles[$idb]->type_requete;
243
-	// boucle recursive, c'est foutu...
244
-	if ($r == TYPE_RECURSIF) {
245
-		return [];
246
-	}
247
-	if (!$r) {
248
-		$joker = false; // indiquer a l'appelant
249
-		# continuer pour chercher l'erreur suivante
250
-		return ["'#" . $r . ':' . $nom_champ . "'", ''];
251
-	}
252
-
253
-	$desc = $boucles[$idb]->show;
254
-	// le nom du champ est il une exception de la table ? un alias ?
255
-	$excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
256
-	if ($excep) {
257
-		$excep = $excep[$nom_champ] ?? '';
258
-	}
259
-
260
-	// il y a un alias connu pour ce champ
261
-	if ($excep) {
262
-		$joker = false; // indiquer a l'appelant
263
-		return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
264
-	}
265
-
266
-	// le champ existe dans la table, on le prend.
267
-	if (isset($desc['field'][$nom_champ])) {
268
-		$t = $boucles[$idb]->id_table ?? '';
269
-		$joker = false; // indiquer a l'appelant
270
-		// note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] …
271
-		return ["$t.$nom_champ", $nom_champ];
272
-	}
273
-
274
-	// Tous les champs sont-ils acceptés ?
275
-	// Si oui, on retourne le champ, et on lève le flag joker
276
-	// C'est le cas des itérateurs DATA qui acceptent tout
277
-	// et testent la présence du champ à l'exécution et non à la compilation
278
-	// car ils ne connaissent pas ici leurs contenus.
279
-	if (
280
-		/*$joker AND */
281
-		isset($desc['field']['*'])
282
-	) {
283
-		$joker = true; // indiquer a l'appelant
284
-		return [$nom_champ, $nom_champ];
285
-	}
286
-
287
-	$joker = false; // indiquer a l'appelant
288
-
289
-	// la table de jointure est explicitement indiquée (rubrique.titre)
290
-	if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
291
-		[, $_table, $_nom_champ] = $r;
292
-		if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
293
-			$_alias = $cle . '_' . $_nom_champ;
294
-			return index_exception(
295
-				$boucles[$idb],
296
-				$desc,
297
-				$_alias,
298
-				[$_table, $_nom_champ]
299
-			);
300
-		}
301
-		return ['', ''];
302
-	}
303
-
304
-	// pas d'alias, pas de champ, pas de joker...
305
-	// tenter via une jointure...
306
-
307
-	// regarder si le champ est deja dans une jointure existante
308
-	// sinon, si il y a des joitures explicites, la construire
309
-	if (
310
-		!($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]))
311
-		&& $boucles[$idb]->jointures_explicites
312
-	) {
313
-		// [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
314
-		// fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
315
-		// mais est-ce ce qu'on veut ?
316
-		$jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
317
-		if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
318
-			$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
319
-		}
320
-	}
321
-
322
-	if ($t) {
323
-		// si on a trouvé une jointure possible, on fait comme
324
-		// si c'était une exception pour le champ demandé
325
-		return index_exception(
326
-			$boucles[$idb],
327
-			$desc,
328
-			$nom_champ,
329
-			[$t[1]['id_table'], reset($t[2])]
330
-		);
331
-	}
332
-
333
-	return ['', ''];
242
+    $r = $boucles[$idb]->type_requete;
243
+    // boucle recursive, c'est foutu...
244
+    if ($r == TYPE_RECURSIF) {
245
+        return [];
246
+    }
247
+    if (!$r) {
248
+        $joker = false; // indiquer a l'appelant
249
+        # continuer pour chercher l'erreur suivante
250
+        return ["'#" . $r . ':' . $nom_champ . "'", ''];
251
+    }
252
+
253
+    $desc = $boucles[$idb]->show;
254
+    // le nom du champ est il une exception de la table ? un alias ?
255
+    $excep = $GLOBALS['exceptions_des_tables'][$r] ?? '';
256
+    if ($excep) {
257
+        $excep = $excep[$nom_champ] ?? '';
258
+    }
259
+
260
+    // il y a un alias connu pour ce champ
261
+    if ($excep) {
262
+        $joker = false; // indiquer a l'appelant
263
+        return index_exception($boucles[$idb], $desc, $nom_champ, $excep);
264
+    }
265
+
266
+    // le champ existe dans la table, on le prend.
267
+    if (isset($desc['field'][$nom_champ])) {
268
+        $t = $boucles[$idb]->id_table ?? '';
269
+        $joker = false; // indiquer a l'appelant
270
+        // note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] …
271
+        return ["$t.$nom_champ", $nom_champ];
272
+    }
273
+
274
+    // Tous les champs sont-ils acceptés ?
275
+    // Si oui, on retourne le champ, et on lève le flag joker
276
+    // C'est le cas des itérateurs DATA qui acceptent tout
277
+    // et testent la présence du champ à l'exécution et non à la compilation
278
+    // car ils ne connaissent pas ici leurs contenus.
279
+    if (
280
+        /*$joker AND */
281
+        isset($desc['field']['*'])
282
+    ) {
283
+        $joker = true; // indiquer a l'appelant
284
+        return [$nom_champ, $nom_champ];
285
+    }
286
+
287
+    $joker = false; // indiquer a l'appelant
288
+
289
+    // la table de jointure est explicitement indiquée (rubrique.titre)
290
+    if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) {
291
+        [, $_table, $_nom_champ] = $r;
292
+        if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) {
293
+            $_alias = $cle . '_' . $_nom_champ;
294
+            return index_exception(
295
+                $boucles[$idb],
296
+                $desc,
297
+                $_alias,
298
+                [$_table, $_nom_champ]
299
+            );
300
+        }
301
+        return ['', ''];
302
+    }
303
+
304
+    // pas d'alias, pas de champ, pas de joker...
305
+    // tenter via une jointure...
306
+
307
+    // regarder si le champ est deja dans une jointure existante
308
+    // sinon, si il y a des joitures explicites, la construire
309
+    if (
310
+        !($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]))
311
+        && $boucles[$idb]->jointures_explicites
312
+    ) {
313
+        // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!!
314
+        // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites
315
+        // mais est-ce ce qu'on veut ?
316
+        $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites);
317
+        if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) {
318
+            $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]);
319
+        }
320
+    }
321
+
322
+    if ($t) {
323
+        // si on a trouvé une jointure possible, on fait comme
324
+        // si c'était une exception pour le champ demandé
325
+        return index_exception(
326
+            $boucles[$idb],
327
+            $desc,
328
+            $nom_champ,
329
+            [$t[1]['id_table'], reset($t[2])]
330
+        );
331
+    }
332
+
333
+    return ['', ''];
334 334
 }
335 335
 
336 336
 
@@ -358,52 +358,52 @@  discard block
 block discarded – undo
358 358
  *     est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot"
359 359
  **/
360 360
 function index_exception(&$boucle, $desc, $nom_champ, $excep) {
361
-	static $trouver_table;
362
-	if (!$trouver_table) {
363
-		$trouver_table = charger_fonction('trouver_table', 'base');
364
-	}
365
-
366
-	if (is_array($excep)) {
367
-		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
368
-		$t = null;
369
-		if (count($excep) == 3) {
370
-			$index_exception_derogatoire = array_pop($excep);
371
-			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
372
-		}
373
-		if ($t == null) {
374
-			[$e, $x] = $excep;  #PHP4 affecte de gauche a droite
375
-			$excep = $x;    #PHP5 de droite a gauche !
376
-			$j = $trouver_table($e, $boucle->sql_serveur);
377
-			if (!$j) {
378
-				return ['', ''];
379
-			}
380
-			$e = $j['table'];
381
-			if (!$t = array_search($e, $boucle->from)) {
382
-				$k = $j['key']['PRIMARY KEY'];
383
-				if (strpos($k, ',')) {
384
-					$l = (preg_split('/\s*,\s*/', $k));
385
-					$k = $desc['key']['PRIMARY KEY'];
386
-					if (!in_array($k, $l)) {
387
-						spip_logger()->info("jointure impossible $e " . implode(',', $l));
388
-
389
-						return ['', ''];
390
-					}
391
-				}
392
-				$k = [$boucle->id_table, [$e], $k];
393
-				fabrique_jointures($boucle, [$k]);
394
-				$t = array_search($e, $boucle->from);
395
-			}
396
-		}
397
-	} else {
398
-		$t = $boucle->id_table;
399
-	}
400
-	// demander a SQL de gerer le synonyme
401
-	// ca permet que excep soit dynamique (Cedric, 2/3/06)
402
-	if ($excep != $nom_champ) {
403
-		$excep .= ' AS ' . $nom_champ;
404
-	}
405
-
406
-	return ["$t.$excep", $nom_champ];
361
+    static $trouver_table;
362
+    if (!$trouver_table) {
363
+        $trouver_table = charger_fonction('trouver_table', 'base');
364
+    }
365
+
366
+    if (is_array($excep)) {
367
+        // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
368
+        $t = null;
369
+        if (count($excep) == 3) {
370
+            $index_exception_derogatoire = array_pop($excep);
371
+            $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
372
+        }
373
+        if ($t == null) {
374
+            [$e, $x] = $excep;  #PHP4 affecte de gauche a droite
375
+            $excep = $x;    #PHP5 de droite a gauche !
376
+            $j = $trouver_table($e, $boucle->sql_serveur);
377
+            if (!$j) {
378
+                return ['', ''];
379
+            }
380
+            $e = $j['table'];
381
+            if (!$t = array_search($e, $boucle->from)) {
382
+                $k = $j['key']['PRIMARY KEY'];
383
+                if (strpos($k, ',')) {
384
+                    $l = (preg_split('/\s*,\s*/', $k));
385
+                    $k = $desc['key']['PRIMARY KEY'];
386
+                    if (!in_array($k, $l)) {
387
+                        spip_logger()->info("jointure impossible $e " . implode(',', $l));
388
+
389
+                        return ['', ''];
390
+                    }
391
+                }
392
+                $k = [$boucle->id_table, [$e], $k];
393
+                fabrique_jointures($boucle, [$k]);
394
+                $t = array_search($e, $boucle->from);
395
+            }
396
+        }
397
+    } else {
398
+        $t = $boucle->id_table;
399
+    }
400
+    // demander a SQL de gerer le synonyme
401
+    // ca permet que excep soit dynamique (Cedric, 2/3/06)
402
+    if ($excep != $nom_champ) {
403
+        $excep .= ' AS ' . $nom_champ;
404
+    }
405
+
406
+    return ["$t.$excep", $nom_champ];
407 407
 }
408 408
 
409 409
 /**
@@ -428,7 +428,7 @@  discard block
 block discarded – undo
428 428
  *     Code PHP pour retrouver le champ
429 429
  */
430 430
 function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) {
431
-	return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
431
+    return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile);
432 432
 }
433 433
 
434 434
 
@@ -448,9 +448,9 @@  discard block
 block discarded – undo
448 448
  *     Code PHP pour d'exécution de la balise et de ses filtres
449 449
  **/
450 450
 function calculer_champ($p) {
451
-	$p = calculer_balise($p->nom_champ, $p);
451
+    $p = calculer_balise($p->nom_champ, $p);
452 452
 
453
-	return applique_filtres($p);
453
+    return applique_filtres($p);
454 454
 }
455 455
 
456 456
 
@@ -487,29 +487,29 @@  discard block
 block discarded – undo
487 487
  **/
488 488
 function calculer_balise(string $nom, Champ $p): Champ {
489 489
 
490
-	// S'agit-t-il d'une balise_XXXX[_dist]() ?
491
-	if ($f = charger_fonction($nom, 'balise', true)) {
492
-		$res = $f($p);
493
-		// la balise peut retourner un null pour passer la main à la version générique
494
-		if ($res !== null && is_object($res)) {
495
-			$p->balise_calculee = true;
496
-			return $res;
497
-		}
498
-	}
499
-
500
-	// Certaines des balises comportant un _ sont generiques
501
-	if ($balise_generique = chercher_balise_generique($nom)) {
502
-		$res = $balise_generique['fonction_generique']($p);
503
-		// la balise peut retourner un null pour dire qu'elle fait rien mais c'est un peu plus tiré par les cheveux...
504
-		if ($res !== null && is_object($res)) {
505
-			$p->balise_calculee = true;
506
-			return $res;
507
-		}
508
-	}
509
-
510
-	$f = charger_fonction('DEFAUT', 'calculer_balise');
511
-
512
-	return $f($nom, $p);
490
+    // S'agit-t-il d'une balise_XXXX[_dist]() ?
491
+    if ($f = charger_fonction($nom, 'balise', true)) {
492
+        $res = $f($p);
493
+        // la balise peut retourner un null pour passer la main à la version générique
494
+        if ($res !== null && is_object($res)) {
495
+            $p->balise_calculee = true;
496
+            return $res;
497
+        }
498
+    }
499
+
500
+    // Certaines des balises comportant un _ sont generiques
501
+    if ($balise_generique = chercher_balise_generique($nom)) {
502
+        $res = $balise_generique['fonction_generique']($p);
503
+        // la balise peut retourner un null pour dire qu'elle fait rien mais c'est un peu plus tiré par les cheveux...
504
+        if ($res !== null && is_object($res)) {
505
+            $p->balise_calculee = true;
506
+            return $res;
507
+        }
508
+    }
509
+
510
+    $f = charger_fonction('DEFAUT', 'calculer_balise');
511
+
512
+    return $f($nom, $p);
513 513
 }
514 514
 
515 515
 
@@ -537,33 +537,33 @@  discard block
 block discarded – undo
537 537
  **/
538 538
 function calculer_balise_DEFAUT_dist($nom, $p) {
539 539
 
540
-	// ca pourrait etre un champ SQL homonyme,
541
-	$p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
542
-
543
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
544
-	// il faut recracher {...} quand ce n'est finalement pas des args
545
-	if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
546
-		$code = addslashes($p->fonctions[0][1]);
547
-		$p->code .= " . '$code'";
548
-	}
549
-
550
-	// ne pas passer le filtre securite sur les id_xxx
551
-	if (str_starts_with($nom, 'ID_')) {
552
-		$p->interdire_scripts = false;
553
-	}
554
-
555
-	// Compatibilite ascendante avec les couleurs html (#FEFEFE) :
556
-	// SI le champ SQL n'est pas trouve
557
-	// ET si la balise a une forme de couleur
558
-	// ET s'il n'y a ni filtre ni etoile
559
-	// ALORS retourner la couleur.
560
-	// Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
561
-	if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) {
562
-		$p->code = "'#$nom'";
563
-		$p->interdire_scripts = false;
564
-	}
565
-
566
-	return $p;
540
+    // ca pourrait etre un champ SQL homonyme,
541
+    $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle);
542
+
543
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
544
+    // il faut recracher {...} quand ce n'est finalement pas des args
545
+    if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
546
+        $code = addslashes($p->fonctions[0][1]);
547
+        $p->code .= " . '$code'";
548
+    }
549
+
550
+    // ne pas passer le filtre securite sur les id_xxx
551
+    if (str_starts_with($nom, 'ID_')) {
552
+        $p->interdire_scripts = false;
553
+    }
554
+
555
+    // Compatibilite ascendante avec les couleurs html (#FEFEFE) :
556
+    // SI le champ SQL n'est pas trouve
557
+    // ET si la balise a une forme de couleur
558
+    // ET s'il n'y a ni filtre ni etoile
559
+    // ALORS retourner la couleur.
560
+    // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)]
561
+    if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) {
562
+        $p->code = "'#$nom'";
563
+        $p->interdire_scripts = false;
564
+    }
565
+
566
+    return $p;
567 567
 }
568 568
 
569 569
 
@@ -611,52 +611,52 @@  discard block
 block discarded – undo
611 611
  **/
612 612
 function calculer_balise_dynamique($p, $nom, $l, $supp = []) {
613 613
 
614
-	if (!balise_distante_interdite($p)) {
615
-		$p->code = "''";
616
-
617
-		return $p;
618
-	}
619
-	// compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
620
-	// il faut recracher {...} quand ce n'est finalement pas des args
621
-	if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
622
-		$p->fonctions = [];
623
-	}
624
-
625
-	if ($p->param && ($c = $p->param[0])) {
626
-		// liste d'arguments commence toujours par la chaine vide
627
-		array_shift($c);
628
-		// construire la liste d'arguments comme pour un filtre
629
-		$param = compose_filtres_args($p, $c, ',');
630
-	} else {
631
-		$param = '';
632
-	}
633
-	$collecte = collecter_balise_dynamique($l, $p, $nom);
634
-
635
-	$dans_un_modele = false;
636
-	if (
637
-		!empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles'
638
-	) {
639
-		$dans_un_modele = true;
640
-	}
641
-
642
-	// un modele est toujours inséré en texte dans son contenant
643
-	// donc si on est dans le public avec un cache on va perdre le dynamisme
644
-	// et on risque de mettre en cache les valeurs pre-remplies du formulaire
645
-	// on passe donc par une fonction proxy qui si besoin va collecter les arguments
646
-	// et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
647
-	// (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave))
648
-	$p->code = sprintf(
649
-		$dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE,
650
-		$nom,
651
-		implode(',', $collecte),
652
-		($collecte ? $param : substr($param, 1)), # virer la virgule
653
-		memoriser_contexte_compil($p),
654
-		($supp ? ', ' . implode(',', $supp) : (''))
655
-	);
656
-
657
-	$p->interdire_scripts = false;
658
-
659
-	return $p;
614
+    if (!balise_distante_interdite($p)) {
615
+        $p->code = "''";
616
+
617
+        return $p;
618
+    }
619
+    // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour
620
+    // il faut recracher {...} quand ce n'est finalement pas des args
621
+    if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) {
622
+        $p->fonctions = [];
623
+    }
624
+
625
+    if ($p->param && ($c = $p->param[0])) {
626
+        // liste d'arguments commence toujours par la chaine vide
627
+        array_shift($c);
628
+        // construire la liste d'arguments comme pour un filtre
629
+        $param = compose_filtres_args($p, $c, ',');
630
+    } else {
631
+        $param = '';
632
+    }
633
+    $collecte = collecter_balise_dynamique($l, $p, $nom);
634
+
635
+    $dans_un_modele = false;
636
+    if (
637
+        !empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles'
638
+    ) {
639
+        $dans_un_modele = true;
640
+    }
641
+
642
+    // un modele est toujours inséré en texte dans son contenant
643
+    // donc si on est dans le public avec un cache on va perdre le dynamisme
644
+    // et on risque de mettre en cache les valeurs pre-remplies du formulaire
645
+    // on passe donc par une fonction proxy qui si besoin va collecter les arguments
646
+    // et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
647
+    // (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave))
648
+    $p->code = sprintf(
649
+        $dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE,
650
+        $nom,
651
+        implode(',', $collecte),
652
+        ($collecte ? $param : substr($param, 1)), # virer la virgule
653
+        memoriser_contexte_compil($p),
654
+        ($supp ? ', ' . implode(',', $supp) : (''))
655
+    );
656
+
657
+    $p->interdire_scripts = false;
658
+
659
+    return $p;
660 660
 }
661 661
 
662 662
 
@@ -686,17 +686,17 @@  discard block
 block discarded – undo
686 686
  *     Liste des codes PHP d'éxecution des balises collectées
687 687
  **/
688 688
 function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array {
689
-	$args = [];
690
-	foreach ($l as $c) {
691
-		if ($c === null) {
692
-			$args[] = 'null';
693
-		} else {
694
-			$x = calculer_balise($c, $p);
695
-			$args[] = $x->code;
696
-		}
697
-	}
698
-
699
-	return $args;
689
+    $args = [];
690
+    foreach ($l as $c) {
691
+        if ($c === null) {
692
+            $args[] = 'null';
693
+        } else {
694
+            $x = calculer_balise($c, $p);
695
+            $args[] = $x->code;
696
+        }
697
+    }
698
+
699
+    return $args;
700 700
 }
701 701
 
702 702
 
@@ -711,19 +711,19 @@  discard block
 block discarded – undo
711 711
  *     Nom de la connexion
712 712
  **/
713 713
 function trouver_nom_serveur_distant($p) {
714
-	$nom = $p->id_boucle;
715
-	if (
716
-		$nom && isset($p->boucles[$nom])
717
-	) {
718
-		$s = $p->boucles[$nom]->sql_serveur;
719
-		if (
720
-			strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect'])
721
-		) {
722
-			return $serveur;
723
-		}
724
-	}
725
-
726
-	return '';
714
+    $nom = $p->id_boucle;
715
+    if (
716
+        $nom && isset($p->boucles[$nom])
717
+    ) {
718
+        $s = $p->boucles[$nom]->sql_serveur;
719
+        if (
720
+            strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect'])
721
+        ) {
722
+            return $serveur;
723
+        }
724
+    }
725
+
726
+    return '';
727 727
 }
728 728
 
729 729
 
@@ -747,15 +747,15 @@  discard block
 block discarded – undo
747 747
  *     - false : La balise est interdite car le serveur est distant
748 748
  **/
749 749
 function balise_distante_interdite($p) {
750
-	$nom = $p->id_boucle;
750
+    $nom = $p->id_boucle;
751 751
 
752
-	if ($nom && trouver_nom_serveur_distant($p)) {
753
-		spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
752
+    if ($nom && trouver_nom_serveur_distant($p)) {
753
+        spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit'));
754 754
 
755
-		return false;
756
-	}
755
+        return false;
756
+    }
757 757
 
758
-	return true;
758
+    return true;
759 759
 }
760 760
 
761 761
 
@@ -765,75 +765,75 @@  discard block
 block discarded – undo
765 765
 //
766 766
 function champs_traitements($p) {
767 767
 
768
-	if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
769
-		$ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
770
-	} else {
771
-		// quand on utilise un traitement catch-all *
772
-		// celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
773
-		// leur propre securite
774
-		$ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*'];
775
-	}
776
-
777
-	if (is_array($ps)) {
778
-		// Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
779
-		$idb = index_boucle($p);
780
-		// si le champ a ete trouve dans une boucle parente sa source est renseignee ici
781
-		if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
782
-			$idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
783
-		}
784
-
785
-		// mais on peut aussi etre hors boucle. Se mefier.
786
-		$type_requete = $p->boucles[$idb]->type_requete ?? false;
787
-		$table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
788
-
789
-		// bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
790
-		if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) {
791
-			$type_alias = $type_requete;
792
-			$type_requete = $GLOBALS['table_des_tables'][$type_requete];
793
-		} else {
794
-			$type_alias = false;
795
-		}
796
-
797
-		// le traitement peut n'etre defini que pour une table en particulier "spip_articles"
798
-		if ($table_sql && isset($ps[$table_sql])) {
799
-			$ps = $ps[$table_sql];
800
-		} // ou pour une boucle en particulier "DATA","articles"
801
-		elseif ($type_requete && isset($ps[$type_requete])) {
802
-			$ps = $ps[$type_requete];
803
-		} // ou pour une boucle utilisant un alias ("hierarchie")
804
-		elseif ($type_alias && isset($ps[$type_alias])) {
805
-			$ps = $ps[$type_alias];
806
-		} // ou pour indifféremment quelle que soit la boucle
807
-		elseif (isset($ps[0])) {
808
-			$ps = $ps[0];
809
-		} else {
810
-			$ps = false;
811
-		}
812
-	}
813
-
814
-	if (!$ps) {
815
-		return $p->code;
816
-	}
817
-
818
-	// Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
819
-	// ou si in INCLURE contient {doublons}
820
-	// on insere une fonction de remplissage du tableau des doublons
821
-	// dans les filtres propre() ou typo()
822
-	// (qui traitent les raccourcis <docXX> referencant les docs)
823
-
824
-	if (
825
-		isset($p->descr['documents'])
826
-		&& $p->descr['documents']
827
-		&& (str_contains($ps, 'propre') || str_contains($ps, 'typo'))
828
-	) {
829
-		$ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
830
-	}
831
-
832
-	// La protection des champs par |safehtml est assuree par les extensions
833
-	// dans la declaration des traitements des champs sensibles
834
-
835
-	// Remplacer enfin le placeholder %s par le vrai code de la balise
836
-	return str_replace('%s', $p->code, $ps);
768
+    if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) {
769
+        $ps = $GLOBALS['table_des_traitements'][$p->nom_champ];
770
+    } else {
771
+        // quand on utilise un traitement catch-all *
772
+        // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer
773
+        // leur propre securite
774
+        $ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*'];
775
+    }
776
+
777
+    if (is_array($ps)) {
778
+        // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte
779
+        $idb = index_boucle($p);
780
+        // si le champ a ete trouve dans une boucle parente sa source est renseignee ici
781
+        if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) {
782
+            $idb = $p->boucles[$idb]->index_champ[$p->nom_champ];
783
+        }
784
+
785
+        // mais on peut aussi etre hors boucle. Se mefier.
786
+        $type_requete = $p->boucles[$idb]->type_requete ?? false;
787
+        $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false;
788
+
789
+        // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.)
790
+        if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) {
791
+            $type_alias = $type_requete;
792
+            $type_requete = $GLOBALS['table_des_tables'][$type_requete];
793
+        } else {
794
+            $type_alias = false;
795
+        }
796
+
797
+        // le traitement peut n'etre defini que pour une table en particulier "spip_articles"
798
+        if ($table_sql && isset($ps[$table_sql])) {
799
+            $ps = $ps[$table_sql];
800
+        } // ou pour une boucle en particulier "DATA","articles"
801
+        elseif ($type_requete && isset($ps[$type_requete])) {
802
+            $ps = $ps[$type_requete];
803
+        } // ou pour une boucle utilisant un alias ("hierarchie")
804
+        elseif ($type_alias && isset($ps[$type_alias])) {
805
+            $ps = $ps[$type_alias];
806
+        } // ou pour indifféremment quelle que soit la boucle
807
+        elseif (isset($ps[0])) {
808
+            $ps = $ps[0];
809
+        } else {
810
+            $ps = false;
811
+        }
812
+    }
813
+
814
+    if (!$ps) {
815
+        return $p->code;
816
+    }
817
+
818
+    // Si une boucle DOCUMENTS{doublons} est presente dans le squelette,
819
+    // ou si in INCLURE contient {doublons}
820
+    // on insere une fonction de remplissage du tableau des doublons
821
+    // dans les filtres propre() ou typo()
822
+    // (qui traitent les raccourcis <docXX> referencant les docs)
823
+
824
+    if (
825
+        isset($p->descr['documents'])
826
+        && $p->descr['documents']
827
+        && (str_contains($ps, 'propre') || str_contains($ps, 'typo'))
828
+    ) {
829
+        $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')';
830
+    }
831
+
832
+    // La protection des champs par |safehtml est assuree par les extensions
833
+    // dans la declaration des traitements des champs sensibles
834
+
835
+    // Remplacer enfin le placeholder %s par le vrai code de la balise
836
+    return str_replace('%s', $p->code, $ps);
837 837
 }
838 838
 
839 839
 
@@ -845,95 +845,95 @@  discard block
 block discarded – undo
845 845
 //
846 846
 function applique_filtres($p) {
847 847
 
848
-	// Traitements standards (cf. supra)
849
-	$code = $p->etoile == '' ? champs_traitements($p) : $p->code;
848
+    // Traitements standards (cf. supra)
849
+    $code = $p->etoile == '' ? champs_traitements($p) : $p->code;
850 850
 
851
-	// Appliquer les filtres perso
852
-	if ($p->param) {
853
-		$code = compose_filtres($p, $code);
854
-	}
851
+    // Appliquer les filtres perso
852
+    if ($p->param) {
853
+        $code = compose_filtres($p, $code);
854
+    }
855 855
 
856
-	// S'il y a un lien avec la session, ajouter un code qui levera
857
-	// un drapeau dans la structure d'invalidation $Cache
858
-	if (isset($p->descr['session'])) {
859
-		$code = "invalideur_session(\$Cache, $code)";
860
-	}
856
+    // S'il y a un lien avec la session, ajouter un code qui levera
857
+    // un drapeau dans la structure d'invalidation $Cache
858
+    if (isset($p->descr['session'])) {
859
+        $code = "invalideur_session(\$Cache, $code)";
860
+    }
861 861
 
862
-	return sandbox_composer_interdire_scripts($code, $p);
862
+    return sandbox_composer_interdire_scripts($code, $p);
863 863
 }
864 864
 
865 865
 // Cf. function pipeline dans ecrire/inc_utils.php
866 866
 function compose_filtres(&$p, $code) {
867 867
 
868
-	$image_miette = false;
869
-	foreach ($p->param as $filtre) {
870
-		$fonc = array_shift($filtre);
871
-		if (!$fonc) {
872
-			continue;
873
-		} // normalement qu'au premier tour.
874
-		$is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver');
875
-		if ($image_miette && !$is_filtre_image) {
876
-			// il faut graver maintenant car apres le filtre en cours
877
-			// on est pas sur d'avoir encore le nom du fichier dans le pipe
878
-			$code = "filtrer('image_graver', $code)";
879
-			$image_miette = false;
880
-		}
881
-
882
-		// recuperer les arguments du filtre,
883
-		// a separer par "," ou ":" dans le cas du filtre "?{a,b}"
884
-		$countfiltre = is_countable($filtre) ? count($filtre) : 0;
885
-		if ($fonc !== '?') {
886
-			$sep = ',';
887
-		} else {
888
-			$sep = ':';
889
-			// |?{a,b} *doit* avoir exactement 2 arguments ; on les force
890
-			if ($countfiltre != 2) {
891
-				$filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
892
-				$countfiltre = 2;
893
-			}
894
-		}
895
-		$arglist = compose_filtres_args($p, $filtre, $sep);
896
-		$logique = filtre_logique($fonc, $code, substr($arglist, 1));
897
-		if ($logique) {
898
-			$code = $logique;
899
-		} else {
900
-			$code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
901
-			if ($is_filtre_image) {
902
-				$image_miette = true;
903
-			}
904
-		}
905
-	}
906
-	// ramasser les images intermediaires inutiles et graver l'image finale
907
-	if ($image_miette) {
908
-		$code = "filtrer('image_graver',$code)";
909
-	}
910
-
911
-	return $code;
868
+    $image_miette = false;
869
+    foreach ($p->param as $filtre) {
870
+        $fonc = array_shift($filtre);
871
+        if (!$fonc) {
872
+            continue;
873
+        } // normalement qu'au premier tour.
874
+        $is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver');
875
+        if ($image_miette && !$is_filtre_image) {
876
+            // il faut graver maintenant car apres le filtre en cours
877
+            // on est pas sur d'avoir encore le nom du fichier dans le pipe
878
+            $code = "filtrer('image_graver', $code)";
879
+            $image_miette = false;
880
+        }
881
+
882
+        // recuperer les arguments du filtre,
883
+        // a separer par "," ou ":" dans le cas du filtre "?{a,b}"
884
+        $countfiltre = is_countable($filtre) ? count($filtre) : 0;
885
+        if ($fonc !== '?') {
886
+            $sep = ',';
887
+        } else {
888
+            $sep = ':';
889
+            // |?{a,b} *doit* avoir exactement 2 arguments ; on les force
890
+            if ($countfiltre != 2) {
891
+                $filtre = [$filtre[0] ?? '', $filtre[1] ?? ''];
892
+                $countfiltre = 2;
893
+            }
894
+        }
895
+        $arglist = compose_filtres_args($p, $filtre, $sep);
896
+        $logique = filtre_logique($fonc, $code, substr($arglist, 1));
897
+        if ($logique) {
898
+            $code = $logique;
899
+        } else {
900
+            $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre);
901
+            if ($is_filtre_image) {
902
+                $image_miette = true;
903
+            }
904
+        }
905
+    }
906
+    // ramasser les images intermediaires inutiles et graver l'image finale
907
+    if ($image_miette) {
908
+        $code = "filtrer('image_graver',$code)";
909
+    }
910
+
911
+    return $code;
912 912
 }
913 913
 
914 914
 // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes
915 915
 // et comparateurs
916 916
 function filtre_logique($fonc, $code, $arg) {
917
-	return match (true) {
918
-		in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)",
919
-		$fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')",
920
-		$fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')",
921
-		$fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')",
922
-		$fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)",
923
-		$fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')",
924
-		$fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')",
925
-		default => '',
926
-	};
917
+    return match (true) {
918
+        in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)",
919
+        $fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')",
920
+        $fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')",
921
+        $fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')",
922
+        $fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)",
923
+        $fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')",
924
+        $fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')",
925
+        default => '',
926
+    };
927 927
 }
928 928
 
929 929
 function compose_filtres_args($p, $args, $sep) {
930
-	$arglist = '';
931
-	foreach ($args as $arg) {
932
-		$arglist .= $sep .
933
-			calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
934
-	}
930
+    $arglist = '';
931
+    foreach ($args as $arg) {
932
+        $arglist .= $sep .
933
+            calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle);
934
+    }
935 935
 
936
-	return $arglist;
936
+    return $arglist;
937 937
 }
938 938
 
939 939
 
@@ -951,15 +951,15 @@  discard block
 block discarded – undo
951 951
  **/
952 952
 function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) {
953 953
 
954
-	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
955
-	if ($boucles[$idb]->externe) {
956
-		index_pile($idb, $nom_champ, $boucles, '', $defaut);
957
-		// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
958
-		// on ignore le defaut fourni dans ce cas
959
-		$defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
960
-	}
954
+    // si recursif, forcer l'extraction du champ SQL mais ignorer le code
955
+    if ($boucles[$idb]->externe) {
956
+        index_pile($idb, $nom_champ, $boucles, '', $defaut);
957
+        // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
958
+        // on ignore le defaut fourni dans ce cas
959
+        $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)";
960
+    }
961 961
 
962
-	return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
962
+    return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut);
963 963
 }
964 964
 
965 965
 //
@@ -973,30 +973,30 @@  discard block
 block discarded – undo
973 973
 //
974 974
 
975 975
 function rindex_pile($p, $champ, $motif) {
976
-	$n = 0;
977
-	$b = $p->id_boucle;
978
-	$p->code = '';
979
-	while ($b != '') {
980
-		foreach ($p->boucles[$b]->criteres as $critere) {
981
-			if ($critere->op == $motif) {
982
-				$p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
983
-					"]['$champ']";
984
-				$b = '';
985
-				break 2;
986
-			}
987
-		}
988
-		$n++;
989
-		$b = $p->boucles[$b]->id_parent;
990
-	}
991
-
992
-	// si on est hors d'une boucle de {recherche}, cette balise est vide
993
-	if (!$p->code) {
994
-		$p->code = "''";
995
-	}
996
-
997
-	$p->interdire_scripts = false;
998
-
999
-	return $p;
976
+    $n = 0;
977
+    $b = $p->id_boucle;
978
+    $p->code = '';
979
+    while ($b != '') {
980
+        foreach ($p->boucles[$b]->criteres as $critere) {
981
+            if ($critere->op == $motif) {
982
+                $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") .
983
+                    "]['$champ']";
984
+                $b = '';
985
+                break 2;
986
+            }
987
+        }
988
+        $n++;
989
+        $b = $p->boucles[$b]->id_parent;
990
+    }
991
+
992
+    // si on est hors d'une boucle de {recherche}, cette balise est vide
993
+    if (!$p->code) {
994
+        $p->code = "''";
995
+    }
996
+
997
+    $p->interdire_scripts = false;
998
+
999
+    return $p;
1000 1000
 }
1001 1001
 
1002 1002
 /**
@@ -1006,7 +1006,7 @@  discard block
 block discarded – undo
1006 1006
  * @return string Nom de la balise, avec indication de boucle explicite si présent.
1007 1007
  */
1008 1008
 function zbug_presenter_champ($p, $champ = '') {
1009
-	$balise = $champ ?: $p->nom_champ;
1010
-	$explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1011
-	return "#{$explicite}{$balise}";
1009
+    $balise = $champ ?: $p->nom_champ;
1010
+    $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : '';
1011
+    return "#{$explicite}{$balise}";
1012 1012
 }
Please login to merge, or discard this patch.