Completed
Push — master ( 0ae8e3...60e317 )
by cam
01:05
created
ecrire/public/criteres.php 2 patches
Indentation   +1709 added lines, -1709 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,12 +43,12 @@  discard block
 block discarded – undo
43 43
  **/
44 44
 function critere_racine_dist($idb, &$boucles, $crit) {
45 45
 
46
-	$not = $crit->not;
47
-	$boucle = &$boucles[$idb];
48
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
49 49
 
50
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
51
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
50
+    $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
51
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
52 52
 }
53 53
 
54 54
 
@@ -65,15 +65,15 @@  discard block
 block discarded – undo
65 65
  * @return void
66 66
  **/
67 67
 function critere_exclus_dist($idb, &$boucles, $crit) {
68
-	$not = $crit->not;
69
-	$boucle = &$boucles[$idb];
70
-	$id = $boucle->primary;
71
-
72
-	if ($not or !$id) {
73
-		return (['zbug_critere_inconnu', ['critere' => $not . $crit->op]]);
74
-	}
75
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
76
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
68
+    $not = $crit->not;
69
+    $boucle = &$boucles[$idb];
70
+    $id = $boucle->primary;
71
+
72
+    if ($not or !$id) {
73
+        return (['zbug_critere_inconnu', ['critere' => $not . $crit->op]]);
74
+    }
75
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
76
+    $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
77 77
 }
78 78
 
79 79
 
@@ -93,73 +93,73 @@  discard block
 block discarded – undo
93 93
  * @return void
94 94
  **/
95 95
 function critere_doublons_dist($idb, &$boucles, $crit) {
96
-	$boucle = &$boucles[$idb];
97
-	$primary = $boucle->primary;
98
-
99
-	// la table nécessite une clé primaire, non composée
100
-	if (!$primary or strpos($primary, ',')) {
101
-		return (['zbug_doublon_sur_table_sans_cle_primaire']);
102
-	}
103
-
104
-	$not = ($crit->not ? '' : 'NOT');
105
-
106
-	// le doublon s'applique sur un type de boucle (article)
107
-	$nom = "'" . $boucle->type_requete . "'";
108
-
109
-	// compléter le nom avec un nom précisé {doublons nom}
110
-	// on obtient $nom = "'article' . 'nom'"
111
-	if (isset($crit->param[0])) {
112
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113
-	}
114
-
115
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
116
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
117
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
118
-
119
-	// on crée un sql_in avec la clé primaire de la table
120
-	// et la collection des doublons déjà emmagasinés dans le tableau
121
-	// $doublons et son index, ici $nom
122
-
123
-	// debut du code "sql_in('articles.id_article', "
124
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
126
-	// Attention : boucle->doublons désigne une variable qu'on affecte
127
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
128
-
129
-	// le debut complet du code des doublons
130
-	$debut_doub = $debut_in . $debut_doub;
131
-
132
-	// nom du doublon "('article' . 'nom')]"
133
-	$fin_doub = "($nom)]";
134
-
135
-	// si on trouve un autre critère doublon,
136
-	// on fusionne pour avoir un seul IN, et on s'en va !
137
-	foreach ($boucle->where as $k => $w) {
138
-		if (strpos($w[0], $debut_doub) === 0) {
139
-			// fusionner le sql_in (du where)
140
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
-			// fusionner l'initialisation (du hash) pour faire plus joli
142
-			$x = strpos($boucle->hash, $init_comment);
143
-			$len = strlen($init_comment);
144
-			$boucle->hash =
145
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
-
147
-			return;
148
-		}
149
-	}
150
-
151
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
152
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
153
-
154
-	// déclarer le doublon s'il n'existe pas encore
155
-	$boucle->hash .= $init_comment . $init_code;
156
-
157
-
158
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
159
-	# mais elle fait planter une boucle a 2 critere doublons:
160
-	# {!doublons A}{doublons B}
161
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
162
-	#	if ($crit->not) $boucle->doublons = "";
96
+    $boucle = &$boucles[$idb];
97
+    $primary = $boucle->primary;
98
+
99
+    // la table nécessite une clé primaire, non composée
100
+    if (!$primary or strpos($primary, ',')) {
101
+        return (['zbug_doublon_sur_table_sans_cle_primaire']);
102
+    }
103
+
104
+    $not = ($crit->not ? '' : 'NOT');
105
+
106
+    // le doublon s'applique sur un type de boucle (article)
107
+    $nom = "'" . $boucle->type_requete . "'";
108
+
109
+    // compléter le nom avec un nom précisé {doublons nom}
110
+    // on obtient $nom = "'article' . 'nom'"
111
+    if (isset($crit->param[0])) {
112
+        $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113
+    }
114
+
115
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
116
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
117
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
118
+
119
+    // on crée un sql_in avec la clé primaire de la table
120
+    // et la collection des doublons déjà emmagasinés dans le tableau
121
+    // $doublons et son index, ici $nom
122
+
123
+    // debut du code "sql_in('articles.id_article', "
124
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
126
+    // Attention : boucle->doublons désigne une variable qu'on affecte
127
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
128
+
129
+    // le debut complet du code des doublons
130
+    $debut_doub = $debut_in . $debut_doub;
131
+
132
+    // nom du doublon "('article' . 'nom')]"
133
+    $fin_doub = "($nom)]";
134
+
135
+    // si on trouve un autre critère doublon,
136
+    // on fusionne pour avoir un seul IN, et on s'en va !
137
+    foreach ($boucle->where as $k => $w) {
138
+        if (strpos($w[0], $debut_doub) === 0) {
139
+            // fusionner le sql_in (du where)
140
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
+            // fusionner l'initialisation (du hash) pour faire plus joli
142
+            $x = strpos($boucle->hash, $init_comment);
143
+            $len = strlen($init_comment);
144
+            $boucle->hash =
145
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
+
147
+            return;
148
+        }
149
+    }
150
+
151
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
152
+    $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
153
+
154
+    // déclarer le doublon s'il n'existe pas encore
155
+    $boucle->hash .= $init_comment . $init_code;
156
+
157
+
158
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
159
+    # mais elle fait planter une boucle a 2 critere doublons:
160
+    # {!doublons A}{doublons B}
161
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
162
+    #	if ($crit->not) $boucle->doublons = "";
163 163
 }
164 164
 
165 165
 
@@ -180,14 +180,14 @@  discard block
 block discarded – undo
180 180
  * @return void
181 181
  **/
182 182
 function critere_lang_select_dist($idb, &$boucles, $crit) {
183
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
184
-		$param = 'oui';
185
-	}
186
-	if ($crit->not) {
187
-		$param = ($param == 'oui') ? 'non' : 'oui';
188
-	}
189
-	$boucle = &$boucles[$idb];
190
-	$boucle->lang_select = $param;
183
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
184
+        $param = 'oui';
185
+    }
186
+    if ($crit->not) {
187
+        $param = ($param == 'oui') ? 'non' : 'oui';
188
+    }
189
+    $boucle = &$boucles[$idb];
190
+    $boucle->lang_select = $param;
191 191
 }
192 192
 
193 193
 
@@ -209,15 +209,15 @@  discard block
 block discarded – undo
209 209
  * @return void
210 210
  **/
211 211
 function critere_debut_dist($idb, &$boucles, $crit) {
212
-	[$un, $deux] = $crit->param;
213
-	$un = $un[0]->texte;
214
-	$deux = $deux[0]->texte;
215
-	if ($deux) {
216
-		$boucles[$idb]->limit = 
217
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
218
-	} else {
219
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
220
-	}
212
+    [$un, $deux] = $crit->param;
213
+    $un = $un[0]->texte;
214
+    $deux = $deux[0]->texte;
215
+    if ($deux) {
216
+        $boucles[$idb]->limit = 
217
+            'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
218
+    } else {
219
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
220
+    }
221 221
 }
222 222
 
223 223
 
@@ -251,58 +251,58 @@  discard block
 block discarded – undo
251 251
  **/
252 252
 function critere_pagination_dist($idb, &$boucles, $crit) {
253 253
 
254
-	$boucle = &$boucles[$idb];
255
-	// definition de la taille de la page
256
-	$pas = !isset($crit->param[0][0]) ? "''"
257
-		: calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
258
-
259
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
260
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
261
-	} else {
262
-		$r = intval($r[2]);
263
-		$pas = strval($r ?: 10);
264
-	}
265
-
266
-	// Calcul du nommage de la pagination si il existe.
267
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
268
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
269
-	$type = "'$idb'";
270
-	// Calcul d'un nommage spécifique de la pagination si précisé.
271
-	// Syntaxe {pagination 20, nom}
272
-	if (isset($crit->param[0][1])) {
273
-		$type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
274
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
275
-	elseif (isset($crit->param[1][0])) {
276
-		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
277
-	}
278
-
279
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
280
-	$boucle->modificateur['debut_nom'] = $type;
281
-	$partie =
282
-		// tester si le numero de page demande est de la forme '@yyy'
283
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
284
-		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
285
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
286
-		. "\t\t" . '$iter->seek(0);' . "\n"
287
-		. "\t}\n"
288
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
289
-
290
-	$boucle->hash .= '
254
+    $boucle = &$boucles[$idb];
255
+    // definition de la taille de la page
256
+    $pas = !isset($crit->param[0][0]) ? "''"
257
+        : calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent);
258
+
259
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
260
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
261
+    } else {
262
+        $r = intval($r[2]);
263
+        $pas = strval($r ?: 10);
264
+    }
265
+
266
+    // Calcul du nommage de la pagination si il existe.
267
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
268
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
269
+    $type = "'$idb'";
270
+    // Calcul d'un nommage spécifique de la pagination si précisé.
271
+    // Syntaxe {pagination 20, nom}
272
+    if (isset($crit->param[0][1])) {
273
+        $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
274
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
275
+    elseif (isset($crit->param[1][0])) {
276
+        $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
277
+    }
278
+
279
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
280
+    $boucle->modificateur['debut_nom'] = $type;
281
+    $partie =
282
+        // tester si le numero de page demande est de la forme '@yyy'
283
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
284
+        . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
285
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
286
+        . "\t\t" . '$iter->seek(0);' . "\n"
287
+        . "\t}\n"
288
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
289
+
290
+    $boucle->hash .= '
291 291
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
292 292
 
293
-	$boucle->total_parties = $pas;
294
-	calculer_parties($boucles, $idb, $partie, 'p+');
295
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
296
-	// sauf si pas de primaire, ou si primaire composee
297
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
298
-	$t = $boucle->id_table . '.' . $boucle->primary;
299
-	if (
300
-		$boucle->primary
301
-		and !preg_match('/[,\s]/', $boucle->primary)
302
-		and !in_array($t, $boucle->select)
303
-	) {
304
-		$boucle->select[] = $t;
305
-	}
293
+    $boucle->total_parties = $pas;
294
+    calculer_parties($boucles, $idb, $partie, 'p+');
295
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
296
+    // sauf si pas de primaire, ou si primaire composee
297
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
298
+    $t = $boucle->id_table . '.' . $boucle->primary;
299
+    if (
300
+        $boucle->primary
301
+        and !preg_match('/[,\s]/', $boucle->primary)
302
+        and !in_array($t, $boucle->select)
303
+    ) {
304
+        $boucle->select[] = $t;
305
+    }
306 306
 }
307 307
 
308 308
 
@@ -324,24 +324,24 @@  discard block
 block discarded – undo
324 324
  **/
325 325
 function critere_recherche_dist($idb, &$boucles, $crit) {
326 326
 
327
-	$boucle = &$boucles[$idb];
327
+    $boucle = &$boucles[$idb];
328 328
 
329
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
330
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
329
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
330
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
331 331
 
332
-		return;
333
-	}
332
+        return;
333
+    }
334 334
 
335
-	if (isset($crit->param[0])) {
336
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
337
-	} else {
338
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
339
-	}
335
+    if (isset($crit->param[0])) {
336
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
337
+    } else {
338
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
339
+    }
340 340
 
341
-	$_modificateur = var_export($boucle->modificateur, true);
342
-	$boucle->hash .= '
341
+    $_modificateur = var_export($boucle->modificateur, true);
342
+    $boucle->hash .= '
343 343
 	// RECHERCHE'
344
-		. ($crit->cond ? '
344
+        . ($crit->cond ? '
345 345
 	if (!strlen(' . $quoi . ')){
346 346
 		list($rech_select, $rech_where) = array("0 as points","");
347 347
 	} else' : '') . '
@@ -352,21 +352,21 @@  discard block
 block discarded – undo
352 352
 	';
353 353
 
354 354
 
355
-	$t = $boucle->id_table . '.' . $boucle->primary;
356
-	if (!in_array($t, $boucles[$idb]->select)) {
357
-		$boucle->select[] = $t;
358
-	} # pour postgres, neuneu ici
359
-	// jointure uniquement sur le serveur principal
360
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
361
-	if (!$boucle->sql_serveur) {
362
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
363
-		$boucle->from['resultats'] = 'spip_resultats';
364
-	}
365
-	$boucle->select[] = '$rech_select';
366
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
367
-
368
-	// et la recherche trouve
369
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
355
+    $t = $boucle->id_table . '.' . $boucle->primary;
356
+    if (!in_array($t, $boucles[$idb]->select)) {
357
+        $boucle->select[] = $t;
358
+    } # pour postgres, neuneu ici
359
+    // jointure uniquement sur le serveur principal
360
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
361
+    if (!$boucle->sql_serveur) {
362
+        $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
363
+        $boucle->from['resultats'] = 'spip_resultats';
364
+    }
365
+    $boucle->select[] = '$rech_select';
366
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
367
+
368
+    // et la recherche trouve
369
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
370 370
 }
371 371
 
372 372
 /**
@@ -383,25 +383,25 @@  discard block
 block discarded – undo
383 383
  * @return void
384 384
  **/
385 385
 function critere_traduction_dist($idb, &$boucles, $crit) {
386
-	$boucle = &$boucles[$idb];
387
-	$prim = $boucle->primary;
388
-	$table = $boucle->id_table;
389
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
390
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
391
-	$boucle->where[] =
392
-		[
393
-			"'OR'",
394
-			[
395
-				"'AND'",
396
-				["'='", "'$table.id_trad'", 0],
397
-				["'='", "'$table.$prim'", $dprim]
398
-			],
399
-			[
400
-				"'AND'",
401
-				["'>'", "'$table.id_trad'", 0],
402
-				["'='", "'$table.id_trad'", $arg]
403
-			]
404
-		];
386
+    $boucle = &$boucles[$idb];
387
+    $prim = $boucle->primary;
388
+    $table = $boucle->id_table;
389
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
390
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
391
+    $boucle->where[] =
392
+        [
393
+            "'OR'",
394
+            [
395
+                "'AND'",
396
+                ["'='", "'$table.id_trad'", 0],
397
+                ["'='", "'$table.$prim'", $dprim]
398
+            ],
399
+            [
400
+                "'AND'",
401
+                ["'>'", "'$table.id_trad'", 0],
402
+                ["'='", "'$table.id_trad'", $arg]
403
+            ]
404
+        ];
405 405
 }
406 406
 
407 407
 
@@ -419,17 +419,17 @@  discard block
 block discarded – undo
419 419
  * @return void
420 420
  **/
421 421
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
422
-	$boucle = &$boucles[$idb];
423
-	$prim = $boucle->primary;
424
-	$table = $boucle->id_table;
425
-
426
-	$c =
427
-		[
428
-			"'OR'",
429
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
430
-			["'='", "'$table.id_trad'", "'0'"]
431
-		];
432
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
422
+    $boucle = &$boucles[$idb];
423
+    $prim = $boucle->primary;
424
+    $table = $boucle->id_table;
425
+
426
+    $c =
427
+        [
428
+            "'OR'",
429
+            ["'='", "'$table." . "id_trad'", "'$table.$prim'"],
430
+            ["'='", "'$table.id_trad'", "'0'"]
431
+        ];
432
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
433 433
 }
434 434
 
435 435
 
@@ -446,17 +446,17 @@  discard block
 block discarded – undo
446 446
  **/
447 447
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
448 448
 
449
-	$boucle = &$boucles[$idb];
450
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
451
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
452
-	$mparent = $boucle->id_table . '.' . $id_parent;
453
-
454
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
455
-		$boucle->where[] = ["'='", "'$mparent'", $arg];
456
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
457
-	else {
458
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]);
459
-	}
449
+    $boucle = &$boucles[$idb];
450
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
451
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
452
+    $mparent = $boucle->id_table . '.' . $id_parent;
453
+
454
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
455
+        $boucle->where[] = ["'='", "'$mparent'", $arg];
456
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
457
+    else {
458
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]);
459
+    }
460 460
 }
461 461
 
462 462
 
@@ -487,37 +487,37 @@  discard block
 block discarded – undo
487 487
  **/
488 488
 function critere_branche_dist($idb, &$boucles, $crit) {
489 489
 
490
-	$not = $crit->not;
491
-	$boucle = &$boucles[$idb];
492
-	// prendre en priorite un identifiant en parametre {branche XX}
493
-	if (isset($crit->param[0])) {
494
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
495
-		// sinon on le prend chez une boucle parente
496
-	} else {
497
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
498
-	}
499
-
500
-	//Trouver une jointure
501
-	$champ = 'id_rubrique';
502
-	$desc = $boucle->show;
503
-	//Seulement si necessaire
504
-	if (!array_key_exists($champ, $desc['field'])) {
505
-		$cle = trouver_jointure_champ($champ, $boucle);
506
-		$trouver_table = charger_fonction('trouver_table', 'base');
507
-		$desc = $trouver_table($boucle->from[$cle]);
508
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
509
-			$decompose = decompose_champ_id_objet($champ);
510
-			$champ = array_shift($decompose);
511
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
512
-		}
513
-	} else {
514
-		$cle = $boucle->id_table;
515
-	}
516
-
517
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
518
-		. ($not ? ", 'NOT'" : '') . ')';
519
-	$boucle->where[] = !$crit->cond ? $c :
520
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
490
+    $not = $crit->not;
491
+    $boucle = &$boucles[$idb];
492
+    // prendre en priorite un identifiant en parametre {branche XX}
493
+    if (isset($crit->param[0])) {
494
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
495
+        // sinon on le prend chez une boucle parente
496
+    } else {
497
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
498
+    }
499
+
500
+    //Trouver une jointure
501
+    $champ = 'id_rubrique';
502
+    $desc = $boucle->show;
503
+    //Seulement si necessaire
504
+    if (!array_key_exists($champ, $desc['field'])) {
505
+        $cle = trouver_jointure_champ($champ, $boucle);
506
+        $trouver_table = charger_fonction('trouver_table', 'base');
507
+        $desc = $trouver_table($boucle->from[$cle]);
508
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
509
+            $decompose = decompose_champ_id_objet($champ);
510
+            $champ = array_shift($decompose);
511
+            $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
512
+        }
513
+    } else {
514
+        $cle = $boucle->id_table;
515
+    }
516
+
517
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
518
+        . ($not ? ", 'NOT'" : '') . ')';
519
+    $boucle->where[] = !$crit->cond ? $c :
520
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
521 521
 }
522 522
 
523 523
 /**
@@ -533,15 +533,15 @@  discard block
 block discarded – undo
533 533
  **/
534 534
 function critere_logo_dist($idb, &$boucles, $crit) {
535 535
 
536
-	$boucle = &$boucles[$idb];
537
-	$not = ($crit->not ? 'NOT' : '');
538
-	$serveur = $boucle->sql_serveur;
536
+    $boucle = &$boucles[$idb];
537
+    $not = ($crit->not ? 'NOT' : '');
538
+    $serveur = $boucle->sql_serveur;
539 539
 
540
-	$c = "sql_in('" .
541
-		$boucle->id_table . '.' . $boucle->primary
542
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
540
+    $c = "sql_in('" .
541
+        $boucle->id_table . '.' . $boucle->primary
542
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
543 543
 
544
-	$boucle->where[] = $c;
544
+    $boucle->where[] = $c;
545 545
 }
546 546
 
547 547
 
@@ -563,31 +563,31 @@  discard block
 block discarded – undo
563 563
  * @return void
564 564
  **/
565 565
 function critere_fusion_dist($idb, &$boucles, $crit) {
566
-	if ($t = isset($crit->param[0])) {
567
-		$t = $crit->param[0];
568
-		if ($t[0]->type == 'texte') {
569
-			$t = $t[0]->texte;
570
-			if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
571
-				$t = table_objet_sql($r[1]);
572
-				$t = array_search($t, $boucles[$idb]->from);
573
-				if ($t) {
574
-					$t .= '.' . $r[2];
575
-				}
576
-			}
577
-		} else {
578
-			$t = '".'
579
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
580
-				. '."';
581
-		}
582
-	}
583
-	if ($t) {
584
-		$boucles[$idb]->group[] = $t;
585
-		if (!in_array($t, $boucles[$idb]->select)) {
586
-			$boucles[$idb]->select[] = $t;
587
-		}
588
-	} else {
589
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
590
-	}
566
+    if ($t = isset($crit->param[0])) {
567
+        $t = $crit->param[0];
568
+        if ($t[0]->type == 'texte') {
569
+            $t = $t[0]->texte;
570
+            if (preg_match('/^(.*)\.(.*)$/', $t, $r)) {
571
+                $t = table_objet_sql($r[1]);
572
+                $t = array_search($t, $boucles[$idb]->from);
573
+                if ($t) {
574
+                    $t .= '.' . $r[2];
575
+                }
576
+            }
577
+        } else {
578
+            $t = '".'
579
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
580
+                . '."';
581
+        }
582
+    }
583
+    if ($t) {
584
+        $boucles[$idb]->group[] = $t;
585
+        if (!in_array($t, $boucles[$idb]->select)) {
586
+            $boucles[$idb]->select[] = $t;
587
+        }
588
+    } else {
589
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
590
+    }
591 591
 }
592 592
 
593 593
 /**
@@ -607,7 +607,7 @@  discard block
 block discarded – undo
607 607
  * @return void
608 608
  **/
609 609
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
610
-	$boucles[$idb]->group = [];
610
+    $boucles[$idb]->group = [];
611 611
 }
612 612
 
613 613
 /**
@@ -644,44 +644,44 @@  discard block
 block discarded – undo
644 644
  * @param Critere $crit Paramètres du critère dans cette boucle
645 645
  */
646 646
 function critere_collecte_dist($idb, &$boucles, $crit) {
647
-	if (isset($crit->param[0])) {
648
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
649
-		$boucle = $boucles[$idb];
650
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
651
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
652
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
653
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
654
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
655
-			if (
656
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
657
-				or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
658
-			) {
659
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
660
-			} else {
661
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
662
-			}
663
-		}
664
-	} else {
665
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
666
-	}
647
+    if (isset($crit->param[0])) {
648
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
649
+        $boucle = $boucles[$idb];
650
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
651
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
652
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
653
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
654
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
655
+            if (
656
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
657
+                or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
658
+            ) {
659
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
660
+            } else {
661
+                $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
662
+            }
663
+        }
664
+    } else {
665
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
666
+    }
667 667
 }
668 668
 
669 669
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
670
-	$boucle = $boucles[$idb];
671
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
672
-	$var = '$champs_' . $idb;
673
-	$desc = (strpos($boucle->in, (string) "static $var =") !== false);
674
-	if (!$desc) {
675
-		$desc = $boucle->show['field'];
676
-		$desc = implode(',', array_map('_q', array_keys($desc)));
677
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
678
-	}
679
-	if ($desc) {
680
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
681
-	}
682
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
683
-
684
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
670
+    $boucle = $boucles[$idb];
671
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
672
+    $var = '$champs_' . $idb;
673
+    $desc = (strpos($boucle->in, (string) "static $var =") !== false);
674
+    if (!$desc) {
675
+        $desc = $boucle->show['field'];
676
+        $desc = implode(',', array_map('_q', array_keys($desc)));
677
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
678
+    }
679
+    if ($desc) {
680
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
681
+    }
682
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
683
+
684
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
685 685
 }
686 686
 
687 687
 /**
@@ -720,7 +720,7 @@  discard block
 block discarded – undo
720 720
  * @param Critere $crit Paramètres du critère dans cette boucle
721 721
  */
722 722
 function critere_par_dist($idb, &$boucles, $crit) {
723
-	return critere_parinverse($idb, $boucles, $crit);
723
+    return critere_parinverse($idb, $boucles, $crit);
724 724
 }
725 725
 
726 726
 /**
@@ -742,93 +742,93 @@  discard block
 block discarded – undo
742 742
  * @param Critere $crit Paramètres du critère dans cette boucle
743 743
  */
744 744
 function critere_parinverse($idb, &$boucles, $crit) {
745
-	$boucle = &$boucles[$idb];
746
-
747
-	$sens = $collecte = '';
748
-	if ($crit->not) {
749
-		$sens = " . ' DESC'";
750
-	}
751
-	if (isset($boucle->modificateur['collate'])) {
752
-		$collecte = ' . ' . $boucle->modificateur['collate'];
753
-	}
754
-
755
-	// Pour chaque paramètre du critère
756
-	foreach ($crit->param as $tri) {
757
-		$order = $fct = '';
758
-		// tris specifiés dynamiquement {par #ENV{tri}}
759
-		if ($tri[0]->type != 'texte') {
760
-			// calculer le order dynamique qui verifie les champs
761
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
762
-			// ajouter 'hasard' comme possibilité de tri dynamique
763
-			calculer_critere_par_hasard($idb, $boucles, $crit);
764
-		}
765
-		// tris textuels {par titre}
766
-		else {
767
-			$par = array_shift($tri);
768
-			$par = $par->texte;
769
-
770
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
771
-			if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
772
-				$expression = trim($m[1]);
773
-				$champ = trim($m[2]);
774
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
775
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
776
-				} else {
777
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
778
-				}
779
-
780
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
781
-			} elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
782
-				// {par FONCTION(champ)}
783
-				if (isset($match) and count($match) > 2) {
784
-					$par = substr($match[2], 1, -1);
785
-					$fct = $match[1];
786
-				}
787
-				// quelques cas spécifiques {par hasard}, {par date}
788
-				if ($par == 'hasard') {
789
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
790
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
791
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
792
-				} else {
793
-					// cas général {par champ}, {par table.champ}, ...
794
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
795
-				}
796
-			}
797
-
798
-			// on ne sait pas traiter…
799
-			else {
800
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
801
-			}
802
-
803
-			// En cas d'erreur de squelette retournée par une fonction
804
-			if (is_array($order)) {
805
-				return $order;
806
-			}
807
-		}
808
-
809
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
810
-			$t = $m[1];
811
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
812
-				$boucle->select[] = $t;
813
-			}
814
-		} else {
815
-			$sens = '';
816
-		}
817
-
818
-		if ($fct) {
819
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
820
-				$order = "'$fct(" . $r[1] . ")'";
821
-			} else {
822
-				$order = "'$fct(' . $order . ')'";
823
-			}
824
-		}
825
-		$t = $order . $collecte . $sens;
826
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
827
-			$t = $r[1] . $r[2];
828
-		}
829
-
830
-		$boucle->order[] = $t;
831
-	}
745
+    $boucle = &$boucles[$idb];
746
+
747
+    $sens = $collecte = '';
748
+    if ($crit->not) {
749
+        $sens = " . ' DESC'";
750
+    }
751
+    if (isset($boucle->modificateur['collate'])) {
752
+        $collecte = ' . ' . $boucle->modificateur['collate'];
753
+    }
754
+
755
+    // Pour chaque paramètre du critère
756
+    foreach ($crit->param as $tri) {
757
+        $order = $fct = '';
758
+        // tris specifiés dynamiquement {par #ENV{tri}}
759
+        if ($tri[0]->type != 'texte') {
760
+            // calculer le order dynamique qui verifie les champs
761
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
762
+            // ajouter 'hasard' comme possibilité de tri dynamique
763
+            calculer_critere_par_hasard($idb, $boucles, $crit);
764
+        }
765
+        // tris textuels {par titre}
766
+        else {
767
+            $par = array_shift($tri);
768
+            $par = $par->texte;
769
+
770
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
771
+            if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
772
+                $expression = trim($m[1]);
773
+                $champ = trim($m[2]);
774
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
775
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
776
+                } else {
777
+                    return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
778
+                }
779
+
780
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
781
+            } elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
782
+                // {par FONCTION(champ)}
783
+                if (isset($match) and count($match) > 2) {
784
+                    $par = substr($match[2], 1, -1);
785
+                    $fct = $match[1];
786
+                }
787
+                // quelques cas spécifiques {par hasard}, {par date}
788
+                if ($par == 'hasard') {
789
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
790
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
791
+                    $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
792
+                } else {
793
+                    // cas général {par champ}, {par table.champ}, ...
794
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
795
+                }
796
+            }
797
+
798
+            // on ne sait pas traiter…
799
+            else {
800
+                return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
801
+            }
802
+
803
+            // En cas d'erreur de squelette retournée par une fonction
804
+            if (is_array($order)) {
805
+                return $order;
806
+            }
807
+        }
808
+
809
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
810
+            $t = $m[1];
811
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
812
+                $boucle->select[] = $t;
813
+            }
814
+        } else {
815
+            $sens = '';
816
+        }
817
+
818
+        if ($fct) {
819
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
820
+                $order = "'$fct(" . $r[1] . ")'";
821
+            } else {
822
+                $order = "'$fct(' . $order . ')'";
823
+            }
824
+        }
825
+        $t = $order . $collecte . $sens;
826
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
827
+            $t = $r[1] . $r[2];
828
+        }
829
+
830
+        $boucle->order[] = $t;
831
+    }
832 832
 }
833 833
 
834 834
 /**
@@ -842,13 +842,13 @@  discard block
 block discarded – undo
842 842
  * @return string Clause pour le Order by
843 843
  */
844 844
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
845
-	$boucle = &$boucles[$idb];
846
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
847
-	$parha = 'rand() AS hasard';
848
-	if (!in_array($parha, $boucle->select)) {
849
-		$boucle->select[] = $parha;
850
-	}
851
-	return "'hasard'";
845
+    $boucle = &$boucles[$idb];
846
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
847
+    $parha = 'rand() AS hasard';
848
+    if (!in_array($parha, $boucle->select)) {
849
+        $boucle->select[] = $parha;
850
+    }
851
+    return "'hasard'";
852 852
 }
853 853
 
854 854
 /**
@@ -872,24 +872,24 @@  discard block
 block discarded – undo
872 872
  * @return string Clause pour le Order by
873 873
  */
874 874
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
875
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
876
-	if (is_array($_champ)) {
877
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
878
-	}
879
-	$boucle = &$boucles[$idb];
880
-	$texte = '0+' . $_champ;
881
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
882
-	if ($suite !== "''") {
883
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
884
-	}
885
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
886
-	$boucle->select[] = $texte . " AS $asnum";
887
-
888
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
889
-	$orderassinum = trim($orderassinum, "'");
890
-
891
-	$order = "'$orderassinum, $asnum'";
892
-	return $order;
875
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
876
+    if (is_array($_champ)) {
877
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
878
+    }
879
+    $boucle = &$boucles[$idb];
880
+    $texte = '0+' . $_champ;
881
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
882
+    if ($suite !== "''") {
883
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
884
+    }
885
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
886
+    $boucle->select[] = $texte . " AS $asnum";
887
+
888
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
889
+    $orderassinum = trim($orderassinum, "'");
890
+
891
+    $order = "'$orderassinum, $asnum'";
892
+    return $order;
893 893
 }
894 894
 
895 895
 /**
@@ -910,35 +910,35 @@  discard block
 block discarded – undo
910 910
  * @return string Clause pour le Order by
911 911
  */
912 912
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
913
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
914
-	if (is_array($_champ)) {
915
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
916
-	}
917
-	$boucle = &$boucles[$idb];
918
-	$texte = '0+' . $_champ;
919
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
920
-	if ($suite !== "''") {
921
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
922
-	}
923
-
924
-	$as = false;
925
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
926
-	foreach ($boucle->select as $s) {
927
-		if (strpos($s, $select) === 0) {
928
-			$as = trim(substr($s, strlen($select)));
929
-			if (!preg_match(',\W,', $as)) {
930
-				break;
931
-			}
932
-			$as = false;
933
-		}
934
-	}
935
-
936
-	if (!$as) {
937
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
938
-		$boucle->select[] = $select . $as;
939
-	}
940
-	$order = "'$as'";
941
-	return $order;
913
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
914
+    if (is_array($_champ)) {
915
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
916
+    }
917
+    $boucle = &$boucles[$idb];
918
+    $texte = '0+' . $_champ;
919
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
920
+    if ($suite !== "''") {
921
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
922
+    }
923
+
924
+    $as = false;
925
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
926
+    foreach ($boucle->select as $s) {
927
+        if (strpos($s, $select) === 0) {
928
+            $as = trim(substr($s, strlen($select)));
929
+            if (!preg_match(',\W,', $as)) {
930
+                break;
931
+            }
932
+            $as = false;
933
+        }
934
+    }
935
+
936
+    if (!$as) {
937
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
938
+        $boucle->select[] = $select . $as;
939
+    }
940
+    $order = "'$as'";
941
+    return $order;
942 942
 }
943 943
 
944 944
 
@@ -958,14 +958,14 @@  discard block
 block discarded – undo
958 958
  * @return string Clause pour le Order by
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
-	$order = "'multi'";
968
-	return $order;
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
+    $order = "'multi'";
968
+    return $order;
969 969
 }
970 970
 
971 971
 /**
@@ -984,56 +984,56 @@  discard block
 block discarded – undo
984 984
  * @return array|string
985 985
  */
986 986
 function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
987
-	$boucle = &$boucles[$idb];
988
-	$desc = $boucle->show;
989
-
990
-	// le champ existe dans la table, pas de souci (le plus commun)
991
-	if (isset($desc['field'][$par])) {
992
-		$par = $boucle->id_table . '.' . $par;
993
-	}
994
-	// le champ est peut être une jointure
995
-	else {
996
-		$table = $table_alias = false; // toutes les tables de jointure possibles
997
-		$champ = $par;
998
-
999
-		// le champ demandé est une exception de jointure {par titre_mot}
1000
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1001
-			[$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1002
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1003
-		elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1004
-			[, $table, $champ] = $r;
1005
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1006
-			$table = table_objet_sql($table);
1007
-		}
1008
-
1009
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1010
-		// Sinon on cherche le champ dans les tables possibles de jointures
1011
-		// Si la table est déjà dans le from, on la réutilise.
1012
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1013
-			$par = $infos['alias'] . '.' . $champ;
1014
-		} elseif (
1015
-			$boucle->jointures_explicites
1016
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1017
-		) {
1018
-			$par = $alias . '.' . $champ;
1019
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1020
-			$par = $alias . '.' . $champ;
1021
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1022
-		} elseif (
1023
-			$table_alias
1024
-			and isset($boucle->from[$table_alias])
1025
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1026
-		) {
1027
-			$par = $infos['alias'] . '.' . $champ;
1028
-		} elseif ($table) {
1029
-			// On avait table + champ, mais on ne les a pas trouvés
1030
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1031
-		} else {
1032
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1033
-		}
1034
-	}
1035
-
1036
-	return $raw ? $par : "'$par'";
987
+    $boucle = &$boucles[$idb];
988
+    $desc = $boucle->show;
989
+
990
+    // le champ existe dans la table, pas de souci (le plus commun)
991
+    if (isset($desc['field'][$par])) {
992
+        $par = $boucle->id_table . '.' . $par;
993
+    }
994
+    // le champ est peut être une jointure
995
+    else {
996
+        $table = $table_alias = false; // toutes les tables de jointure possibles
997
+        $champ = $par;
998
+
999
+        // le champ demandé est une exception de jointure {par titre_mot}
1000
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1001
+            [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1002
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1003
+        elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1004
+            [, $table, $champ] = $r;
1005
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1006
+            $table = table_objet_sql($table);
1007
+        }
1008
+
1009
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1010
+        // Sinon on cherche le champ dans les tables possibles de jointures
1011
+        // Si la table est déjà dans le from, on la réutilise.
1012
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1013
+            $par = $infos['alias'] . '.' . $champ;
1014
+        } elseif (
1015
+            $boucle->jointures_explicites
1016
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1017
+        ) {
1018
+            $par = $alias . '.' . $champ;
1019
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1020
+            $par = $alias . '.' . $champ;
1021
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1022
+        } elseif (
1023
+            $table_alias
1024
+            and isset($boucle->from[$table_alias])
1025
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1026
+        ) {
1027
+            $par = $infos['alias'] . '.' . $champ;
1028
+        } elseif ($table) {
1029
+            // On avait table + champ, mais on ne les a pas trouvés
1030
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1031
+        } else {
1032
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1033
+        }
1034
+    }
1035
+
1036
+    return $raw ? $par : "'$par'";
1037 1037
 }
1038 1038
 
1039 1039
 /**
@@ -1047,11 +1047,11 @@  discard block
 block discarded – undo
1047 1047
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1048 1048
  */
1049 1049
 function critere_par_joint($table, $champ, &$boucle) {
1050
-	$t = array_search($table, $boucle->from);
1051
-	if (!$t) {
1052
-		$t = trouver_jointure_champ($champ, $boucle);
1053
-	}
1054
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1050
+    $t = array_search($table, $boucle->from);
1051
+    if (!$t) {
1052
+        $t = trouver_jointure_champ($champ, $boucle);
1053
+    }
1054
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1055 1055
 }
1056 1056
 
1057 1057
 /**
@@ -1076,33 +1076,33 @@  discard block
 block discarded – undo
1076 1076
  */
1077 1077
 function critere_inverse_dist($idb, &$boucles, $crit) {
1078 1078
 
1079
-	$boucle = &$boucles[$idb];
1080
-	// Classement par ordre inverse
1081
-	if ($crit->not) {
1082
-		critere_parinverse($idb, $boucles, $crit);
1083
-	} else {
1084
-		$order = "' DESC'";
1085
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1086
-		if (isset($crit->param[0])) {
1087
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1088
-			$order = "(($critere)?' DESC':'')";
1089
-		}
1090
-
1091
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
1092
-		if (!$n) {
1093
-			if (isset($boucle->default_order[0])) {
1094
-				$boucle->default_order[0] .= ' . " DESC"';
1095
-			} else {
1096
-				$boucle->default_order[] = ' DESC';
1097
-			}
1098
-		} else {
1099
-			$t = $boucle->order[$n - 1] . " . $order";
1100
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1101
-				$t = $r[1] . $r[2];
1102
-			}
1103
-			$boucle->order[$n - 1] = $t;
1104
-		}
1105
-	}
1079
+    $boucle = &$boucles[$idb];
1080
+    // Classement par ordre inverse
1081
+    if ($crit->not) {
1082
+        critere_parinverse($idb, $boucles, $crit);
1083
+    } else {
1084
+        $order = "' DESC'";
1085
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1086
+        if (isset($crit->param[0])) {
1087
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1088
+            $order = "(($critere)?' DESC':'')";
1089
+        }
1090
+
1091
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
1092
+        if (!$n) {
1093
+            if (isset($boucle->default_order[0])) {
1094
+                $boucle->default_order[0] .= ' . " DESC"';
1095
+            } else {
1096
+                $boucle->default_order[] = ' DESC';
1097
+            }
1098
+        } else {
1099
+            $t = $boucle->order[$n - 1] . " . $order";
1100
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1101
+                $t = $r[1] . $r[2];
1102
+            }
1103
+            $boucle->order[$n - 1] = $t;
1104
+        }
1105
+    }
1106 1106
 }
1107 1107
 
1108 1108
 /**
@@ -1113,137 +1113,137 @@  discard block
 block discarded – undo
1113 1113
  * @return array|string
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);
1136
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1135
+    $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1136
+    $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1137 1137
 }
1138 1138
 
1139 1139
 
1140 1140
 function critere_agenda_dist($idb, &$boucles, $crit) {
1141
-	$params = $crit->param;
1142
-
1143
-	if ((is_countable($params) ? count($params) : 0) < 1) {
1144
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1145
-	}
1146
-
1147
-	$boucle = &$boucles[$idb];
1148
-	$parent = $boucle->id_parent;
1149
-	$fields = $boucle->show['field'];
1150
-
1151
-	$date = array_shift($params);
1152
-	$type = array_shift($params);
1153
-
1154
-	// la valeur $type doit etre connue a la compilation
1155
-	// donc etre forcement reduite a un litteral unique dans le source
1156
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1157
-
1158
-	// La valeur date doit designer un champ de la table SQL.
1159
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1160
-	// sinon synthetiser le test de verif pour execution ulterieure
1161
-	// On prendra arbitrairement le premier champ si test negatif.
1162
-	if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1163
-		$date = $date[0]->texte;
1164
-		if (!isset($fields[$date])) {
1165
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1166
-		}
1167
-	} else {
1168
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1169
-		$noms = array_keys($fields);
1170
-		$defaut = $noms[0];
1171
-		$noms = join(' ', $noms);
1172
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1173
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1174
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1175
-	}
1176
-	$annee = $params ? array_shift($params) : '';
1177
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1178
-		calculer_liste($annee, $idb, $boucles, $parent) .
1179
-		') ? $x : date("Y"))';
1180
-
1181
-	$mois = $params ? array_shift($params) : '';
1182
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1183
-		calculer_liste($mois, $idb, $boucles, $parent) .
1184
-		') ? $x : date("m"))';
1185
-
1186
-	$jour = $params ? array_shift($params) : '';
1187
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1188
-		calculer_liste($jour, $idb, $boucles, $parent) .
1189
-		') ? $x : date("d"))';
1190
-
1191
-	$annee2 = $params ? array_shift($params) : '';
1192
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1193
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1194
-		') ? $x : date("Y"))';
1195
-
1196
-	$mois2 = $params ? array_shift($params) : '';
1197
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1198
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1199
-		') ? $x : date("m"))';
1200
-
1201
-	$jour2 = $params ? array_shift($params) : '';
1202
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1203
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1204
-		') ? $x : date("d"))';
1205
-
1206
-	$date = $boucle->id_table . ".$date";
1207
-
1208
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1209
-	if ($type == 'jour') {
1210
-		$boucle->where[] = [
1211
-			"'='",
1212
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1213
-			("sql_quote($annee . $mois . $jour$quote_end)")
1214
-		];
1215
-	} elseif ($type == 'mois') {
1216
-		$boucle->where[] = [
1217
-			"'='",
1218
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1219
-			("sql_quote($annee . $mois$quote_end)")
1220
-		];
1221
-	} elseif ($type == 'semaine') {
1222
-		$boucle->where[] = [
1223
-			"'AND'",
1224
-			[
1225
-				"'>='",
1226
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1227
-				("date_debut_semaine($annee, $mois, $jour)")
1228
-			],
1229
-			[
1230
-				"'<='",
1231
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1232
-				("date_fin_semaine($annee, $mois, $jour)")
1233
-			]
1234
-		];
1235
-	} elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1236
-		$boucle->where[] = [
1237
-			"'AND'",
1238
-			[
1239
-				"'>='",
1240
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
-				("sql_quote($annee . $mois . $jour$quote_end)")
1242
-			],
1243
-			["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1244
-		];
1245
-	}
1246
-	// sinon on prend tout
1141
+    $params = $crit->param;
1142
+
1143
+    if ((is_countable($params) ? count($params) : 0) < 1) {
1144
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1145
+    }
1146
+
1147
+    $boucle = &$boucles[$idb];
1148
+    $parent = $boucle->id_parent;
1149
+    $fields = $boucle->show['field'];
1150
+
1151
+    $date = array_shift($params);
1152
+    $type = array_shift($params);
1153
+
1154
+    // la valeur $type doit etre connue a la compilation
1155
+    // donc etre forcement reduite a un litteral unique dans le source
1156
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1157
+
1158
+    // La valeur date doit designer un champ de la table SQL.
1159
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1160
+    // sinon synthetiser le test de verif pour execution ulterieure
1161
+    // On prendra arbitrairement le premier champ si test negatif.
1162
+    if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1163
+        $date = $date[0]->texte;
1164
+        if (!isset($fields[$date])) {
1165
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1166
+        }
1167
+    } else {
1168
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1169
+        $noms = array_keys($fields);
1170
+        $defaut = $noms[0];
1171
+        $noms = join(' ', $noms);
1172
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1173
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1174
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1175
+    }
1176
+    $annee = $params ? array_shift($params) : '';
1177
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1178
+        calculer_liste($annee, $idb, $boucles, $parent) .
1179
+        ') ? $x : date("Y"))';
1180
+
1181
+    $mois = $params ? array_shift($params) : '';
1182
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1183
+        calculer_liste($mois, $idb, $boucles, $parent) .
1184
+        ') ? $x : date("m"))';
1185
+
1186
+    $jour = $params ? array_shift($params) : '';
1187
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1188
+        calculer_liste($jour, $idb, $boucles, $parent) .
1189
+        ') ? $x : date("d"))';
1190
+
1191
+    $annee2 = $params ? array_shift($params) : '';
1192
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1193
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1194
+        ') ? $x : date("Y"))';
1195
+
1196
+    $mois2 = $params ? array_shift($params) : '';
1197
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1198
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1199
+        ') ? $x : date("m"))';
1200
+
1201
+    $jour2 = $params ? array_shift($params) : '';
1202
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1203
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1204
+        ') ? $x : date("d"))';
1205
+
1206
+    $date = $boucle->id_table . ".$date";
1207
+
1208
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1209
+    if ($type == 'jour') {
1210
+        $boucle->where[] = [
1211
+            "'='",
1212
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1213
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1214
+        ];
1215
+    } elseif ($type == 'mois') {
1216
+        $boucle->where[] = [
1217
+            "'='",
1218
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1219
+            ("sql_quote($annee . $mois$quote_end)")
1220
+        ];
1221
+    } elseif ($type == 'semaine') {
1222
+        $boucle->where[] = [
1223
+            "'AND'",
1224
+            [
1225
+                "'>='",
1226
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1227
+                ("date_debut_semaine($annee, $mois, $jour)")
1228
+            ],
1229
+            [
1230
+                "'<='",
1231
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1232
+                ("date_fin_semaine($annee, $mois, $jour)")
1233
+            ]
1234
+        ];
1235
+    } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1236
+        $boucle->where[] = [
1237
+            "'AND'",
1238
+            [
1239
+                "'>='",
1240
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1242
+            ],
1243
+            ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1244
+        ];
1245
+    }
1246
+    // sinon on prend tout
1247 1247
 }
1248 1248
 
1249 1249
 
@@ -1268,33 +1268,33 @@  discard block
 block discarded – undo
1268 1268
  * @return void
1269 1269
  **/
1270 1270
 function calculer_critere_parties($idb, &$boucles, $crit) {
1271
-	$boucle = &$boucles[$idb];
1272
-	$a1 = $crit->param[0];
1273
-	$a2 = $crit->param[1];
1274
-	$op = $crit->op;
1275
-
1276
-	[$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1277
-	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1278
-
1279
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1280
-		$boucle->limit = $a11 . ',' . $a21;
1281
-	} else {
1282
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1283
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1284
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1285
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1286
-		$mode = (($op == '/') ? '/' :
1287
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1288
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1289
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1290
-			$boucle->limit =
1291
-				(is_numeric($a11) ? "'$a11'" : $a11)
1292
-				. ".','."
1293
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1294
-		} else {
1295
-			calculer_parties($boucles, $idb, $partie, $mode);
1296
-		}
1297
-	}
1271
+    $boucle = &$boucles[$idb];
1272
+    $a1 = $crit->param[0];
1273
+    $a2 = $crit->param[1];
1274
+    $op = $crit->op;
1275
+
1276
+    [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1277
+    [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1278
+
1279
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1280
+        $boucle->limit = $a11 . ',' . $a21;
1281
+    } else {
1282
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1283
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1284
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1285
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1286
+        $mode = (($op == '/') ? '/' :
1287
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1288
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1289
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1290
+            $boucle->limit =
1291
+                (is_numeric($a11) ? "'$a11'" : $a11)
1292
+                . ".','."
1293
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1294
+        } else {
1295
+            calculer_parties($boucles, $idb, $partie, $mode);
1296
+        }
1297
+    }
1298 1298
 }
1299 1299
 
1300 1300
 /**
@@ -1322,63 +1322,63 @@  discard block
 block discarded – undo
1322 1322
  * @return void
1323 1323
  **/
1324 1324
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1325
-	$total_parties = $boucles[$id_boucle]->total_parties;
1326
-
1327
-	preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1328
-	[, $op1, $op2] = array_pad($regs, 3, null);
1329
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1330
-	// {1/3}
1331
-	if ($op1 == '/') {
1332
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1333
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1334
-			"($total_parties ? $total_parties : 1)";
1335
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1336
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1337
-	} else {
1338
-		// cas {n-1,x}
1339
-		if ($op1 == '-') {
1340
-			$debut = "$nombre_boucle - $debut;";
1341
-		}
1342
-
1343
-		// cas {x,n-1}
1344
-		if ($op2 == '-') {
1345
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1346
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1347
-					($total_parties . ' - 1'));
1348
-		} else {
1349
-			// {x,1} ou {pagination}
1350
-			$fin = '$debut_boucle'
1351
-				. (is_numeric($total_parties) ?
1352
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1353
-					('+' . $total_parties . ' - 1'));
1354
-		}
1355
-
1356
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1357
-		if ($op1 == 'p') {
1358
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1359
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1360
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1361
-		}
1362
-	}
1363
-
1364
-	// Notes :
1365
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1366
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1367
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1368
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1369
-
1370
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1371
-		. '$debut_boucle = ' . $debut . ";\n	"
1372
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1373
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1374
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1375
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1376
-		. "\n\tif (\$debut_boucle>0"
1377
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1378
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1379
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1380
-
1381
-	$boucles[$id_boucle]->partie = "
1325
+    $total_parties = $boucles[$id_boucle]->total_parties;
1326
+
1327
+    preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1328
+    [, $op1, $op2] = array_pad($regs, 3, null);
1329
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1330
+    // {1/3}
1331
+    if ($op1 == '/') {
1332
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1333
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1334
+            "($total_parties ? $total_parties : 1)";
1335
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1336
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1337
+    } else {
1338
+        // cas {n-1,x}
1339
+        if ($op1 == '-') {
1340
+            $debut = "$nombre_boucle - $debut;";
1341
+        }
1342
+
1343
+        // cas {x,n-1}
1344
+        if ($op2 == '-') {
1345
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1346
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1347
+                    ($total_parties . ' - 1'));
1348
+        } else {
1349
+            // {x,1} ou {pagination}
1350
+            $fin = '$debut_boucle'
1351
+                . (is_numeric($total_parties) ?
1352
+                    (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1353
+                    ('+' . $total_parties . ' - 1'));
1354
+        }
1355
+
1356
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1357
+        if ($op1 == 'p') {
1358
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1359
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1360
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1361
+        }
1362
+    }
1363
+
1364
+    // Notes :
1365
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1366
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1367
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1368
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1369
+
1370
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1371
+        . '$debut_boucle = ' . $debut . ";\n	"
1372
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1373
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1374
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1375
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1376
+        . "\n\tif (\$debut_boucle>0"
1377
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1378
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1379
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1380
+
1381
+    $boucles[$id_boucle]->partie = "
1382 1382
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1383 1383
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1384 1384
 }
@@ -1395,26 +1395,26 @@  discard block
 block discarded – undo
1395 1395
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1396 1396
  **/
1397 1397
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1398
-	if ($param[0]->type != 'texte') {
1399
-		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1400
-		if (isset($param[1]->texte)) {
1401
-			preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
1402
-
1403
-			return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1404
-		} else {
1405
-			return ["intval($a1)", 0];
1406
-		}
1407
-	} else {
1408
-		preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
1409
-		$a1 = $m[1];
1410
-		if (empty($m[3])) {
1411
-			return [$a1, 0];
1412
-		} elseif (!empty($m[4])) {
1413
-			return [$a1, $m[4]];
1414
-		} else {
1415
-			return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1416
-		}
1417
-	}
1398
+    if ($param[0]->type != 'texte') {
1399
+        $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1400
+        if (isset($param[1]->texte)) {
1401
+            preg_match(',^\s*(-([0-9]+))?\s*$,', $param[1]->texte, $m);
1402
+
1403
+            return ["intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)];
1404
+        } else {
1405
+            return ["intval($a1)", 0];
1406
+        }
1407
+    } else {
1408
+        preg_match(',^\s*(([0-9]+)|n)\s*(-\s*([0-9]+)?\s*)?$,', $param[0]->texte, $m);
1409
+        $a1 = $m[1];
1410
+        if (empty($m[3])) {
1411
+            return [$a1, 0];
1412
+        } elseif (!empty($m[4])) {
1413
+            return [$a1, $m[4]];
1414
+        } else {
1415
+            return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1416
+        }
1417
+    }
1418 1418
 }
1419 1419
 
1420 1420
 
@@ -1441,47 +1441,47 @@  discard block
 block discarded – undo
1441 1441
  *     array : Erreur sur un des critères
1442 1442
  **/
1443 1443
 function calculer_criteres($idb, &$boucles) {
1444
-	$msg = '';
1445
-	$boucle = $boucles[$idb];
1446
-	$table = strtoupper($boucle->type_requete);
1447
-	$serveur = strtolower($boucle->sql_serveur);
1448
-
1449
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1450
-	// s'il y avait une erreur de syntaxe, propager cette info
1451
-	if (!is_array($boucle->criteres)) {
1452
-		return [];
1453
-	}
1454
-
1455
-	foreach ($boucle->criteres as $crit) {
1456
-		$critere = $crit->op;
1457
-		// critere personnalise ?
1458
-		if (
1459
-			(!$serveur or
1460
-				((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1461
-					and (!function_exists($f = $f . '_dist'))
1462
-					and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1463
-					and (!function_exists($f = $f . '_dist'))
1464
-				)
1465
-			)
1466
-			and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1467
-			and (!function_exists($f = $f . '_dist'))
1468
-			and (!function_exists($f = 'critere_' . $critere))
1469
-			and (!function_exists($f = $f . '_dist'))
1470
-		) {
1471
-			// fonction critere standard
1472
-			$f = $defaut;
1473
-		}
1474
-		// compile le critere
1475
-		$res = $f($idb, $boucles, $crit);
1476
-
1477
-		// Gestion centralisee des erreurs pour pouvoir propager
1478
-		if (is_array($res)) {
1479
-			$msg = $res;
1480
-			erreur_squelette($msg, $boucle);
1481
-		}
1482
-	}
1483
-
1484
-	return $msg;
1444
+    $msg = '';
1445
+    $boucle = $boucles[$idb];
1446
+    $table = strtoupper($boucle->type_requete);
1447
+    $serveur = strtolower($boucle->sql_serveur);
1448
+
1449
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1450
+    // s'il y avait une erreur de syntaxe, propager cette info
1451
+    if (!is_array($boucle->criteres)) {
1452
+        return [];
1453
+    }
1454
+
1455
+    foreach ($boucle->criteres as $crit) {
1456
+        $critere = $crit->op;
1457
+        // critere personnalise ?
1458
+        if (
1459
+            (!$serveur or
1460
+                ((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1461
+                    and (!function_exists($f = $f . '_dist'))
1462
+                    and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1463
+                    and (!function_exists($f = $f . '_dist'))
1464
+                )
1465
+            )
1466
+            and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1467
+            and (!function_exists($f = $f . '_dist'))
1468
+            and (!function_exists($f = 'critere_' . $critere))
1469
+            and (!function_exists($f = $f . '_dist'))
1470
+        ) {
1471
+            // fonction critere standard
1472
+            $f = $defaut;
1473
+        }
1474
+        // compile le critere
1475
+        $res = $f($idb, $boucles, $crit);
1476
+
1477
+        // Gestion centralisee des erreurs pour pouvoir propager
1478
+        if (is_array($res)) {
1479
+            $msg = $res;
1480
+            erreur_squelette($msg, $boucle);
1481
+        }
1482
+    }
1483
+
1484
+    return $msg;
1485 1485
 }
1486 1486
 
1487 1487
 /**
@@ -1496,11 +1496,11 @@  discard block
 block discarded – undo
1496 1496
  * @return string         Code compilé rééchappé
1497 1497
  */
1498 1498
 function kwote($lisp, $serveur = '', $type = '') {
1499
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1500
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1501
-	} else {
1502
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1503
-	}
1499
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1500
+        return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1501
+    } else {
1502
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1503
+    }
1504 1504
 }
1505 1505
 
1506 1506
 
@@ -1519,81 +1519,81 @@  discard block
 block discarded – undo
1519 1519
  * @return void
1520 1520
  **/
1521 1521
 function critere_IN_dist($idb, &$boucles, $crit) {
1522
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1523
-	if (!$r) {
1524
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
1525
-	}
1526
-	[$arg, $op, $val, $col, $where_complement] = $r;
1527
-
1528
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1529
-
1530
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1531
-	$where = $in;
1532
-	if ($crit->cond) {
1533
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1534
-		$where = ["'?'", $pred, $where, "''"];
1535
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1536
-		$where_complement = ["'?'", $pred, $where_complement, "''"];
1537
-		}
1538
-	}
1539
-	if ($crit->exclus) {
1540
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1541
-			$where = ["'NOT'", $where];
1542
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1543
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1544
-		{
1545
-			$where = [
1546
-				"'NOT'",
1547
-				[
1548
-					"'IN'",
1549
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1550
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1551
-				]
1552
-			];
1553
-		}
1554
-	}
1555
-
1556
-	$boucles[$idb]->where[] = $where;
1557
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1558
-	$boucles[$idb]->where[] = $where_complement;
1559
-	}
1522
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1523
+    if (!$r) {
1524
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
1525
+    }
1526
+    [$arg, $op, $val, $col, $where_complement] = $r;
1527
+
1528
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1529
+
1530
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1531
+    $where = $in;
1532
+    if ($crit->cond) {
1533
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1534
+        $where = ["'?'", $pred, $where, "''"];
1535
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1536
+        $where_complement = ["'?'", $pred, $where_complement, "''"];
1537
+        }
1538
+    }
1539
+    if ($crit->exclus) {
1540
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1541
+            $where = ["'NOT'", $where];
1542
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1543
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1544
+        {
1545
+            $where = [
1546
+                "'NOT'",
1547
+                [
1548
+                    "'IN'",
1549
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1550
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1551
+                ]
1552
+            ];
1553
+        }
1554
+    }
1555
+
1556
+    $boucles[$idb]->where[] = $where;
1557
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1558
+    $boucles[$idb]->where[] = $where_complement;
1559
+    }
1560 1560
 }
1561 1561
 
1562 1562
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1563
-	static $num = [];
1564
-	$descr = $boucles[$idb]->descr;
1565
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1566
-
1567
-	$var = '$in' . $cpt++;
1568
-	$x = "\n\t$var = array();";
1569
-	foreach ($val as $k => $v) {
1570
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1571
-			// optimiser le traitement des constantes
1572
-			if (is_numeric($r[2])) {
1573
-				$x .= "\n\t$var" . "[]= $r[2];";
1574
-			} else {
1575
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1576
-			}
1577
-		} else {
1578
-			// Pour permettre de passer des tableaux de valeurs
1579
-			// on repere l'utilisation brute de #ENV**{X},
1580
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1581
-			// et on deballe mais en rajoutant l'anti XSS
1582
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1583
-		}
1584
-	}
1585
-
1586
-	$boucles[$idb]->in .= $x;
1587
-
1588
-	// inserer le tri par defaut selon les ordres du IN ...
1589
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1590
-	// et que l'on limite donc strictement aux cas necessaires :
1591
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1592
-	if (!$crit2) {
1593
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1594
-	}
1595
-
1596
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1563
+    static $num = [];
1564
+    $descr = $boucles[$idb]->descr;
1565
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1566
+
1567
+    $var = '$in' . $cpt++;
1568
+    $x = "\n\t$var = array();";
1569
+    foreach ($val as $k => $v) {
1570
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1571
+            // optimiser le traitement des constantes
1572
+            if (is_numeric($r[2])) {
1573
+                $x .= "\n\t$var" . "[]= $r[2];";
1574
+            } else {
1575
+                $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1576
+            }
1577
+        } else {
1578
+            // Pour permettre de passer des tableaux de valeurs
1579
+            // on repere l'utilisation brute de #ENV**{X},
1580
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1581
+            // et on deballe mais en rajoutant l'anti XSS
1582
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1583
+        }
1584
+    }
1585
+
1586
+    $boucles[$idb]->in .= $x;
1587
+
1588
+    // inserer le tri par defaut selon les ordres du IN ...
1589
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1590
+    // et que l'on limite donc strictement aux cas necessaires :
1591
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1592
+    if (!$crit2) {
1593
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1594
+    }
1595
+
1596
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1597 1597
 }
1598 1598
 
1599 1599
 /**
@@ -1609,22 +1609,22 @@  discard block
 block discarded – undo
1609 1609
  * @return void
1610 1610
  */
1611 1611
 function critere_where_dist($idb, &$boucles, $crit) {
1612
-	$boucle = &$boucles[$idb];
1613
-	if (isset($crit->param[0])) {
1614
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1615
-	} else {
1616
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1617
-	}
1618
-
1619
-	if ($crit->cond) {
1620
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1621
-	}
1622
-
1623
-	if ($crit->not) {
1624
-		$_where = "array('NOT',$_where)";
1625
-	}
1626
-
1627
-	$boucle->where[] = $_where;
1612
+    $boucle = &$boucles[$idb];
1613
+    if (isset($crit->param[0])) {
1614
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1615
+    } else {
1616
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1617
+    }
1618
+
1619
+    if ($crit->cond) {
1620
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1621
+    }
1622
+
1623
+    if ($crit->not) {
1624
+        $_where = "array('NOT',$_where)";
1625
+    }
1626
+
1627
+    $boucle->where[] = $_where;
1628 1628
 }
1629 1629
 
1630 1630
 /**
@@ -1652,31 +1652,31 @@  discard block
 block discarded – undo
1652 1652
  * @return void
1653 1653
  */
1654 1654
 function critere_id__dist($idb, &$boucles, $crit) {
1655
-	/** @var Boucle $boucle */
1656
-	$boucle = $boucles[$idb];
1657
-
1658
-	$champs = lister_champs_id_conditionnel(
1659
-		$boucle->show['table'],
1660
-		$boucle->show,
1661
-		$boucle->sql_serveur
1662
-	);
1663
-
1664
-	// ne pas tenir compte des critères identiques déjà présents.
1665
-	if (!empty($boucle->modificateur['criteres'])) {
1666
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1667
-	}
1668
-	// nous aider en mode debug.
1669
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1670
-	$boucle->modificateur['id_'] = $champs;
1671
-
1672
-	// créer un critère {id_xxx?} de chaque champ retenu
1673
-	foreach ($champs as $champ) {
1674
-		$critere_id_table = new Critere();
1675
-		$critere_id_table->op = $champ;
1676
-		$critere_id_table->cond = '?';
1677
-		$critere_id_table->ligne = $crit->ligne;
1678
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1679
-	}
1655
+    /** @var Boucle $boucle */
1656
+    $boucle = $boucles[$idb];
1657
+
1658
+    $champs = lister_champs_id_conditionnel(
1659
+        $boucle->show['table'],
1660
+        $boucle->show,
1661
+        $boucle->sql_serveur
1662
+    );
1663
+
1664
+    // ne pas tenir compte des critères identiques déjà présents.
1665
+    if (!empty($boucle->modificateur['criteres'])) {
1666
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1667
+    }
1668
+    // nous aider en mode debug.
1669
+    $boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1670
+    $boucle->modificateur['id_'] = $champs;
1671
+
1672
+    // créer un critère {id_xxx?} de chaque champ retenu
1673
+    foreach ($champs as $champ) {
1674
+        $critere_id_table = new Critere();
1675
+        $critere_id_table->op = $champ;
1676
+        $critere_id_table->cond = '?';
1677
+        $critere_id_table->ligne = $crit->ligne;
1678
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1679
+    }
1680 1680
 }
1681 1681
 
1682 1682
 /**
@@ -1696,75 +1696,75 @@  discard block
 block discarded – undo
1696 1696
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1697 1697
  */
1698 1698
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1699
-	// calculer la description de la table
1700
-	if (!is_array($desc)) {
1701
-		$desc = description_table($table, $serveur);
1702
-	}
1703
-	if (!$desc) {
1704
-		return [];
1705
-	}
1706
-
1707
-	// Les champs id_xx de la table demandée
1708
-	$champs = array_filter(
1709
-		array_keys($desc['field']),
1710
-		fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
1711
-	);
1712
-
1713
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1714
-	if (
1715
-		in_array('id_rubrique', $champs)
1716
-		and !in_array('id_secteur', $champs)
1717
-	) {
1718
-		$champs[] = 'id_secteur';
1719
-	}
1720
-
1721
-	// On ne fera pas mieux pour les tables d’un autre serveur
1722
-	if ($serveur) {
1723
-		return $champs;
1724
-	}
1725
-
1726
-	$primary = false;
1727
-	$associable = false;
1728
-	include_spip('action/editer_liens');
1729
-
1730
-	if (isset($desc['type'])) {
1731
-		$primary = id_table_objet($desc['type']);
1732
-		$associable = objet_associable($desc['type']);
1733
-	}
1734
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1735
-		$associable = true;
1736
-	}
1737
-
1738
-	// liste de toutes les tables principales, sauf la notre
1739
-	$tables = lister_tables_objets_sql();
1740
-	unset($tables[$table]);
1741
-
1742
-	foreach ($tables as $_table => $_desc) {
1743
-		if (
1744
-			$associable
1745
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1746
-			or objet_associable($_desc['type'])
1747
-		) {
1748
-			$champs[] = id_table_objet($_table);
1749
-		}
1750
-	}
1751
-	$champs = array_values(array_unique($champs));
1752
-
1753
-	// Exclusions de certains id
1754
-	$exclusions = pipeline(
1755
-		'exclure_id_conditionnel',
1756
-		[
1757
-			'args' => [
1758
-				'table' => $table,
1759
-				'id_table_objet' => $primary,
1760
-				'associable' => $associable,
1761
-			],
1762
-			'data' => [],
1763
-		]
1764
-	);
1765
-	$champs = array_diff($champs, $exclusions);
1766
-
1767
-	return $champs;
1699
+    // calculer la description de la table
1700
+    if (!is_array($desc)) {
1701
+        $desc = description_table($table, $serveur);
1702
+    }
1703
+    if (!$desc) {
1704
+        return [];
1705
+    }
1706
+
1707
+    // Les champs id_xx de la table demandée
1708
+    $champs = array_filter(
1709
+        array_keys($desc['field']),
1710
+        fn($champ) => strpos($champ, 'id_') === 0 or (in_array($champ, ['objet']))
1711
+    );
1712
+
1713
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1714
+    if (
1715
+        in_array('id_rubrique', $champs)
1716
+        and !in_array('id_secteur', $champs)
1717
+    ) {
1718
+        $champs[] = 'id_secteur';
1719
+    }
1720
+
1721
+    // On ne fera pas mieux pour les tables d’un autre serveur
1722
+    if ($serveur) {
1723
+        return $champs;
1724
+    }
1725
+
1726
+    $primary = false;
1727
+    $associable = false;
1728
+    include_spip('action/editer_liens');
1729
+
1730
+    if (isset($desc['type'])) {
1731
+        $primary = id_table_objet($desc['type']);
1732
+        $associable = objet_associable($desc['type']);
1733
+    }
1734
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1735
+        $associable = true;
1736
+    }
1737
+
1738
+    // liste de toutes les tables principales, sauf la notre
1739
+    $tables = lister_tables_objets_sql();
1740
+    unset($tables[$table]);
1741
+
1742
+    foreach ($tables as $_table => $_desc) {
1743
+        if (
1744
+            $associable
1745
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1746
+            or objet_associable($_desc['type'])
1747
+        ) {
1748
+            $champs[] = id_table_objet($_table);
1749
+        }
1750
+    }
1751
+    $champs = array_values(array_unique($champs));
1752
+
1753
+    // Exclusions de certains id
1754
+    $exclusions = pipeline(
1755
+        'exclure_id_conditionnel',
1756
+        [
1757
+            'args' => [
1758
+                'table' => $table,
1759
+                'id_table_objet' => $primary,
1760
+                'associable' => $associable,
1761
+            ],
1762
+            'data' => [],
1763
+        ]
1764
+    );
1765
+    $champs = array_diff($champs, $exclusions);
1766
+
1767
+    return $champs;
1768 1768
 }
1769 1769
 
1770 1770
 /**
@@ -1819,27 +1819,27 @@  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
-	$_sens_defaut = !isset($crit->param[1][0]) ? '1'
1828
-		: calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1829
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1830
-		: calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1831
-
1832
-	$_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):'')";
1833
-
1834
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1835
-	$_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)";
1836
-
1837
-	$boucle->modificateur['tri_champ'] = $_tri;
1838
-	$boucle->modificateur['tri_sens'] = $_sens;
1839
-	$boucle->modificateur['tri_nom'] = $_variable;
1840
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1841
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1842
-	$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
+    $_sens_defaut = !isset($crit->param[1][0]) ? '1'
1828
+        : calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
1829
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1830
+        : calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent);
1831
+
1832
+    $_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):'')";
1833
+
1834
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1835
+    $_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)";
1836
+
1837
+    $boucle->modificateur['tri_champ'] = $_tri;
1838
+    $boucle->modificateur['tri_sens'] = $_sens;
1839
+    $boucle->modificateur['tri_nom'] = $_variable;
1840
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1841
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1842
+    $boucle->hash .= "
1843 1843
 	\$senstri = '';
1844 1844
 	\$tri = $_tri;
1845 1845
 	if (\$tri){
@@ -1847,8 +1847,8 @@  discard block
 block discarded – undo
1847 1847
 		\$senstri = (\$senstri<0)?' DESC':'';
1848 1848
 	};
1849 1849
 	";
1850
-	$boucle->select[] = '".tri_champ_select($tri)."';
1851
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1850
+    $boucle->select[] = '".tri_champ_select($tri)."';
1851
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1852 1852
 }
1853 1853
 
1854 1854
 # Criteres de comparaison
@@ -1865,20 +1865,20 @@  discard block
 block discarded – undo
1865 1865
  * @return void
1866 1866
  **/
1867 1867
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1868
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1869
-	if (($crit->op == ',') or ($crit->op == '/')) {
1870
-		return calculer_critere_parties($idb, $boucles, $crit);
1871
-	}
1872
-
1873
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1874
-	if (!$r) {
1875
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1876
-		#	if (!$crit->cond) {
1877
-		return (['zbug_critere_inconnu', ['critere' => $crit->op]]);
1878
-		#	}
1879
-	} else {
1880
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1881
-	}
1868
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1869
+    if (($crit->op == ',') or ($crit->op == '/')) {
1870
+        return calculer_critere_parties($idb, $boucles, $crit);
1871
+    }
1872
+
1873
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1874
+    if (!$r) {
1875
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1876
+        #	if (!$crit->cond) {
1877
+        return (['zbug_critere_inconnu', ['critere' => $crit->op]]);
1878
+        #	}
1879
+    } else {
1880
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1881
+    }
1882 1882
 }
1883 1883
 
1884 1884
 
@@ -1898,62 +1898,62 @@  discard block
 block discarded – undo
1898 1898
  * @return void
1899 1899
  **/
1900 1900
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1901
-	[$arg, $op, $val, $col, $where_complement] = $args;
1902
-
1903
-	$where = ["'$op'", "'$arg'", $val[0]];
1904
-
1905
-	// inserer la negation (cf !...)
1906
-
1907
-	if ($crit->not) {
1908
-		$where = ["'NOT'", $where];
1909
-	}
1910
-	if ($crit->exclus) {
1911
-		if (!preg_match(',^L[0-9]+[.],', $arg)) {
1912
-			$where = ["'NOT'", $where];
1913
-		} else {
1914
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1915
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1916
-			$where = [
1917
-				"'NOT'",
1918
-				[
1919
-					"'IN'",
1920
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1921
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1922
-				]
1923
-			];
1924
-		}
1925
-	}
1926
-
1927
-	// inserer la condition (cf {lang?})
1928
-	// traiter a part la date, elle est mise d'office par SPIP,
1929
-	if ($crit->cond) {
1930
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1931
-		if ($col === 'date' or $col === 'date_redac') {
1932
-			if ($pred === "\$Pile[0]['" . $col . "']") {
1933
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1934
-			}
1935
-		}
1936
-
1937
-		if ($op === '=' and !$crit->not) {
1938
-			$where = [
1939
-				"'?'",
1940
-				"(is_array($pred))",
1941
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1942
-				$where
1943
-			];
1944
-		}
1945
-		$where = ["'?'", "!is_whereable($pred)", "''", $where];
1946
-		if ($where_complement) { 
1947
-			// condition annexe du type "AND (objet='article')"
1948
-			$where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1949
-		}
1950
-	}
1951
-
1952
-	$boucles[$idb]->where[] = $where;
1953
-	if ($where_complement) {
1954
-		// condition annexe du type "AND (objet='article')"
1955
-		$boucles[$idb]->where[] = $where_complement;
1956
-	}
1901
+    [$arg, $op, $val, $col, $where_complement] = $args;
1902
+
1903
+    $where = ["'$op'", "'$arg'", $val[0]];
1904
+
1905
+    // inserer la negation (cf !...)
1906
+
1907
+    if ($crit->not) {
1908
+        $where = ["'NOT'", $where];
1909
+    }
1910
+    if ($crit->exclus) {
1911
+        if (!preg_match(',^L[0-9]+[.],', $arg)) {
1912
+            $where = ["'NOT'", $where];
1913
+        } else {
1914
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1915
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1916
+            $where = [
1917
+                "'NOT'",
1918
+                [
1919
+                    "'IN'",
1920
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1921
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1922
+                ]
1923
+            ];
1924
+        }
1925
+    }
1926
+
1927
+    // inserer la condition (cf {lang?})
1928
+    // traiter a part la date, elle est mise d'office par SPIP,
1929
+    if ($crit->cond) {
1930
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1931
+        if ($col === 'date' or $col === 'date_redac') {
1932
+            if ($pred === "\$Pile[0]['" . $col . "']") {
1933
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1934
+            }
1935
+        }
1936
+
1937
+        if ($op === '=' and !$crit->not) {
1938
+            $where = [
1939
+                "'?'",
1940
+                "(is_array($pred))",
1941
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
1942
+                $where
1943
+            ];
1944
+        }
1945
+        $where = ["'?'", "!is_whereable($pred)", "''", $where];
1946
+        if ($where_complement) { 
1947
+            // condition annexe du type "AND (objet='article')"
1948
+            $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
1949
+        }
1950
+    }
1951
+
1952
+    $boucles[$idb]->where[] = $where;
1953
+    if ($where_complement) {
1954
+        // condition annexe du type "AND (objet='article')"
1955
+        $boucles[$idb]->where[] = $where_complement;
1956
+    }
1957 1957
 }
1958 1958
 
1959 1959
 
@@ -1994,165 +1994,165 @@  discard block
 block discarded – undo
1994 1994
  **/
1995 1995
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1996 1996
 
1997
-	$boucle = &$boucles[$idb];
1998
-	$type = $boucle->type_requete;
1999
-	$table = $boucle->id_table ?? '';
2000
-	$desc = $boucle->show;
2001
-	$col_vraie = null;
2002
-
2003
-	[$fct, $col, $op, $val, $args_sql] =
2004
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2005
-
2006
-	$col_alias = $col;
2007
-	$where_complement = false;
2008
-
2009
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2010
-	if ($col == 'id_enfant') {
2011
-		$col = $boucle->primary;
2012
-	}
2013
-
2014
-	// Cas particulier : id_parent => verifier les exceptions de tables
2015
-	if (
2016
-		(in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2017
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2018
-	) {
2019
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2020
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2021
-	else {
2022
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2023
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2024
-		}
2025
-
2026
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2027
-		// sauf si exception declaree : sauter cette etape
2028
-		else {
2029
-			if (
2030
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2031
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2032
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2033
-			) {
2034
-				$e = decompose_champ_id_objet($col);
2035
-				$col = array_shift($e);
2036
-				$where_complement = primary_doublee($e, $table);
2037
-			} // Cas particulier : expressions de date
2038
-			else {
2039
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2040
-					[$col, $col_vraie] = $c;
2041
-					$table = '';
2042
-				} // table explicitée {mots.titre}
2043
-				else {
2044
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2045
-						[, $table, $col] = $r;
2046
-						$col_alias = $col;
2047
-
2048
-						$trouver_table = charger_fonction('trouver_table', 'base');
2049
-						if (
2050
-							$desc = $trouver_table($table, $boucle->sql_serveur)
2051
-							and isset($desc['field'][$col])
2052
-							and $cle = array_search($desc['table'], $boucle->from)
2053
-						) {
2054
-							$table = $cle;
2055
-						} else {
2056
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2057
-						}
2058
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2059
-						if (!$table) {
2060
-							return '';
2061
-						}
2062
-					}
2063
-					// si le champ n'est pas trouvé dans la table,
2064
-					// on cherche si une jointure peut l'obtenir
2065
-					elseif (@!array_key_exists($col, $desc['field'])) {
2066
-						// Champ joker * des iterateurs DATA qui accepte tout
2067
-						if (@array_key_exists('*', $desc['field'])) {
2068
-							$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
2069
-						}
2070
-						else {
2071
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2072
-							if (!$r) {
2073
-								return '';
2074
-							}
2075
-							[$col, $col_alias, $table, $where_complement, $desc] = $r;
2076
-						}
2077
-					}
2078
-				}
2079
-			}
2080
-		}
2081
-	}
2082
-
2083
-	$col_vraie = ($col_vraie ?: $col);
2084
-	// Dans tous les cas,
2085
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2086
-	// et passer dans sql_quote avec le type si connu
2087
-	// et int sinon si la valeur est numerique
2088
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2089
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2090
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2091
-		$type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2092
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2093
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2094
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2095
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2096
-		}
2097
-		// sinon expliciter les
2098
-		// sql_quote(truc) en sql_quote(truc,'',type)
2099
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2100
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2101
-		// sans toucher aux
2102
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2103
-		// sql_quote(truc,'','varchar')
2104
-		elseif (
2105
-			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2106
-			// si pas deja un type
2107
-			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2108
-		) {
2109
-			$r = $r[1]
2110
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2111
-				. ",'" . addslashes($type_cast_quote) . "'";
2112
-			$val[0] = "sql_quote($r)";
2113
-		}
2114
-		elseif (
2115
-			strpos($val[0], '@@defaultcast@@') !== false
2116
-			and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2117
-		) {
2118
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2119
-		}
2120
-	}
2121
-
2122
-	if (
2123
-		strpos($val[0], '@@defaultcast@@') !== false
2124
-		and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2125
-	) {
2126
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2127
-	}
2128
-
2129
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2130
-	// leurs requetes par defaut, notamment le champ statut
2131
-	// Ne pas confondre champs de la table principale et des jointures
2132
-	if ($table === $boucle->id_table) {
2133
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2134
-		if ($col_alias != $col_vraie) {
2135
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2136
-		}
2137
-	}
2138
-
2139
-	// inserer le nom de la table SQL devant le nom du champ
2140
-	if ($table) {
2141
-		if ($col[0] == '`') {
2142
-			$arg = "$table." . substr($col, 1, -1);
2143
-		} else {
2144
-			$arg = "$table.$col";
2145
-		}
2146
-	} else {
2147
-		$arg = $col;
2148
-	}
2149
-
2150
-	// inserer la fonction SQL
2151
-	if ($fct) {
2152
-		$arg = "$fct($arg$args_sql)";
2153
-	}
2154
-
2155
-	return [$arg, $op, $val, $col_alias, $where_complement];
1997
+    $boucle = &$boucles[$idb];
1998
+    $type = $boucle->type_requete;
1999
+    $table = $boucle->id_table ?? '';
2000
+    $desc = $boucle->show;
2001
+    $col_vraie = null;
2002
+
2003
+    [$fct, $col, $op, $val, $args_sql] =
2004
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2005
+
2006
+    $col_alias = $col;
2007
+    $where_complement = false;
2008
+
2009
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2010
+    if ($col == 'id_enfant') {
2011
+        $col = $boucle->primary;
2012
+    }
2013
+
2014
+    // Cas particulier : id_parent => verifier les exceptions de tables
2015
+    if (
2016
+        (in_array($col, ['id_parent', 'id_secteur']) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2017
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2018
+    ) {
2019
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2020
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2021
+    else {
2022
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2023
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2024
+        }
2025
+
2026
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2027
+        // sauf si exception declaree : sauter cette etape
2028
+        else {
2029
+            if (
2030
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2031
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2032
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2033
+            ) {
2034
+                $e = decompose_champ_id_objet($col);
2035
+                $col = array_shift($e);
2036
+                $where_complement = primary_doublee($e, $table);
2037
+            } // Cas particulier : expressions de date
2038
+            else {
2039
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2040
+                    [$col, $col_vraie] = $c;
2041
+                    $table = '';
2042
+                } // table explicitée {mots.titre}
2043
+                else {
2044
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2045
+                        [, $table, $col] = $r;
2046
+                        $col_alias = $col;
2047
+
2048
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2049
+                        if (
2050
+                            $desc = $trouver_table($table, $boucle->sql_serveur)
2051
+                            and isset($desc['field'][$col])
2052
+                            and $cle = array_search($desc['table'], $boucle->from)
2053
+                        ) {
2054
+                            $table = $cle;
2055
+                        } else {
2056
+                            $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond or $op != '='));
2057
+                        }
2058
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2059
+                        if (!$table) {
2060
+                            return '';
2061
+                        }
2062
+                    }
2063
+                    // si le champ n'est pas trouvé dans la table,
2064
+                    // on cherche si une jointure peut l'obtenir
2065
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2066
+                        // Champ joker * des iterateurs DATA qui accepte tout
2067
+                        if (@array_key_exists('*', $desc['field'])) {
2068
+                            $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
2069
+                        }
2070
+                        else {
2071
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2072
+                            if (!$r) {
2073
+                                return '';
2074
+                            }
2075
+                            [$col, $col_alias, $table, $where_complement, $desc] = $r;
2076
+                        }
2077
+                    }
2078
+                }
2079
+            }
2080
+        }
2081
+    }
2082
+
2083
+    $col_vraie = ($col_vraie ?: $col);
2084
+    // Dans tous les cas,
2085
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2086
+    // et passer dans sql_quote avec le type si connu
2087
+    // et int sinon si la valeur est numerique
2088
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2089
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2090
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2091
+        $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2092
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2093
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2094
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2095
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2096
+        }
2097
+        // sinon expliciter les
2098
+        // sql_quote(truc) en sql_quote(truc,'',type)
2099
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2100
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2101
+        // sans toucher aux
2102
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2103
+        // sql_quote(truc,'','varchar')
2104
+        elseif (
2105
+            preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2106
+            // si pas deja un type
2107
+            and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2108
+        ) {
2109
+            $r = $r[1]
2110
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2111
+                . ",'" . addslashes($type_cast_quote) . "'";
2112
+            $val[0] = "sql_quote($r)";
2113
+        }
2114
+        elseif (
2115
+            strpos($val[0], '@@defaultcast@@') !== false
2116
+            and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2117
+        ) {
2118
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2119
+        }
2120
+    }
2121
+
2122
+    if (
2123
+        strpos($val[0], '@@defaultcast@@') !== false
2124
+        and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2125
+    ) {
2126
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2127
+    }
2128
+
2129
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2130
+    // leurs requetes par defaut, notamment le champ statut
2131
+    // Ne pas confondre champs de la table principale et des jointures
2132
+    if ($table === $boucle->id_table) {
2133
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2134
+        if ($col_alias != $col_vraie) {
2135
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2136
+        }
2137
+    }
2138
+
2139
+    // inserer le nom de la table SQL devant le nom du champ
2140
+    if ($table) {
2141
+        if ($col[0] == '`') {
2142
+            $arg = "$table." . substr($col, 1, -1);
2143
+        } else {
2144
+            $arg = "$table.$col";
2145
+        }
2146
+    } else {
2147
+        $arg = $col;
2148
+    }
2149
+
2150
+    // inserer la fonction SQL
2151
+    if ($fct) {
2152
+        $arg = "$fct($arg$args_sql)";
2153
+    }
2154
+
2155
+    return [$arg, $op, $val, $col_alias, $where_complement];
2156 2156
 }
2157 2157
 
2158 2158
 
@@ -2181,77 +2181,77 @@  discard block
 block discarded – undo
2181 2181
  **/
2182 2182
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2183 2183
 
2184
-	$where = '';
2185
-
2186
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2187
-	// gestion par les plugins des jointures tordues
2188
-	// pas automatiques mais necessaires
2189
-	$table_sql = table_objet_sql($table);
2190
-	if (
2191
-		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2192
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2193
-		and
2194
-		(
2195
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2196
-			or
2197
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2198
-		)
2199
-	) {
2200
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2201
-		$index = $t[$col] ?? $t[''] ?? [];
2202
-
2203
-		if ((is_countable($index) ? count($index) : 0) == 3) {
2204
-			[$t, $col, $calculer_critere_externe] = $index;
2205
-		} elseif ((is_countable($index) ? count($index) : 0) == 2) {
2206
-			[$t, $col] = $t[$col];
2207
-		} elseif ((is_countable($index) ? count($index) : 0) == 1) {
2208
-			[$calculer_critere_externe] = $index;
2209
-			$t = $table;
2210
-		} else {
2211
-			$t = '';
2212
-		} // jointure non declaree. La trouver.
2213
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2214
-		[$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2215
-	} else {
2216
-		$t = '';
2217
-	} // jointure non declaree. La trouver.
2218
-
2219
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2220
-
2221
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2222
-	// permet de forcer une table de lien quand il y a ambiguite
2223
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2224
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2225
-	$table = '';
2226
-	if ($boucle->jointures_explicites) {
2227
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2228
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2229
-	}
2230
-
2231
-	// et sinon on cherche parmi toutes les jointures declarees
2232
-	if (!$table) {
2233
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2234
-	}
2235
-
2236
-	if (!$table) {
2237
-		return '';
2238
-	}
2239
-
2240
-	// il ne reste plus qu'a trouver le champ dans les from
2241
-	[$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2242
-
2243
-	if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
2244
-		$col_alias = $col; // id_article devient juste le nom d'origine
2245
-		if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
2246
-			$e = decompose_champ_id_objet($col);
2247
-			$col = array_shift($e);
2248
-			$where = primary_doublee($e, $table);
2249
-		} else {
2250
-			$col = reset($cle);
2251
-		}
2252
-	}
2253
-
2254
-	return [$col, $col_alias, $table, $where, $desc];
2184
+    $where = '';
2185
+
2186
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2187
+    // gestion par les plugins des jointures tordues
2188
+    // pas automatiques mais necessaires
2189
+    $table_sql = table_objet_sql($table);
2190
+    if (
2191
+        isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2192
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2193
+        and
2194
+        (
2195
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2196
+            or
2197
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2198
+        )
2199
+    ) {
2200
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2201
+        $index = $t[$col] ?? $t[''] ?? [];
2202
+
2203
+        if ((is_countable($index) ? count($index) : 0) == 3) {
2204
+            [$t, $col, $calculer_critere_externe] = $index;
2205
+        } elseif ((is_countable($index) ? count($index) : 0) == 2) {
2206
+            [$t, $col] = $t[$col];
2207
+        } elseif ((is_countable($index) ? count($index) : 0) == 1) {
2208
+            [$calculer_critere_externe] = $index;
2209
+            $t = $table;
2210
+        } else {
2211
+            $t = '';
2212
+        } // jointure non declaree. La trouver.
2213
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2214
+        [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2215
+    } else {
2216
+        $t = '';
2217
+    } // jointure non declaree. La trouver.
2218
+
2219
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2220
+
2221
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2222
+    // permet de forcer une table de lien quand il y a ambiguite
2223
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2224
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2225
+    $table = '';
2226
+    if ($boucle->jointures_explicites) {
2227
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2228
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2229
+    }
2230
+
2231
+    // et sinon on cherche parmi toutes les jointures declarees
2232
+    if (!$table) {
2233
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2234
+    }
2235
+
2236
+    if (!$table) {
2237
+        return '';
2238
+    }
2239
+
2240
+    // il ne reste plus qu'a trouver le champ dans les from
2241
+    [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2242
+
2243
+    if ((is_countable($cle) ? count($cle) : 0) > 1 or reset($cle) !== $col) {
2244
+        $col_alias = $col; // id_article devient juste le nom d'origine
2245
+        if ((is_countable($cle) ? count($cle) : 0) > 1 and reset($cle) == 'id_objet') {
2246
+            $e = decompose_champ_id_objet($col);
2247
+            $col = array_shift($e);
2248
+            $where = primary_doublee($e, $table);
2249
+        } else {
2250
+            $col = reset($cle);
2251
+        }
2252
+    }
2253
+
2254
+    return [$col, $col_alias, $table, $where, $desc];
2255 2255
 }
2256 2256
 
2257 2257
 
@@ -2272,10 +2272,10 @@  discard block
 block discarded – undo
2272 2272
  *     - valeur
2273 2273
  **/
2274 2274
 function primary_doublee($decompose, $table) {
2275
-	$e1 = reset($decompose);
2276
-	$e2 = "sql_quote('" . end($decompose) . "')";
2275
+    $e1 = reset($decompose);
2276
+    $e2 = "sql_quote('" . end($decompose) . "')";
2277 2277
 
2278
-	return ["'='", "'$table." . $e1 . "'", $e2];
2278
+    return ["'='", "'$table." . $e1 . "'", $e2];
2279 2279
 }
2280 2280
 
2281 2281
 /**
@@ -2306,57 +2306,57 @@  discard block
 block discarded – undo
2306 2306
  *     Vide sinon.
2307 2307
  */
2308 2308
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2309
-	// si on demande un truc du genre spip_mots
2310
-	// avec aussi spip_mots_liens dans les jointures dispo
2311
-	// et qu'on est la
2312
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2313
-	if (
2314
-		$checkarrivee
2315
-		and is_string($checkarrivee)
2316
-		and $a = table_objet($checkarrivee)
2317
-		and in_array($a . '_liens', $joints)
2318
-	) {
2319
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2320
-			return $res;
2321
-		}
2322
-	}
2323
-	foreach ($joints as $joint) {
2324
-		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2325
-			// alias de table dans le from
2326
-			$t = array_search($arrivee[0], $boucle->from);
2327
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2328
-			$cols = $arrivee[2];
2329
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2330
-			if ((is_countable($cols) ? count($cols) : 0) > 2) {
2331
-				array_pop($cols);
2332
-			}
2333
-			if ($t) {
2334
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2335
-				$joindre = false;
2336
-				foreach ($cols as $col) {
2337
-					$c = '/\b' . $t . ".$col" . '\b/';
2338
-					if (trouver_champ($c, $boucle->where)) {
2339
-						$joindre = true;
2340
-					} else {
2341
-						// mais ca peut etre dans le FIELD pour le Having
2342
-						$c = "/FIELD.$t" . ".$col,/";
2343
-						if (trouver_champ($c, $boucle->select)) {
2344
-							$joindre = true;
2345
-						}
2346
-					}
2347
-				}
2348
-				if (!$joindre) {
2349
-					return $t;
2350
-				}
2351
-			}
2352
-			array_pop($arrivee);
2353
-			if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2354
-				return $res;
2355
-			}
2356
-		}
2357
-	}
2358
-
2359
-	return '';
2309
+    // si on demande un truc du genre spip_mots
2310
+    // avec aussi spip_mots_liens dans les jointures dispo
2311
+    // et qu'on est la
2312
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2313
+    if (
2314
+        $checkarrivee
2315
+        and is_string($checkarrivee)
2316
+        and $a = table_objet($checkarrivee)
2317
+        and in_array($a . '_liens', $joints)
2318
+    ) {
2319
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2320
+            return $res;
2321
+        }
2322
+    }
2323
+    foreach ($joints as $joint) {
2324
+        if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2325
+            // alias de table dans le from
2326
+            $t = array_search($arrivee[0], $boucle->from);
2327
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2328
+            $cols = $arrivee[2];
2329
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2330
+            if ((is_countable($cols) ? count($cols) : 0) > 2) {
2331
+                array_pop($cols);
2332
+            }
2333
+            if ($t) {
2334
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2335
+                $joindre = false;
2336
+                foreach ($cols as $col) {
2337
+                    $c = '/\b' . $t . ".$col" . '\b/';
2338
+                    if (trouver_champ($c, $boucle->where)) {
2339
+                        $joindre = true;
2340
+                    } else {
2341
+                        // mais ca peut etre dans le FIELD pour le Having
2342
+                        $c = "/FIELD.$t" . ".$col,/";
2343
+                        if (trouver_champ($c, $boucle->select)) {
2344
+                            $joindre = true;
2345
+                        }
2346
+                    }
2347
+                }
2348
+                if (!$joindre) {
2349
+                    return $t;
2350
+                }
2351
+            }
2352
+            array_pop($arrivee);
2353
+            if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2354
+                return $res;
2355
+            }
2356
+        }
2357
+    }
2358
+
2359
+    return '';
2360 2360
 }
2361 2361
 
2362 2362
 /**
@@ -2382,35 +2382,35 @@  discard block
 block discarded – undo
2382 2382
  *     Alias de la table de jointure (Lx)
2383 2383
  */
2384 2384
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2385
-	$primary_arrivee = id_table_objet($checkarrivee);
2386
-
2387
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2388
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2389
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2390
-
2391
-	if (!$intermediaire or !$arrivee) {
2392
-		return '';
2393
-	}
2394
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2395
-	array_pop($arrivee); // enlever la cle en 3eme argument
2396
-
2397
-	$res = fabrique_jointures(
2398
-		$boucle,
2399
-		[
2400
-			[
2401
-				$boucle->id_table,
2402
-				$intermediaire,
2403
-				[id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2404
-			],
2405
-			[reset($intermediaire), $arrivee, $primary_arrivee]
2406
-		],
2407
-		$cond,
2408
-		$desc,
2409
-		$boucle->id_table,
2410
-		[$col]
2411
-	);
2412
-
2413
-	return $res;
2385
+    $primary_arrivee = id_table_objet($checkarrivee);
2386
+
2387
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2388
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2389
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2390
+
2391
+    if (!$intermediaire or !$arrivee) {
2392
+        return '';
2393
+    }
2394
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2395
+    array_pop($arrivee); // enlever la cle en 3eme argument
2396
+
2397
+    $res = fabrique_jointures(
2398
+        $boucle,
2399
+        [
2400
+            [
2401
+                $boucle->id_table,
2402
+                $intermediaire,
2403
+                [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2404
+            ],
2405
+            [reset($intermediaire), $arrivee, $primary_arrivee]
2406
+        ],
2407
+        $cond,
2408
+        $desc,
2409
+        $boucle->id_table,
2410
+        [$col]
2411
+    );
2412
+
2413
+    return $res;
2414 2414
 }
2415 2415
 
2416 2416
 
@@ -2427,17 +2427,17 @@  discard block
 block discarded – undo
2427 2427
  *     false sinon.
2428 2428
  **/
2429 2429
 function trouver_champ($champ, $where) {
2430
-	if (!is_array($where)) {
2431
-		return preg_match($champ, $where);
2432
-	} else {
2433
-		foreach ($where as $clause) {
2434
-			if (trouver_champ($champ, $clause)) {
2435
-				return true;
2436
-			}
2437
-		}
2438
-
2439
-		return false;
2440
-	}
2430
+    if (!is_array($where)) {
2431
+        return preg_match($champ, $where);
2432
+    } else {
2433
+        foreach ($where as $clause) {
2434
+            if (trouver_champ($champ, $clause)) {
2435
+                return true;
2436
+            }
2437
+        }
2438
+
2439
+        return false;
2440
+    }
2441 2441
 }
2442 2442
 
2443 2443
 
@@ -2463,129 +2463,129 @@  discard block
 block discarded – undo
2463 2463
  *     - string $args_sql  Suite des arguments du critère. ?
2464 2464
  **/
2465 2465
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2466
-	// cas d'une valeur comparee a elle-meme ou son referent
2467
-	if (count($crit->param) == 0) {
2468
-		$op = '=';
2469
-		$col = $val = $crit->op;
2470
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2471
-			$val = $r[2];
2472
-		}
2473
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2474
-		if ($val == 'lang') {
2475
-			$val = [kwote('$GLOBALS[\'spip_lang\']')];
2476
-		} else {
2477
-			$defaut = null;
2478
-			if ($val == 'id_parent') {
2479
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2480
-				// de la boucle superieure.... faudrait verifier qu'il existe
2481
-				// pour eviter l'erreur SQL
2482
-				$val = $boucles[$idb]->primary;
2483
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2484
-				$defaut = "(\$Pile[0]['id_parent'] ?? null)";
2485
-			} elseif ($val == 'id_enfant') {
2486
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2487
-				// de la boucle superieure
2488
-				$val = 'id_parent';
2489
-			} elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2490
-				// un critere conditionnel sur date est traite a part
2491
-				// car la date est mise d'office par SPIP,
2492
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2493
-			}
2494
-
2495
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2496
-			$val = [kwote($val)];
2497
-		}
2498
-	} else {
2499
-		// comparaison explicite
2500
-		// le phraseur impose que le premier param soit du texte
2501
-		$params = $crit->param;
2502
-		$op = $crit->op;
2503
-		if ($op == '==') {
2504
-			$op = 'REGEXP';
2505
-		}
2506
-		$col = array_shift($params);
2507
-		$col = $col[0]->texte;
2508
-
2509
-		$val = [];
2510
-		$parent = $boucles[$idb]->id_parent;
2511
-
2512
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2513
-		// celui ne sachant pas ce qu'est un critere infixe
2514
-		// et a fortiori son 2e operande qu'entoure " ou '
2515
-		if (
2516
-			count($params) == 1
2517
-			and (is_countable($params[0]) ? count($params[0]) : 0) == 3
2518
-			and $params[0][0]->type == 'texte'
2519
-			and $params[0][2]->type == 'texte'
2520
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2521
-			and (($p == "'") or ($p == '"'))
2522
-			and $params[0][1]->type == 'champ'
2523
-		) {
2524
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2525
-		} else {
2526
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2527
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2528
-				if (strcasecmp($op, 'IN') == 0) {
2529
-					$val[] = $a;
2530
-				} else {
2531
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2532
-				} // toujours quoter en char ici
2533
-			}
2534
-		}
2535
-	}
2536
-
2537
-	$fct = $args_sql = '';
2538
-	// fonction SQL ?
2539
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2540
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2541
-		$fct = $m[1];
2542
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2543
-		$col = $a[1];
2544
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2545
-			$col = $m[1];
2546
-			$args_sql = $m[2];
2547
-		}
2548
-		$args_sql .= $a[2];
2549
-	}
2550
-
2551
-	return [$fct, $col, $op, $val, $args_sql];
2466
+    // cas d'une valeur comparee a elle-meme ou son referent
2467
+    if (count($crit->param) == 0) {
2468
+        $op = '=';
2469
+        $col = $val = $crit->op;
2470
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2471
+            $val = $r[2];
2472
+        }
2473
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2474
+        if ($val == 'lang') {
2475
+            $val = [kwote('$GLOBALS[\'spip_lang\']')];
2476
+        } else {
2477
+            $defaut = null;
2478
+            if ($val == 'id_parent') {
2479
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2480
+                // de la boucle superieure.... faudrait verifier qu'il existe
2481
+                // pour eviter l'erreur SQL
2482
+                $val = $boucles[$idb]->primary;
2483
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2484
+                $defaut = "(\$Pile[0]['id_parent'] ?? null)";
2485
+            } elseif ($val == 'id_enfant') {
2486
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2487
+                // de la boucle superieure
2488
+                $val = 'id_parent';
2489
+            } elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2490
+                // un critere conditionnel sur date est traite a part
2491
+                // car la date est mise d'office par SPIP,
2492
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2493
+            }
2494
+
2495
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2496
+            $val = [kwote($val)];
2497
+        }
2498
+    } else {
2499
+        // comparaison explicite
2500
+        // le phraseur impose que le premier param soit du texte
2501
+        $params = $crit->param;
2502
+        $op = $crit->op;
2503
+        if ($op == '==') {
2504
+            $op = 'REGEXP';
2505
+        }
2506
+        $col = array_shift($params);
2507
+        $col = $col[0]->texte;
2508
+
2509
+        $val = [];
2510
+        $parent = $boucles[$idb]->id_parent;
2511
+
2512
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2513
+        // celui ne sachant pas ce qu'est un critere infixe
2514
+        // et a fortiori son 2e operande qu'entoure " ou '
2515
+        if (
2516
+            count($params) == 1
2517
+            and (is_countable($params[0]) ? count($params[0]) : 0) == 3
2518
+            and $params[0][0]->type == 'texte'
2519
+            and $params[0][2]->type == 'texte'
2520
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2521
+            and (($p == "'") or ($p == '"'))
2522
+            and $params[0][1]->type == 'champ'
2523
+        ) {
2524
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2525
+        } else {
2526
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2527
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2528
+                if (strcasecmp($op, 'IN') == 0) {
2529
+                    $val[] = $a;
2530
+                } else {
2531
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2532
+                } // toujours quoter en char ici
2533
+            }
2534
+        }
2535
+    }
2536
+
2537
+    $fct = $args_sql = '';
2538
+    // fonction SQL ?
2539
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2540
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2541
+        $fct = $m[1];
2542
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2543
+        $col = $a[1];
2544
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2545
+            $col = $m[1];
2546
+            $args_sql = $m[2];
2547
+        }
2548
+        $args_sql .= $a[2];
2549
+    }
2550
+
2551
+    return [$fct, $col, $op, $val, $args_sql];
2552 2552
 }
2553 2553
 
2554 2554
 // compatibilite ancienne version
2555 2555
 
2556 2556
 function calculer_vieux_in($params) {
2557
-	$deb = $params[0][0];
2558
-	$k = (is_countable($params) ? count($params) : 0) - 1;
2559
-	$last = $params[$k];
2560
-	$j = (is_countable($last) ? count($last) : 0) - 1;
2561
-	$last = $last[$j];
2562
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2563
-
2564
-	if (
2565
-		!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2566
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2567
-	) {
2568
-		return $params;
2569
-	}
2570
-	$params[0][0]->texte = substr($deb->texte, 1);
2571
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2572
-	$last = $params[$k][$j];
2573
-	$n = strlen($last->texte);
2574
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2575
-	$newp = [];
2576
-	foreach ($params as $v) {
2577
-		if ($v[0]->type != 'texte') {
2578
-			$newp[] = $v;
2579
-		} else {
2580
-			foreach (explode(',', $v[0]->texte) as $x) {
2581
-				$t = new Texte();
2582
-				$t->texte = $x;
2583
-				$newp[] = [$t];
2584
-			}
2585
-		}
2586
-	}
2587
-
2588
-	return $newp;
2557
+    $deb = $params[0][0];
2558
+    $k = (is_countable($params) ? count($params) : 0) - 1;
2559
+    $last = $params[$k];
2560
+    $j = (is_countable($last) ? count($last) : 0) - 1;
2561
+    $last = $last[$j];
2562
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2563
+
2564
+    if (
2565
+        !((isset($deb->texte[0]) and $deb->texte[0] == '(')
2566
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2567
+    ) {
2568
+        return $params;
2569
+    }
2570
+    $params[0][0]->texte = substr($deb->texte, 1);
2571
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2572
+    $last = $params[$k][$j];
2573
+    $n = strlen($last->texte);
2574
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2575
+    $newp = [];
2576
+    foreach ($params as $v) {
2577
+        if ($v[0]->type != 'texte') {
2578
+            $newp[] = $v;
2579
+        } else {
2580
+            foreach (explode(',', $v[0]->texte) as $x) {
2581
+                $t = new Texte();
2582
+                $t->texte = $x;
2583
+                $newp[] = [$t];
2584
+            }
2585
+        }
2586
+    }
2587
+
2588
+    return $newp;
2589 2589
 }
2590 2590
 
2591 2591
 /**
@@ -2604,89 +2604,89 @@  discard block
 block discarded – undo
2604 2604
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2605 2605
  **/
2606 2606
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2607
-	if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2608
-		return '';
2609
-	}
2610
-
2611
-	$boucle = $boucles[$idb];
2612
-	$table = $boucle->show;
2613
-
2614
-	// si c'est une colonne de la table, ne rien faire
2615
-	if (isset($table['field'][$col])) {
2616
-		return '';
2617
-	}
2618
-
2619
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2620
-		return '';
2621
-	}
2622
-	$pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2623
-
2624
-	$col = $regs[1];
2625
-	if (isset($regs[3]) and $suite = $regs[3]) {
2626
-		# Recherche de l'existence du champ date_xxxx,
2627
-		# si oui choisir ce champ, sinon choisir xxxx
2628
-
2629
-		if (isset($table['field']["date$suite"])) {
2630
-			$date_orig = 'date' . $suite;
2631
-		} else {
2632
-			$date_orig = substr($suite, 1);
2633
-		}
2634
-		$pred = $date_orig;
2635
-	} else {
2636
-		if (isset($regs[2]) and $rel = $regs[2]) {
2637
-			$pred = 'date';
2638
-		}
2639
-	}
2640
-
2641
-	$date_compare = "\"' . normaliser_date(" .
2642
-		calculer_argument_precedent($idb, $pred, $boucles) .
2643
-		") . '\"";
2644
-
2645
-	$col_vraie = $date_orig;
2646
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2647
-
2648
-	switch ($col) {
2649
-		case 'date':
2650
-			$col = $date_orig;
2651
-			break;
2652
-		case 'jour':
2653
-			$col = "DAYOFMONTH($date_orig)";
2654
-			break;
2655
-		case 'mois':
2656
-			$col = "MONTH($date_orig)";
2657
-			break;
2658
-		case 'annee':
2659
-			$col = "YEAR($date_orig)";
2660
-			break;
2661
-		case 'heure':
2662
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2663
-			break;
2664
-		case 'age':
2665
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2666
-			$col_vraie = '';// comparer a un int (par defaut)
2667
-			break;
2668
-		case 'age_relatif':
2669
-			$col = calculer_param_date($date_compare, $date_orig);
2670
-			$col_vraie = '';// comparer a un int (par defaut)
2671
-			break;
2672
-		case 'jour_relatif':
2673
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2674
-			$col_vraie = '';// comparer a un int (par defaut)
2675
-			break;
2676
-		case 'mois_relatif':
2677
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2678
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2679
-				')-YEAR(' . $date_orig . '))';
2680
-			$col_vraie = '';// comparer a un int (par defaut)
2681
-			break;
2682
-		case 'annee_relatif':
2683
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2684
-				$date_orig . ')';
2685
-			$col_vraie = '';// comparer a un int (par defaut)
2686
-			break;
2687
-	}
2688
-
2689
-	return [$col, $col_vraie];
2607
+    if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2608
+        return '';
2609
+    }
2610
+
2611
+    $boucle = $boucles[$idb];
2612
+    $table = $boucle->show;
2613
+
2614
+    // si c'est une colonne de la table, ne rien faire
2615
+    if (isset($table['field'][$col])) {
2616
+        return '';
2617
+    }
2618
+
2619
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2620
+        return '';
2621
+    }
2622
+    $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2623
+
2624
+    $col = $regs[1];
2625
+    if (isset($regs[3]) and $suite = $regs[3]) {
2626
+        # Recherche de l'existence du champ date_xxxx,
2627
+        # si oui choisir ce champ, sinon choisir xxxx
2628
+
2629
+        if (isset($table['field']["date$suite"])) {
2630
+            $date_orig = 'date' . $suite;
2631
+        } else {
2632
+            $date_orig = substr($suite, 1);
2633
+        }
2634
+        $pred = $date_orig;
2635
+    } else {
2636
+        if (isset($regs[2]) and $rel = $regs[2]) {
2637
+            $pred = 'date';
2638
+        }
2639
+    }
2640
+
2641
+    $date_compare = "\"' . normaliser_date(" .
2642
+        calculer_argument_precedent($idb, $pred, $boucles) .
2643
+        ") . '\"";
2644
+
2645
+    $col_vraie = $date_orig;
2646
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2647
+
2648
+    switch ($col) {
2649
+        case 'date':
2650
+            $col = $date_orig;
2651
+            break;
2652
+        case 'jour':
2653
+            $col = "DAYOFMONTH($date_orig)";
2654
+            break;
2655
+        case 'mois':
2656
+            $col = "MONTH($date_orig)";
2657
+            break;
2658
+        case 'annee':
2659
+            $col = "YEAR($date_orig)";
2660
+            break;
2661
+        case 'heure':
2662
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2663
+            break;
2664
+        case 'age':
2665
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2666
+            $col_vraie = '';// comparer a un int (par defaut)
2667
+            break;
2668
+        case 'age_relatif':
2669
+            $col = calculer_param_date($date_compare, $date_orig);
2670
+            $col_vraie = '';// comparer a un int (par defaut)
2671
+            break;
2672
+        case 'jour_relatif':
2673
+            $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2674
+            $col_vraie = '';// comparer a un int (par defaut)
2675
+            break;
2676
+        case 'mois_relatif':
2677
+            $col = 'MONTH(' . $date_compare . ')-MONTH(' .
2678
+                $date_orig . ')+12*(YEAR(' . $date_compare .
2679
+                ')-YEAR(' . $date_orig . '))';
2680
+            $col_vraie = '';// comparer a un int (par defaut)
2681
+            break;
2682
+        case 'annee_relatif':
2683
+            $col = 'YEAR(' . $date_compare . ')-YEAR(' .
2684
+                $date_orig . ')';
2685
+            $col_vraie = '';// comparer a un int (par defaut)
2686
+            break;
2687
+    }
2688
+
2689
+    return [$col, $col_vraie];
2690 2690
 }
2691 2691
 
2692 2692
 /**
@@ -2705,16 +2705,16 @@  discard block
 block discarded – undo
2705 2705
  *     de colonne SQL et une date.
2706 2706
  **/
2707 2707
 function calculer_param_date($date_compare, $date_orig) {
2708
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2709
-		$init = "'\" . (\$x = $r[1]) . \"'";
2710
-		$date_compare = '\'$x\'';
2711
-	} else {
2712
-		$init = $date_compare;
2713
-	}
2714
-
2715
-	return
2716
-		// optimisation : mais prevoir le support SQLite avant
2717
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2708
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2709
+        $init = "'\" . (\$x = $r[1]) . \"'";
2710
+        $date_compare = '\'$x\'';
2711
+    } else {
2712
+        $init = $date_compare;
2713
+    }
2714
+
2715
+    return
2716
+        // optimisation : mais prevoir le support SQLite avant
2717
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2718 2718
 }
2719 2719
 
2720 2720
 /**
@@ -2732,20 +2732,20 @@  discard block
 block discarded – undo
2732 2732
  * @param Critere $crit Paramètres du critère dans cette boucle
2733 2733
  */
2734 2734
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2735
-	$boucle = &$boucles[$idb];
2736
-
2737
-	$args = [];
2738
-	foreach ($crit->param as &$param) {
2739
-		array_push(
2740
-			$args,
2741
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2742
-		);
2743
-	}
2735
+    $boucle = &$boucles[$idb];
2744 2736
 
2745
-	$boucle->hash .= '
2737
+    $args = [];
2738
+    foreach ($crit->param as &$param) {
2739
+        array_push(
2740
+            $args,
2741
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent)
2742
+        );
2743
+    }
2744
+
2745
+    $boucle->hash .= '
2746 2746
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2747 2747
 
2748
-	$boucle->hash .= '
2748
+    $boucle->hash .= '
2749 2749
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2750 2750
 }
2751 2751
 
@@ -2763,8 +2763,8 @@  discard block
 block discarded – undo
2763 2763
  * @param Critere $crit Paramètres du critère dans cette boucle
2764 2764
  */
2765 2765
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2766
-	$boucle = &$boucles[$idb];
2767
-	$boucle->hash .= '
2766
+    $boucle = &$boucles[$idb];
2767
+    $boucle->hash .= '
2768 2768
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2769 2769
 }
2770 2770
 
@@ -2780,12 +2780,12 @@  discard block
 block discarded – undo
2780 2780
  * @param Critere $crit Paramètres du critère dans cette boucle
2781 2781
  */
2782 2782
 function critere_php_args_dist($idb, &$boucles, $crit) {
2783
-	$boucle = &$boucles[$idb];
2784
-	$boucle->hash .= '$command[\'args\']=array();';
2785
-	foreach ($crit->param as $param) {
2786
-		$boucle->hash .= '
2783
+    $boucle = &$boucles[$idb];
2784
+    $boucle->hash .= '$command[\'args\']=array();';
2785
+    foreach ($crit->param as $param) {
2786
+        $boucle->hash .= '
2787 2787
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2788
-	}
2788
+    }
2789 2789
 }
2790 2790
 
2791 2791
 /**
@@ -2802,16 +2802,16 @@  discard block
 block discarded – undo
2802 2802
  * @param Critere $crit Paramètres du critère dans cette boucle
2803 2803
  */
2804 2804
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2805
-	$boucle = &$boucles[$idb];
2806
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2807
-	foreach ($crit->param as $param) {
2808
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2809
-			$param,
2810
-			$idb,
2811
-			$boucles,
2812
-			$boucles[$idb]->id_parent
2813
-		) . ";\n";
2814
-	}
2805
+    $boucle = &$boucles[$idb];
2806
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2807
+    foreach ($crit->param as $param) {
2808
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2809
+            $param,
2810
+            $idb,
2811
+            $boucles,
2812
+            $boucles[$idb]->id_parent
2813
+        ) . ";\n";
2814
+    }
2815 2815
 }
2816 2816
 
2817 2817
 /**
@@ -2836,16 +2836,16 @@  discard block
 block discarded – undo
2836 2836
  * @param Critere $crit Paramètres du critère dans cette boucle
2837 2837
  */
2838 2838
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2839
-	$boucle = &$boucles[$idb];
2840
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2841
-	foreach ($crit->param as $param) {
2842
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2843
-			$param,
2844
-			$idb,
2845
-			$boucles,
2846
-			$boucles[$idb]->id_parent
2847
-		) . ";\n";
2848
-	}
2839
+    $boucle = &$boucles[$idb];
2840
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2841
+    foreach ($crit->param as $param) {
2842
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2843
+            $param,
2844
+            $idb,
2845
+            $boucles,
2846
+            $boucles[$idb]->id_parent
2847
+        ) . ";\n";
2848
+    }
2849 2849
 }
2850 2850
 
2851 2851
 /**
@@ -2860,11 +2860,11 @@  discard block
 block discarded – undo
2860 2860
  * @param Critere $crit Paramètres du critère dans cette boucle
2861 2861
  */
2862 2862
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2863
-	$boucle = &$boucles[$idb];
2864
-	foreach ($crit->param as $param) {
2865
-		$boucle->hash .= '
2863
+    $boucle = &$boucles[$idb];
2864
+    foreach ($crit->param as $param) {
2865
+        $boucle->hash .= '
2866 2866
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2867
-	}
2867
+    }
2868 2868
 }
2869 2869
 
2870 2870
 
@@ -2896,20 +2896,20 @@  discard block
 block discarded – undo
2896 2896
  * @param Critere $crit Paramètres du critère dans cette boucle
2897 2897
  */
2898 2898
 function critere_si_dist($idb, &$boucles, $crit) {
2899
-	$boucle = &$boucles[$idb];
2900
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2901
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2902
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2903
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2904
-	if ($crit->param) {
2905
-		foreach ($crit->param as $param) {
2906
-			$boucle->hash .= "\t\$command['si'][] = "
2907
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2908
-		}
2909
-		// interdire {si 0} aussi !
2910
-	} else {
2911
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2912
-	}
2899
+    $boucle = &$boucles[$idb];
2900
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2901
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2902
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2903
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2904
+    if ($crit->param) {
2905
+        foreach ($crit->param as $param) {
2906
+            $boucle->hash .= "\t\$command['si'][] = "
2907
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2908
+        }
2909
+        // interdire {si 0} aussi !
2910
+    } else {
2911
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2912
+    }
2913 2913
 }
2914 2914
 
2915 2915
 /**
@@ -2926,8 +2926,8 @@  discard block
 block discarded – undo
2926 2926
  * @param Critere $crit Paramètres du critère dans cette boucle
2927 2927
  */
2928 2928
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2929
-	$boucle = &$boucles[$idb];
2930
-	$boucle->hash .= '
2929
+    $boucle = &$boucles[$idb];
2930
+    $boucle->hash .= '
2931 2931
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2932 2932
 	$command[\'sourcemode\'] = \'table\';';
2933 2933
 }
@@ -2948,27 +2948,27 @@  discard block
 block discarded – undo
2948 2948
  */
2949 2949
 function critere_noeud_dist($idb, &$boucles, $crit) {
2950 2950
 
2951
-	$not = $crit->not;
2952
-	$boucle = &$boucles[$idb];
2953
-	$primary = $boucle->primary;
2951
+    $not = $crit->not;
2952
+    $boucle = &$boucles[$idb];
2953
+    $primary = $boucle->primary;
2954 2954
 
2955
-	if (!$primary or strpos($primary, ',')) {
2956
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2955
+    if (!$primary or strpos($primary, ',')) {
2956
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2957 2957
 
2958
-		return;
2959
-	}
2960
-	$table = $boucle->type_requete;
2961
-	$table_sql = table_objet_sql(objet_type($table));
2958
+        return;
2959
+    }
2960
+    $table = $boucle->type_requete;
2961
+    $table_sql = table_objet_sql(objet_type($table));
2962 2962
 
2963
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2963
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2964 2964
 
2965
-	$in = 'IN';
2966
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2967
-	if ($not) {
2968
-		$where = ["'NOT'", $where];
2969
-	}
2965
+    $in = 'IN';
2966
+    $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2967
+    if ($not) {
2968
+        $where = ["'NOT'", $where];
2969
+    }
2970 2970
 
2971
-	$boucle->where[] = $where;
2971
+    $boucle->where[] = $where;
2972 2972
 }
2973 2973
 
2974 2974
 /**
@@ -2984,8 +2984,8 @@  discard block
 block discarded – undo
2984 2984
  * @param Critere $crit Paramètres du critère dans cette boucle
2985 2985
  */
2986 2986
 function critere_feuille_dist($idb, &$boucles, $crit) {
2987
-	$not = $crit->not;
2988
-	$crit->not = $not ? false : true;
2989
-	critere_noeud_dist($idb, $boucles, $crit);
2990
-	$crit->not = $not;
2987
+    $not = $crit->not;
2988
+    $crit->not = $not ? false : true;
2989
+    critere_noeud_dist($idb, $boucles, $crit);
2990
+    $crit->not = $not;
2991 2991
 }
Please login to merge, or discard this patch.
Spacing   +165 added lines, -170 removed lines patch added patch discarded remove patch
@@ -47,7 +47,7 @@  discard block
 block discarded – undo
47 47
 	$boucle = &$boucles[$idb];
48 48
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
49 49
 
50
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
50
+	$c = ["'='", "'$boucle->id_table."."$id_parent'", 0];
51 51
 	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
52 52
 }
53 53
 
@@ -70,10 +70,10 @@  discard block
 block discarded – undo
70 70
 	$id = $boucle->primary;
71 71
 
72 72
 	if ($not or !$id) {
73
-		return (['zbug_critere_inconnu', ['critere' => $not . $crit->op]]);
73
+		return (['zbug_critere_inconnu', ['critere' => $not.$crit->op]]);
74 74
 	}
75 75
 	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
76
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
76
+	$boucle->where[] = ["'!='", "'$boucle->id_table."."$id'", $arg];
77 77
 }
78 78
 
79 79
 
@@ -104,12 +104,12 @@  discard block
 block discarded – undo
104 104
 	$not = ($crit->not ? '' : 'NOT');
105 105
 
106 106
 	// le doublon s'applique sur un type de boucle (article)
107
-	$nom = "'" . $boucle->type_requete . "'";
107
+	$nom = "'".$boucle->type_requete."'";
108 108
 
109 109
 	// compléter le nom avec un nom précisé {doublons nom}
110 110
 	// on obtient $nom = "'article' . 'nom'"
111 111
 	if (isset($crit->param[0])) {
112
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
112
+		$nom .= '.'.calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113 113
 	}
114 114
 
115 115
 	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
@@ -121,13 +121,13 @@  discard block
 block discarded – undo
121 121
 	// $doublons et son index, ici $nom
122 122
 
123 123
 	// debut du code "sql_in('articles.id_article', "
124
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
124
+	$debut_in = "sql_in('".$boucle->id_table.'.'.$primary."', ";
125 125
 	// lecture des données du doublon "$doublons[$doublon_index[] = "
126 126
 	// Attention : boucle->doublons désigne une variable qu'on affecte
127
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . '[]= '));
127
+	$debut_doub = '$doublons['.(!$not ? '' : ($boucle->doublons.'[]= '));
128 128
 
129 129
 	// le debut complet du code des doublons
130
-	$debut_doub = $debut_in . $debut_doub;
130
+	$debut_doub = $debut_in.$debut_doub;
131 131
 
132 132
 	// nom du doublon "('article' . 'nom')]"
133 133
 	$fin_doub = "($nom)]";
@@ -137,22 +137,22 @@  discard block
 block discarded – undo
137 137
 	foreach ($boucle->where as $k => $w) {
138 138
 		if (strpos($w[0], $debut_doub) === 0) {
139 139
 			// fusionner le sql_in (du where)
140
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
140
+			$boucle->where[$k][0] = $debut_doub.$fin_doub.' . '.substr($w[0], strlen($debut_in));
141 141
 			// fusionner l'initialisation (du hash) pour faire plus joli
142 142
 			$x = strpos($boucle->hash, $init_comment);
143 143
 			$len = strlen($init_comment);
144 144
 			$boucle->hash =
145
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
145
+				substr($boucle->hash, 0, $x + $len).$init_code.substr($boucle->hash, $x + $len);
146 146
 
147 147
 			return;
148 148
 		}
149 149
 	}
150 150
 
151 151
 	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
152
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
152
+	$boucle->where[] = [$debut_doub.$fin_doub.", '".$not."')"];
153 153
 
154 154
 	// déclarer le doublon s'il n'existe pas encore
155
-	$boucle->hash .= $init_comment . $init_code;
155
+	$boucle->hash .= $init_comment.$init_code;
156 156
 
157 157
 
158 158
 	# la ligne suivante avait l'intention d'eviter une collecte deja faite
@@ -214,7 +214,7 @@  discard block
 block discarded – undo
214 214
 	$deux = $deux[0]->texte;
215 215
 	if ($deux) {
216 216
 		$boucles[$idb]->limit = 
217
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
217
+			'intval($Pile[0]["debut'.$un.'"]) . ",'.$deux.'"';
218 218
 	} else {
219 219
 		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
220 220
 	}
@@ -276,26 +276,26 @@  discard block
 block discarded – undo
276 276
 		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
277 277
 	}
278 278
 
279
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
279
+	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut".substr($type, 1));
280 280
 	$boucle->modificateur['debut_nom'] = $type;
281 281
 	$partie =
282 282
 		// tester si le numero de page demande est de la forme '@yyy'
283
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
283
+		'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n"
284 284
 		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
285
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
286
-		. "\t\t" . '$iter->seek(0);' . "\n"
285
+		. "\t\t".'$debut_boucle = $Pile[0]['.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$iter);'."\n"
286
+		. "\t\t".'$iter->seek(0);'."\n"
287 287
 		. "\t}\n"
288
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
288
+		. "\t".'$debut_boucle = intval($debut_boucle)';
289 289
 
290 290
 	$boucle->hash .= '
291
-	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
291
+	$command[\'pagination\'] = array((isset($Pile[0][' . $debut.']) ? $Pile[0]['.$debut.'] : null), '.$pas.');';
292 292
 
293 293
 	$boucle->total_parties = $pas;
294 294
 	calculer_parties($boucles, $idb, $partie, 'p+');
295 295
 	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
296 296
 	// sauf si pas de primaire, ou si primaire composee
297 297
 	// dans ce cas, on ne sait pas gerer une pagination indirecte
298
-	$t = $boucle->id_table . '.' . $boucle->primary;
298
+	$t = $boucle->id_table.'.'.$boucle->primary;
299 299
 	if (
300 300
 		$boucle->primary
301 301
 		and !preg_match('/[,\s]/', $boucle->primary)
@@ -342,24 +342,24 @@  discard block
 block discarded – undo
342 342
 	$boucle->hash .= '
343 343
 	// RECHERCHE'
344 344
 		. ($crit->cond ? '
345
-	if (!strlen(' . $quoi . ')){
345
+	if (!strlen(' . $quoi.')){
346 346
 		list($rech_select, $rech_where) = array("0 as points","");
347
-	} else' : '') . '
347
+	} else' : '').'
348 348
 	{
349 349
 		$prepare_recherche = charger_fonction(\'prepare_recherche\', \'inc\');
350
-		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi . ', "' . $boucle->id_table . '", "' . $crit->cond . '","' . $boucle->sql_serveur . '",' . $_modificateur . ',"' . $boucle->primary . '");
350
+		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'","'.$boucle->sql_serveur.'",'.$_modificateur.',"'.$boucle->primary.'");
351 351
 	}
352 352
 	';
353 353
 
354 354
 
355
-	$t = $boucle->id_table . '.' . $boucle->primary;
355
+	$t = $boucle->id_table.'.'.$boucle->primary;
356 356
 	if (!in_array($t, $boucles[$idb]->select)) {
357 357
 		$boucle->select[] = $t;
358 358
 	} # pour postgres, neuneu ici
359 359
 	// jointure uniquement sur le serveur principal
360 360
 	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
361 361
 	if (!$boucle->sql_serveur) {
362
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
362
+		$boucle->join['resultats'] = ["'".$boucle->id_table."'", "'id'", "'".$boucle->primary."'"];
363 363
 		$boucle->from['resultats'] = 'spip_resultats';
364 364
 	}
365 365
 	$boucle->select[] = '$rech_select';
@@ -426,7 +426,7 @@  discard block
 block discarded – undo
426 426
 	$c =
427 427
 		[
428 428
 			"'OR'",
429
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
429
+			["'='", "'$table."."id_trad'", "'$table.$prim'"],
430 430
 			["'='", "'$table.id_trad'", "'0'"]
431 431
 		];
432 432
 	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
@@ -449,13 +449,13 @@  discard block
 block discarded – undo
449 449
 	$boucle = &$boucles[$idb];
450 450
 	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
451 451
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
452
-	$mparent = $boucle->id_table . '.' . $id_parent;
452
+	$mparent = $boucle->id_table.'.'.$id_parent;
453 453
 
454 454
 	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
455 455
 		$boucle->where[] = ["'='", "'$mparent'", $arg];
456 456
 	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
457 457
 	else {
458
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]]);
458
+		return (['zbug_critere_inconnu', ['critere' => $crit->op.' '.$boucle->type_requete]]);
459 459
 	}
460 460
 }
461 461
 
@@ -508,16 +508,15 @@  discard block
 block discarded – undo
508 508
 		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
509 509
 			$decompose = decompose_champ_id_objet($champ);
510 510
 			$champ = array_shift($decompose);
511
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
511
+			$boucle->where[] = ["'='", _q($cle.'.'.reset($decompose)), '"'.sql_quote(end($decompose)).'"'];
512 512
 		}
513 513
 	} else {
514 514
 		$cle = $boucle->id_table;
515 515
 	}
516 516
 
517
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
518
-		. ($not ? ", 'NOT'" : '') . ')';
519
-	$boucle->where[] = !$crit->cond ? $c :
520
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
517
+	$c = "sql_in('$cle".".$champ', calcul_branche_in($arg)"
518
+		. ($not ? ", 'NOT'" : '').')';
519
+	$boucle->where[] = !$crit->cond ? $c : ("($arg ? $c : ".($not ? "'0=1'" : "'1=1'").')');
521 520
 }
522 521
 
523 522
 /**
@@ -537,9 +536,9 @@  discard block
 block discarded – undo
537 536
 	$not = ($crit->not ? 'NOT' : '');
538 537
 	$serveur = $boucle->sql_serveur;
539 538
 
540
-	$c = "sql_in('" .
541
-		$boucle->id_table . '.' . $boucle->primary
542
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
539
+	$c = "sql_in('".
540
+		$boucle->id_table.'.'.$boucle->primary
541
+		. "', lister_objets_avec_logos('".$boucle->primary."'), '$not', '$serveur')";
543 542
 
544 543
 	$boucle->where[] = $c;
545 544
 }
@@ -571,7 +570,7 @@  discard block
 block discarded – undo
571 570
 				$t = table_objet_sql($r[1]);
572 571
 				$t = array_search($t, $boucles[$idb]->from);
573 572
 				if ($t) {
574
-					$t .= '.' . $r[2];
573
+					$t .= '.'.$r[2];
575 574
 				}
576 575
 			}
577 576
 		} else {
@@ -586,7 +585,7 @@  discard block
 block discarded – undo
586 585
 			$boucles[$idb]->select[] = $t;
587 586
 		}
588 587
 	} else {
589
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
588
+		return (['zbug_critere_inconnu', ['critere' => $crit->op.' ?']]);
590 589
 	}
591 590
 }
592 591
 
@@ -656,25 +655,25 @@  discard block
 block discarded – undo
656 655
 				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
657 656
 				or (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
658 657
 			) {
659
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
658
+				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . ".$boucle->modificateur['collate']." . ' ", $i, 0);
660 659
 			} else {
661
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
660
+				$boucle->order[$n - 1] .= ' . '.$boucle->modificateur['collate'];
662 661
 			}
663 662
 		}
664 663
 	} else {
665
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
664
+		return (['zbug_critere_inconnu', ['critere' => $crit->op.' '.(is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
666 665
 	}
667 666
 }
668 667
 
669 668
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
670 669
 	$boucle = $boucles[$idb];
671
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
672
-	$var = '$champs_' . $idb;
670
+	$alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')';
671
+	$var = '$champs_'.$idb;
673 672
 	$desc = (strpos($boucle->in, (string) "static $var =") !== false);
674 673
 	if (!$desc) {
675 674
 		$desc = $boucle->show['field'];
676 675
 		$desc = implode(',', array_map('_q', array_keys($desc)));
677
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
676
+		$boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.');';
678 677
 	}
679 678
 	if ($desc) {
680 679
 		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
@@ -749,7 +748,7 @@  discard block
 block discarded – undo
749 748
 		$sens = " . ' DESC'";
750 749
 	}
751 750
 	if (isset($boucle->modificateur['collate'])) {
752
-		$collecte = ' . ' . $boucle->modificateur['collate'];
751
+		$collecte = ' . '.$boucle->modificateur['collate'];
753 752
 	}
754 753
 
755 754
 	// Pour chaque paramètre du critère
@@ -771,14 +770,14 @@  discard block
 block discarded – undo
771 770
 			if (preg_match(',^(\w+)[\s]+(.*)$,', $par, $m)) {
772 771
 				$expression = trim($m[1]);
773 772
 				$champ = trim($m[2]);
774
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
773
+				if (function_exists($f = 'calculer_critere_par_expression_'.$expression)) {
775 774
 					$order = $f($idb, $boucles, $crit, $tri, $champ);
776 775
 				} else {
777
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
776
+					return ['zbug_critere_inconnu', ['critere' => $crit->op." $par"]];
778 777
 				}
779 778
 
780 779
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
781
-			} elseif ($boucle->type_requete == 'DATA' or preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
780
+			} elseif ($boucle->type_requete == 'DATA' or preg_match(',^'.CHAMP_SQL_PLUS_FONC.'$,is', $par, $match)) {
782 781
 				// {par FONCTION(champ)}
783 782
 				if (isset($match) and count($match) > 2) {
784 783
 					$par = substr($match[2], 1, -1);
@@ -788,7 +787,7 @@  discard block
 block discarded – undo
788 787
 				if ($par == 'hasard') {
789 788
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
790 789
 				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
791
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
790
+					$order = "'".$boucle->id_table.'.'.$boucle->show['date']."'";
792 791
 				} else {
793 792
 					// cas général {par champ}, {par table.champ}, ...
794 793
 					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
@@ -797,7 +796,7 @@  discard block
 block discarded – undo
797 796
 
798 797
 			// on ne sait pas traiter…
799 798
 			else {
800
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
799
+				return ['zbug_critere_inconnu', ['critere' => $crit->op." $par"]];
801 800
 			}
802 801
 
803 802
 			// En cas d'erreur de squelette retournée par une fonction
@@ -817,14 +816,14 @@  discard block
 block discarded – undo
817 816
 
818 817
 		if ($fct) {
819 818
 			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
820
-				$order = "'$fct(" . $r[1] . ")'";
819
+				$order = "'$fct(".$r[1].")'";
821 820
 			} else {
822 821
 				$order = "'$fct(' . $order . ')'";
823 822
 			}
824 823
 		}
825
-		$t = $order . $collecte . $sens;
824
+		$t = $order.$collecte.$sens;
826 825
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
827
-			$t = $r[1] . $r[2];
826
+			$t = $r[1].$r[2];
828 827
 		}
829 828
 
830 829
 		$boucle->order[] = $t;
@@ -874,16 +873,16 @@  discard block
 block discarded – undo
874 873
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
875 874
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
876 875
 	if (is_array($_champ)) {
877
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
876
+		return ['zbug_critere_inconnu', ['critere' => $crit->op." num $champ"]];
878 877
 	}
879 878
 	$boucle = &$boucles[$idb];
880
-	$texte = '0+' . $_champ;
879
+	$texte = '0+'.$_champ;
881 880
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
882 881
 	if ($suite !== "''") {
883
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
882
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')".' . "';
884 883
 	}
885
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
886
-	$boucle->select[] = $texte . " AS $asnum";
884
+	$asnum = 'num'.($boucle->order ? count($boucle->order) : '');
885
+	$boucle->select[] = $texte." AS $asnum";
887 886
 
888 887
 	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
889 888
 	$orderassinum = trim($orderassinum, "'");
@@ -912,13 +911,13 @@  discard block
 block discarded – undo
912 911
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
913 912
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
914 913
 	if (is_array($_champ)) {
915
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
914
+		return ['zbug_critere_inconnu', ['critere' => $crit->op." sinum $champ"]];
916 915
 	}
917 916
 	$boucle = &$boucles[$idb];
918
-	$texte = '0+' . $_champ;
917
+	$texte = '0+'.$_champ;
919 918
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
920 919
 	if ($suite !== "''") {
921
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
920
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')".' . "';
922 921
 	}
923 922
 
924 923
 	$as = false;
@@ -934,8 +933,8 @@  discard block
 block discarded – undo
934 933
 	}
935 934
 
936 935
 	if (!$as) {
937
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
938
-		$boucle->select[] = $select . $as;
936
+		$as = 'sinum'.($boucle->order ? count($boucle->order) : '');
937
+		$boucle->select[] = $select.$as;
939 938
 	}
940 939
 	$order = "'$as'";
941 940
 	return $order;
@@ -960,10 +959,10 @@  discard block
 block discarded – undo
960 959
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
961 960
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
962 961
 	if (is_array($_champ)) {
963
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
962
+		return ['zbug_critere_inconnu', ['critere' => $crit->op." multi $champ"]];
964 963
 	}
965 964
 	$boucle = &$boucles[$idb];
966
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
965
+	$boucle->select[] = "\".sql_multi('".$_champ."', \$GLOBALS['spip_lang']).\"";
967 966
 	$order = "'multi'";
968 967
 	return $order;
969 968
 }
@@ -989,7 +988,7 @@  discard block
 block discarded – undo
989 988
 
990 989
 	// le champ existe dans la table, pas de souci (le plus commun)
991 990
 	if (isset($desc['field'][$par])) {
992
-		$par = $boucle->id_table . '.' . $par;
991
+		$par = $boucle->id_table.'.'.$par;
993 992
 	}
994 993
 	// le champ est peut être une jointure
995 994
 	else {
@@ -1010,24 +1009,24 @@  discard block
 block discarded – undo
1010 1009
 		// Sinon on cherche le champ dans les tables possibles de jointures
1011 1010
 		// Si la table est déjà dans le from, on la réutilise.
1012 1011
 		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1013
-			$par = $infos['alias'] . '.' . $champ;
1012
+			$par = $infos['alias'].'.'.$champ;
1014 1013
 		} elseif (
1015 1014
 			$boucle->jointures_explicites
1016 1015
 			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1017 1016
 		) {
1018
-			$par = $alias . '.' . $champ;
1017
+			$par = $alias.'.'.$champ;
1019 1018
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1020
-			$par = $alias . '.' . $champ;
1019
+			$par = $alias.'.'.$champ;
1021 1020
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1022 1021
 		} elseif (
1023 1022
 			$table_alias
1024 1023
 			and isset($boucle->from[$table_alias])
1025 1024
 			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1026 1025
 		) {
1027
-			$par = $infos['alias'] . '.' . $champ;
1026
+			$par = $infos['alias'].'.'.$champ;
1028 1027
 		} elseif ($table) {
1029 1028
 			// On avait table + champ, mais on ne les a pas trouvés
1030
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1029
+			return ['zbug_critere_inconnu', ['critere' => $crit->op." $par"]];
1031 1030
 		} else {
1032 1031
 			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1033 1032
 		}
@@ -1051,7 +1050,7 @@  discard block
 block discarded – undo
1051 1050
 	if (!$t) {
1052 1051
 		$t = trouver_jointure_champ($champ, $boucle);
1053 1052
 	}
1054
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1053
+	return !$t ? '' : ("'".$t.'.'.$champ."'");
1055 1054
 }
1056 1055
 
1057 1056
 /**
@@ -1096,9 +1095,9 @@  discard block
 block discarded – undo
1096 1095
 				$boucle->default_order[] = ' DESC';
1097 1096
 			}
1098 1097
 		} else {
1099
-			$t = $boucle->order[$n - 1] . " . $order";
1098
+			$t = $boucle->order[$n - 1]." . $order";
1100 1099
 			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1101
-				$t = $r[1] . $r[2];
1100
+				$t = $r[1].$r[2];
1102 1101
 			}
1103 1102
 			$boucle->order[$n - 1] = $t;
1104 1103
 		}
@@ -1133,7 +1132,7 @@  discard block
 block discarded – undo
1133 1132
 	$_order = array_pop($boucle->order);
1134 1133
 
1135 1134
 	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1136
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1135
+	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'".$boucle->sql_serveur."')) ? \$zl : '0').')'$sens";
1137 1136
 }
1138 1137
 
1139 1138
 
@@ -1141,7 +1140,7 @@  discard block
 block discarded – undo
1141 1140
 	$params = $crit->param;
1142 1141
 
1143 1142
 	if ((is_countable($params) ? count($params) : 0) < 1) {
1144
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1143
+		return ['zbug_critere_inconnu', ['critere' => $crit->op.' ?']];
1145 1144
 	}
1146 1145
 
1147 1146
 	$boucle = &$boucles[$idb];
@@ -1162,7 +1161,7 @@  discard block
 block discarded – undo
1162 1161
 	if (((is_countable($date) ? count($date) : 0) == 1) and ($date[0]->type == 'texte')) {
1163 1162
 		$date = $date[0]->texte;
1164 1163
 		if (!isset($fields[$date])) {
1165
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1164
+			return ['zbug_critere_inconnu', ['critere' => $crit->op.' '.$date]];
1166 1165
 		}
1167 1166
 	} else {
1168 1167
 		$a = calculer_liste($date, $idb, $boucles, $parent);
@@ -1174,38 +1173,38 @@  discard block
 block discarded – undo
1174 1173
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1175 1174
 	}
1176 1175
 	$annee = $params ? array_shift($params) : '';
1177
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1178
-		calculer_liste($annee, $idb, $boucles, $parent) .
1176
+	$annee = "\n".'sprintf("%04d", ($x = '.
1177
+		calculer_liste($annee, $idb, $boucles, $parent).
1179 1178
 		') ? $x : date("Y"))';
1180 1179
 
1181 1180
 	$mois = $params ? array_shift($params) : '';
1182
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1183
-		calculer_liste($mois, $idb, $boucles, $parent) .
1181
+	$mois = "\n".'sprintf("%02d", ($x = '.
1182
+		calculer_liste($mois, $idb, $boucles, $parent).
1184 1183
 		') ? $x : date("m"))';
1185 1184
 
1186 1185
 	$jour = $params ? array_shift($params) : '';
1187
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1188
-		calculer_liste($jour, $idb, $boucles, $parent) .
1186
+	$jour = "\n".'sprintf("%02d", ($x = '.
1187
+		calculer_liste($jour, $idb, $boucles, $parent).
1189 1188
 		') ? $x : date("d"))';
1190 1189
 
1191 1190
 	$annee2 = $params ? array_shift($params) : '';
1192
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1193
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1191
+	$annee2 = "\n".'sprintf("%04d", ($x = '.
1192
+		calculer_liste($annee2, $idb, $boucles, $parent).
1194 1193
 		') ? $x : date("Y"))';
1195 1194
 
1196 1195
 	$mois2 = $params ? array_shift($params) : '';
1197
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1198
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1196
+	$mois2 = "\n".'sprintf("%02d", ($x = '.
1197
+		calculer_liste($mois2, $idb, $boucles, $parent).
1199 1198
 		') ? $x : date("m"))';
1200 1199
 
1201 1200
 	$jour2 = $params ? array_shift($params) : '';
1202
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1203
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1201
+	$jour2 = "\n".'sprintf("%02d", ($x = '.
1202
+		calculer_liste($jour2, $idb, $boucles, $parent).
1204 1203
 		') ? $x : date("d"))';
1205 1204
 
1206
-	$date = $boucle->id_table . ".$date";
1205
+	$date = $boucle->id_table.".$date";
1207 1206
 
1208
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1207
+	$quote_end = ",'".$boucle->sql_serveur."','text'";
1209 1208
 	if ($type == 'jour') {
1210 1209
 		$boucle->where[] = [
1211 1210
 			"'='",
@@ -1277,14 +1276,13 @@  discard block
 block discarded – undo
1277 1276
 	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1278 1277
 
1279 1278
 	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1280
-		$boucle->limit = $a11 . ',' . $a21;
1279
+		$boucle->limit = $a11.','.$a21;
1281 1280
 	} else {
1282 1281
 		// 3 dans {1/3}, {2,3} ou {1,n-3}
1283 1282
 		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1284 1283
 		// 2 dans {2/3}, {2,5}, {n-2,1}
1285 1284
 		$partie = ($a11 != 'n') ? $a11 : $a12;
1286
-		$mode = (($op == '/') ? '/' :
1287
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1285
+		$mode = (($op == '/') ? '/' : (($a11 == 'n') ? '-' : '+').(($a21 == 'n') ? '-' : '+'));
1288 1286
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1289 1287
 		if ($a11 !== 'n' and $a21 !== 'n' and $mode == '++' and $op == ',') {
1290 1288
 			$boucle->limit =
@@ -1330,8 +1328,7 @@  discard block
 block discarded – undo
1330 1328
 	// {1/3}
1331 1329
 	if ($op1 == '/') {
1332 1330
 		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1333
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1334
-			"($total_parties ? $total_parties : 1)";
1331
+		$totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)";
1335 1332
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1336 1333
 		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1337 1334
 	} else {
@@ -1342,15 +1339,13 @@  discard block
 block discarded – undo
1342 1339
 
1343 1340
 		// cas {x,n-1}
1344 1341
 		if ($op2 == '-') {
1345
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1346
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1347
-					($total_parties . ' - 1'));
1342
+			$fin = '$debut_boucle + '.$nombre_boucle.' - '
1343
+				. (is_numeric($total_parties) ? ($total_parties + 1) : ($total_parties.' - 1'));
1348 1344
 		} else {
1349 1345
 			// {x,1} ou {pagination}
1350 1346
 			$fin = '$debut_boucle'
1351 1347
 				. (is_numeric($total_parties) ?
1352
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1353
-					('+' . $total_parties . ' - 1'));
1348
+					(($total_parties == 1) ? '' : (' + '.($total_parties - 1))) : ('+'.$total_parties.' - 1'));
1354 1349
 		}
1355 1350
 
1356 1351
 		// {pagination}, gerer le debut_xx=-1 pour tout voir
@@ -1368,11 +1363,11 @@  discard block
 block discarded – undo
1368 1363
 	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1369 1364
 
1370 1365
 	$boucles[$id_boucle]->mode_partie = "\n\t"
1371
-		. '$debut_boucle = ' . $debut . ";\n	"
1366
+		. '$debut_boucle = '.$debut.";\n	"
1372 1367
 		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1373
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1374
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1375
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1368
+		. '$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n	"
1369
+		. '$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1370
+		. '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1376 1371
 		. "\n\tif (\$debut_boucle>0"
1377 1372
 		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1378 1373
 		. " AND \$iter->seek(\$debut_boucle,'continue'))"
@@ -1457,16 +1452,16 @@  discard block
 block discarded – undo
1457 1452
 		// critere personnalise ?
1458 1453
 		if (
1459 1454
 			(!$serveur or
1460
-				((!function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere))
1461
-					and (!function_exists($f = $f . '_dist'))
1462
-					and (!function_exists($f = 'critere_' . $serveur . '_' . $critere))
1463
-					and (!function_exists($f = $f . '_dist'))
1455
+				((!function_exists($f = 'critere_'.$serveur.'_'.$table.'_'.$critere))
1456
+					and (!function_exists($f = $f.'_dist'))
1457
+					and (!function_exists($f = 'critere_'.$serveur.'_'.$critere))
1458
+					and (!function_exists($f = $f.'_dist'))
1464 1459
 				)
1465 1460
 			)
1466
-			and (!function_exists($f = 'critere_' . $table . '_' . $critere))
1467
-			and (!function_exists($f = $f . '_dist'))
1468
-			and (!function_exists($f = 'critere_' . $critere))
1469
-			and (!function_exists($f = $f . '_dist'))
1461
+			and (!function_exists($f = 'critere_'.$table.'_'.$critere))
1462
+			and (!function_exists($f = $f.'_dist'))
1463
+			and (!function_exists($f = 'critere_'.$critere))
1464
+			and (!function_exists($f = $f.'_dist'))
1470 1465
 		) {
1471 1466
 			// fonction critere standard
1472 1467
 			$f = $defaut;
@@ -1497,9 +1492,9 @@  discard block
 block discarded – undo
1497 1492
  */
1498 1493
 function kwote($lisp, $serveur = '', $type = '') {
1499 1494
 	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1500
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1495
+		return $r[1].'"'.sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type).'"';
1501 1496
 	} else {
1502
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1497
+		return "sql_quote($lisp, '$serveur', '".str_replace("'", "\\'", $type)."')";
1503 1498
 	}
1504 1499
 }
1505 1500
 
@@ -1521,7 +1516,7 @@  discard block
 block discarded – undo
1521 1516
 function critere_IN_dist($idb, &$boucles, $crit) {
1522 1517
 	$r = calculer_critere_infixe($idb, $boucles, $crit);
1523 1518
 	if (!$r) {
1524
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']]);
1519
+		return (['zbug_critere_inconnu', ['critere' => $crit->op.' ?']]);
1525 1520
 	}
1526 1521
 	[$arg, $op, $val, $col, $where_complement] = $r;
1527 1522
 
@@ -1546,8 +1541,8 @@  discard block
 block discarded – undo
1546 1541
 				"'NOT'",
1547 1542
 				[
1548 1543
 					"'IN'",
1549
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1550
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1544
+					"'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'",
1545
+					["'SELF'", "'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'", $where]
1551 1546
 				]
1552 1547
 			];
1553 1548
 		}
@@ -1564,22 +1559,22 @@  discard block
 block discarded – undo
1564 1559
 	$descr = $boucles[$idb]->descr;
1565 1560
 	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1566 1561
 
1567
-	$var = '$in' . $cpt++;
1562
+	$var = '$in'.$cpt++;
1568 1563
 	$x = "\n\t$var = array();";
1569 1564
 	foreach ($val as $k => $v) {
1570 1565
 		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1571 1566
 			// optimiser le traitement des constantes
1572 1567
 			if (is_numeric($r[2])) {
1573
-				$x .= "\n\t$var" . "[]= $r[2];";
1568
+				$x .= "\n\t$var"."[]= $r[2];";
1574 1569
 			} else {
1575
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1570
+				$x .= "\n\t$var".'[]= '.sql_quote($r[2]).';';
1576 1571
 			}
1577 1572
 		} else {
1578 1573
 			// Pour permettre de passer des tableaux de valeurs
1579 1574
 			// on repere l'utilisation brute de #ENV**{X},
1580 1575
 			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1581 1576
 			// et on deballe mais en rajoutant l'anti XSS
1582
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1577
+			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);";
1583 1578
 		}
1584 1579
 	}
1585 1580
 
@@ -1593,7 +1588,7 @@  discard block
 block discarded – undo
1593 1588
 		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1594 1589
 	}
1595 1590
 
1596
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1591
+	return "sql_in('$arg', $var".($crit2 == 'NOT' ? ",'NOT'" : '').')';
1597 1592
 }
1598 1593
 
1599 1594
 /**
@@ -1666,7 +1661,7 @@  discard block
 block discarded – undo
1666 1661
 		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1667 1662
 	}
1668 1663
 	// nous aider en mode debug.
1669
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1664
+	$boucle->debug[] = 'id_ : '.implode(', ', $champs);
1670 1665
 	$boucle->modificateur['id_'] = $champs;
1671 1666
 
1672 1667
 	// créer un critère {id_xxx?} de chaque champ retenu
@@ -1917,8 +1912,8 @@  discard block
 block discarded – undo
1917 1912
 				"'NOT'",
1918 1913
 				[
1919 1914
 					"'IN'",
1920
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1921
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1915
+					"'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'",
1916
+					["'SELF'", "'".$boucles[$idb]->id_table.'.'.$boucles[$idb]->primary."'", $where]
1922 1917
 				]
1923 1918
 			];
1924 1919
 		}
@@ -1929,7 +1924,7 @@  discard block
 block discarded – undo
1929 1924
 	if ($crit->cond) {
1930 1925
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
1931 1926
 		if ($col === 'date' or $col === 'date_redac') {
1932
-			if ($pred === "\$Pile[0]['" . $col . "']") {
1927
+			if ($pred === "\$Pile[0]['".$col."']") {
1933 1928
 				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1934 1929
 			}
1935 1930
 		}
@@ -2092,7 +2087,7 @@  discard block
 block discarded – undo
2092 2087
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2093 2088
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2094 2089
 		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2095
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2090
+			$val[0] = $r[1].'"'.sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote).'"';
2096 2091
 		}
2097 2092
 		// sinon expliciter les
2098 2093
 		// sql_quote(truc) en sql_quote(truc,'',type)
@@ -2108,14 +2103,14 @@  discard block
 block discarded – undo
2108 2103
 		) {
2109 2104
 			$r = $r[1]
2110 2105
 				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2111
-				. ",'" . addslashes($type_cast_quote) . "'";
2106
+				. ",'".addslashes($type_cast_quote)."'";
2112 2107
 			$val[0] = "sql_quote($r)";
2113 2108
 		}
2114 2109
 		elseif (
2115 2110
 			strpos($val[0], '@@defaultcast@@') !== false
2116 2111
 			and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2117 2112
 		) {
2118
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2113
+			$val[0] = substr($val[0], 0, -strlen($r[0]))."'".addslashes($type_cast_quote)."')";
2119 2114
 		}
2120 2115
 	}
2121 2116
 
@@ -2123,7 +2118,7 @@  discard block
 block discarded – undo
2123 2118
 		strpos($val[0], '@@defaultcast@@') !== false
2124 2119
 		and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)
2125 2120
 	) {
2126
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2121
+		$val[0] = substr($val[0], 0, -strlen($r[0]))."'char')";
2127 2122
 	}
2128 2123
 
2129 2124
 	// Indicateur pour permettre aux fonctionx boucle_X de modifier
@@ -2139,7 +2134,7 @@  discard block
 block discarded – undo
2139 2134
 	// inserer le nom de la table SQL devant le nom du champ
2140 2135
 	if ($table) {
2141 2136
 		if ($col[0] == '`') {
2142
-			$arg = "$table." . substr($col, 1, -1);
2137
+			$arg = "$table.".substr($col, 1, -1);
2143 2138
 		} else {
2144 2139
 			$arg = "$table.$col";
2145 2140
 		}
@@ -2273,9 +2268,9 @@  discard block
 block discarded – undo
2273 2268
  **/
2274 2269
 function primary_doublee($decompose, $table) {
2275 2270
 	$e1 = reset($decompose);
2276
-	$e2 = "sql_quote('" . end($decompose) . "')";
2271
+	$e2 = "sql_quote('".end($decompose)."')";
2277 2272
 
2278
-	return ["'='", "'$table." . $e1 . "'", $e2];
2273
+	return ["'='", "'$table.".$e1."'", $e2];
2279 2274
 }
2280 2275
 
2281 2276
 /**
@@ -2314,7 +2309,7 @@  discard block
 block discarded – undo
2314 2309
 		$checkarrivee
2315 2310
 		and is_string($checkarrivee)
2316 2311
 		and $a = table_objet($checkarrivee)
2317
-		and in_array($a . '_liens', $joints)
2312
+		and in_array($a.'_liens', $joints)
2318 2313
 	) {
2319 2314
 		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2320 2315
 			return $res;
@@ -2334,12 +2329,12 @@  discard block
 block discarded – undo
2334 2329
 				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2335 2330
 				$joindre = false;
2336 2331
 				foreach ($cols as $col) {
2337
-					$c = '/\b' . $t . ".$col" . '\b/';
2332
+					$c = '/\b'.$t.".$col".'\b/';
2338 2333
 					if (trouver_champ($c, $boucle->where)) {
2339 2334
 						$joindre = true;
2340 2335
 					} else {
2341 2336
 						// mais ca peut etre dans le FIELD pour le Having
2342
-						$c = "/FIELD.$t" . ".$col,/";
2337
+						$c = "/FIELD.$t".".$col,/";
2343 2338
 						if (trouver_champ($c, $boucle->select)) {
2344 2339
 							$joindre = true;
2345 2340
 						}
@@ -2385,7 +2380,7 @@  discard block
 block discarded – undo
2385 2380
 	$primary_arrivee = id_table_objet($checkarrivee);
2386 2381
 
2387 2382
 	// [FIXME] $checkarrivee peut-il arriver avec false ????
2388
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2383
+	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee.'_liens');
2389 2384
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2390 2385
 
2391 2386
 	if (!$intermediaire or !$arrivee) {
@@ -2489,7 +2484,7 @@  discard block
 block discarded – undo
2489 2484
 			} elseif ($crit->cond and ($col == 'date' or $col == 'date_redac')) {
2490 2485
 				// un critere conditionnel sur date est traite a part
2491 2486
 				// car la date est mise d'office par SPIP,
2492
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2487
+				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])";
2493 2488
 			}
2494 2489
 
2495 2490
 			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
@@ -2521,7 +2516,7 @@  discard block
 block discarded – undo
2521 2516
 			and (($p == "'") or ($p == '"'))
2522 2517
 			and $params[0][1]->type == 'champ'
2523 2518
 		) {
2524
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2519
+			$val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p";
2525 2520
 		} else {
2526 2521
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2527 2522
 				$a = calculer_liste($p, $idb, $boucles, $parent);
@@ -2537,7 +2532,7 @@  discard block
 block discarded – undo
2537 2532
 	$fct = $args_sql = '';
2538 2533
 	// fonction SQL ?
2539 2534
 	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2540
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2535
+	if (preg_match('/^(.*)'.SQL_ARGS.'$/', $col, $m)) {
2541 2536
 		$fct = $m[1];
2542 2537
 		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2543 2538
 		$col = $a[1];
@@ -2627,7 +2622,7 @@  discard block
 block discarded – undo
2627 2622
 		# si oui choisir ce champ, sinon choisir xxxx
2628 2623
 
2629 2624
 		if (isset($table['field']["date$suite"])) {
2630
-			$date_orig = 'date' . $suite;
2625
+			$date_orig = 'date'.$suite;
2631 2626
 		} else {
2632 2627
 			$date_orig = substr($suite, 1);
2633 2628
 		}
@@ -2638,12 +2633,12 @@  discard block
 block discarded – undo
2638 2633
 		}
2639 2634
 	}
2640 2635
 
2641
-	$date_compare = "\"' . normaliser_date(" .
2642
-		calculer_argument_precedent($idb, $pred, $boucles) .
2636
+	$date_compare = "\"' . normaliser_date(".
2637
+		calculer_argument_precedent($idb, $pred, $boucles).
2643 2638
 		") . '\"";
2644 2639
 
2645 2640
 	$col_vraie = $date_orig;
2646
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2641
+	$date_orig = $boucle->id_table.'.'.$date_orig;
2647 2642
 
2648 2643
 	switch ($col) {
2649 2644
 		case 'date':
@@ -2663,26 +2658,26 @@  discard block
 block discarded – undo
2663 2658
 			break;
2664 2659
 		case 'age':
2665 2660
 			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2666
-			$col_vraie = '';// comparer a un int (par defaut)
2661
+			$col_vraie = ''; // comparer a un int (par defaut)
2667 2662
 			break;
2668 2663
 		case 'age_relatif':
2669 2664
 			$col = calculer_param_date($date_compare, $date_orig);
2670
-			$col_vraie = '';// comparer a un int (par defaut)
2665
+			$col_vraie = ''; // comparer a un int (par defaut)
2671 2666
 			break;
2672 2667
 		case 'jour_relatif':
2673
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2674
-			$col_vraie = '';// comparer a un int (par defaut)
2668
+			$col = '(TO_DAYS('.$date_compare.')-TO_DAYS('.$date_orig.'))';
2669
+			$col_vraie = ''; // comparer a un int (par defaut)
2675 2670
 			break;
2676 2671
 		case 'mois_relatif':
2677
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2678
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2679
-				')-YEAR(' . $date_orig . '))';
2680
-			$col_vraie = '';// comparer a un int (par defaut)
2672
+			$col = 'MONTH('.$date_compare.')-MONTH('.
2673
+				$date_orig.')+12*(YEAR('.$date_compare.
2674
+				')-YEAR('.$date_orig.'))';
2675
+			$col_vraie = ''; // comparer a un int (par defaut)
2681 2676
 			break;
2682 2677
 		case 'annee_relatif':
2683
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2684
-				$date_orig . ')';
2685
-			$col_vraie = '';// comparer a un int (par defaut)
2678
+			$col = 'YEAR('.$date_compare.')-YEAR('.
2679
+				$date_orig.')';
2680
+			$col_vraie = ''; // comparer a un int (par defaut)
2686 2681
 			break;
2687 2682
 	}
2688 2683
 
@@ -2743,10 +2738,10 @@  discard block
 block discarded – undo
2743 2738
 	}
2744 2739
 
2745 2740
 	$boucle->hash .= '
2746
-	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2741
+	$command[\'sourcemode\'] = ' . array_shift($args).";\n";
2747 2742
 
2748 2743
 	$boucle->hash .= '
2749
-	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2744
+	$command[\'source\'] = array(' . join(', ', $args).");\n";
2750 2745
 }
2751 2746
 
2752 2747
 /**
@@ -2765,7 +2760,7 @@  discard block
 block discarded – undo
2765 2760
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2766 2761
 	$boucle = &$boucles[$idb];
2767 2762
 	$boucle->hash .= '
2768
-	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2763
+	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).';';
2769 2764
 }
2770 2765
 
2771 2766
 
@@ -2784,7 +2779,7 @@  discard block
 block discarded – undo
2784 2779
 	$boucle->hash .= '$command[\'args\']=array();';
2785 2780
 	foreach ($crit->param as $param) {
2786 2781
 		$boucle->hash .= '
2787
-			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2782
+			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2788 2783
 	}
2789 2784
 }
2790 2785
 
@@ -2803,14 +2798,14 @@  discard block
 block discarded – undo
2803 2798
  */
2804 2799
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2805 2800
 	$boucle = &$boucles[$idb];
2806
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2801
+	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
2807 2802
 	foreach ($crit->param as $param) {
2808
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2803
+		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste(
2809 2804
 			$param,
2810 2805
 			$idb,
2811 2806
 			$boucles,
2812 2807
 			$boucles[$idb]->id_parent
2813
-		) . ";\n";
2808
+		).";\n";
2814 2809
 	}
2815 2810
 }
2816 2811
 
@@ -2837,14 +2832,14 @@  discard block
 block discarded – undo
2837 2832
  */
2838 2833
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2839 2834
 	$boucle = &$boucles[$idb];
2840
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2835
+	$boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n";
2841 2836
 	foreach ($crit->param as $param) {
2842
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2837
+		$boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste(
2843 2838
 			$param,
2844 2839
 			$idb,
2845 2840
 			$boucles,
2846 2841
 			$boucles[$idb]->id_parent
2847
-		) . ";\n";
2842
+		).";\n";
2848 2843
 	}
2849 2844
 }
2850 2845
 
@@ -2863,7 +2858,7 @@  discard block
 block discarded – undo
2863 2858
 	$boucle = &$boucles[$idb];
2864 2859
 	foreach ($crit->param as $param) {
2865 2860
 		$boucle->hash .= '
2866
-			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2861
+			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2867 2862
 	}
2868 2863
 }
2869 2864
 
@@ -2904,7 +2899,7 @@  discard block
 block discarded – undo
2904 2899
 	if ($crit->param) {
2905 2900
 		foreach ($crit->param as $param) {
2906 2901
 			$boucle->hash .= "\t\$command['si'][] = "
2907
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2902
+				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).";\n";
2908 2903
 		}
2909 2904
 		// interdire {si 0} aussi !
2910 2905
 	} else {
@@ -2928,7 +2923,7 @@  discard block
 block discarded – undo
2928 2923
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2929 2924
 	$boucle = &$boucles[$idb];
2930 2925
 	$boucle->hash .= '
2931
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2926
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2932 2927
 	$command[\'sourcemode\'] = \'table\';';
2933 2928
 }
2934 2929
 
@@ -2963,7 +2958,7 @@  discard block
 block discarded – undo
2963 2958
 	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2964 2959
 
2965 2960
 	$in = 'IN';
2966
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2961
+	$where = ["'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
2967 2962
 	if ($not) {
2968 2963
 		$where = ["'NOT'", $where];
2969 2964
 	}
Please login to merge, or discard this patch.
ecrire/iterateur/data.php 1 patch
Indentation   +640 added lines, -640 removed lines patch added patch discarded remove patch
@@ -17,11 +17,11 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 if (!defined('_DATA_SOURCE_MAX_SIZE')) {
24
-	define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
24
+    define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
25 25
 }
26 26
 
27 27
 
@@ -42,17 +42,17 @@  discard block
 block discarded – undo
42 42
  *     Description de la boucle complétée des champs
43 43
  */
44 44
 function iterateur_DATA_dist($b) {
45
-	$b->iterateur = 'DATA'; # designe la classe d'iterateur
46
-	$b->show = [
47
-		'field' => [
48
-			'cle' => 'STRING',
49
-			'valeur' => 'STRING',
50
-			'*' => 'ALL' // Champ joker *
51
-		]
52
-	];
53
-	$b->select[] = '.valeur';
54
-
55
-	return $b;
45
+    $b->iterateur = 'DATA'; # designe la classe d'iterateur
46
+    $b->show = [
47
+        'field' => [
48
+            'cle' => 'STRING',
49
+            'valeur' => 'STRING',
50
+            '*' => 'ALL' // Champ joker *
51
+        ]
52
+    ];
53
+    $b->select[] = '.valeur';
54
+
55
+    return $b;
56 56
 }
57 57
 
58 58
 
@@ -62,522 +62,522 @@  discard block
 block discarded – undo
62 62
  * Pour itérer sur des données quelconques (transformables en tableau)
63 63
  */
64 64
 class IterateurDATA implements Iterator {
65
-	/**
66
-	 * tableau de donnees
67
-	 *
68
-	 * @var array
69
-	 */
70
-	protected $tableau = [];
71
-
72
-	/**
73
-	 * Conditions de filtrage
74
-	 * ie criteres de selection
75
-	 *
76
-	 * @var array
77
-	 */
78
-	protected $filtre = [];
79
-
80
-
81
-	/**
82
-	 * Cle courante
83
-	 *
84
-	 * @var null
85
-	 */
86
-	protected $cle = null;
87
-
88
-	/**
89
-	 * Valeur courante
90
-	 *
91
-	 * @var null
92
-	 */
93
-	protected $valeur = null;
94
-
95
-	/**
96
-	 * Erreur presente ?
97
-	 *
98
-	 * @var bool
99
-	 **/
100
-	public $err = false;
101
-
102
-	/**
103
-	 * Calcul du total des elements
104
-	 *
105
-	 * @var int|null
106
-	 **/
107
-	public $total = null;
108
-
109
-	/**
110
-	 * Constructeur
111
-	 *
112
-	 * @param  $command
113
-	 * @param array $info
114
-	 */
115
-	public function __construct($command, $info = []) {
116
-		$this->type = 'DATA';
117
-		$this->command = $command;
118
-		$this->info = $info;
119
-
120
-		$this->select($command);
121
-	}
122
-
123
-	/**
124
-	 * Revenir au depart
125
-	 *
126
-	 * @return void
127
-	 */
128
-	public function rewind() : void {
129
-		reset($this->tableau);
130
-		$this->cle = array_key_first($this->tableau);
131
-		$this->valeur = current($this->tableau);
132
-		next($this->tableau);
133
-	}
134
-
135
-	/**
136
-	 * Déclarer les critères exceptions
137
-	 *
138
-	 * @return array
139
-	 */
140
-	public function exception_des_criteres() {
141
-		return ['tableau'];
142
-	}
143
-
144
-	/**
145
-	 * Récupérer depuis le cache si possible
146
-	 *
147
-	 * @param string $cle
148
-	 * @return mixed
149
-	 */
150
-	protected function cache_get($cle) {
151
-		if (!$cle) {
152
-			return;
153
-		}
154
-		# utiliser memoization si dispo
155
-		if (!function_exists('cache_get')) {
156
-			return;
157
-		}
158
-
159
-		return cache_get($cle);
160
-	}
161
-
162
-	/**
163
-	 * Stocker en cache si possible
164
-	 *
165
-	 * @param string $cle
166
-	 * @param int $ttl
167
-	 * @param null|mixed $valeur
168
-	 * @return bool
169
-	 */
170
-	protected function cache_set($cle, $ttl, $valeur = null) {
171
-		if (!$cle) {
172
-			return;
173
-		}
174
-		if (is_null($valeur)) {
175
-			$valeur = $this->tableau;
176
-		}
177
-		# utiliser memoization si dispo
178
-		if (!function_exists('cache_set')) {
179
-			return;
180
-		}
181
-
182
-		return cache_set(
183
-			$cle,
184
-			[
185
-				'data' => $valeur,
186
-				'time' => time(),
187
-				'ttl' => $ttl
188
-			],
189
-			3600 + $ttl
190
-		);
191
-		# conserver le cache 1h de plus que la validite demandee,
192
-		# pour le cas ou le serveur distant ne reponde plus
193
-	}
194
-
195
-	/**
196
-	 * Aller chercher les données de la boucle DATA
197
-	 *
198
-	 * @throws Exception
199
-	 * @param array $command
200
-	 * @return void
201
-	 */
202
-	protected function select($command) {
203
-
204
-		// l'iterateur DATA peut etre appele en passant (data:type)
205
-		// le type se retrouve dans la commande 'from'
206
-		// dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
207
-		if (isset($this->command['from'][0])) {
208
-			if (isset($this->command['source']) and is_array($this->command['source'])) {
209
-				array_unshift($this->command['source'], $this->command['sourcemode']);
210
-			}
211
-			$this->command['sourcemode'] = $this->command['from'][0];
212
-		}
213
-
214
-		// cherchons differents moyens de creer le tableau de donnees
215
-		// les commandes connues pour l'iterateur DATA
216
-		// sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
217
-
218
-		// {source format, [URL], [arg2]...}
219
-		if (
220
-			isset($this->command['source'])
221
-			and isset($this->command['sourcemode'])
222
-		) {
223
-			$this->select_source();
224
-		}
225
-
226
-		// Critere {liste X1, X2, X3}
227
-		if (isset($this->command['liste'])) {
228
-			$this->select_liste();
229
-		}
230
-		if (isset($this->command['enum'])) {
231
-			$this->select_enum();
232
-		}
233
-
234
-		// Si a ce stade on n'a pas de table, il y a un bug
235
-		if (!is_array($this->tableau)) {
236
-			$this->err = true;
237
-			spip_log('erreur datasource ' . var_export($command, true));
238
-		}
239
-
240
-		// {datapath query.results}
241
-		// extraire le chemin "query.results" du tableau de donnees
242
-		if (
243
-			!$this->err
244
-			and isset($this->command['datapath'])
245
-			and is_array($this->command['datapath'])
246
-		) {
247
-			$this->select_datapath();
248
-		}
249
-
250
-		// tri {par x}
251
-		if ($this->command['orderby']) {
252
-			$this->select_orderby();
253
-		}
254
-
255
-		// grouper les resultats {fusion /x/y/z} ;
256
-		if ($this->command['groupby']) {
257
-			$this->select_groupby();
258
-		}
259
-
260
-		$this->rewind();
261
-		#var_dump($this->tableau);
262
-	}
263
-
264
-
265
-	/**
266
-	 * Aller chercher les donnees de la boucle DATA
267
-	 * depuis une source
268
-	 * {source format, [URL], [arg2]...}
269
-	 */
270
-	protected function select_source() {
271
-		# un peu crado : avant de charger le cache il faut charger
272
-		# les class indispensables, sinon PHP ne saura pas gerer
273
-		# l'objet en cache ; cf plugins/icalendar
274
-		# perf : pas de fonction table_to_array ! (table est deja un array)
275
-		if (
276
-			isset($this->command['sourcemode'])
277
-			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
278
-		) {
279
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
280
-		}
281
-
282
-		# le premier argument peut etre un array, une URL etc.
283
-		$src = $this->command['source'][0];
284
-
285
-		# avons-nous un cache dispo ?
286
-		$cle = null;
287
-		if (is_string($src)) {
288
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
289
-		}
290
-
291
-		$cache = $this->cache_get($cle);
292
-		if (isset($this->command['datacache'])) {
293
-			$ttl = intval($this->command['datacache']);
294
-		}
295
-		if (
296
-			$cache
297
-			and ($cache['time'] + ($ttl ?? $cache['ttl'])
298
-				> time())
299
-			and !(_request('var_mode') === 'recalcul'
300
-				and include_spip('inc/autoriser')
301
-				and autoriser('recalcul')
302
-			)
303
-		) {
304
-			$this->tableau = $cache['data'];
305
-		} else {
306
-			try {
307
-				if (
308
-					isset($this->command['sourcemode'])
309
-					and in_array(
310
-						$this->command['sourcemode'],
311
-						['table', 'array', 'tableau']
312
-					)
313
-				) {
314
-					if (
315
-						is_array($a = $src)
316
-						or (is_string($a)
317
-							and $a = str_replace('&quot;', '"', $a) # fragile!
318
-							and is_array($a = @unserialize($a)))
319
-					) {
320
-						$this->tableau = $a;
321
-					}
322
-				} else {
323
-					$data = $src;
324
-					if (is_string($src)) {
325
-						if (tester_url_absolue($src)) {
326
-							include_spip('inc/distant');
327
-							$data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
328
-							$data = $data['page'] ?? '';
329
-							if (!$data) {
330
-								throw new Exception('404');
331
-							}
332
-							if (!isset($ttl)) {
333
-								$ttl = 24 * 3600;
334
-							}
335
-						} elseif (@is_dir($src)) {
336
-							$data = $src;
337
-						} elseif (@is_readable($src) && @is_file($src)) {
338
-							$data = spip_file_get_contents($src);
339
-						}
340
-						if (!isset($ttl)) {
341
-							$ttl = 10;
342
-						}
343
-					}
344
-
345
-					if (
346
-						!$this->err
347
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
348
-					) {
349
-						$args = $this->command['source'];
350
-						$args[0] = $data;
351
-						if (is_array($a = $data_to_array(...$args))) {
352
-							$this->tableau = $a;
353
-						}
354
-					}
355
-				}
356
-
357
-				if (!is_array($this->tableau)) {
358
-					$this->err = true;
359
-				}
360
-
361
-				if (!$this->err and isset($ttl) and $ttl > 0) {
362
-					$this->cache_set($cle, $ttl);
363
-				}
364
-			} catch (Exception $e) {
365
-				$e = $e->getMessage();
366
-				$err = sprintf(
367
-					"[%s, %s] $e",
368
-					$src,
369
-					$this->command['sourcemode']
370
-				);
371
-				erreur_squelette([$err, []]);
372
-				$this->err = true;
373
-			}
374
-		}
375
-
376
-		# en cas d'erreur, utiliser le cache si encore dispo
377
-		if (
378
-			$this->err
379
-			and $cache
380
-		) {
381
-			$this->tableau = $cache['data'];
382
-			$this->err = false;
383
-		}
384
-	}
385
-
386
-
387
-	/**
388
-	 * Retourne un tableau donne depuis un critère liste
389
-	 *
390
-	 * Critère `{liste X1, X2, X3}`
391
-	 *
392
-	 * @see critere_DATA_liste_dist()
393
-	 *
394
-	 **/
395
-	protected function select_liste() {
396
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
397
-		if (!isset($this->command['liste'][1])) {
398
-			if (!is_array($this->command['liste'][0])) {
399
-				$this->command['liste'] = explode(',', $this->command['liste'][0]);
400
-			} else {
401
-				$this->command['liste'] = $this->command['liste'][0];
402
-			}
403
-		}
404
-		$this->tableau = $this->command['liste'];
405
-	}
406
-
407
-	/**
408
-	 * Retourne un tableau donne depuis un critere liste
409
-	 * Critere {enum Xmin, Xmax}
410
-	 *
411
-	 **/
412
-	protected function select_enum() {
413
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
414
-		if (!isset($this->command['enum'][1])) {
415
-			if (!is_array($this->command['enum'][0])) {
416
-				$this->command['enum'] = explode(',', $this->command['enum'][0]);
417
-			} else {
418
-				$this->command['enum'] = $this->command['enum'][0];
419
-			}
420
-		}
421
-		if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
422
-			$enum = range(
423
-				array_shift($this->command['enum']),
424
-				array_shift($this->command['enum']),
425
-				array_shift($this->command['enum'])
426
-			);
427
-		} else {
428
-			$enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
429
-		}
430
-		$this->tableau = $enum;
431
-	}
432
-
433
-
434
-	/**
435
-	 * extraire le chemin "query.results" du tableau de donnees
436
-	 * {datapath query.results}
437
-	 *
438
-	 **/
439
-	protected function select_datapath() {
440
-		$base = reset($this->command['datapath']);
441
-		if (strlen($base = ltrim(trim($base), '/'))) {
442
-			$this->tableau = table_valeur($this->tableau, $base);
443
-			if (!is_array($this->tableau)) {
444
-				$this->tableau = [];
445
-				$this->err = true;
446
-				spip_log("datapath '$base' absent");
447
-			}
448
-		}
449
-	}
450
-
451
-	/**
452
-	 * Ordonner les resultats
453
-	 * {par x}
454
-	 *
455
-	 **/
456
-	protected function select_orderby() {
457
-		$sortfunc = '';
458
-		$aleas = 0;
459
-		foreach ($this->command['orderby'] as $tri) {
460
-			// virer le / initial pour les criteres de la forme {par /xx}
461
-			if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
462
-				$r = array_pad($r, 3, null);
463
-
464
-				// tri par cle
465
-				if ($r[1] == 'cle') {
466
-					if (isset($r[2]) and $r[2]) {
467
-						krsort($this->tableau);
468
-					} else {
469
-						ksort($this->tableau);
470
-					}
471
-				} # {par hasard}
472
-				else {
473
-					if ($r[1] == 'hasard') {
474
-						$k = array_keys($this->tableau);
475
-						shuffle($k);
476
-						$v = [];
477
-						foreach ($k as $cle) {
478
-							$v[$cle] = $this->tableau[$cle];
479
-						}
480
-						$this->tableau = $v;
481
-					} else {
482
-						# {par valeur}
483
-						if ($r[1] == 'valeur') {
484
-							$tv = '%s';
485
-						} # {par valeur/xx/yy} ??
486
-						else {
487
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
488
-						}
489
-						$sortfunc .= '
65
+    /**
66
+     * tableau de donnees
67
+     *
68
+     * @var array
69
+     */
70
+    protected $tableau = [];
71
+
72
+    /**
73
+     * Conditions de filtrage
74
+     * ie criteres de selection
75
+     *
76
+     * @var array
77
+     */
78
+    protected $filtre = [];
79
+
80
+
81
+    /**
82
+     * Cle courante
83
+     *
84
+     * @var null
85
+     */
86
+    protected $cle = null;
87
+
88
+    /**
89
+     * Valeur courante
90
+     *
91
+     * @var null
92
+     */
93
+    protected $valeur = null;
94
+
95
+    /**
96
+     * Erreur presente ?
97
+     *
98
+     * @var bool
99
+     **/
100
+    public $err = false;
101
+
102
+    /**
103
+     * Calcul du total des elements
104
+     *
105
+     * @var int|null
106
+     **/
107
+    public $total = null;
108
+
109
+    /**
110
+     * Constructeur
111
+     *
112
+     * @param  $command
113
+     * @param array $info
114
+     */
115
+    public function __construct($command, $info = []) {
116
+        $this->type = 'DATA';
117
+        $this->command = $command;
118
+        $this->info = $info;
119
+
120
+        $this->select($command);
121
+    }
122
+
123
+    /**
124
+     * Revenir au depart
125
+     *
126
+     * @return void
127
+     */
128
+    public function rewind() : void {
129
+        reset($this->tableau);
130
+        $this->cle = array_key_first($this->tableau);
131
+        $this->valeur = current($this->tableau);
132
+        next($this->tableau);
133
+    }
134
+
135
+    /**
136
+     * Déclarer les critères exceptions
137
+     *
138
+     * @return array
139
+     */
140
+    public function exception_des_criteres() {
141
+        return ['tableau'];
142
+    }
143
+
144
+    /**
145
+     * Récupérer depuis le cache si possible
146
+     *
147
+     * @param string $cle
148
+     * @return mixed
149
+     */
150
+    protected function cache_get($cle) {
151
+        if (!$cle) {
152
+            return;
153
+        }
154
+        # utiliser memoization si dispo
155
+        if (!function_exists('cache_get')) {
156
+            return;
157
+        }
158
+
159
+        return cache_get($cle);
160
+    }
161
+
162
+    /**
163
+     * Stocker en cache si possible
164
+     *
165
+     * @param string $cle
166
+     * @param int $ttl
167
+     * @param null|mixed $valeur
168
+     * @return bool
169
+     */
170
+    protected function cache_set($cle, $ttl, $valeur = null) {
171
+        if (!$cle) {
172
+            return;
173
+        }
174
+        if (is_null($valeur)) {
175
+            $valeur = $this->tableau;
176
+        }
177
+        # utiliser memoization si dispo
178
+        if (!function_exists('cache_set')) {
179
+            return;
180
+        }
181
+
182
+        return cache_set(
183
+            $cle,
184
+            [
185
+                'data' => $valeur,
186
+                'time' => time(),
187
+                'ttl' => $ttl
188
+            ],
189
+            3600 + $ttl
190
+        );
191
+        # conserver le cache 1h de plus que la validite demandee,
192
+        # pour le cas ou le serveur distant ne reponde plus
193
+    }
194
+
195
+    /**
196
+     * Aller chercher les données de la boucle DATA
197
+     *
198
+     * @throws Exception
199
+     * @param array $command
200
+     * @return void
201
+     */
202
+    protected function select($command) {
203
+
204
+        // l'iterateur DATA peut etre appele en passant (data:type)
205
+        // le type se retrouve dans la commande 'from'
206
+        // dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
207
+        if (isset($this->command['from'][0])) {
208
+            if (isset($this->command['source']) and is_array($this->command['source'])) {
209
+                array_unshift($this->command['source'], $this->command['sourcemode']);
210
+            }
211
+            $this->command['sourcemode'] = $this->command['from'][0];
212
+        }
213
+
214
+        // cherchons differents moyens de creer le tableau de donnees
215
+        // les commandes connues pour l'iterateur DATA
216
+        // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
217
+
218
+        // {source format, [URL], [arg2]...}
219
+        if (
220
+            isset($this->command['source'])
221
+            and isset($this->command['sourcemode'])
222
+        ) {
223
+            $this->select_source();
224
+        }
225
+
226
+        // Critere {liste X1, X2, X3}
227
+        if (isset($this->command['liste'])) {
228
+            $this->select_liste();
229
+        }
230
+        if (isset($this->command['enum'])) {
231
+            $this->select_enum();
232
+        }
233
+
234
+        // Si a ce stade on n'a pas de table, il y a un bug
235
+        if (!is_array($this->tableau)) {
236
+            $this->err = true;
237
+            spip_log('erreur datasource ' . var_export($command, true));
238
+        }
239
+
240
+        // {datapath query.results}
241
+        // extraire le chemin "query.results" du tableau de donnees
242
+        if (
243
+            !$this->err
244
+            and isset($this->command['datapath'])
245
+            and is_array($this->command['datapath'])
246
+        ) {
247
+            $this->select_datapath();
248
+        }
249
+
250
+        // tri {par x}
251
+        if ($this->command['orderby']) {
252
+            $this->select_orderby();
253
+        }
254
+
255
+        // grouper les resultats {fusion /x/y/z} ;
256
+        if ($this->command['groupby']) {
257
+            $this->select_groupby();
258
+        }
259
+
260
+        $this->rewind();
261
+        #var_dump($this->tableau);
262
+    }
263
+
264
+
265
+    /**
266
+     * Aller chercher les donnees de la boucle DATA
267
+     * depuis une source
268
+     * {source format, [URL], [arg2]...}
269
+     */
270
+    protected function select_source() {
271
+        # un peu crado : avant de charger le cache il faut charger
272
+        # les class indispensables, sinon PHP ne saura pas gerer
273
+        # l'objet en cache ; cf plugins/icalendar
274
+        # perf : pas de fonction table_to_array ! (table est deja un array)
275
+        if (
276
+            isset($this->command['sourcemode'])
277
+            and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
278
+        ) {
279
+            charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
280
+        }
281
+
282
+        # le premier argument peut etre un array, une URL etc.
283
+        $src = $this->command['source'][0];
284
+
285
+        # avons-nous un cache dispo ?
286
+        $cle = null;
287
+        if (is_string($src)) {
288
+            $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
289
+        }
290
+
291
+        $cache = $this->cache_get($cle);
292
+        if (isset($this->command['datacache'])) {
293
+            $ttl = intval($this->command['datacache']);
294
+        }
295
+        if (
296
+            $cache
297
+            and ($cache['time'] + ($ttl ?? $cache['ttl'])
298
+                > time())
299
+            and !(_request('var_mode') === 'recalcul'
300
+                and include_spip('inc/autoriser')
301
+                and autoriser('recalcul')
302
+            )
303
+        ) {
304
+            $this->tableau = $cache['data'];
305
+        } else {
306
+            try {
307
+                if (
308
+                    isset($this->command['sourcemode'])
309
+                    and in_array(
310
+                        $this->command['sourcemode'],
311
+                        ['table', 'array', 'tableau']
312
+                    )
313
+                ) {
314
+                    if (
315
+                        is_array($a = $src)
316
+                        or (is_string($a)
317
+                            and $a = str_replace('&quot;', '"', $a) # fragile!
318
+                            and is_array($a = @unserialize($a)))
319
+                    ) {
320
+                        $this->tableau = $a;
321
+                    }
322
+                } else {
323
+                    $data = $src;
324
+                    if (is_string($src)) {
325
+                        if (tester_url_absolue($src)) {
326
+                            include_spip('inc/distant');
327
+                            $data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
328
+                            $data = $data['page'] ?? '';
329
+                            if (!$data) {
330
+                                throw new Exception('404');
331
+                            }
332
+                            if (!isset($ttl)) {
333
+                                $ttl = 24 * 3600;
334
+                            }
335
+                        } elseif (@is_dir($src)) {
336
+                            $data = $src;
337
+                        } elseif (@is_readable($src) && @is_file($src)) {
338
+                            $data = spip_file_get_contents($src);
339
+                        }
340
+                        if (!isset($ttl)) {
341
+                            $ttl = 10;
342
+                        }
343
+                    }
344
+
345
+                    if (
346
+                        !$this->err
347
+                        and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
348
+                    ) {
349
+                        $args = $this->command['source'];
350
+                        $args[0] = $data;
351
+                        if (is_array($a = $data_to_array(...$args))) {
352
+                            $this->tableau = $a;
353
+                        }
354
+                    }
355
+                }
356
+
357
+                if (!is_array($this->tableau)) {
358
+                    $this->err = true;
359
+                }
360
+
361
+                if (!$this->err and isset($ttl) and $ttl > 0) {
362
+                    $this->cache_set($cle, $ttl);
363
+                }
364
+            } catch (Exception $e) {
365
+                $e = $e->getMessage();
366
+                $err = sprintf(
367
+                    "[%s, %s] $e",
368
+                    $src,
369
+                    $this->command['sourcemode']
370
+                );
371
+                erreur_squelette([$err, []]);
372
+                $this->err = true;
373
+            }
374
+        }
375
+
376
+        # en cas d'erreur, utiliser le cache si encore dispo
377
+        if (
378
+            $this->err
379
+            and $cache
380
+        ) {
381
+            $this->tableau = $cache['data'];
382
+            $this->err = false;
383
+        }
384
+    }
385
+
386
+
387
+    /**
388
+     * Retourne un tableau donne depuis un critère liste
389
+     *
390
+     * Critère `{liste X1, X2, X3}`
391
+     *
392
+     * @see critere_DATA_liste_dist()
393
+     *
394
+     **/
395
+    protected function select_liste() {
396
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
397
+        if (!isset($this->command['liste'][1])) {
398
+            if (!is_array($this->command['liste'][0])) {
399
+                $this->command['liste'] = explode(',', $this->command['liste'][0]);
400
+            } else {
401
+                $this->command['liste'] = $this->command['liste'][0];
402
+            }
403
+        }
404
+        $this->tableau = $this->command['liste'];
405
+    }
406
+
407
+    /**
408
+     * Retourne un tableau donne depuis un critere liste
409
+     * Critere {enum Xmin, Xmax}
410
+     *
411
+     **/
412
+    protected function select_enum() {
413
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
414
+        if (!isset($this->command['enum'][1])) {
415
+            if (!is_array($this->command['enum'][0])) {
416
+                $this->command['enum'] = explode(',', $this->command['enum'][0]);
417
+            } else {
418
+                $this->command['enum'] = $this->command['enum'][0];
419
+            }
420
+        }
421
+        if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
422
+            $enum = range(
423
+                array_shift($this->command['enum']),
424
+                array_shift($this->command['enum']),
425
+                array_shift($this->command['enum'])
426
+            );
427
+        } else {
428
+            $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
429
+        }
430
+        $this->tableau = $enum;
431
+    }
432
+
433
+
434
+    /**
435
+     * extraire le chemin "query.results" du tableau de donnees
436
+     * {datapath query.results}
437
+     *
438
+     **/
439
+    protected function select_datapath() {
440
+        $base = reset($this->command['datapath']);
441
+        if (strlen($base = ltrim(trim($base), '/'))) {
442
+            $this->tableau = table_valeur($this->tableau, $base);
443
+            if (!is_array($this->tableau)) {
444
+                $this->tableau = [];
445
+                $this->err = true;
446
+                spip_log("datapath '$base' absent");
447
+            }
448
+        }
449
+    }
450
+
451
+    /**
452
+     * Ordonner les resultats
453
+     * {par x}
454
+     *
455
+     **/
456
+    protected function select_orderby() {
457
+        $sortfunc = '';
458
+        $aleas = 0;
459
+        foreach ($this->command['orderby'] as $tri) {
460
+            // virer le / initial pour les criteres de la forme {par /xx}
461
+            if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
462
+                $r = array_pad($r, 3, null);
463
+
464
+                // tri par cle
465
+                if ($r[1] == 'cle') {
466
+                    if (isset($r[2]) and $r[2]) {
467
+                        krsort($this->tableau);
468
+                    } else {
469
+                        ksort($this->tableau);
470
+                    }
471
+                } # {par hasard}
472
+                else {
473
+                    if ($r[1] == 'hasard') {
474
+                        $k = array_keys($this->tableau);
475
+                        shuffle($k);
476
+                        $v = [];
477
+                        foreach ($k as $cle) {
478
+                            $v[$cle] = $this->tableau[$cle];
479
+                        }
480
+                        $this->tableau = $v;
481
+                    } else {
482
+                        # {par valeur}
483
+                        if ($r[1] == 'valeur') {
484
+                            $tv = '%s';
485
+                        } # {par valeur/xx/yy} ??
486
+                        else {
487
+                            $tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
488
+                        }
489
+                        $sortfunc .= '
490 490
 					$a = ' . sprintf($tv, '$aa') . ';
491 491
 					$b = ' . sprintf($tv, '$bb') . ';
492 492
 					if ($a <> $b)
493 493
 						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
494
-					}
495
-				}
496
-			}
497
-		}
498
-
499
-		if ($sortfunc) {
500
-			$sortfunc .= "\n return 0;";
501
-			uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
502
-		}
503
-	}
504
-
505
-
506
-	/**
507
-	 * Grouper les resultats
508
-	 * {fusion /x/y/z}
509
-	 *
510
-	 **/
511
-	protected function select_groupby() {
512
-		// virer le / initial pour les criteres de la forme {fusion /xx}
513
-		if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
514
-			$vu = [];
515
-			foreach ($this->tableau as $k => $v) {
516
-				$val = table_valeur($v, $fusion);
517
-				if (isset($vu[$val])) {
518
-					unset($this->tableau[$k]);
519
-				} else {
520
-					$vu[$val] = true;
521
-				}
522
-			}
523
-		}
524
-	}
525
-
526
-
527
-	/**
528
-	 * L'iterateur est-il encore valide ?
529
-	 *
530
-	 * @return bool
531
-	 */
532
-	public function valid(): bool {
533
-		return !is_null($this->cle);
534
-	}
535
-
536
-	/**
537
-	 * Retourner la valeur
538
-	 *
539
-	 * @return mixed
540
-	 */
541
-	#[\ReturnTypeWillChange]
542
-	public function current() {
543
-		return $this->valeur;
544
-	}
545
-
546
-	/**
547
-	 * Retourner la cle
548
-	 *
549
-	 * @return mixed
550
-	 */
551
-	#[\ReturnTypeWillChange]
552
-	public function key() {
553
-		return $this->cle;
554
-	}
555
-
556
-	/**
557
-	 * Passer a la valeur suivante
558
-	 *
559
-	 * @return void
560
-	 */
561
-	public function next() : void {
562
-		if ($this->valid()) {
563
-			$this->cle = key($this->tableau);
564
-			$this->valeur = current($this->tableau);
565
-			next($this->tableau);
566
-		}
567
-	}
568
-
569
-	/**
570
-	 * Compter le nombre total de resultats
571
-	 *
572
-	 * @return int
573
-	 */
574
-	public function count() {
575
-		if (is_null($this->total)) {
576
-			$this->total = count($this->tableau);
577
-		}
578
-
579
-		return $this->total;
580
-	}
494
+                    }
495
+                }
496
+            }
497
+        }
498
+
499
+        if ($sortfunc) {
500
+            $sortfunc .= "\n return 0;";
501
+            uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
502
+        }
503
+    }
504
+
505
+
506
+    /**
507
+     * Grouper les resultats
508
+     * {fusion /x/y/z}
509
+     *
510
+     **/
511
+    protected function select_groupby() {
512
+        // virer le / initial pour les criteres de la forme {fusion /xx}
513
+        if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
514
+            $vu = [];
515
+            foreach ($this->tableau as $k => $v) {
516
+                $val = table_valeur($v, $fusion);
517
+                if (isset($vu[$val])) {
518
+                    unset($this->tableau[$k]);
519
+                } else {
520
+                    $vu[$val] = true;
521
+                }
522
+            }
523
+        }
524
+    }
525
+
526
+
527
+    /**
528
+     * L'iterateur est-il encore valide ?
529
+     *
530
+     * @return bool
531
+     */
532
+    public function valid(): bool {
533
+        return !is_null($this->cle);
534
+    }
535
+
536
+    /**
537
+     * Retourner la valeur
538
+     *
539
+     * @return mixed
540
+     */
541
+    #[\ReturnTypeWillChange]
542
+    public function current() {
543
+        return $this->valeur;
544
+    }
545
+
546
+    /**
547
+     * Retourner la cle
548
+     *
549
+     * @return mixed
550
+     */
551
+    #[\ReturnTypeWillChange]
552
+    public function key() {
553
+        return $this->cle;
554
+    }
555
+
556
+    /**
557
+     * Passer a la valeur suivante
558
+     *
559
+     * @return void
560
+     */
561
+    public function next() : void {
562
+        if ($this->valid()) {
563
+            $this->cle = key($this->tableau);
564
+            $this->valeur = current($this->tableau);
565
+            next($this->tableau);
566
+        }
567
+    }
568
+
569
+    /**
570
+     * Compter le nombre total de resultats
571
+     *
572
+     * @return int
573
+     */
574
+    public function count() {
575
+        if (is_null($this->total)) {
576
+            $this->total = count($this->tableau);
577
+        }
578
+
579
+        return $this->total;
580
+    }
581 581
 }
582 582
 
583 583
 /*
@@ -591,7 +591,7 @@  discard block
 block discarded – undo
591 591
  * @return array
592 592
  */
593 593
 function inc_file_to_array_dist($data) {
594
-	return preg_split('/\r?\n/', $data);
594
+    return preg_split('/\r?\n/', $data);
595 595
 }
596 596
 
597 597
 /**
@@ -600,9 +600,9 @@  discard block
 block discarded – undo
600 600
  * @return array
601 601
  */
602 602
 function inc_plugins_to_array_dist() {
603
-	include_spip('inc/plugin');
603
+    include_spip('inc/plugin');
604 604
 
605
-	return liste_chemin_plugin_actifs();
605
+    return liste_chemin_plugin_actifs();
606 606
 }
607 607
 
608 608
 /**
@@ -612,7 +612,7 @@  discard block
 block discarded – undo
612 612
  * @return array
613 613
  */
614 614
 function inc_xml_to_array_dist($data) {
615
-	return @XMLObjectToArray(new SimpleXmlIterator($data));
615
+    return @XMLObjectToArray(new SimpleXmlIterator($data));
616 616
 }
617 617
 
618 618
 /**
@@ -624,14 +624,14 @@  discard block
 block discarded – undo
624 624
  *
625 625
  */
626 626
 function inc_object_to_array($object) {
627
-	if (!is_object($object) && !is_array($object)) {
628
-		return $object;
629
-	}
630
-	if (is_object($object)) {
631
-		$object = get_object_vars($object);
632
-	}
633
-
634
-	return array_map('inc_object_to_array', $object);
627
+    if (!is_object($object) && !is_array($object)) {
628
+        return $object;
629
+    }
630
+    if (is_object($object)) {
631
+        $object = get_object_vars($object);
632
+    }
633
+
634
+    return array_map('inc_object_to_array', $object);
635 635
 }
636 636
 
637 637
 /**
@@ -641,20 +641,20 @@  discard block
 block discarded – undo
641 641
  * @return array|bool
642 642
  */
643 643
 function inc_sql_to_array_dist($data) {
644
-	# sortir le connecteur de $data
645
-	preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
646
-	$serveur = (string)$v[1];
647
-	$req = trim($v[2]);
648
-	if ($s = sql_query($req, $serveur)) {
649
-		$r = [];
650
-		while ($t = sql_fetch($s)) {
651
-			$r[] = $t;
652
-		}
653
-
654
-		return $r;
655
-	}
656
-
657
-	return false;
644
+    # sortir le connecteur de $data
645
+    preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
646
+    $serveur = (string)$v[1];
647
+    $req = trim($v[2]);
648
+    if ($s = sql_query($req, $serveur)) {
649
+        $r = [];
650
+        while ($t = sql_fetch($s)) {
651
+            $r[] = $t;
652
+        }
653
+
654
+        return $r;
655
+    }
656
+
657
+    return false;
658 658
 }
659 659
 
660 660
 /**
@@ -664,13 +664,13 @@  discard block
 block discarded – undo
664 664
  * @return array|bool
665 665
  */
666 666
 function inc_json_to_array_dist($data) {
667
-	try {
668
-		$json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
669
-	} catch (JsonException $e) {
670
-		$json = null;
671
-		spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
672
-	}
673
-	return is_array($json) ? (array) $json : [];
667
+    try {
668
+        $json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
669
+    } catch (JsonException $e) {
670
+        $json = null;
671
+        spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
672
+    }
673
+    return is_array($json) ? (array) $json : [];
674 674
 }
675 675
 
676 676
 /**
@@ -680,30 +680,30 @@  discard block
 block discarded – undo
680 680
  * @return array|bool
681 681
  */
682 682
 function inc_csv_to_array_dist($data) {
683
-	include_spip('inc/csv');
684
-	[$entete, $csv] = analyse_csv($data);
685
-	array_unshift($csv, $entete);
686
-
687
-	include_spip('inc/charsets');
688
-	$i = 1;
689
-	foreach ($entete as $k => $v) {
690
-		if (trim($v) == '') {
691
-			$v = 'col' . $i;
692
-		} // reperer des eventuelles cases vides
693
-		if (is_numeric($v) and $v < 0) {
694
-			$v = '__' . $v;
695
-		} // ne pas risquer d'ecraser une cle numerique
696
-		if (is_numeric($v)) {
697
-			$v = '_' . $v;
698
-		} // ne pas risquer d'ecraser une cle numerique
699
-		$v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
700
-		foreach ($csv as &$item) {
701
-			$item[$v] = &$item[$k];
702
-		}
703
-		$i++;
704
-	}
705
-
706
-	return $csv;
683
+    include_spip('inc/csv');
684
+    [$entete, $csv] = analyse_csv($data);
685
+    array_unshift($csv, $entete);
686
+
687
+    include_spip('inc/charsets');
688
+    $i = 1;
689
+    foreach ($entete as $k => $v) {
690
+        if (trim($v) == '') {
691
+            $v = 'col' . $i;
692
+        } // reperer des eventuelles cases vides
693
+        if (is_numeric($v) and $v < 0) {
694
+            $v = '__' . $v;
695
+        } // ne pas risquer d'ecraser une cle numerique
696
+        if (is_numeric($v)) {
697
+            $v = '_' . $v;
698
+        } // ne pas risquer d'ecraser une cle numerique
699
+        $v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
700
+        foreach ($csv as &$item) {
701
+            $item[$v] = &$item[$k];
702
+        }
703
+        $i++;
704
+    }
705
+
706
+    return $csv;
707 707
 }
708 708
 
709 709
 /**
@@ -713,13 +713,13 @@  discard block
 block discarded – undo
713 713
  * @return array|bool
714 714
  */
715 715
 function inc_rss_to_array_dist($data) {
716
-	$tableau = null;
717
-	include_spip('inc/syndic');
718
-	if (is_array($rss = analyser_backend($data))) {
719
-		$tableau = $rss;
720
-	}
716
+    $tableau = null;
717
+    include_spip('inc/syndic');
718
+    if (is_array($rss = analyser_backend($data))) {
719
+        $tableau = $rss;
720
+    }
721 721
 
722
-	return $tableau;
722
+    return $tableau;
723 723
 }
724 724
 
725 725
 /**
@@ -729,9 +729,9 @@  discard block
 block discarded – undo
729 729
  * @return array|bool
730 730
  */
731 731
 function inc_atom_to_array_dist($data) {
732
-	$rss_to_array = charger_fonction('rss_to_array', 'inc');
732
+    $rss_to_array = charger_fonction('rss_to_array', 'inc');
733 733
 
734
-	return $rss_to_array($data);
734
+    return $rss_to_array($data);
735 735
 }
736 736
 
737 737
 /**
@@ -742,12 +742,12 @@  discard block
 block discarded – undo
742 742
  * @return array|bool
743 743
  */
744 744
 function inc_glob_to_array_dist($data) {
745
-	$a = glob(
746
-		$data,
747
-		GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
748
-	);
745
+    $a = glob(
746
+        $data,
747
+        GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
748
+    );
749 749
 
750
-	return $a ?: [];
750
+    return $a ?: [];
751 751
 }
752 752
 
753 753
 /**
@@ -758,14 +758,14 @@  discard block
 block discarded – undo
758 758
  * @throws Exception
759 759
  */
760 760
 function inc_yaml_to_array_dist($data) {
761
-	include_spip('inc/yaml-mini');
762
-	if (!function_exists('yaml_decode')) {
763
-		throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
761
+    include_spip('inc/yaml-mini');
762
+    if (!function_exists('yaml_decode')) {
763
+        throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
764 764
 
765
-		return false;
766
-	}
765
+        return false;
766
+    }
767 767
 
768
-	return yaml_decode($data);
768
+    return yaml_decode($data);
769 769
 }
770 770
 
771 771
 
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
  * @return array|bool
781 781
  */
782 782
 function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) {
783
-	return (array)preg_files($dir, $regexp, $limit);
783
+    return (array)preg_files($dir, $regexp, $limit);
784 784
 }
785 785
 
786 786
 /**
@@ -792,23 +792,23 @@  discard block
 block discarded – undo
792 792
  * @return array|bool
793 793
  */
794 794
 function inc_ls_to_array_dist($data) {
795
-	$glob_to_array = charger_fonction('glob_to_array', 'inc');
796
-	$a = $glob_to_array($data);
797
-	foreach ($a as &$v) {
798
-		$b = (array)@stat($v);
799
-		foreach ($b as $k => $ignore) {
800
-			if (is_numeric($k)) {
801
-				unset($b[$k]);
802
-			}
803
-		}
804
-		$b['file'] = preg_replace('`/$`', '', $v) ;
805
-		$v = array_merge(
806
-			pathinfo($v),
807
-			$b
808
-		);
809
-	}
810
-
811
-	return $a;
795
+    $glob_to_array = charger_fonction('glob_to_array', 'inc');
796
+    $a = $glob_to_array($data);
797
+    foreach ($a as &$v) {
798
+        $b = (array)@stat($v);
799
+        foreach ($b as $k => $ignore) {
800
+            if (is_numeric($k)) {
801
+                unset($b[$k]);
802
+            }
803
+        }
804
+        $b['file'] = preg_replace('`/$`', '', $v) ;
805
+        $v = array_merge(
806
+            pathinfo($v),
807
+            $b
808
+        );
809
+    }
810
+
811
+    return $a;
812 812
 }
813 813
 
814 814
 /**
@@ -818,25 +818,25 @@  discard block
 block discarded – undo
818 818
  * @return array|bool
819 819
  */
820 820
 function XMLObjectToArray($object) {
821
-	$xml_array = [];
822
-	for ($object->rewind(); $object->valid(); $object->next()) {
823
-		if (array_key_exists($key = $object->key(), $xml_array)) {
824
-			$key .= '-' . uniqid();
825
-		}
826
-		$vars = get_object_vars($object->current());
827
-		if (isset($vars['@attributes'])) {
828
-			foreach ($vars['@attributes'] as $k => $v) {
829
-				$xml_array[$key][$k] = $v;
830
-			}
831
-		}
832
-		if ($object->hasChildren()) {
833
-			$xml_array[$key][] = XMLObjectToArray(
834
-				$object->current()
835
-			);
836
-		} else {
837
-			$xml_array[$key][] = strval($object->current());
838
-		}
839
-	}
840
-
841
-	return $xml_array;
821
+    $xml_array = [];
822
+    for ($object->rewind(); $object->valid(); $object->next()) {
823
+        if (array_key_exists($key = $object->key(), $xml_array)) {
824
+            $key .= '-' . uniqid();
825
+        }
826
+        $vars = get_object_vars($object->current());
827
+        if (isset($vars['@attributes'])) {
828
+            foreach ($vars['@attributes'] as $k => $v) {
829
+                $xml_array[$key][$k] = $v;
830
+            }
831
+        }
832
+        if ($object->hasChildren()) {
833
+            $xml_array[$key][] = XMLObjectToArray(
834
+                $object->current()
835
+            );
836
+        } else {
837
+            $xml_array[$key][] = strval($object->current());
838
+        }
839
+    }
840
+
841
+    return $xml_array;
842 842
 }
Please login to merge, or discard this patch.