Completed
Push — master ( cd5173...c1da76 )
by cam
15:58 queued 11s
created
ecrire/public/criteres.php 2 patches
Indentation   +1691 added lines, -1691 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,14 +43,14 @@  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 = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
+        'id_parent';
51 51
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
52
+    $c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 54
 }
55 55
 
56 56
 
@@ -67,15 +67,15 @@  discard block
 block discarded – undo
67 67
  * @return void
68 68
  **/
69 69
 function critere_exclus_dist($idb, &$boucles, $crit) {
70
-	$not = $crit->not;
71
-	$boucle = &$boucles[$idb];
72
-	$id = $boucle->primary;
73
-
74
-	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
-	}
77
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
70
+    $not = $crit->not;
71
+    $boucle = &$boucles[$idb];
72
+    $id = $boucle->primary;
73
+
74
+    if ($not or !$id) {
75
+        return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
+    }
77
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
+    $boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
79 79
 }
80 80
 
81 81
 
@@ -95,73 +95,73 @@  discard block
 block discarded – undo
95 95
  * @return void
96 96
  **/
97 97
 function critere_doublons_dist($idb, &$boucles, $crit) {
98
-	$boucle = &$boucles[$idb];
99
-	$primary = $boucle->primary;
100
-
101
-	// la table nécessite une clé primaire, non composée
102
-	if (!$primary or strpos($primary, ',')) {
103
-		return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
-	}
105
-
106
-	$not = ($crit->not ? '' : 'NOT');
107
-
108
-	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
110
-
111
-	// compléter le nom avec un nom précisé {doublons nom}
112
-	// on obtient $nom = "'article' . 'nom'"
113
-	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
-	}
116
-
117
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
-
121
-	// on crée un sql_in avec la clé primaire de la table
122
-	// et la collection des doublons déjà emmagasinés dans le tableau
123
-	// $doublons et son index, ici $nom
124
-
125
-	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
128
-	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
-
131
-	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
133
-
134
-	// nom du doublon "('article' . 'nom')]"
135
-	$fin_doub = "($nom)]";
136
-
137
-	// si on trouve un autre critère doublon,
138
-	// on fusionne pour avoir un seul IN, et on s'en va !
139
-	foreach ($boucle->where as $k => $w) {
140
-		if (strpos($w[0], $debut_doub) === 0) {
141
-			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
-			// fusionner l'initialisation (du hash) pour faire plus joli
144
-			$x = strpos($boucle->hash, $init_comment);
145
-			$len = strlen($init_comment);
146
-			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
-
149
-			return;
150
-		}
151
-	}
152
-
153
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
-
156
-	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
158
-
159
-
160
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
161
-	# mais elle fait planter une boucle a 2 critere doublons:
162
-	# {!doublons A}{doublons B}
163
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
-	#	if ($crit->not) $boucle->doublons = "";
98
+    $boucle = &$boucles[$idb];
99
+    $primary = $boucle->primary;
100
+
101
+    // la table nécessite une clé primaire, non composée
102
+    if (!$primary or strpos($primary, ',')) {
103
+        return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
+    }
105
+
106
+    $not = ($crit->not ? '' : 'NOT');
107
+
108
+    // le doublon s'applique sur un type de boucle (article)
109
+    $nom = "'" . $boucle->type_requete . "'";
110
+
111
+    // compléter le nom avec un nom précisé {doublons nom}
112
+    // on obtient $nom = "'article' . 'nom'"
113
+    if (isset($crit->param[0])) {
114
+        $nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
+    }
116
+
117
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
+
121
+    // on crée un sql_in avec la clé primaire de la table
122
+    // et la collection des doublons déjà emmagasinés dans le tableau
123
+    // $doublons et son index, ici $nom
124
+
125
+    // debut du code "sql_in('articles.id_article', "
126
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
128
+    // Attention : boucle->doublons désigne une variable qu'on affecte
129
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
+
131
+    // le debut complet du code des doublons
132
+    $debut_doub = $debut_in . $debut_doub;
133
+
134
+    // nom du doublon "('article' . 'nom')]"
135
+    $fin_doub = "($nom)]";
136
+
137
+    // si on trouve un autre critère doublon,
138
+    // on fusionne pour avoir un seul IN, et on s'en va !
139
+    foreach ($boucle->where as $k => $w) {
140
+        if (strpos($w[0], $debut_doub) === 0) {
141
+            // fusionner le sql_in (du where)
142
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
+            // fusionner l'initialisation (du hash) pour faire plus joli
144
+            $x = strpos($boucle->hash, $init_comment);
145
+            $len = strlen($init_comment);
146
+            $boucle->hash =
147
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
+
149
+            return;
150
+        }
151
+    }
152
+
153
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
+    $boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
+
156
+    // déclarer le doublon s'il n'existe pas encore
157
+    $boucle->hash .= $init_comment . $init_code;
158
+
159
+
160
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
161
+    # mais elle fait planter une boucle a 2 critere doublons:
162
+    # {!doublons A}{doublons B}
163
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
+    #	if ($crit->not) $boucle->doublons = "";
165 165
 }
166 166
 
167 167
 
@@ -182,14 +182,14 @@  discard block
 block discarded – undo
182 182
  * @return void
183 183
  **/
184 184
 function critere_lang_select_dist($idb, &$boucles, $crit) {
185
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
-		$param = 'oui';
187
-	}
188
-	if ($crit->not) {
189
-		$param = ($param == 'oui') ? 'non' : 'oui';
190
-	}
191
-	$boucle = &$boucles[$idb];
192
-	$boucle->lang_select = $param;
185
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
+        $param = 'oui';
187
+    }
188
+    if ($crit->not) {
189
+        $param = ($param == 'oui') ? 'non' : 'oui';
190
+    }
191
+    $boucle = &$boucles[$idb];
192
+    $boucle->lang_select = $param;
193 193
 }
194 194
 
195 195
 
@@ -211,18 +211,18 @@  discard block
 block discarded – undo
211 211
  * @return void
212 212
  **/
213 213
 function critere_debut_dist($idb, &$boucles, $crit) {
214
-	list($un, $deux) = $crit->param;
215
-	$un = $un[0]->texte;
216
-	$deux = $deux[0]->texte;
217
-	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
222
-			'"';
223
-	} else {
224
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
-	}
214
+    list($un, $deux) = $crit->param;
215
+    $un = $un[0]->texte;
216
+    $deux = $deux[0]->texte;
217
+    if ($deux) {
218
+        $boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
+            $un .
220
+            '"]) . ",' .
221
+            $deux .
222
+            '"';
223
+    } else {
224
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
+    }
226 226
 }
227 227
 
228 228
 
@@ -256,57 +256,57 @@  discard block
 block discarded – undo
256 256
  **/
257 257
 function critere_pagination_dist($idb, &$boucles, $crit) {
258 258
 
259
-	$boucle = &$boucles[$idb];
260
-	// definition de la taille de la page
261
-	$pas = !isset($crit->param[0][0]) ? "''"
262
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
263
-
264
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
266
-	} else {
267
-		$r = intval($r[2]);
268
-		$pas = strval($r ? $r : 10);
269
-	}
270
-
271
-	// Calcul du nommage de la pagination si il existe.
272
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
274
-	$type = "'$idb'";
275
-	// Calcul d'un nommage spécifique de la pagination si précisé.
276
-	// Syntaxe {pagination 20, nom}
277
-	if (isset($crit->param[0][1])) {
278
-		$type = calculer_liste(array($crit->param[0][1]), $idb, $boucles, $boucle->id_parent);
279
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
-	elseif (isset($crit->param[1][0])) {
281
-		$type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282
-	}
283
-
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
-	$boucle->modificateur['debut_nom'] = $type;
286
-	$partie =
287
-		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
-		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
292
-		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
294
-
295
-	$boucle->hash .= '
259
+    $boucle = &$boucles[$idb];
260
+    // definition de la taille de la page
261
+    $pas = !isset($crit->param[0][0]) ? "''"
262
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
263
+
264
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
266
+    } else {
267
+        $r = intval($r[2]);
268
+        $pas = strval($r ? $r : 10);
269
+    }
270
+
271
+    // Calcul du nommage de la pagination si il existe.
272
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
274
+    $type = "'$idb'";
275
+    // Calcul d'un nommage spécifique de la pagination si précisé.
276
+    // Syntaxe {pagination 20, nom}
277
+    if (isset($crit->param[0][1])) {
278
+        $type = calculer_liste(array($crit->param[0][1]), $idb, $boucles, $boucle->id_parent);
279
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
+    elseif (isset($crit->param[1][0])) {
281
+        $type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282
+    }
283
+
284
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
+    $boucle->modificateur['debut_nom'] = $type;
286
+    $partie =
287
+        // tester si le numero de page demande est de la forme '@yyy'
288
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
+        . "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
+        . "\t\t" . '$iter->seek(0);' . "\n"
292
+        . "\t}\n"
293
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
294
+
295
+    $boucle->hash .= '
296 296
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
297 297
 
298
-	$boucle->total_parties = $pas;
299
-	calculer_parties($boucles, $idb, $partie, 'p+');
300
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
-	// sauf si pas de primaire, ou si primaire composee
302
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
304
-	if ($boucle->primary
305
-		and !preg_match('/[,\s]/', $boucle->primary)
306
-		and !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
298
+    $boucle->total_parties = $pas;
299
+    calculer_parties($boucles, $idb, $partie, 'p+');
300
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
+    // sauf si pas de primaire, ou si primaire composee
302
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
303
+    $t = $boucle->id_table . '.' . $boucle->primary;
304
+    if ($boucle->primary
305
+        and !preg_match('/[,\s]/', $boucle->primary)
306
+        and !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
333
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		array(
397
-			"'OR'",
398
-			array(
399
-				"'AND'",
400
-				array("'='", "'$table.id_trad'", 0),
401
-				array("'='", "'$table.$prim'", $dprim)
402
-			),
403
-			array(
404
-				"'AND'",
405
-				array("'>'", "'$table.id_trad'", 0),
406
-				array("'='", "'$table.id_trad'", $arg)
407
-			)
408
-		);
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        array(
397
+            "'OR'",
398
+            array(
399
+                "'AND'",
400
+                array("'='", "'$table.id_trad'", 0),
401
+                array("'='", "'$table.$prim'", $dprim)
402
+            ),
403
+            array(
404
+                "'AND'",
405
+                array("'>'", "'$table.id_trad'", 0),
406
+                array("'='", "'$table.id_trad'", $arg)
407
+            )
408
+        );
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		array(
432
-			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
-			array("'='", "'$table.id_trad'", "'0'")
435
-		);
436
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        array(
432
+            "'OR'",
433
+            array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
+            array("'='", "'$table.id_trad'", "'0'")
435
+        );
436
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,20 +450,20 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
+        'id_parent';
458
+    $mparent = $boucle->id_table . '.' . $id_parent;
459 459
 
460
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
-		$boucle->where[] = array("'='", "'$mparent'", $arg);
460
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
+        $boucle->where[] = array("'='", "'$mparent'", $arg);
462 462
 
463
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
-	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
-	}
463
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
+    else {
465
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
+    }
467 467
 }
468 468
 
469 469
 
@@ -494,37 +494,37 @@  discard block
 block discarded – undo
494 494
  **/
495 495
 function critere_branche_dist($idb, &$boucles, $crit) {
496 496
 
497
-	$not = $crit->not;
498
-	$boucle = &$boucles[$idb];
499
-	// prendre en priorite un identifiant en parametre {branche XX}
500
-	if (isset($crit->param[0])) {
501
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
-		// sinon on le prend chez une boucle parente
503
-	} else {
504
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
-	}
506
-
507
-	//Trouver une jointure
508
-	$champ = "id_rubrique";
509
-	$desc = $boucle->show;
510
-	//Seulement si necessaire
511
-	if (!array_key_exists($champ, $desc['field'])) {
512
-		$cle = trouver_jointure_champ($champ, $boucle);
513
-		$trouver_table = charger_fonction("trouver_table", "base");
514
-		$desc = $trouver_table($boucle->from[$cle]);
515
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
-			$decompose = decompose_champ_id_objet($champ);
517
-			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
-		}
520
-	} else {
521
-		$cle = $boucle->id_table;
522
-	}
523
-
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
497
+    $not = $crit->not;
498
+    $boucle = &$boucles[$idb];
499
+    // prendre en priorite un identifiant en parametre {branche XX}
500
+    if (isset($crit->param[0])) {
501
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
+        // sinon on le prend chez une boucle parente
503
+    } else {
504
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
+    }
506
+
507
+    //Trouver une jointure
508
+    $champ = "id_rubrique";
509
+    $desc = $boucle->show;
510
+    //Seulement si necessaire
511
+    if (!array_key_exists($champ, $desc['field'])) {
512
+        $cle = trouver_jointure_champ($champ, $boucle);
513
+        $trouver_table = charger_fonction("trouver_table", "base");
514
+        $desc = $trouver_table($boucle->from[$cle]);
515
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
+            $decompose = decompose_champ_id_objet($champ);
517
+            $champ = array_shift($decompose);
518
+            $boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
+        }
520
+    } else {
521
+        $cle = $boucle->id_table;
522
+    }
523
+
524
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
+        . ($not ? ", 'NOT'" : '') . ")";
526
+    $boucle->where[] = !$crit->cond ? $c :
527
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
528 528
 }
529 529
 
530 530
 /**
@@ -540,15 +540,15 @@  discard block
 block discarded – undo
540 540
  **/
541 541
 function critere_logo_dist($idb, &$boucles, $crit) {
542 542
 
543
-	$boucle = &$boucles[$idb];
544
-	$not = ($crit->not ? 'NOT' : '');
545
-	$serveur = $boucle->sql_serveur;
543
+    $boucle = &$boucles[$idb];
544
+    $not = ($crit->not ? 'NOT' : '');
545
+    $serveur = $boucle->sql_serveur;
546 546
 
547
-	$c = "sql_in('" .
548
-		$boucle->id_table . '.' . $boucle->primary
549
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
547
+    $c = "sql_in('" .
548
+        $boucle->id_table . '.' . $boucle->primary
549
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
550 550
 
551
-	$boucle->where[] = $c;
551
+    $boucle->where[] = $c;
552 552
 }
553 553
 
554 554
 
@@ -570,31 +570,31 @@  discard block
 block discarded – undo
570 570
  * @return void
571 571
  **/
572 572
 function critere_fusion_dist($idb, &$boucles, $crit) {
573
-	if ($t = isset($crit->param[0])) {
574
-		$t = $crit->param[0];
575
-		if ($t[0]->type == 'texte') {
576
-			$t = $t[0]->texte;
577
-			if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
578
-				$t = table_objet_sql($r[1]);
579
-				$t = array_search($t, $boucles[$idb]->from);
580
-				if ($t) {
581
-					$t .= '.' . $r[2];
582
-				}
583
-			}
584
-		} else {
585
-			$t = '".'
586
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
587
-				. '."';
588
-		}
589
-	}
590
-	if ($t) {
591
-		$boucles[$idb]->group[] = $t;
592
-		if (!in_array($t, $boucles[$idb]->select)) {
593
-			$boucles[$idb]->select[] = $t;
594
-		}
595
-	} else {
596
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
597
-	}
573
+    if ($t = isset($crit->param[0])) {
574
+        $t = $crit->param[0];
575
+        if ($t[0]->type == 'texte') {
576
+            $t = $t[0]->texte;
577
+            if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
578
+                $t = table_objet_sql($r[1]);
579
+                $t = array_search($t, $boucles[$idb]->from);
580
+                if ($t) {
581
+                    $t .= '.' . $r[2];
582
+                }
583
+            }
584
+        } else {
585
+            $t = '".'
586
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
587
+                . '."';
588
+        }
589
+    }
590
+    if ($t) {
591
+        $boucles[$idb]->group[] = $t;
592
+        if (!in_array($t, $boucles[$idb]->select)) {
593
+            $boucles[$idb]->select[] = $t;
594
+        }
595
+    } else {
596
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
597
+    }
598 598
 }
599 599
 
600 600
 /**
@@ -614,9 +614,9 @@  discard block
 block discarded – undo
614 614
  * @return void
615 615
  **/
616 616
 if (!function_exists('critere_fusion_supprimer_dist')) {
617
-	function critere_fusion_supprimer_dist($idb, &$boucles, $crit){
618
-		$boucles[$idb]->group = array();
619
-	}
617
+    function critere_fusion_supprimer_dist($idb, &$boucles, $crit){
618
+        $boucles[$idb]->group = array();
619
+    }
620 620
 }
621 621
 
622 622
 /**
@@ -653,45 +653,45 @@  discard block
 block discarded – undo
653 653
  * @param Critere $crit Paramètres du critère dans cette boucle
654 654
  */
655 655
 function critere_collecte_dist($idb, &$boucles, $crit) {
656
-	if (isset($crit->param[0])) {
657
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
658
-		$boucle = $boucles[$idb];
659
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
660
-		$n = count($boucle->order);
661
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
662
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
663
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
664
-			if (
665
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
666
-				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
667
-			) {
668
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
669
-			} else {
670
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
671
-			}
672
-		}
673
-	} else {
674
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
675
-	}
656
+    if (isset($crit->param[0])) {
657
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
658
+        $boucle = $boucles[$idb];
659
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
660
+        $n = count($boucle->order);
661
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
662
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
663
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
664
+            if (
665
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
666
+                OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
667
+            ) {
668
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
669
+            } else {
670
+                $boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
671
+            }
672
+        }
673
+    } else {
674
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
675
+    }
676 676
 }
677 677
 
678 678
 // https://code.spip.net/@calculer_critere_arg_dynamique
679 679
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
680
-	$boucle = $boucles[$idb];
681
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
682
-	$var = '$champs_' . $idb;
683
-	$desc = (strpos($boucle->in, "static $var =") !== false);
684
-	if (!$desc) {
685
-		$desc = $boucle->show['field'];
686
-		$desc = implode(',', array_map('_q', array_keys($desc)));
687
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
688
-	}
689
-	if ($desc) {
690
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
691
-	}
692
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
693
-
694
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
680
+    $boucle = $boucles[$idb];
681
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
682
+    $var = '$champs_' . $idb;
683
+    $desc = (strpos($boucle->in, "static $var =") !== false);
684
+    if (!$desc) {
685
+        $desc = $boucle->show['field'];
686
+        $desc = implode(',', array_map('_q', array_keys($desc)));
687
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
688
+    }
689
+    if ($desc) {
690
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
691
+    }
692
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
693
+
694
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
695 695
 }
696 696
 
697 697
 /**
@@ -730,7 +730,7 @@  discard block
 block discarded – undo
730 730
  * @param Critere $crit Paramètres du critère dans cette boucle
731 731
  */
732 732
 function critere_par_dist($idb, &$boucles, $crit) {
733
-	return critere_parinverse($idb, $boucles, $crit);
733
+    return critere_parinverse($idb, $boucles, $crit);
734 734
 }
735 735
 
736 736
 /**
@@ -752,93 +752,93 @@  discard block
 block discarded – undo
752 752
  * @param Critere $crit Paramètres du critère dans cette boucle
753 753
  */
754 754
 function critere_parinverse($idb, &$boucles, $crit) {
755
-	$boucle = &$boucles[$idb];
756
-
757
-	$sens = $collecte = '';
758
-	if ($crit->not) {
759
-		$sens = " . ' DESC'";
760
-	}
761
-	if (isset($boucle->modificateur['collate'])) {
762
-		$collecte = ' . ' . $boucle->modificateur['collate'];
763
-	}
764
-
765
-	// Pour chaque paramètre du critère
766
-	foreach ($crit->param as $tri) {
767
-		$order = $fct = '';
768
-		// tris specifiés dynamiquement {par #ENV{tri}}
769
-		if ($tri[0]->type != 'texte') {
770
-			// calculer le order dynamique qui verifie les champs
771
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
772
-			// ajouter 'hasard' comme possibilité de tri dynamique
773
-			calculer_critere_par_hasard($idb, $boucles, $crit);
774
-		}
775
-		// tris textuels {par titre}
776
-		else {
777
-			$par = array_shift($tri);
778
-			$par = $par->texte;
779
-
780
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
781
-			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
782
-				$expression = trim($m[1]);
783
-				$champ = trim($m[2]);
784
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
785
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
786
-				} else {
787
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
788
-				}
789
-
790
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
791
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
792
-				// {par FONCTION(champ)}
793
-				if (count($match) > 2) {
794
-					$par = substr($match[2], 1, -1);
795
-					$fct = $match[1];
796
-				}
797
-				// quelques cas spécifiques {par hasard}, {par date}
798
-				if ($par == 'hasard') {
799
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
800
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
801
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
802
-				} else {
803
-					// cas général {par champ}, {par table.champ}, ...
804
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
805
-				}
806
-			}
807
-
808
-			// on ne sait pas traiter…
809
-			else {
810
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
811
-			}
812
-
813
-			// En cas d'erreur de squelette retournée par une fonction
814
-			if (is_array($order)) {
815
-				return $order;
816
-			}
817
-		}
818
-
819
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
820
-			$t = $m[1];
821
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
822
-				$boucle->select[] = $t;
823
-			}
824
-		} else {
825
-			$sens = '';
826
-		}
827
-
828
-		if ($fct) {
829
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
830
-				$order = "'$fct(" . $r[1] . ")'";
831
-			} else {
832
-				$order = "'$fct(' . $order . ')'";
833
-			}
834
-		}
835
-		$t = $order . $collecte . $sens;
836
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
837
-			$t = $r[1] . $r[2];
838
-		}
839
-
840
-		$boucle->order[] = $t;
841
-	}
755
+    $boucle = &$boucles[$idb];
756
+
757
+    $sens = $collecte = '';
758
+    if ($crit->not) {
759
+        $sens = " . ' DESC'";
760
+    }
761
+    if (isset($boucle->modificateur['collate'])) {
762
+        $collecte = ' . ' . $boucle->modificateur['collate'];
763
+    }
764
+
765
+    // Pour chaque paramètre du critère
766
+    foreach ($crit->param as $tri) {
767
+        $order = $fct = '';
768
+        // tris specifiés dynamiquement {par #ENV{tri}}
769
+        if ($tri[0]->type != 'texte') {
770
+            // calculer le order dynamique qui verifie les champs
771
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
772
+            // ajouter 'hasard' comme possibilité de tri dynamique
773
+            calculer_critere_par_hasard($idb, $boucles, $crit);
774
+        }
775
+        // tris textuels {par titre}
776
+        else {
777
+            $par = array_shift($tri);
778
+            $par = $par->texte;
779
+
780
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
781
+            if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
782
+                $expression = trim($m[1]);
783
+                $champ = trim($m[2]);
784
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
785
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
786
+                } else {
787
+                    return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
788
+                }
789
+
790
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
791
+            } elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
792
+                // {par FONCTION(champ)}
793
+                if (count($match) > 2) {
794
+                    $par = substr($match[2], 1, -1);
795
+                    $fct = $match[1];
796
+                }
797
+                // quelques cas spécifiques {par hasard}, {par date}
798
+                if ($par == 'hasard') {
799
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
800
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
801
+                    $order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
802
+                } else {
803
+                    // cas général {par champ}, {par table.champ}, ...
804
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
805
+                }
806
+            }
807
+
808
+            // on ne sait pas traiter…
809
+            else {
810
+                return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
811
+            }
812
+
813
+            // En cas d'erreur de squelette retournée par une fonction
814
+            if (is_array($order)) {
815
+                return $order;
816
+            }
817
+        }
818
+
819
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
820
+            $t = $m[1];
821
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
822
+                $boucle->select[] = $t;
823
+            }
824
+        } else {
825
+            $sens = '';
826
+        }
827
+
828
+        if ($fct) {
829
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
830
+                $order = "'$fct(" . $r[1] . ")'";
831
+            } else {
832
+                $order = "'$fct(' . $order . ')'";
833
+            }
834
+        }
835
+        $t = $order . $collecte . $sens;
836
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
837
+            $t = $r[1] . $r[2];
838
+        }
839
+
840
+        $boucle->order[] = $t;
841
+    }
842 842
 }
843 843
 
844 844
 /**
@@ -852,13 +852,13 @@  discard block
 block discarded – undo
852 852
  * @return string Clause pour le Order by
853 853
  */
854 854
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
855
-	$boucle = &$boucles[$idb];
856
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
857
-	$parha = "rand() AS hasard";
858
-	if (!in_array($parha, $boucle->select)) {
859
-		$boucle->select[] = $parha;
860
-	}
861
-	return "'hasard'";
855
+    $boucle = &$boucles[$idb];
856
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
857
+    $parha = "rand() AS hasard";
858
+    if (!in_array($parha, $boucle->select)) {
859
+        $boucle->select[] = $parha;
860
+    }
861
+    return "'hasard'";
862 862
 }
863 863
 
864 864
 /**
@@ -882,20 +882,20 @@  discard block
 block discarded – undo
882 882
  * @return string Clause pour le Order by
883 883
  */
884 884
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
885
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
886
-	if (is_array($_champ)) {
887
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
888
-	}
889
-	$boucle = &$boucles[$idb];
890
-	$texte = '0+' . $_champ;
891
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
892
-	if ($suite !== "''") {
893
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
894
-	}
895
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
896
-	$boucle->select[] = $texte . " AS $as";
897
-	$order = "'$as'";
898
-	return $order;
885
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
886
+    if (is_array($_champ)) {
887
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
888
+    }
889
+    $boucle = &$boucles[$idb];
890
+    $texte = '0+' . $_champ;
891
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
892
+    if ($suite !== "''") {
893
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
894
+    }
895
+    $as = 'num' . ($boucle->order ? count($boucle->order) : "");
896
+    $boucle->select[] = $texte . " AS $as";
897
+    $order = "'$as'";
898
+    return $order;
899 899
 }
900 900
 
901 901
 /**
@@ -916,20 +916,20 @@  discard block
 block discarded – undo
916 916
  * @return string Clause pour le Order by
917 917
  */
918 918
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
919
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
920
-	if (is_array($_champ)) {
921
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
922
-	}
923
-	$boucle = &$boucles[$idb];
924
-	$texte = '0+' . $_champ;
925
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
926
-	if ($suite !== "''") {
927
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
928
-	}
929
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
930
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
931
-	$order = "'$as'";
932
-	return $order;
919
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
920
+    if (is_array($_champ)) {
921
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
922
+    }
923
+    $boucle = &$boucles[$idb];
924
+    $texte = '0+' . $_champ;
925
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
926
+    if ($suite !== "''") {
927
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
928
+    }
929
+    $as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
930
+    $boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
931
+    $order = "'$as'";
932
+    return $order;
933 933
 }
934 934
 
935 935
 
@@ -949,14 +949,14 @@  discard block
 block discarded – undo
949 949
  * @return string Clause pour le Order by
950 950
  */
951 951
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
952
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
953
-	if (is_array($_champ)) {
954
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
955
-	}
956
-	$boucle = &$boucles[$idb];
957
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
958
-	$order = "'multi'";
959
-	return $order;
952
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
953
+    if (is_array($_champ)) {
954
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
955
+    }
956
+    $boucle = &$boucles[$idb];
957
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
958
+    $order = "'multi'";
959
+    return $order;
960 960
 }
961 961
 
962 962
 /**
@@ -975,56 +975,56 @@  discard block
 block discarded – undo
975 975
  * @return array|string
976 976
  */
977 977
 function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
978
-	$boucle = &$boucles[$idb];
979
-	$desc = $boucle->show;
980
-
981
-	// le champ existe dans la table, pas de souci (le plus commun)
982
-	if (isset($desc['field'][$par])) {
983
-		$par = $boucle->id_table . "." . $par;
984
-	}
985
-	// le champ est peut être une jointure
986
-	else {
987
-		$table = $table_alias = false; // toutes les tables de jointure possibles
988
-		$champ = $par;
989
-
990
-		// le champ demandé est une exception de jointure {par titre_mot}
991
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
992
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
993
-		} // la table de jointure est explicitement indiquée {par truc.muche}
994
-		elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
995
-			list(, $table, $champ) = $r;
996
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
997
-			$table = table_objet_sql($table);
998
-		}
999
-
1000
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1001
-		// Sinon on cherche le champ dans les tables possibles de jointures
1002
-		// Si la table est déjà dans le from, on la réutilise.
1003
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1004
-			$par = $infos['alias'] . "." . $champ;
1005
-		} elseif (
1006
-			$boucle->jointures_explicites
1007
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1008
-		) {
1009
-			$par = $alias . "." . $champ;
1010
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1011
-			$par = $alias . "." . $champ;
1012
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1013
-		} elseif (
1014
-			$table_alias
1015
-			and isset($boucle->from[$table_alias])
1016
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1017
-		) {
1018
-			$par = $infos['alias'] . "." . $champ;
1019
-		} elseif ($table) {
1020
-			// On avait table + champ, mais on ne les a pas trouvés
1021
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1022
-		} else {
1023
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1024
-		}
1025
-	}
1026
-
1027
-	return $raw ? $par : "'$par'";
978
+    $boucle = &$boucles[$idb];
979
+    $desc = $boucle->show;
980
+
981
+    // le champ existe dans la table, pas de souci (le plus commun)
982
+    if (isset($desc['field'][$par])) {
983
+        $par = $boucle->id_table . "." . $par;
984
+    }
985
+    // le champ est peut être une jointure
986
+    else {
987
+        $table = $table_alias = false; // toutes les tables de jointure possibles
988
+        $champ = $par;
989
+
990
+        // le champ demandé est une exception de jointure {par titre_mot}
991
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
992
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
993
+        } // la table de jointure est explicitement indiquée {par truc.muche}
994
+        elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
995
+            list(, $table, $champ) = $r;
996
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
997
+            $table = table_objet_sql($table);
998
+        }
999
+
1000
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1001
+        // Sinon on cherche le champ dans les tables possibles de jointures
1002
+        // Si la table est déjà dans le from, on la réutilise.
1003
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1004
+            $par = $infos['alias'] . "." . $champ;
1005
+        } elseif (
1006
+            $boucle->jointures_explicites
1007
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1008
+        ) {
1009
+            $par = $alias . "." . $champ;
1010
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1011
+            $par = $alias . "." . $champ;
1012
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1013
+        } elseif (
1014
+            $table_alias
1015
+            and isset($boucle->from[$table_alias])
1016
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1017
+        ) {
1018
+            $par = $infos['alias'] . "." . $champ;
1019
+        } elseif ($table) {
1020
+            // On avait table + champ, mais on ne les a pas trouvés
1021
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1022
+        } else {
1023
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1024
+        }
1025
+    }
1026
+
1027
+    return $raw ? $par : "'$par'";
1028 1028
 }
1029 1029
 
1030 1030
 /**
@@ -1038,11 +1038,11 @@  discard block
 block discarded – undo
1038 1038
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1039 1039
  */
1040 1040
 function critere_par_joint($table, $champ, &$boucle) {
1041
-	$t = array_search($table, $boucle->from);
1042
-	if (!$t) {
1043
-		$t = trouver_jointure_champ($champ, $boucle);
1044
-	}
1045
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1041
+    $t = array_search($table, $boucle->from);
1042
+    if (!$t) {
1043
+        $t = trouver_jointure_champ($champ, $boucle);
1044
+    }
1045
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1046 1046
 }
1047 1047
 
1048 1048
 /**
@@ -1067,33 +1067,33 @@  discard block
 block discarded – undo
1067 1067
  */
1068 1068
 function critere_inverse_dist($idb, &$boucles, $crit) {
1069 1069
 
1070
-	$boucle = &$boucles[$idb];
1071
-	// Classement par ordre inverse
1072
-	if ($crit->not) {
1073
-		critere_parinverse($idb, $boucles, $crit);
1074
-	} else {
1075
-		$order = "' DESC'";
1076
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1077
-		if (isset($crit->param[0])) {
1078
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1079
-			$order = "(($critere)?' DESC':'')";
1080
-		}
1081
-
1082
-		$n = count($boucle->order);
1083
-		if (!$n) {
1084
-			if (isset($boucle->default_order[0])) {
1085
-				$boucle->default_order[0] .= ' . " DESC"';
1086
-			} else {
1087
-				$boucle->default_order[] = ' DESC';
1088
-			}
1089
-		} else {
1090
-			$t = $boucle->order[$n - 1] . " . $order";
1091
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1092
-				$t = $r[1] . $r[2];
1093
-			}
1094
-			$boucle->order[$n - 1] = $t;
1095
-		}
1096
-	}
1070
+    $boucle = &$boucles[$idb];
1071
+    // Classement par ordre inverse
1072
+    if ($crit->not) {
1073
+        critere_parinverse($idb, $boucles, $crit);
1074
+    } else {
1075
+        $order = "' DESC'";
1076
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1077
+        if (isset($crit->param[0])) {
1078
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1079
+            $order = "(($critere)?' DESC':'')";
1080
+        }
1081
+
1082
+        $n = count($boucle->order);
1083
+        if (!$n) {
1084
+            if (isset($boucle->default_order[0])) {
1085
+                $boucle->default_order[0] .= ' . " DESC"';
1086
+            } else {
1087
+                $boucle->default_order[] = ' DESC';
1088
+            }
1089
+        } else {
1090
+            $t = $boucle->order[$n - 1] . " . $order";
1091
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1092
+                $t = $r[1] . $r[2];
1093
+            }
1094
+            $boucle->order[$n - 1] = $t;
1095
+        }
1096
+    }
1097 1097
 }
1098 1098
 
1099 1099
 /**
@@ -1104,138 +1104,138 @@  discard block
 block discarded – undo
1104 1104
  * @return array|string
1105 1105
  */
1106 1106
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit){
1107
-	$boucle = &$boucles[$idb];
1107
+    $boucle = &$boucles[$idb];
1108 1108
 
1109
-	$sens = $collecte = '';
1110
-	if ($crit->not){
1111
-		$sens = " . ' DESC'";
1112
-	}
1109
+    $sens = $collecte = '';
1110
+    if ($crit->not){
1111
+        $sens = " . ' DESC'";
1112
+    }
1113 1113
 
1114
-	$crit2 = clone $crit;
1115
-	$crit2->not = false;
1116
-	$crit2->param = [reset($crit->param)];
1117
-	$res = critere_parinverse($idb, $boucles, $crit2);
1114
+    $crit2 = clone $crit;
1115
+    $crit2->not = false;
1116
+    $crit2->param = [reset($crit->param)];
1117
+    $res = critere_parinverse($idb, $boucles, $crit2);
1118 1118
 
1119
-	// erreur ?
1120
-	if (is_array($res)){
1121
-		return $res;
1122
-	}
1119
+    // erreur ?
1120
+    if (is_array($res)){
1121
+        return $res;
1122
+    }
1123 1123
 
1124
-	$_order = array_pop($boucle->order);
1124
+    $_order = array_pop($boucle->order);
1125 1125
 
1126
-	$_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1127
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1126
+    $_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1127
+    $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1128 1128
 }
1129 1129
 
1130 1130
 
1131 1131
 // https://code.spip.net/@critere_agenda_dist
1132 1132
 function critere_agenda_dist($idb, &$boucles, $crit) {
1133
-	$params = $crit->param;
1134
-
1135
-	if (count($params) < 1) {
1136
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1137
-	}
1138
-
1139
-	$boucle = &$boucles[$idb];
1140
-	$parent = $boucle->id_parent;
1141
-	$fields = $boucle->show['field'];
1142
-
1143
-	$date = array_shift($params);
1144
-	$type = array_shift($params);
1145
-
1146
-	// la valeur $type doit etre connue a la compilation
1147
-	// donc etre forcement reduite a un litteral unique dans le source
1148
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1149
-
1150
-	// La valeur date doit designer un champ de la table SQL.
1151
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1152
-	// sinon synthetiser le test de verif pour execution ulterieure
1153
-	// On prendra arbitrairement le premier champ si test negatif.
1154
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1155
-		$date = $date[0]->texte;
1156
-		if (!isset($fields[$date])) {
1157
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1158
-		}
1159
-	} else {
1160
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1161
-		$noms = array_keys($fields);
1162
-		$defaut = $noms[0];
1163
-		$noms = join(" ", $noms);
1164
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1165
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1166
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1167
-	}
1168
-	$annee = $params ? array_shift($params) : "";
1169
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1170
-		calculer_liste($annee, $idb, $boucles, $parent) .
1171
-		') ? $x : date("Y"))';
1172
-
1173
-	$mois = $params ? array_shift($params) : "";
1174
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1175
-		calculer_liste($mois, $idb, $boucles, $parent) .
1176
-		') ? $x : date("m"))';
1177
-
1178
-	$jour = $params ? array_shift($params) : "";
1179
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1180
-		calculer_liste($jour, $idb, $boucles, $parent) .
1181
-		') ? $x : date("d"))';
1182
-
1183
-	$annee2 = $params ? array_shift($params) : "";
1184
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1185
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1186
-		') ? $x : date("Y"))';
1187
-
1188
-	$mois2 = $params ? array_shift($params) : "";
1189
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1190
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1191
-		') ? $x : date("m"))';
1192
-
1193
-	$jour2 = $params ? array_shift($params) : "";
1194
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1195
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1196
-		') ? $x : date("d"))';
1197
-
1198
-	$date = $boucle->id_table . ".$date";
1199
-
1200
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1201
-	if ($type == 'jour') {
1202
-		$boucle->where[] = array(
1203
-			"'='",
1204
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1205
-			("sql_quote($annee . $mois . $jour$quote_end)")
1206
-		);
1207
-	} elseif ($type == 'mois') {
1208
-		$boucle->where[] = array(
1209
-			"'='",
1210
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1211
-			("sql_quote($annee . $mois$quote_end)")
1212
-		);
1213
-	} elseif ($type == 'semaine') {
1214
-		$boucle->where[] = array(
1215
-			"'AND'",
1216
-			array(
1217
-				"'>='",
1218
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1219
-				("date_debut_semaine($annee, $mois, $jour)")
1220
-			),
1221
-			array(
1222
-				"'<='",
1223
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1224
-				("date_fin_semaine($annee, $mois, $jour)")
1225
-			)
1226
-		);
1227
-	} elseif (count($crit->param) > 2) {
1228
-		$boucle->where[] = array(
1229
-			"'AND'",
1230
-			array(
1231
-				"'>='",
1232
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1233
-				("sql_quote($annee . $mois . $jour$quote_end)")
1234
-			),
1235
-			array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1236
-		);
1237
-	}
1238
-	// sinon on prend tout
1133
+    $params = $crit->param;
1134
+
1135
+    if (count($params) < 1) {
1136
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1137
+    }
1138
+
1139
+    $boucle = &$boucles[$idb];
1140
+    $parent = $boucle->id_parent;
1141
+    $fields = $boucle->show['field'];
1142
+
1143
+    $date = array_shift($params);
1144
+    $type = array_shift($params);
1145
+
1146
+    // la valeur $type doit etre connue a la compilation
1147
+    // donc etre forcement reduite a un litteral unique dans le source
1148
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1149
+
1150
+    // La valeur date doit designer un champ de la table SQL.
1151
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1152
+    // sinon synthetiser le test de verif pour execution ulterieure
1153
+    // On prendra arbitrairement le premier champ si test negatif.
1154
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1155
+        $date = $date[0]->texte;
1156
+        if (!isset($fields[$date])) {
1157
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1158
+        }
1159
+    } else {
1160
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1161
+        $noms = array_keys($fields);
1162
+        $defaut = $noms[0];
1163
+        $noms = join(" ", $noms);
1164
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1165
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1166
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1167
+    }
1168
+    $annee = $params ? array_shift($params) : "";
1169
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1170
+        calculer_liste($annee, $idb, $boucles, $parent) .
1171
+        ') ? $x : date("Y"))';
1172
+
1173
+    $mois = $params ? array_shift($params) : "";
1174
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1175
+        calculer_liste($mois, $idb, $boucles, $parent) .
1176
+        ') ? $x : date("m"))';
1177
+
1178
+    $jour = $params ? array_shift($params) : "";
1179
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1180
+        calculer_liste($jour, $idb, $boucles, $parent) .
1181
+        ') ? $x : date("d"))';
1182
+
1183
+    $annee2 = $params ? array_shift($params) : "";
1184
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1185
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1186
+        ') ? $x : date("Y"))';
1187
+
1188
+    $mois2 = $params ? array_shift($params) : "";
1189
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1190
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1191
+        ') ? $x : date("m"))';
1192
+
1193
+    $jour2 = $params ? array_shift($params) : "";
1194
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1195
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1196
+        ') ? $x : date("d"))';
1197
+
1198
+    $date = $boucle->id_table . ".$date";
1199
+
1200
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1201
+    if ($type == 'jour') {
1202
+        $boucle->where[] = array(
1203
+            "'='",
1204
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1205
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1206
+        );
1207
+    } elseif ($type == 'mois') {
1208
+        $boucle->where[] = array(
1209
+            "'='",
1210
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1211
+            ("sql_quote($annee . $mois$quote_end)")
1212
+        );
1213
+    } elseif ($type == 'semaine') {
1214
+        $boucle->where[] = array(
1215
+            "'AND'",
1216
+            array(
1217
+                "'>='",
1218
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1219
+                ("date_debut_semaine($annee, $mois, $jour)")
1220
+            ),
1221
+            array(
1222
+                "'<='",
1223
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1224
+                ("date_fin_semaine($annee, $mois, $jour)")
1225
+            )
1226
+        );
1227
+    } elseif (count($crit->param) > 2) {
1228
+        $boucle->where[] = array(
1229
+            "'AND'",
1230
+            array(
1231
+                "'>='",
1232
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1233
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1234
+            ),
1235
+            array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1236
+        );
1237
+    }
1238
+    // sinon on prend tout
1239 1239
 }
1240 1240
 
1241 1241
 
@@ -1260,33 +1260,33 @@  discard block
 block discarded – undo
1260 1260
  * @return void
1261 1261
  **/
1262 1262
 function calculer_critere_parties($idb, &$boucles, $crit) {
1263
-	$boucle = &$boucles[$idb];
1264
-	$a1 = $crit->param[0];
1265
-	$a2 = $crit->param[1];
1266
-	$op = $crit->op;
1267
-
1268
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1269
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1270
-
1271
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1272
-		$boucle->limit = $a11 . ',' . $a21;
1273
-	} else {
1274
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1275
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1276
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1277
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1278
-		$mode = (($op == '/') ? '/' :
1279
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1280
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1281
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1282
-			$boucle->limit =
1283
-				(is_numeric($a11) ? "'$a11'" : $a11)
1284
-				. ".','."
1285
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1286
-		} else {
1287
-			calculer_parties($boucles, $idb, $partie, $mode);
1288
-		}
1289
-	}
1263
+    $boucle = &$boucles[$idb];
1264
+    $a1 = $crit->param[0];
1265
+    $a2 = $crit->param[1];
1266
+    $op = $crit->op;
1267
+
1268
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1269
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1270
+
1271
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1272
+        $boucle->limit = $a11 . ',' . $a21;
1273
+    } else {
1274
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1275
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1276
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1277
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1278
+        $mode = (($op == '/') ? '/' :
1279
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1280
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1281
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1282
+            $boucle->limit =
1283
+                (is_numeric($a11) ? "'$a11'" : $a11)
1284
+                . ".','."
1285
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1286
+        } else {
1287
+            calculer_parties($boucles, $idb, $partie, $mode);
1288
+        }
1289
+    }
1290 1290
 }
1291 1291
 
1292 1292
 /**
@@ -1314,63 +1314,63 @@  discard block
 block discarded – undo
1314 1314
  * @return void
1315 1315
  **/
1316 1316
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1317
-	$total_parties = $boucles[$id_boucle]->total_parties;
1318
-
1319
-	preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1320
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1321
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1322
-	// {1/3}
1323
-	if ($op1 == '/') {
1324
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1325
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1326
-			"($total_parties ? $total_parties : 1)";
1327
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1328
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1329
-	} else {
1330
-		// cas {n-1,x}
1331
-		if ($op1 == '-') {
1332
-			$debut = "$nombre_boucle - $debut;";
1333
-		}
1334
-
1335
-		// cas {x,n-1}
1336
-		if ($op2 == '-') {
1337
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1338
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1339
-					($total_parties . ' - 1'));
1340
-		} else {
1341
-			// {x,1} ou {pagination}
1342
-			$fin = '$debut_boucle'
1343
-				. (is_numeric($total_parties) ?
1344
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1345
-					('+' . $total_parties . ' - 1'));
1346
-		}
1347
-
1348
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1349
-		if ($op1 == 'p') {
1350
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1351
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1352
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1353
-		}
1354
-	}
1355
-
1356
-	// Notes :
1357
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1358
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1359
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1360
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1361
-
1362
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1363
-		. '$debut_boucle = ' . $debut . ";\n	"
1364
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1365
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1366
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1367
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1368
-		. "\n\tif (\$debut_boucle>0"
1369
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1370
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1371
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1372
-
1373
-	$boucles[$id_boucle]->partie = "
1317
+    $total_parties = $boucles[$id_boucle]->total_parties;
1318
+
1319
+    preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1320
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1321
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1322
+    // {1/3}
1323
+    if ($op1 == '/') {
1324
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1325
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1326
+            "($total_parties ? $total_parties : 1)";
1327
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1328
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1329
+    } else {
1330
+        // cas {n-1,x}
1331
+        if ($op1 == '-') {
1332
+            $debut = "$nombre_boucle - $debut;";
1333
+        }
1334
+
1335
+        // cas {x,n-1}
1336
+        if ($op2 == '-') {
1337
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1338
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1339
+                    ($total_parties . ' - 1'));
1340
+        } else {
1341
+            // {x,1} ou {pagination}
1342
+            $fin = '$debut_boucle'
1343
+                . (is_numeric($total_parties) ?
1344
+                    (($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1345
+                    ('+' . $total_parties . ' - 1'));
1346
+        }
1347
+
1348
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1349
+        if ($op1 == 'p') {
1350
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1351
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1352
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1353
+        }
1354
+    }
1355
+
1356
+    // Notes :
1357
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1358
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1359
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1360
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1361
+
1362
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1363
+        . '$debut_boucle = ' . $debut . ";\n	"
1364
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1365
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1366
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1367
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1368
+        . "\n\tif (\$debut_boucle>0"
1369
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1370
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1371
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1372
+
1373
+    $boucles[$id_boucle]->partie = "
1374 1374
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1375 1375
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1376 1376
 }
@@ -1387,26 +1387,26 @@  discard block
 block discarded – undo
1387 1387
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1388 1388
  **/
1389 1389
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1390
-	if ($param[0]->type != 'texte') {
1391
-		$a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1392
-		if (isset($param[1]->texte)) {
1393
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1394
-
1395
-			return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1396
-		} else {
1397
-			return array("intval($a1)", 0);
1398
-		}
1399
-	} else {
1400
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1401
-		$a1 = $m[1];
1402
-		if (empty($m[3])) {
1403
-			return array($a1, 0);
1404
-		} elseif (!empty($m[4])) {
1405
-			return array($a1, $m[4]);
1406
-		} else {
1407
-			return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1408
-		}
1409
-	}
1390
+    if ($param[0]->type != 'texte') {
1391
+        $a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1392
+        if (isset($param[1]->texte)) {
1393
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1394
+
1395
+            return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1396
+        } else {
1397
+            return array("intval($a1)", 0);
1398
+        }
1399
+    } else {
1400
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1401
+        $a1 = $m[1];
1402
+        if (empty($m[3])) {
1403
+            return array($a1, 0);
1404
+        } elseif (!empty($m[4])) {
1405
+            return array($a1, $m[4]);
1406
+        } else {
1407
+            return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1408
+        }
1409
+    }
1410 1410
 }
1411 1411
 
1412 1412
 
@@ -1433,47 +1433,47 @@  discard block
 block discarded – undo
1433 1433
  *     array : Erreur sur un des critères
1434 1434
  **/
1435 1435
 function calculer_criteres($idb, &$boucles) {
1436
-	$msg = '';
1437
-	$boucle = $boucles[$idb];
1438
-	$table = strtoupper($boucle->type_requete);
1439
-	$serveur = strtolower($boucle->sql_serveur);
1440
-
1441
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1442
-	// s'il y avait une erreur de syntaxe, propager cette info
1443
-	if (!is_array($boucle->criteres)) {
1444
-		return array();
1445
-	}
1446
-
1447
-	foreach ($boucle->criteres as $crit) {
1448
-		$critere = $crit->op;
1449
-		// critere personnalise ?
1450
-		if (
1451
-			(!$serveur or
1452
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1453
-					and (!function_exists($f = $f . "_dist"))
1454
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1455
-					and (!function_exists($f = $f . "_dist"))
1456
-				)
1457
-			)
1458
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1459
-			and (!function_exists($f = $f . "_dist"))
1460
-			and (!function_exists($f = "critere_" . $critere))
1461
-			and (!function_exists($f = $f . "_dist"))
1462
-		) {
1463
-			// fonction critere standard
1464
-			$f = $defaut;
1465
-		}
1466
-		// compile le critere
1467
-		$res = $f($idb, $boucles, $crit);
1468
-
1469
-		// Gestion centralisee des erreurs pour pouvoir propager
1470
-		if (is_array($res)) {
1471
-			$msg = $res;
1472
-			erreur_squelette($msg, $boucle);
1473
-		}
1474
-	}
1475
-
1476
-	return $msg;
1436
+    $msg = '';
1437
+    $boucle = $boucles[$idb];
1438
+    $table = strtoupper($boucle->type_requete);
1439
+    $serveur = strtolower($boucle->sql_serveur);
1440
+
1441
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1442
+    // s'il y avait une erreur de syntaxe, propager cette info
1443
+    if (!is_array($boucle->criteres)) {
1444
+        return array();
1445
+    }
1446
+
1447
+    foreach ($boucle->criteres as $crit) {
1448
+        $critere = $crit->op;
1449
+        // critere personnalise ?
1450
+        if (
1451
+            (!$serveur or
1452
+                ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1453
+                    and (!function_exists($f = $f . "_dist"))
1454
+                    and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1455
+                    and (!function_exists($f = $f . "_dist"))
1456
+                )
1457
+            )
1458
+            and (!function_exists($f = "critere_" . $table . "_" . $critere))
1459
+            and (!function_exists($f = $f . "_dist"))
1460
+            and (!function_exists($f = "critere_" . $critere))
1461
+            and (!function_exists($f = $f . "_dist"))
1462
+        ) {
1463
+            // fonction critere standard
1464
+            $f = $defaut;
1465
+        }
1466
+        // compile le critere
1467
+        $res = $f($idb, $boucles, $crit);
1468
+
1469
+        // Gestion centralisee des erreurs pour pouvoir propager
1470
+        if (is_array($res)) {
1471
+            $msg = $res;
1472
+            erreur_squelette($msg, $boucle);
1473
+        }
1474
+    }
1475
+
1476
+    return $msg;
1477 1477
 }
1478 1478
 
1479 1479
 /**
@@ -1490,11 +1490,11 @@  discard block
 block discarded – undo
1490 1490
  * @return string         Code compilé rééchappé
1491 1491
  */
1492 1492
 function kwote($lisp, $serveur = '', $type = '') {
1493
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1494
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1495
-	} else {
1496
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1497
-	}
1493
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1494
+        return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1495
+    } else {
1496
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1497
+    }
1498 1498
 }
1499 1499
 
1500 1500
 
@@ -1513,85 +1513,85 @@  discard block
 block discarded – undo
1513 1513
  * @return void
1514 1514
  **/
1515 1515
 function critere_IN_dist($idb, &$boucles, $crit) {
1516
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1517
-	if (!$r) {
1518
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1519
-	}
1520
-	list($arg, $op, $val, $col, $where_complement) = $r;
1521
-
1522
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1523
-
1524
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1525
-	$where = $in;
1526
-	if ($crit->cond) {
1527
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1528
-		$where = array("'?'", $pred, $where, "''");
1529
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1530
-		{
1531
-			$where_complement = array("'?'", $pred, $where_complement, "''");
1532
-		}
1533
-	}
1534
-	if ($crit->exclus) {
1535
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1536
-			$where = array("'NOT'", $where);
1537
-		} else
1538
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1539
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1540
-		{
1541
-			$where = array(
1542
-				"'NOT'",
1543
-				array(
1544
-					"'IN'",
1545
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1546
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1547
-				)
1548
-			);
1549
-		}
1550
-	}
1551
-
1552
-	$boucles[$idb]->where[] = $where;
1553
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1554
-	{
1555
-		$boucles[$idb]->where[] = $where_complement;
1556
-	}
1516
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1517
+    if (!$r) {
1518
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1519
+    }
1520
+    list($arg, $op, $val, $col, $where_complement) = $r;
1521
+
1522
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1523
+
1524
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1525
+    $where = $in;
1526
+    if ($crit->cond) {
1527
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1528
+        $where = array("'?'", $pred, $where, "''");
1529
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1530
+        {
1531
+            $where_complement = array("'?'", $pred, $where_complement, "''");
1532
+        }
1533
+    }
1534
+    if ($crit->exclus) {
1535
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1536
+            $where = array("'NOT'", $where);
1537
+        } else
1538
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1539
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1540
+        {
1541
+            $where = array(
1542
+                "'NOT'",
1543
+                array(
1544
+                    "'IN'",
1545
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1546
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1547
+                )
1548
+            );
1549
+        }
1550
+    }
1551
+
1552
+    $boucles[$idb]->where[] = $where;
1553
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1554
+    {
1555
+        $boucles[$idb]->where[] = $where_complement;
1556
+    }
1557 1557
 }
1558 1558
 
1559 1559
 // https://code.spip.net/@critere_IN_cas
1560 1560
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1561
-	static $num = array();
1562
-	$descr = $boucles[$idb]->descr;
1563
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1564
-
1565
-	$var = '$in' . $cpt++;
1566
-	$x = "\n\t$var = array();";
1567
-	foreach ($val as $k => $v) {
1568
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1569
-			// optimiser le traitement des constantes
1570
-			if (is_numeric($r[2])) {
1571
-				$x .= "\n\t$var" . "[]= $r[2];";
1572
-			} else {
1573
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1574
-			}
1575
-		} else {
1576
-			// Pour permettre de passer des tableaux de valeurs
1577
-			// on repere l'utilisation brute de #ENV**{X},
1578
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1579
-			// et on deballe mais en rajoutant l'anti XSS
1580
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1581
-		}
1582
-	}
1583
-
1584
-	$boucles[$idb]->in .= $x;
1585
-
1586
-	// inserer le tri par defaut selon les ordres du IN ...
1587
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1588
-	// et que l'on limite donc strictement aux cas necessaires :
1589
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1590
-	if (!$crit2) {
1591
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1592
-	}
1593
-
1594
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1561
+    static $num = array();
1562
+    $descr = $boucles[$idb]->descr;
1563
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1564
+
1565
+    $var = '$in' . $cpt++;
1566
+    $x = "\n\t$var = array();";
1567
+    foreach ($val as $k => $v) {
1568
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1569
+            // optimiser le traitement des constantes
1570
+            if (is_numeric($r[2])) {
1571
+                $x .= "\n\t$var" . "[]= $r[2];";
1572
+            } else {
1573
+                $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1574
+            }
1575
+        } else {
1576
+            // Pour permettre de passer des tableaux de valeurs
1577
+            // on repere l'utilisation brute de #ENV**{X},
1578
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1579
+            // et on deballe mais en rajoutant l'anti XSS
1580
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1581
+        }
1582
+    }
1583
+
1584
+    $boucles[$idb]->in .= $x;
1585
+
1586
+    // inserer le tri par defaut selon les ordres du IN ...
1587
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1588
+    // et que l'on limite donc strictement aux cas necessaires :
1589
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1590
+    if (!$crit2) {
1591
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1592
+    }
1593
+
1594
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1595 1595
 }
1596 1596
 
1597 1597
 /**
@@ -1607,22 +1607,22 @@  discard block
 block discarded – undo
1607 1607
  * @return void
1608 1608
  */
1609 1609
 function critere_where_dist($idb, &$boucles, $crit) {
1610
-	$boucle = &$boucles[$idb];
1611
-	if (isset($crit->param[0])) {
1612
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1613
-	} else {
1614
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1615
-	}
1616
-
1617
-	if ($crit->cond) {
1618
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1619
-	}
1620
-
1621
-	if ($crit->not) {
1622
-		$_where = "array('NOT',$_where)";
1623
-	}
1624
-
1625
-	$boucle->where[] = $_where;
1610
+    $boucle = &$boucles[$idb];
1611
+    if (isset($crit->param[0])) {
1612
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1613
+    } else {
1614
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1615
+    }
1616
+
1617
+    if ($crit->cond) {
1618
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1619
+    }
1620
+
1621
+    if ($crit->not) {
1622
+        $_where = "array('NOT',$_where)";
1623
+    }
1624
+
1625
+    $boucle->where[] = $_where;
1626 1626
 }
1627 1627
 
1628 1628
 /**
@@ -1650,31 +1650,31 @@  discard block
 block discarded – undo
1650 1650
  * @return void
1651 1651
  */
1652 1652
 function critere_id__dist($idb, &$boucles, $crit) {
1653
-	/** @var Boucle $boucle */
1654
-	$boucle = $boucles[$idb];
1655
-
1656
-	$champs = lister_champs_id_conditionnel(
1657
-		$boucle->show['table'],
1658
-		$boucle->show,
1659
-		$boucle->sql_serveur
1660
-	);
1661
-
1662
-	// ne pas tenir compte des critères identiques déjà présents.
1663
-	if (!empty($boucle->modificateur['criteres'])) {
1664
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1665
-	}
1666
-	// nous aider en mode debug.
1667
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1668
-	$boucle->modificateur['id_'] = $champs;
1669
-
1670
-	// créer un critère {id_xxx?} de chaque champ retenu
1671
-	foreach ($champs as $champ) {
1672
-		$critere_id_table = new Critere;
1673
-		$critere_id_table->op = $champ;
1674
-		$critere_id_table->cond = '?';
1675
-		$critere_id_table->ligne = $crit->ligne;
1676
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1677
-	}
1653
+    /** @var Boucle $boucle */
1654
+    $boucle = $boucles[$idb];
1655
+
1656
+    $champs = lister_champs_id_conditionnel(
1657
+        $boucle->show['table'],
1658
+        $boucle->show,
1659
+        $boucle->sql_serveur
1660
+    );
1661
+
1662
+    // ne pas tenir compte des critères identiques déjà présents.
1663
+    if (!empty($boucle->modificateur['criteres'])) {
1664
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1665
+    }
1666
+    // nous aider en mode debug.
1667
+    $boucle->debug[] = "id_ : " . implode(', ', $champs);
1668
+    $boucle->modificateur['id_'] = $champs;
1669
+
1670
+    // créer un critère {id_xxx?} de chaque champ retenu
1671
+    foreach ($champs as $champ) {
1672
+        $critere_id_table = new Critere;
1673
+        $critere_id_table->op = $champ;
1674
+        $critere_id_table->cond = '?';
1675
+        $critere_id_table->ligne = $crit->ligne;
1676
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1677
+    }
1678 1678
 }
1679 1679
 
1680 1680
 /**
@@ -1694,79 +1694,79 @@  discard block
 block discarded – undo
1694 1694
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1695 1695
  */
1696 1696
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1697
-	// calculer la description de la table
1698
-	if (!is_array($desc)) {
1699
-		$desc = description_table($table, $serveur);
1700
-	}
1701
-	if (!$desc) {
1702
-		return [];
1703
-	}
1704
-
1705
-	// Les champs id_xx de la table demandée
1706
-	$champs = array_filter(
1707
-		array_keys($desc['field']),
1708
-		function($champ){
1709
-			return
1710
-				strpos($champ, 'id_') === 0
1711
-				or (in_array($champ, array('objet')));
1712
-		}
1713
-	);
1714
-
1715
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1716
-	if (
1717
-		in_array('id_rubrique', $champs)
1718
-		and !in_array('id_secteur', $champs)
1719
-	) {
1720
-		$champs[] = 'id_secteur';
1721
-	}
1722
-
1723
-	// On ne fera pas mieux pour les tables d’un autre serveur
1724
-	if ($serveur) {
1725
-		return $champs;
1726
-	}
1727
-
1728
-	$primary = false;
1729
-	$associable = false;
1730
-	include_spip('action/editer_liens');
1731
-
1732
-	if (isset($desc['type'])) {
1733
-		$primary = id_table_objet($desc['type']);
1734
-		$associable = objet_associable($desc['type']);
1735
-	}
1736
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1737
-		$associable = true;
1738
-	}
1739
-
1740
-	// liste de toutes les tables principales, sauf la notre
1741
-	$tables = lister_tables_objets_sql();
1742
-	unset($tables[$table]);
1743
-
1744
-	foreach ($tables as $_table => $_desc) {
1745
-		if (
1746
-			$associable
1747
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1748
-			or objet_associable($_desc['type'])
1749
-		) {
1750
-			$champs[] = id_table_objet($_table);
1751
-		}
1752
-	}
1753
-	$champs = array_values(array_unique($champs));
1754
-
1755
-	// Exclusions de certains id
1756
-	$exclusions = pipeline(
1757
-		'exclure_id_conditionnel',
1758
-		array(
1759
-			'args' => array(
1760
-				'table' => $table,
1761
-				'id_table_objet' => $primary,
1762
-				'associable' => $associable,
1763
-			),
1764
-			'data' => array(),
1765
-		)
1766
-	);
1767
-	$champs = array_diff($champs, $exclusions);
1768
-
1769
-	return $champs;
1697
+    // calculer la description de la table
1698
+    if (!is_array($desc)) {
1699
+        $desc = description_table($table, $serveur);
1700
+    }
1701
+    if (!$desc) {
1702
+        return [];
1703
+    }
1704
+
1705
+    // Les champs id_xx de la table demandée
1706
+    $champs = array_filter(
1707
+        array_keys($desc['field']),
1708
+        function($champ){
1709
+            return
1710
+                strpos($champ, 'id_') === 0
1711
+                or (in_array($champ, array('objet')));
1712
+        }
1713
+    );
1714
+
1715
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1716
+    if (
1717
+        in_array('id_rubrique', $champs)
1718
+        and !in_array('id_secteur', $champs)
1719
+    ) {
1720
+        $champs[] = 'id_secteur';
1721
+    }
1722
+
1723
+    // On ne fera pas mieux pour les tables d’un autre serveur
1724
+    if ($serveur) {
1725
+        return $champs;
1726
+    }
1727
+
1728
+    $primary = false;
1729
+    $associable = false;
1730
+    include_spip('action/editer_liens');
1731
+
1732
+    if (isset($desc['type'])) {
1733
+        $primary = id_table_objet($desc['type']);
1734
+        $associable = objet_associable($desc['type']);
1735
+    }
1736
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1737
+        $associable = true;
1738
+    }
1739
+
1740
+    // liste de toutes les tables principales, sauf la notre
1741
+    $tables = lister_tables_objets_sql();
1742
+    unset($tables[$table]);
1743
+
1744
+    foreach ($tables as $_table => $_desc) {
1745
+        if (
1746
+            $associable
1747
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1748
+            or objet_associable($_desc['type'])
1749
+        ) {
1750
+            $champs[] = id_table_objet($_table);
1751
+        }
1752
+    }
1753
+    $champs = array_values(array_unique($champs));
1754
+
1755
+    // Exclusions de certains id
1756
+    $exclusions = pipeline(
1757
+        'exclure_id_conditionnel',
1758
+        array(
1759
+            'args' => array(
1760
+                'table' => $table,
1761
+                'id_table_objet' => $primary,
1762
+                'associable' => $associable,
1763
+            ),
1764
+            'data' => array(),
1765
+        )
1766
+    );
1767
+    $champs = array_diff($champs, $exclusions);
1768
+
1769
+    return $champs;
1770 1770
 }
1771 1771
 
1772 1772
 /**
@@ -1821,27 +1821,27 @@  discard block
 block discarded – undo
1821 1821
  * @return void
1822 1822
  */
1823 1823
 function critere_tri_dist($idb, &$boucles, $crit) {
1824
-	$boucle = &$boucles[$idb];
1825
-
1826
-	// definition du champ par defaut
1827
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1828
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1829
-	$_sens_defaut = !isset($crit->param[1][0]) ? "1"
1830
-		: calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1831
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1832
-		: calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1833
-
1834
-	$_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):'')";
1835
-
1836
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1837
-	$_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)";
1838
-
1839
-	$boucle->modificateur['tri_champ'] = $_tri;
1840
-	$boucle->modificateur['tri_sens'] = $_sens;
1841
-	$boucle->modificateur['tri_nom'] = $_variable;
1842
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1843
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1844
-	$boucle->hash .= "
1824
+    $boucle = &$boucles[$idb];
1825
+
1826
+    // definition du champ par defaut
1827
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1828
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1829
+    $_sens_defaut = !isset($crit->param[1][0]) ? "1"
1830
+        : calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1831
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1832
+        : calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1833
+
1834
+    $_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):'')";
1835
+
1836
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1837
+    $_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)";
1838
+
1839
+    $boucle->modificateur['tri_champ'] = $_tri;
1840
+    $boucle->modificateur['tri_sens'] = $_sens;
1841
+    $boucle->modificateur['tri_nom'] = $_variable;
1842
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1843
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1844
+    $boucle->hash .= "
1845 1845
 	\$senstri = '';
1846 1846
 	\$tri = $_tri;
1847 1847
 	if (\$tri){
@@ -1849,8 +1849,8 @@  discard block
 block discarded – undo
1849 1849
 		\$senstri = (\$senstri<0)?' DESC':'';
1850 1850
 	};
1851 1851
 	";
1852
-	$boucle->select[] = "\".tri_champ_select(\$tri).\"";
1853
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1852
+    $boucle->select[] = "\".tri_champ_select(\$tri).\"";
1853
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1854 1854
 }
1855 1855
 
1856 1856
 # Criteres de comparaison
@@ -1867,20 +1867,20 @@  discard block
 block discarded – undo
1867 1867
  * @return void
1868 1868
  **/
1869 1869
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1870
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1871
-	if (($crit->op == ",") or ($crit->op == '/')) {
1872
-		return calculer_critere_parties($idb, $boucles, $crit);
1873
-	}
1874
-
1875
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1876
-	if (!$r) {
1877
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1878
-		#	if (!$crit->cond) {
1879
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1880
-		#	}
1881
-	} else {
1882
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1883
-	}
1870
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1871
+    if (($crit->op == ",") or ($crit->op == '/')) {
1872
+        return calculer_critere_parties($idb, $boucles, $crit);
1873
+    }
1874
+
1875
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1876
+    if (!$r) {
1877
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1878
+        #	if (!$crit->cond) {
1879
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1880
+        #	}
1881
+    } else {
1882
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1883
+    }
1884 1884
 }
1885 1885
 
1886 1886
 
@@ -1900,63 +1900,63 @@  discard block
 block discarded – undo
1900 1900
  * @return void
1901 1901
  **/
1902 1902
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1903
-	list($arg, $op, $val, $col, $where_complement) = $args;
1904
-
1905
-	$where = array("'$op'", "'$arg'", $val[0]);
1906
-
1907
-	// inserer la negation (cf !...)
1908
-
1909
-	if ($crit->not) {
1910
-		$where = array("'NOT'", $where);
1911
-	}
1912
-	if ($crit->exclus) {
1913
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1914
-			$where = array("'NOT'", $where);
1915
-		} else
1916
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1917
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1918
-		{
1919
-			$where = array(
1920
-				"'NOT'",
1921
-				array(
1922
-					"'IN'",
1923
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1924
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1925
-				)
1926
-			);
1927
-		}
1928
-	}
1929
-
1930
-	// inserer la condition (cf {lang?})
1931
-	// traiter a part la date, elle est mise d'office par SPIP,
1932
-	if ($crit->cond) {
1933
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1934
-		if ($col == "date" or $col == "date_redac") {
1935
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1936
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1937
-			}
1938
-		}
1939
-
1940
-		if ($op == '=' and !$crit->not) {
1941
-			$where = array(
1942
-				"'?'",
1943
-				"(is_array($pred))",
1944
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1945
-				$where
1946
-			);
1947
-		}
1948
-		$where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1949
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1950
-		{
1951
-			$where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1952
-		}
1953
-	}
1954
-
1955
-	$boucles[$idb]->where[] = $where;
1956
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1957
-	{
1958
-		$boucles[$idb]->where[] = $where_complement;
1959
-	}
1903
+    list($arg, $op, $val, $col, $where_complement) = $args;
1904
+
1905
+    $where = array("'$op'", "'$arg'", $val[0]);
1906
+
1907
+    // inserer la negation (cf !...)
1908
+
1909
+    if ($crit->not) {
1910
+        $where = array("'NOT'", $where);
1911
+    }
1912
+    if ($crit->exclus) {
1913
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1914
+            $where = array("'NOT'", $where);
1915
+        } else
1916
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1917
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1918
+        {
1919
+            $where = array(
1920
+                "'NOT'",
1921
+                array(
1922
+                    "'IN'",
1923
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1924
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1925
+                )
1926
+            );
1927
+        }
1928
+    }
1929
+
1930
+    // inserer la condition (cf {lang?})
1931
+    // traiter a part la date, elle est mise d'office par SPIP,
1932
+    if ($crit->cond) {
1933
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1934
+        if ($col == "date" or $col == "date_redac") {
1935
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1936
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1937
+            }
1938
+        }
1939
+
1940
+        if ($op == '=' and !$crit->not) {
1941
+            $where = array(
1942
+                "'?'",
1943
+                "(is_array($pred))",
1944
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1945
+                $where
1946
+            );
1947
+        }
1948
+        $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1949
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1950
+        {
1951
+            $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1952
+        }
1953
+    }
1954
+
1955
+    $boucles[$idb]->where[] = $where;
1956
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1957
+    {
1958
+        $boucles[$idb]->where[] = $where_complement;
1959
+    }
1960 1960
 }
1961 1961
 
1962 1962
 
@@ -1997,167 +1997,167 @@  discard block
 block discarded – undo
1997 1997
  **/
1998 1998
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1999 1999
 
2000
-	$boucle = &$boucles[$idb];
2001
-	$type = $boucle->type_requete;
2002
-	$table = $boucle->id_table;
2003
-	$desc = $boucle->show;
2004
-	$col_vraie = null;
2005
-
2006
-	list($fct, $col, $op, $val, $args_sql) =
2007
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2008
-
2009
-	$col_alias = $col;
2010
-	$where_complement = false;
2011
-
2012
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2013
-	if ($col == 'id_enfant') {
2014
-		$col = $boucle->primary;
2015
-	}
2016
-
2017
-	// Cas particulier : id_parent => verifier les exceptions de tables
2018
-	if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2019
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2020
-	) {
2021
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2022
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2023
-	else {
2024
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
2025
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2026
-		}
2027
-
2028
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2029
-		// sauf si exception declaree : sauter cette etape
2030
-		else {
2031
-			if (
2032
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2033
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2034
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2035
-			) {
2036
-				$e = decompose_champ_id_objet($col);
2037
-				$col = array_shift($e);
2038
-				$where_complement = primary_doublee($e, $table);
2039
-			} // Cas particulier : expressions de date
2040
-			else {
2041
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2042
-					list($col, $col_vraie) = $c;
2043
-					$table = '';
2044
-				} // table explicitée {mots.titre}
2045
-				else {
2046
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2047
-						list(, $table, $col) = $r;
2048
-						$col_alias = $col;
2049
-
2050
-						$trouver_table = charger_fonction('trouver_table', 'base');
2051
-						if ($desc = $trouver_table($table, $boucle->sql_serveur)
2052
-							and isset($desc['field'][$col])
2053
-							and $cle = array_search($desc['table'], $boucle->from)
2054
-						) {
2055
-							$table = $cle;
2056
-						} else {
2057
-							$table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2058
-						}
2059
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2060
-						if (!$table) {
2061
-							return '';
2062
-						}
2063
-					}
2064
-					// si le champ n'est pas trouvé dans la table,
2065
-					// on cherche si une jointure peut l'obtenir
2066
-					elseif (@!array_key_exists($col, $desc['field'])) {
2067
-						// Champ joker * des iterateurs DATA qui accepte tout
2068
-						if (@array_key_exists('*', $desc['field'])) {
2069
-							$desc['field'][$col_vraie ? $col_vraie : $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2070
-						}
2071
-						else {
2072
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2073
-							if (!$r) {
2074
-								return '';
2075
-							}
2076
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2077
-						}
2078
-					}
2079
-				}
2080
-			}
2081
-		}
2082
-	}
2083
-
2084
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2085
-	// Dans tous les cas,
2086
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2087
-	// et passer dans sql_quote avec le type si connu
2088
-	// et int sinon si la valeur est numerique
2089
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2090
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2091
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2092
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2093
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2094
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2095
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2096
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2097
-		}
2098
-		// sinon expliciter les
2099
-		// sql_quote(truc) en sql_quote(truc,'',type)
2100
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2101
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2102
-		// sans toucher aux
2103
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2104
-		// sql_quote(truc,'','varchar')
2105
-		elseif (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(strpos($val[0], '@@defaultcast@@') !== false
2115
-		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2116
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2117
-		}
2118
-	}
2119
-
2120
-	if(strpos($val[0], '@@defaultcast@@') !== false
2121
-	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2122
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2123
-	}
2124
-
2125
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2126
-	// leurs requetes par defaut, notamment le champ statut
2127
-	// Ne pas confondre champs de la table principale et des jointures
2128
-	if ($table === $boucle->id_table) {
2129
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2130
-		if ($col_alias != $col_vraie) {
2131
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2132
-		}
2133
-	}
2134
-
2135
-	// ajout pour le cas special d'une condition sur le champ statut:
2136
-	// il faut alors interdire a la fonction de boucle
2137
-	// de mettre ses propres criteres de statut
2138
-	// https://www.spip.net/@statut (a documenter)
2139
-	// garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2140
-	if ($col == 'statut') {
2141
-		$boucles[$idb]->statut = true;
2142
-	}
2143
-
2144
-	// inserer le nom de la table SQL devant le nom du champ
2145
-	if ($table) {
2146
-		if ($col[0] == "`") {
2147
-			$arg = "$table." . substr($col, 1, -1);
2148
-		} else {
2149
-			$arg = "$table.$col";
2150
-		}
2151
-	} else {
2152
-		$arg = $col;
2153
-	}
2154
-
2155
-	// inserer la fonction SQL
2156
-	if ($fct) {
2157
-		$arg = "$fct($arg$args_sql)";
2158
-	}
2159
-
2160
-	return array($arg, $op, $val, $col_alias, $where_complement);
2000
+    $boucle = &$boucles[$idb];
2001
+    $type = $boucle->type_requete;
2002
+    $table = $boucle->id_table;
2003
+    $desc = $boucle->show;
2004
+    $col_vraie = null;
2005
+
2006
+    list($fct, $col, $op, $val, $args_sql) =
2007
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2008
+
2009
+    $col_alias = $col;
2010
+    $where_complement = false;
2011
+
2012
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2013
+    if ($col == 'id_enfant') {
2014
+        $col = $boucle->primary;
2015
+    }
2016
+
2017
+    // Cas particulier : id_parent => verifier les exceptions de tables
2018
+    if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2019
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2020
+    ) {
2021
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2022
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2023
+    else {
2024
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
2025
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2026
+        }
2027
+
2028
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2029
+        // sauf si exception declaree : sauter cette etape
2030
+        else {
2031
+            if (
2032
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2033
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2034
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2035
+            ) {
2036
+                $e = decompose_champ_id_objet($col);
2037
+                $col = array_shift($e);
2038
+                $where_complement = primary_doublee($e, $table);
2039
+            } // Cas particulier : expressions de date
2040
+            else {
2041
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2042
+                    list($col, $col_vraie) = $c;
2043
+                    $table = '';
2044
+                } // table explicitée {mots.titre}
2045
+                else {
2046
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2047
+                        list(, $table, $col) = $r;
2048
+                        $col_alias = $col;
2049
+
2050
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2051
+                        if ($desc = $trouver_table($table, $boucle->sql_serveur)
2052
+                            and isset($desc['field'][$col])
2053
+                            and $cle = array_search($desc['table'], $boucle->from)
2054
+                        ) {
2055
+                            $table = $cle;
2056
+                        } else {
2057
+                            $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2058
+                        }
2059
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2060
+                        if (!$table) {
2061
+                            return '';
2062
+                        }
2063
+                    }
2064
+                    // si le champ n'est pas trouvé dans la table,
2065
+                    // on cherche si une jointure peut l'obtenir
2066
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2067
+                        // Champ joker * des iterateurs DATA qui accepte tout
2068
+                        if (@array_key_exists('*', $desc['field'])) {
2069
+                            $desc['field'][$col_vraie ? $col_vraie : $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2070
+                        }
2071
+                        else {
2072
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2073
+                            if (!$r) {
2074
+                                return '';
2075
+                            }
2076
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2077
+                        }
2078
+                    }
2079
+                }
2080
+            }
2081
+        }
2082
+    }
2083
+
2084
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2085
+    // Dans tous les cas,
2086
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2087
+    // et passer dans sql_quote avec le type si connu
2088
+    // et int sinon si la valeur est numerique
2089
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2090
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2091
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2092
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2093
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2094
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2095
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2096
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2097
+        }
2098
+        // sinon expliciter les
2099
+        // sql_quote(truc) en sql_quote(truc,'',type)
2100
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2101
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2102
+        // sans toucher aux
2103
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2104
+        // sql_quote(truc,'','varchar')
2105
+        elseif (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(strpos($val[0], '@@defaultcast@@') !== false
2115
+          and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2116
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2117
+        }
2118
+    }
2119
+
2120
+    if(strpos($val[0], '@@defaultcast@@') !== false
2121
+      and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2122
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2123
+    }
2124
+
2125
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2126
+    // leurs requetes par defaut, notamment le champ statut
2127
+    // Ne pas confondre champs de la table principale et des jointures
2128
+    if ($table === $boucle->id_table) {
2129
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2130
+        if ($col_alias != $col_vraie) {
2131
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2132
+        }
2133
+    }
2134
+
2135
+    // ajout pour le cas special d'une condition sur le champ statut:
2136
+    // il faut alors interdire a la fonction de boucle
2137
+    // de mettre ses propres criteres de statut
2138
+    // https://www.spip.net/@statut (a documenter)
2139
+    // garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2140
+    if ($col == 'statut') {
2141
+        $boucles[$idb]->statut = true;
2142
+    }
2143
+
2144
+    // inserer le nom de la table SQL devant le nom du champ
2145
+    if ($table) {
2146
+        if ($col[0] == "`") {
2147
+            $arg = "$table." . substr($col, 1, -1);
2148
+        } else {
2149
+            $arg = "$table.$col";
2150
+        }
2151
+    } else {
2152
+        $arg = $col;
2153
+    }
2154
+
2155
+    // inserer la fonction SQL
2156
+    if ($fct) {
2157
+        $arg = "$fct($arg$args_sql)";
2158
+    }
2159
+
2160
+    return array($arg, $op, $val, $col_alias, $where_complement);
2161 2161
 }
2162 2162
 
2163 2163
 
@@ -2186,77 +2186,77 @@  discard block
 block discarded – undo
2186 2186
  **/
2187 2187
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2188 2188
 
2189
-	$where = '';
2190
-
2191
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2192
-	// gestion par les plugins des jointures tordues
2193
-	// pas automatiques mais necessaires
2194
-	$table_sql = table_objet_sql($table);
2195
-	if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2196
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2197
-		and
2198
-		(
2199
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2200
-			or
2201
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2202
-		)
2203
-	) {
2204
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2205
-		$index = isset($t[$col])
2206
-			? $t[$col] : (isset($t['']) ? $t[''] : array());
2207
-
2208
-		if (count($index) == 3) {
2209
-			list($t, $col, $calculer_critere_externe) = $index;
2210
-		} elseif (count($index) == 2) {
2211
-			list($t, $col) = $t[$col];
2212
-		} elseif (count($index) == 1) {
2213
-			list($calculer_critere_externe) = $index;
2214
-			$t = $table;
2215
-		} else {
2216
-			$t = '';
2217
-		} // jointure non declaree. La trouver.
2218
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2219
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2220
-	} else {
2221
-		$t = '';
2222
-	} // jointure non declaree. La trouver.
2223
-
2224
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2225
-
2226
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2227
-	// permet de forcer une table de lien quand il y a ambiguite
2228
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2229
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2230
-	$table = "";
2231
-	if ($boucle->jointures_explicites) {
2232
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2233
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2234
-	}
2235
-
2236
-	// et sinon on cherche parmi toutes les jointures declarees
2237
-	if (!$table) {
2238
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2239
-	}
2240
-
2241
-	if (!$table) {
2242
-		return '';
2243
-	}
2244
-
2245
-	// il ne reste plus qu'a trouver le champ dans les from
2246
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2247
-
2248
-	if (count($cle) > 1 or reset($cle) !== $col) {
2249
-		$col_alias = $col; // id_article devient juste le nom d'origine
2250
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2251
-			$e = decompose_champ_id_objet($col);
2252
-			$col = array_shift($e);
2253
-			$where = primary_doublee($e, $table);
2254
-		} else {
2255
-			$col = reset($cle);
2256
-		}
2257
-	}
2258
-
2259
-	return array($col, $col_alias, $table, $where, $desc);
2189
+    $where = '';
2190
+
2191
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2192
+    // gestion par les plugins des jointures tordues
2193
+    // pas automatiques mais necessaires
2194
+    $table_sql = table_objet_sql($table);
2195
+    if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2196
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2197
+        and
2198
+        (
2199
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2200
+            or
2201
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2202
+        )
2203
+    ) {
2204
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2205
+        $index = isset($t[$col])
2206
+            ? $t[$col] : (isset($t['']) ? $t[''] : array());
2207
+
2208
+        if (count($index) == 3) {
2209
+            list($t, $col, $calculer_critere_externe) = $index;
2210
+        } elseif (count($index) == 2) {
2211
+            list($t, $col) = $t[$col];
2212
+        } elseif (count($index) == 1) {
2213
+            list($calculer_critere_externe) = $index;
2214
+            $t = $table;
2215
+        } else {
2216
+            $t = '';
2217
+        } // jointure non declaree. La trouver.
2218
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2219
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2220
+    } else {
2221
+        $t = '';
2222
+    } // jointure non declaree. La trouver.
2223
+
2224
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2225
+
2226
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2227
+    // permet de forcer une table de lien quand il y a ambiguite
2228
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2229
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2230
+    $table = "";
2231
+    if ($boucle->jointures_explicites) {
2232
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2233
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2234
+    }
2235
+
2236
+    // et sinon on cherche parmi toutes les jointures declarees
2237
+    if (!$table) {
2238
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2239
+    }
2240
+
2241
+    if (!$table) {
2242
+        return '';
2243
+    }
2244
+
2245
+    // il ne reste plus qu'a trouver le champ dans les from
2246
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2247
+
2248
+    if (count($cle) > 1 or reset($cle) !== $col) {
2249
+        $col_alias = $col; // id_article devient juste le nom d'origine
2250
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2251
+            $e = decompose_champ_id_objet($col);
2252
+            $col = array_shift($e);
2253
+            $where = primary_doublee($e, $table);
2254
+        } else {
2255
+            $col = reset($cle);
2256
+        }
2257
+    }
2258
+
2259
+    return array($col, $col_alias, $table, $where, $desc);
2260 2260
 }
2261 2261
 
2262 2262
 
@@ -2277,10 +2277,10 @@  discard block
 block discarded – undo
2277 2277
  *     - valeur
2278 2278
  **/
2279 2279
 function primary_doublee($decompose, $table) {
2280
-	$e1 = reset($decompose);
2281
-	$e2 = "sql_quote('" . end($decompose) . "')";
2280
+    $e1 = reset($decompose);
2281
+    $e2 = "sql_quote('" . end($decompose) . "')";
2282 2282
 
2283
-	return array("'='", "'$table." . $e1 . "'", $e2);
2283
+    return array("'='", "'$table." . $e1 . "'", $e2);
2284 2284
 }
2285 2285
 
2286 2286
 /**
@@ -2311,56 +2311,56 @@  discard block
 block discarded – undo
2311 2311
  *     Vide sinon.
2312 2312
  */
2313 2313
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2314
-	// si on demande un truc du genre spip_mots
2315
-	// avec aussi spip_mots_liens dans les jointures dispo
2316
-	// et qu'on est la
2317
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2318
-	if ($checkarrivee
2319
-		and is_string($checkarrivee)
2320
-		and $a = table_objet($checkarrivee)
2321
-		and in_array($a . '_liens', $joints)
2322
-	) {
2323
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2324
-			return $res;
2325
-		}
2326
-	}
2327
-	foreach ($joints as $joint) {
2328
-		if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2329
-			// alias de table dans le from
2330
-			$t = array_search($arrivee[0], $boucle->from);
2331
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2332
-			$cols = $arrivee[2];
2333
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2334
-			if (count($cols) > 2) {
2335
-				array_pop($cols);
2336
-			}
2337
-			if ($t) {
2338
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2339
-				$joindre = false;
2340
-				foreach ($cols as $col) {
2341
-					$c = '/\b' . $t . ".$col" . '\b/';
2342
-					if (trouver_champ($c, $boucle->where)) {
2343
-						$joindre = true;
2344
-					} else {
2345
-						// mais ca peut etre dans le FIELD pour le Having
2346
-						$c = "/FIELD.$t" . ".$col,/";
2347
-						if (trouver_champ($c, $boucle->select)) {
2348
-							$joindre = true;
2349
-						}
2350
-					}
2351
-				}
2352
-				if (!$joindre) {
2353
-					return $t;
2354
-				}
2355
-			}
2356
-			array_pop($arrivee);
2357
-			if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2358
-				return $res;
2359
-			}
2360
-		}
2361
-	}
2362
-
2363
-	return '';
2314
+    // si on demande un truc du genre spip_mots
2315
+    // avec aussi spip_mots_liens dans les jointures dispo
2316
+    // et qu'on est la
2317
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2318
+    if ($checkarrivee
2319
+        and is_string($checkarrivee)
2320
+        and $a = table_objet($checkarrivee)
2321
+        and in_array($a . '_liens', $joints)
2322
+    ) {
2323
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2324
+            return $res;
2325
+        }
2326
+    }
2327
+    foreach ($joints as $joint) {
2328
+        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2329
+            // alias de table dans le from
2330
+            $t = array_search($arrivee[0], $boucle->from);
2331
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2332
+            $cols = $arrivee[2];
2333
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2334
+            if (count($cols) > 2) {
2335
+                array_pop($cols);
2336
+            }
2337
+            if ($t) {
2338
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2339
+                $joindre = false;
2340
+                foreach ($cols as $col) {
2341
+                    $c = '/\b' . $t . ".$col" . '\b/';
2342
+                    if (trouver_champ($c, $boucle->where)) {
2343
+                        $joindre = true;
2344
+                    } else {
2345
+                        // mais ca peut etre dans le FIELD pour le Having
2346
+                        $c = "/FIELD.$t" . ".$col,/";
2347
+                        if (trouver_champ($c, $boucle->select)) {
2348
+                            $joindre = true;
2349
+                        }
2350
+                    }
2351
+                }
2352
+                if (!$joindre) {
2353
+                    return $t;
2354
+                }
2355
+            }
2356
+            array_pop($arrivee);
2357
+            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2358
+                return $res;
2359
+            }
2360
+        }
2361
+    }
2362
+
2363
+    return '';
2364 2364
 
2365 2365
 }
2366 2366
 
@@ -2387,29 +2387,29 @@  discard block
 block discarded – undo
2387 2387
  *     Alias de la table de jointure (Lx)
2388 2388
  */
2389 2389
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2390
-	$primary_arrivee = id_table_objet($checkarrivee);
2391
-
2392
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2393
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2394
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2395
-
2396
-	if (!$intermediaire or !$arrivee) {
2397
-		return '';
2398
-	}
2399
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2400
-	array_pop($arrivee); // enlever la cle en 3eme argument
2401
-
2402
-	$res = fabrique_jointures($boucle,
2403
-		array(
2404
-			array(
2405
-				$boucle->id_table,
2406
-				$intermediaire,
2407
-				array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2408
-			),
2409
-			array(reset($intermediaire), $arrivee, $primary_arrivee)
2410
-		), $cond, $desc, $boucle->id_table, array($col));
2411
-
2412
-	return $res;
2390
+    $primary_arrivee = id_table_objet($checkarrivee);
2391
+
2392
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2393
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2394
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2395
+
2396
+    if (!$intermediaire or !$arrivee) {
2397
+        return '';
2398
+    }
2399
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2400
+    array_pop($arrivee); // enlever la cle en 3eme argument
2401
+
2402
+    $res = fabrique_jointures($boucle,
2403
+        array(
2404
+            array(
2405
+                $boucle->id_table,
2406
+                $intermediaire,
2407
+                array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2408
+            ),
2409
+            array(reset($intermediaire), $arrivee, $primary_arrivee)
2410
+        ), $cond, $desc, $boucle->id_table, array($col));
2411
+
2412
+    return $res;
2413 2413
 }
2414 2414
 
2415 2415
 
@@ -2426,17 +2426,17 @@  discard block
 block discarded – undo
2426 2426
  *     false sinon.
2427 2427
  **/
2428 2428
 function trouver_champ($champ, $where) {
2429
-	if (!is_array($where)) {
2430
-		return preg_match($champ, $where);
2431
-	} else {
2432
-		foreach ($where as $clause) {
2433
-			if (trouver_champ($champ, $clause)) {
2434
-				return true;
2435
-			}
2436
-		}
2437
-
2438
-		return false;
2439
-	}
2429
+    if (!is_array($where)) {
2430
+        return preg_match($champ, $where);
2431
+    } else {
2432
+        foreach ($where as $clause) {
2433
+            if (trouver_champ($champ, $clause)) {
2434
+                return true;
2435
+            }
2436
+        }
2437
+
2438
+        return false;
2439
+    }
2440 2440
 }
2441 2441
 
2442 2442
 
@@ -2462,128 +2462,128 @@  discard block
 block discarded – undo
2462 2462
  *     - string $args_sql  Suite des arguments du critère. ?
2463 2463
  **/
2464 2464
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2465
-	// cas d'une valeur comparee a elle-meme ou son referent
2466
-	if (count($crit->param) == 0) {
2467
-		$op = '=';
2468
-		$col = $val = $crit->op;
2469
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2470
-			$val = $r[2];
2471
-		}
2472
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2473
-		if ($val == 'lang') {
2474
-			$val = array(kwote('$GLOBALS[\'spip_lang\']'));
2475
-		} else {
2476
-			$defaut = null;
2477
-			if ($val == 'id_parent') {
2478
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2479
-				// de la boucle superieure.... faudrait verifier qu'il existe
2480
-				// pour eviter l'erreur SQL
2481
-				$val = $boucles[$idb]->primary;
2482
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2483
-				$defaut = "@\$Pile[0]['id_parent']";
2484
-			} elseif ($val == 'id_enfant') {
2485
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2486
-				// de la boucle superieure
2487
-				$val = 'id_parent';
2488
-			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2489
-				// un critere conditionnel sur date est traite a part
2490
-				// car la date est mise d'office par SPIP,
2491
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2492
-			}
2493
-
2494
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2495
-			$val = array(kwote($val));
2496
-		}
2497
-	} else {
2498
-		// comparaison explicite
2499
-		// le phraseur impose que le premier param soit du texte
2500
-		$params = $crit->param;
2501
-		$op = $crit->op;
2502
-		if ($op == '==') {
2503
-			$op = 'REGEXP';
2504
-		}
2505
-		$col = array_shift($params);
2506
-		$col = $col[0]->texte;
2507
-
2508
-		$val = array();
2509
-		$parent = $boucles[$idb]->id_parent;
2510
-
2511
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2512
-		// celui ne sachant pas ce qu'est un critere infixe
2513
-		// et a fortiori son 2e operande qu'entoure " ou '
2514
-		if (count($params) == 1
2515
-			and count($params[0]) == 3
2516
-			and $params[0][0]->type == 'texte'
2517
-			and $params[0][2]->type == 'texte'
2518
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2519
-			and (($p == "'") or ($p == '"'))
2520
-			and $params[0][1]->type == 'champ'
2521
-		) {
2522
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2523
-		} else {
2524
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2525
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2526
-				if (strcasecmp($op, 'IN') == 0) {
2527
-					$val[] = $a;
2528
-				} else {
2529
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2530
-				} // toujours quoter en char ici
2531
-			}
2532
-		}
2533
-	}
2534
-
2535
-	$fct = $args_sql = '';
2536
-	// fonction SQL ?
2537
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2538
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2539
-		$fct = $m[1];
2540
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2541
-		$col = $a[1];
2542
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2543
-			$col = $m[1];
2544
-			$args_sql = $m[2];
2545
-		}
2546
-		$args_sql .= $a[2];
2547
-	}
2548
-
2549
-	return array($fct, $col, $op, $val, $args_sql);
2465
+    // cas d'une valeur comparee a elle-meme ou son referent
2466
+    if (count($crit->param) == 0) {
2467
+        $op = '=';
2468
+        $col = $val = $crit->op;
2469
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2470
+            $val = $r[2];
2471
+        }
2472
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2473
+        if ($val == 'lang') {
2474
+            $val = array(kwote('$GLOBALS[\'spip_lang\']'));
2475
+        } else {
2476
+            $defaut = null;
2477
+            if ($val == 'id_parent') {
2478
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2479
+                // de la boucle superieure.... faudrait verifier qu'il existe
2480
+                // pour eviter l'erreur SQL
2481
+                $val = $boucles[$idb]->primary;
2482
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2483
+                $defaut = "@\$Pile[0]['id_parent']";
2484
+            } elseif ($val == 'id_enfant') {
2485
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2486
+                // de la boucle superieure
2487
+                $val = 'id_parent';
2488
+            } elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2489
+                // un critere conditionnel sur date est traite a part
2490
+                // car la date est mise d'office par SPIP,
2491
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2492
+            }
2493
+
2494
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2495
+            $val = array(kwote($val));
2496
+        }
2497
+    } else {
2498
+        // comparaison explicite
2499
+        // le phraseur impose que le premier param soit du texte
2500
+        $params = $crit->param;
2501
+        $op = $crit->op;
2502
+        if ($op == '==') {
2503
+            $op = 'REGEXP';
2504
+        }
2505
+        $col = array_shift($params);
2506
+        $col = $col[0]->texte;
2507
+
2508
+        $val = array();
2509
+        $parent = $boucles[$idb]->id_parent;
2510
+
2511
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2512
+        // celui ne sachant pas ce qu'est un critere infixe
2513
+        // et a fortiori son 2e operande qu'entoure " ou '
2514
+        if (count($params) == 1
2515
+            and count($params[0]) == 3
2516
+            and $params[0][0]->type == 'texte'
2517
+            and $params[0][2]->type == 'texte'
2518
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2519
+            and (($p == "'") or ($p == '"'))
2520
+            and $params[0][1]->type == 'champ'
2521
+        ) {
2522
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2523
+        } else {
2524
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2525
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2526
+                if (strcasecmp($op, 'IN') == 0) {
2527
+                    $val[] = $a;
2528
+                } else {
2529
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2530
+                } // toujours quoter en char ici
2531
+            }
2532
+        }
2533
+    }
2534
+
2535
+    $fct = $args_sql = '';
2536
+    // fonction SQL ?
2537
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2538
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2539
+        $fct = $m[1];
2540
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2541
+        $col = $a[1];
2542
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2543
+            $col = $m[1];
2544
+            $args_sql = $m[2];
2545
+        }
2546
+        $args_sql .= $a[2];
2547
+    }
2548
+
2549
+    return array($fct, $col, $op, $val, $args_sql);
2550 2550
 }
2551 2551
 
2552 2552
 // compatibilite ancienne version
2553 2553
 
2554 2554
 // https://code.spip.net/@calculer_vieux_in
2555 2555
 function calculer_vieux_in($params) {
2556
-	$deb = $params[0][0];
2557
-	$k = count($params) - 1;
2558
-	$last = $params[$k];
2559
-	$j = count($last) - 1;
2560
-	$last = $last[$j];
2561
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2562
-
2563
-	if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2564
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2565
-	) {
2566
-		return $params;
2567
-	}
2568
-	$params[0][0]->texte = substr($deb->texte, 1);
2569
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2570
-	$last = $params[$k][$j];
2571
-	$n = strlen($last->texte);
2572
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2573
-	$newp = array();
2574
-	foreach ($params as $v) {
2575
-		if ($v[0]->type != 'texte') {
2576
-			$newp[] = $v;
2577
-		} else {
2578
-			foreach (explode(',', $v[0]->texte) as $x) {
2579
-				$t = new Texte;
2580
-				$t->texte = $x;
2581
-				$newp[] = array($t);
2582
-			}
2583
-		}
2584
-	}
2585
-
2586
-	return $newp;
2556
+    $deb = $params[0][0];
2557
+    $k = count($params) - 1;
2558
+    $last = $params[$k];
2559
+    $j = count($last) - 1;
2560
+    $last = $last[$j];
2561
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2562
+
2563
+    if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2564
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2565
+    ) {
2566
+        return $params;
2567
+    }
2568
+    $params[0][0]->texte = substr($deb->texte, 1);
2569
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2570
+    $last = $params[$k][$j];
2571
+    $n = strlen($last->texte);
2572
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2573
+    $newp = array();
2574
+    foreach ($params as $v) {
2575
+        if ($v[0]->type != 'texte') {
2576
+            $newp[] = $v;
2577
+        } else {
2578
+            foreach (explode(',', $v[0]->texte) as $x) {
2579
+                $t = new Texte;
2580
+                $t->texte = $x;
2581
+                $newp[] = array($t);
2582
+            }
2583
+        }
2584
+    }
2585
+
2586
+    return $newp;
2587 2587
 }
2588 2588
 
2589 2589
 /**
@@ -2602,89 +2602,89 @@  discard block
 block discarded – undo
2602 2602
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2603 2603
  **/
2604 2604
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2605
-	if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
2606
-		return '';
2607
-	}
2608
-
2609
-	$boucle = $boucles[$idb];
2610
-	$table = $boucle->show;
2611
-
2612
-	// si c'est une colonne de la table, ne rien faire
2613
-	if (isset($table['field'][$col])) {
2614
-		return '';
2615
-	}
2616
-
2617
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2618
-		return '';
2619
-	}
2620
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2621
-
2622
-	$col = $regs[1];
2623
-	if (isset($regs[3]) and $suite = $regs[3]) {
2624
-		# Recherche de l'existence du champ date_xxxx,
2625
-		# si oui choisir ce champ, sinon choisir xxxx
2626
-
2627
-		if (isset($table['field']["date$suite"])) {
2628
-			$date_orig = 'date' . $suite;
2629
-		} else {
2630
-			$date_orig = substr($suite, 1);
2631
-		}
2632
-		$pred = $date_orig;
2633
-	} else {
2634
-		if (isset($regs[2]) and $rel = $regs[2]) {
2635
-			$pred = 'date';
2636
-		}
2637
-	}
2638
-
2639
-	$date_compare = "\"' . normaliser_date(" .
2640
-		calculer_argument_precedent($idb, $pred, $boucles) .
2641
-		") . '\"";
2642
-
2643
-	$col_vraie = $date_orig;
2644
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2645
-
2646
-	switch ($col) {
2647
-		case 'date':
2648
-			$col = $date_orig;
2649
-			break;
2650
-		case 'jour':
2651
-			$col = "DAYOFMONTH($date_orig)";
2652
-			break;
2653
-		case 'mois':
2654
-			$col = "MONTH($date_orig)";
2655
-			break;
2656
-		case 'annee':
2657
-			$col = "YEAR($date_orig)";
2658
-			break;
2659
-		case 'heure':
2660
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2661
-			break;
2662
-		case 'age':
2663
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2664
-			$col_vraie = "";// comparer a un int (par defaut)
2665
-			break;
2666
-		case 'age_relatif':
2667
-			$col = calculer_param_date($date_compare, $date_orig);
2668
-			$col_vraie = "";// comparer a un int (par defaut)
2669
-			break;
2670
-		case 'jour_relatif':
2671
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2672
-			$col_vraie = "";// comparer a un int (par defaut)
2673
-			break;
2674
-		case 'mois_relatif':
2675
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2676
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2677
-				")-YEAR(" . $date_orig . "))";
2678
-			$col_vraie = "";// comparer a un int (par defaut)
2679
-			break;
2680
-		case 'annee_relatif':
2681
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2682
-				$date_orig . ")";
2683
-			$col_vraie = "";// comparer a un int (par defaut)
2684
-			break;
2685
-	}
2686
-
2687
-	return array($col, $col_vraie);
2605
+    if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
2606
+        return '';
2607
+    }
2608
+
2609
+    $boucle = $boucles[$idb];
2610
+    $table = $boucle->show;
2611
+
2612
+    // si c'est une colonne de la table, ne rien faire
2613
+    if (isset($table['field'][$col])) {
2614
+        return '';
2615
+    }
2616
+
2617
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2618
+        return '';
2619
+    }
2620
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2621
+
2622
+    $col = $regs[1];
2623
+    if (isset($regs[3]) and $suite = $regs[3]) {
2624
+        # Recherche de l'existence du champ date_xxxx,
2625
+        # si oui choisir ce champ, sinon choisir xxxx
2626
+
2627
+        if (isset($table['field']["date$suite"])) {
2628
+            $date_orig = 'date' . $suite;
2629
+        } else {
2630
+            $date_orig = substr($suite, 1);
2631
+        }
2632
+        $pred = $date_orig;
2633
+    } else {
2634
+        if (isset($regs[2]) and $rel = $regs[2]) {
2635
+            $pred = 'date';
2636
+        }
2637
+    }
2638
+
2639
+    $date_compare = "\"' . normaliser_date(" .
2640
+        calculer_argument_precedent($idb, $pred, $boucles) .
2641
+        ") . '\"";
2642
+
2643
+    $col_vraie = $date_orig;
2644
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2645
+
2646
+    switch ($col) {
2647
+        case 'date':
2648
+            $col = $date_orig;
2649
+            break;
2650
+        case 'jour':
2651
+            $col = "DAYOFMONTH($date_orig)";
2652
+            break;
2653
+        case 'mois':
2654
+            $col = "MONTH($date_orig)";
2655
+            break;
2656
+        case 'annee':
2657
+            $col = "YEAR($date_orig)";
2658
+            break;
2659
+        case 'heure':
2660
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2661
+            break;
2662
+        case 'age':
2663
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2664
+            $col_vraie = "";// comparer a un int (par defaut)
2665
+            break;
2666
+        case 'age_relatif':
2667
+            $col = calculer_param_date($date_compare, $date_orig);
2668
+            $col_vraie = "";// comparer a un int (par defaut)
2669
+            break;
2670
+        case 'jour_relatif':
2671
+            $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2672
+            $col_vraie = "";// comparer a un int (par defaut)
2673
+            break;
2674
+        case 'mois_relatif':
2675
+            $col = "MONTH(" . $date_compare . ")-MONTH(" .
2676
+                $date_orig . ")+12*(YEAR(" . $date_compare .
2677
+                ")-YEAR(" . $date_orig . "))";
2678
+            $col_vraie = "";// comparer a un int (par defaut)
2679
+            break;
2680
+        case 'annee_relatif':
2681
+            $col = "YEAR(" . $date_compare . ")-YEAR(" .
2682
+                $date_orig . ")";
2683
+            $col_vraie = "";// comparer a un int (par defaut)
2684
+            break;
2685
+    }
2686
+
2687
+    return array($col, $col_vraie);
2688 2688
 }
2689 2689
 
2690 2690
 /**
@@ -2703,16 +2703,16 @@  discard block
 block discarded – undo
2703 2703
  *     de colonne SQL et une date.
2704 2704
  **/
2705 2705
 function calculer_param_date($date_compare, $date_orig) {
2706
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2707
-		$init = "'\" . (\$x = $r[1]) . \"'";
2708
-		$date_compare = '\'$x\'';
2709
-	} else {
2710
-		$init = $date_compare;
2711
-	}
2712
-
2713
-	return
2714
-		// optimisation : mais prevoir le support SQLite avant
2715
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2706
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2707
+        $init = "'\" . (\$x = $r[1]) . \"'";
2708
+        $date_compare = '\'$x\'';
2709
+    } else {
2710
+        $init = $date_compare;
2711
+    }
2712
+
2713
+    return
2714
+        // optimisation : mais prevoir le support SQLite avant
2715
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2716 2716
 }
2717 2717
 
2718 2718
 /**
@@ -2730,18 +2730,18 @@  discard block
 block discarded – undo
2730 2730
  * @param Critere $crit Paramètres du critère dans cette boucle
2731 2731
  */
2732 2732
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2733
-	$boucle = &$boucles[$idb];
2733
+    $boucle = &$boucles[$idb];
2734 2734
 
2735
-	$args = array();
2736
-	foreach ($crit->param as &$param) {
2737
-		array_push($args,
2738
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2739
-	}
2735
+    $args = array();
2736
+    foreach ($crit->param as &$param) {
2737
+        array_push($args,
2738
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2739
+    }
2740 2740
 
2741
-	$boucle->hash .= '
2741
+    $boucle->hash .= '
2742 2742
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2743 2743
 
2744
-	$boucle->hash .= '
2744
+    $boucle->hash .= '
2745 2745
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2746 2746
 }
2747 2747
 
@@ -2758,8 +2758,8 @@  discard block
 block discarded – undo
2758 2758
  * @param Critere $crit Paramètres du critère dans cette boucle
2759 2759
  */
2760 2760
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2761
-	$boucle = &$boucles[$idb];
2762
-	$boucle->hash .= '
2761
+    $boucle = &$boucles[$idb];
2762
+    $boucle->hash .= '
2763 2763
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2764 2764
 	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2765 2765
 }
@@ -2779,8 +2779,8 @@  discard block
 block discarded – undo
2779 2779
  * @param Critere $crit Paramètres du critère dans cette boucle
2780 2780
  */
2781 2781
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2782
-	$boucle = &$boucles[$idb];
2783
-	$boucle->hash .= '
2782
+    $boucle = &$boucles[$idb];
2783
+    $boucle->hash .= '
2784 2784
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2785 2785
 }
2786 2786
 
@@ -2796,12 +2796,12 @@  discard block
 block discarded – undo
2796 2796
  * @param Critere $crit Paramètres du critère dans cette boucle
2797 2797
  */
2798 2798
 function critere_php_args_dist($idb, &$boucles, $crit) {
2799
-	$boucle = &$boucles[$idb];
2800
-	$boucle->hash .= '$command[\'args\']=array();';
2801
-	foreach ($crit->param as $param) {
2802
-		$boucle->hash .= '
2799
+    $boucle = &$boucles[$idb];
2800
+    $boucle->hash .= '$command[\'args\']=array();';
2801
+    foreach ($crit->param as $param) {
2802
+        $boucle->hash .= '
2803 2803
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2804
-	}
2804
+    }
2805 2805
 }
2806 2806
 
2807 2807
 /**
@@ -2818,12 +2818,12 @@  discard block
 block discarded – undo
2818 2818
  * @param Critere $crit Paramètres du critère dans cette boucle
2819 2819
  */
2820 2820
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2821
-	$boucle = &$boucles[$idb];
2822
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2823
-	foreach ($crit->param as $param) {
2824
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2825
-				$boucles[$idb]->id_parent) . ";\n";
2826
-	}
2821
+    $boucle = &$boucles[$idb];
2822
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2823
+    foreach ($crit->param as $param) {
2824
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2825
+                $boucles[$idb]->id_parent) . ";\n";
2826
+    }
2827 2827
 }
2828 2828
 
2829 2829
 /**
@@ -2848,12 +2848,12 @@  discard block
 block discarded – undo
2848 2848
  * @param Critere $crit Paramètres du critère dans cette boucle
2849 2849
  */
2850 2850
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2851
-	$boucle = &$boucles[$idb];
2852
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2853
-	foreach ($crit->param as $param) {
2854
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2855
-				$boucles[$idb]->id_parent) . ";\n";
2856
-	}
2851
+    $boucle = &$boucles[$idb];
2852
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2853
+    foreach ($crit->param as $param) {
2854
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2855
+                $boucles[$idb]->id_parent) . ";\n";
2856
+    }
2857 2857
 }
2858 2858
 
2859 2859
 /**
@@ -2868,11 +2868,11 @@  discard block
 block discarded – undo
2868 2868
  * @param Critere $crit Paramètres du critère dans cette boucle
2869 2869
  */
2870 2870
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2871
-	$boucle = &$boucles[$idb];
2872
-	foreach ($crit->param as $param) {
2873
-		$boucle->hash .= '
2871
+    $boucle = &$boucles[$idb];
2872
+    foreach ($crit->param as $param) {
2873
+        $boucle->hash .= '
2874 2874
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2875
-	}
2875
+    }
2876 2876
 }
2877 2877
 
2878 2878
 
@@ -2904,20 +2904,20 @@  discard block
 block discarded – undo
2904 2904
  * @param Critere $crit Paramètres du critère dans cette boucle
2905 2905
  */
2906 2906
 function critere_si_dist($idb, &$boucles, $crit) {
2907
-	$boucle = &$boucles[$idb];
2908
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2909
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2910
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2911
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2912
-	if ($crit->param) {
2913
-		foreach ($crit->param as $param) {
2914
-			$boucle->hash .= "\t\$command['si'][] = "
2915
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2916
-		}
2917
-		// interdire {si 0} aussi !
2918
-	} else {
2919
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2920
-	}
2907
+    $boucle = &$boucles[$idb];
2908
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2909
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2910
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2911
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2912
+    if ($crit->param) {
2913
+        foreach ($crit->param as $param) {
2914
+            $boucle->hash .= "\t\$command['si'][] = "
2915
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2916
+        }
2917
+        // interdire {si 0} aussi !
2918
+    } else {
2919
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2920
+    }
2921 2921
 }
2922 2922
 
2923 2923
 /**
@@ -2933,8 +2933,8 @@  discard block
 block discarded – undo
2933 2933
  * @param Critere $crit Paramètres du critère dans cette boucle
2934 2934
  */
2935 2935
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2936
-	$boucle = &$boucles[$idb];
2937
-	$boucle->hash .= '
2936
+    $boucle = &$boucles[$idb];
2937
+    $boucle->hash .= '
2938 2938
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2939 2939
 	$command[\'sourcemode\'] = \'table\';';
2940 2940
 }
@@ -2955,29 +2955,29 @@  discard block
 block discarded – undo
2955 2955
  */
2956 2956
 function critere_noeud_dist($idb, &$boucles, $crit) {
2957 2957
 
2958
-	$not = $crit->not;
2959
-	$boucle = &$boucles[$idb];
2960
-	$primary = $boucle->primary;
2958
+    $not = $crit->not;
2959
+    $boucle = &$boucles[$idb];
2960
+    $primary = $boucle->primary;
2961 2961
 
2962
-	if (!$primary or strpos($primary, ',')) {
2963
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2962
+    if (!$primary or strpos($primary, ',')) {
2963
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2964 2964
 
2965
-		return;
2966
-	}
2967
-	$table = $boucle->type_requete;
2968
-	$table_sql = table_objet_sql(objet_type($table));
2965
+        return;
2966
+    }
2967
+    $table = $boucle->type_requete;
2968
+    $table_sql = table_objet_sql(objet_type($table));
2969 2969
 
2970
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2971
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2972
-		'id_parent';
2970
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2971
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2972
+        'id_parent';
2973 2973
 
2974
-	$in = "IN";
2975
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2976
-	if ($not) {
2977
-		$where = array("'NOT'", $where);
2978
-	}
2974
+    $in = "IN";
2975
+    $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2976
+    if ($not) {
2977
+        $where = array("'NOT'", $where);
2978
+    }
2979 2979
 
2980
-	$boucle->where[] = $where;
2980
+    $boucle->where[] = $where;
2981 2981
 }
2982 2982
 
2983 2983
 /**
@@ -2993,8 +2993,8 @@  discard block
 block discarded – undo
2993 2993
  * @param Critere $crit Paramètres du critère dans cette boucle
2994 2994
  */
2995 2995
 function critere_feuille_dist($idb, &$boucles, $crit) {
2996
-	$not = $crit->not;
2997
-	$crit->not = $not ? false : true;
2998
-	critere_noeud_dist($idb, $boucles, $crit);
2999
-	$crit->not = $not;
2996
+    $not = $crit->not;
2997
+    $crit->not = $not ? false : true;
2998
+    critere_noeud_dist($idb, $boucles, $crit);
2999
+    $crit->not = $not;
3000 3000
 }
Please login to merge, or discard this patch.
Spacing   +182 added lines, -190 removed lines patch added patch discarded remove patch
@@ -46,10 +46,9 @@  discard block
 block discarded – undo
46 46
 	$not = $crit->not;
47 47
 	$boucle = &$boucles[$idb];
48 48
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
49
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
51 50
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
51
+	$c = array("'='", "'$boucle->id_table."."$id_parent'", 0);
53 52
 	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 53
 }
55 54
 
@@ -72,10 +71,10 @@  discard block
 block discarded – undo
72 71
 	$id = $boucle->primary;
73 72
 
74 73
 	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
74
+		return (array('zbug_critere_inconnu', array('critere' => $not.$crit->op)));
76 75
 	}
77 76
 	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
77
+	$boucle->where[] = array("'!='", "'$boucle->id_table."."$id'", $arg);
79 78
 }
80 79
 
81 80
 
@@ -106,12 +105,12 @@  discard block
 block discarded – undo
106 105
 	$not = ($crit->not ? '' : 'NOT');
107 106
 
108 107
 	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
108
+	$nom = "'".$boucle->type_requete."'";
110 109
 
111 110
 	// compléter le nom avec un nom précisé {doublons nom}
112 111
 	// on obtient $nom = "'article' . 'nom'"
113 112
 	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
113
+		$nom .= ".".calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115 114
 	}
116 115
 
117 116
 	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
@@ -123,13 +122,13 @@  discard block
 block discarded – undo
123 122
 	// $doublons et son index, ici $nom
124 123
 
125 124
 	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
+	$debut_in = "sql_in('".$boucle->id_table.'.'.$primary."', ";
127 126
 	// lecture des données du doublon "$doublons[$doublon_index[] = "
128 127
 	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
128
+	$debut_doub = '$doublons['.(!$not ? '' : ($boucle->doublons."[]= "));
130 129
 
131 130
 	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
131
+	$debut_doub = $debut_in.$debut_doub;
133 132
 
134 133
 	// nom du doublon "('article' . 'nom')]"
135 134
 	$fin_doub = "($nom)]";
@@ -139,22 +138,22 @@  discard block
 block discarded – undo
139 138
 	foreach ($boucle->where as $k => $w) {
140 139
 		if (strpos($w[0], $debut_doub) === 0) {
141 140
 			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
+			$boucle->where[$k][0] = $debut_doub.$fin_doub.' . '.substr($w[0], strlen($debut_in));
143 142
 			// fusionner l'initialisation (du hash) pour faire plus joli
144 143
 			$x = strpos($boucle->hash, $init_comment);
145 144
 			$len = strlen($init_comment);
146 145
 			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
+				substr($boucle->hash, 0, $x + $len).$init_code.substr($boucle->hash, $x + $len);
148 147
 
149 148
 			return;
150 149
 		}
151 150
 	}
152 151
 
153 152
 	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
153
+	$boucle->where[] = array($debut_doub.$fin_doub.", '".$not."')");
155 154
 
156 155
 	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
156
+	$boucle->hash .= $init_comment.$init_code;
158 157
 
159 158
 
160 159
 	# la ligne suivante avait l'intention d'eviter une collecte deja faite
@@ -215,10 +214,10 @@  discard block
 block discarded – undo
215 214
 	$un = $un[0]->texte;
216 215
 	$deux = $deux[0]->texte;
217 216
 	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
217
+		$boucles[$idb]->limit = 'intval($Pile[0]["debut'.
218
+			$un.
219
+			'"]) . ",'.
220
+			$deux.
222 221
 			'"';
223 222
 	} else {
224 223
 		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
@@ -281,26 +280,26 @@  discard block
 block discarded – undo
281 280
 		$type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282 281
 	}
283 282
 
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
283
+	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut".substr($type, 1));
285 284
 	$boucle->modificateur['debut_nom'] = $type;
286 285
 	$partie =
287 286
 		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
287
+		'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n"
289 288
 		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
289
+		. "\t\t".'$debut_boucle = $Pile[0]['.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$iter);'."\n"
290
+		. "\t\t".'$iter->seek(0);'."\n"
292 291
 		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
292
+		. "\t".'$debut_boucle = intval($debut_boucle)';
294 293
 
295 294
 	$boucle->hash .= '
296
-	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
295
+	$command[\'pagination\'] = array((isset($Pile[0][' . $debut.']) ? $Pile[0]['.$debut.'] : null), '.$pas.');';
297 296
 
298 297
 	$boucle->total_parties = $pas;
299 298
 	calculer_parties($boucles, $idb, $partie, 'p+');
300 299
 	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301 300
 	// sauf si pas de primaire, ou si primaire composee
302 301
 	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
302
+	$t = $boucle->id_table.'.'.$boucle->primary;
304 303
 	if ($boucle->primary
305 304
 		and !preg_match('/[,\s]/', $boucle->primary)
306 305
 		and !in_array($t, $boucle->select)
@@ -346,24 +345,24 @@  discard block
 block discarded – undo
346 345
 	$boucle->hash .= '
347 346
 	// RECHERCHE'
348 347
 		. ($crit->cond ? '
349
-	if (!strlen(' . $quoi . ')){
348
+	if (!strlen(' . $quoi.')){
350 349
 		list($rech_select, $rech_where) = array("0 as points","");
351
-	} else' : '') . '
350
+	} else' : '').'
352 351
 	{
353 352
 		$prepare_recherche = charger_fonction(\'prepare_recherche\', \'inc\');
354
-		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi . ', "' . $boucle->id_table . '", "' . $crit->cond . '","' . $boucle->sql_serveur . '",' . $_modificateur . ',"' . $boucle->primary . '");
353
+		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'","'.$boucle->sql_serveur.'",'.$_modificateur.',"'.$boucle->primary.'");
355 354
 	}
356 355
 	';
357 356
 
358 357
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
358
+	$t = $boucle->id_table.'.'.$boucle->primary;
360 359
 	if (!in_array($t, $boucles[$idb]->select)) {
361 360
 		$boucle->select[] = $t;
362 361
 	} # pour postgres, neuneu ici
363 362
 	// jointure uniquement sur le serveur principal
364 363
 	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365 364
 	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
365
+		$boucle->join['resultats'] = array("'".$boucle->id_table."'", "'id'", "'".$boucle->primary."'");
367 366
 		$boucle->from['resultats'] = 'spip_resultats';
368 367
 	}
369 368
 	$boucle->select[] = '$rech_select';
@@ -430,7 +429,7 @@  discard block
 block discarded – undo
430 429
 	$c =
431 430
 		array(
432 431
 			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
432
+			array("'='", "'$table."."id_trad'", "'$table.$prim'"),
434 433
 			array("'='", "'$table.id_trad'", "'0'")
435 434
 		);
436 435
 	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
@@ -453,16 +452,15 @@  discard block
 block discarded – undo
453 452
 	$boucle = &$boucles[$idb];
454 453
 	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455 454
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
455
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
456
+	$mparent = $boucle->id_table.'.'.$id_parent;
459 457
 
460 458
 	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461 459
 		$boucle->where[] = array("'='", "'$mparent'", $arg);
462 460
 
463 461
 	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464 462
 	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
463
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op.' '.$boucle->type_requete)));
466 464
 	}
467 465
 }
468 466
 
@@ -515,16 +513,15 @@  discard block
 block discarded – undo
515 513
 		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516 514
 			$decompose = decompose_champ_id_objet($champ);
517 515
 			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
516
+			$boucle->where[] = array("'='", _q($cle.".".reset($decompose)), '"'.sql_quote(end($decompose)).'"');
519 517
 		}
520 518
 	} else {
521 519
 		$cle = $boucle->id_table;
522 520
 	}
523 521
 
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
522
+	$c = "sql_in('$cle".".$champ', calcul_branche_in($arg)"
523
+		. ($not ? ", 'NOT'" : '').")";
524
+	$boucle->where[] = !$crit->cond ? $c : ("($arg ? $c : ".($not ? "'0=1'" : "'1=1'").')');
528 525
 }
529 526
 
530 527
 /**
@@ -544,9 +541,9 @@  discard block
 block discarded – undo
544 541
 	$not = ($crit->not ? 'NOT' : '');
545 542
 	$serveur = $boucle->sql_serveur;
546 543
 
547
-	$c = "sql_in('" .
548
-		$boucle->id_table . '.' . $boucle->primary
549
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
544
+	$c = "sql_in('".
545
+		$boucle->id_table.'.'.$boucle->primary
546
+		. "', lister_objets_avec_logos('".$boucle->primary."'), '$not', '$serveur')";
550 547
 
551 548
 	$boucle->where[] = $c;
552 549
 }
@@ -578,7 +575,7 @@  discard block
 block discarded – undo
578 575
 				$t = table_objet_sql($r[1]);
579 576
 				$t = array_search($t, $boucles[$idb]->from);
580 577
 				if ($t) {
581
-					$t .= '.' . $r[2];
578
+					$t .= '.'.$r[2];
582 579
 				}
583 580
 			}
584 581
 		} else {
@@ -593,7 +590,7 @@  discard block
 block discarded – undo
593 590
 			$boucles[$idb]->select[] = $t;
594 591
 		}
595 592
 	} else {
596
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
593
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op.' ?')));
597 594
 	}
598 595
 }
599 596
 
@@ -614,7 +611,7 @@  discard block
 block discarded – undo
614 611
  * @return void
615 612
  **/
616 613
 if (!function_exists('critere_fusion_supprimer_dist')) {
617
-	function critere_fusion_supprimer_dist($idb, &$boucles, $crit){
614
+	function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
618 615
 		$boucles[$idb]->group = array();
619 616
 	}
620 617
 }
@@ -665,26 +662,26 @@  discard block
 block discarded – undo
665 662
 				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
666 663
 				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
667 664
 			) {
668
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
665
+				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . ".$boucle->modificateur['collate']." . ' ", $i, 0);
669 666
 			} else {
670
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
667
+				$boucle->order[$n - 1] .= " . ".$boucle->modificateur['collate'];
671 668
 			}
672 669
 		}
673 670
 	} else {
674
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
671
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ".count($boucles[$idb]->order))));
675 672
 	}
676 673
 }
677 674
 
678 675
 // https://code.spip.net/@calculer_critere_arg_dynamique
679 676
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
680 677
 	$boucle = $boucles[$idb];
681
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
682
-	$var = '$champs_' . $idb;
678
+	$alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')';
679
+	$var = '$champs_'.$idb;
683 680
 	$desc = (strpos($boucle->in, "static $var =") !== false);
684 681
 	if (!$desc) {
685 682
 		$desc = $boucle->show['field'];
686 683
 		$desc = implode(',', array_map('_q', array_keys($desc)));
687
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
684
+		$boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.");";
688 685
 	}
689 686
 	if ($desc) {
690 687
 		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
@@ -759,7 +756,7 @@  discard block
 block discarded – undo
759 756
 		$sens = " . ' DESC'";
760 757
 	}
761 758
 	if (isset($boucle->modificateur['collate'])) {
762
-		$collecte = ' . ' . $boucle->modificateur['collate'];
759
+		$collecte = ' . '.$boucle->modificateur['collate'];
763 760
 	}
764 761
 
765 762
 	// Pour chaque paramètre du critère
@@ -781,14 +778,14 @@  discard block
 block discarded – undo
781 778
 			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
782 779
 				$expression = trim($m[1]);
783 780
 				$champ = trim($m[2]);
784
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
781
+				if (function_exists($f = 'calculer_critere_par_expression_'.$expression)) {
785 782
 					$order = $f($idb, $boucles, $crit, $tri, $champ);
786 783
 				} else {
787
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
784
+					return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
788 785
 				}
789 786
 
790 787
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
791
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
788
+			} elseif (preg_match(",^".CHAMP_SQL_PLUS_FONC.'$,is', $par, $match)) {
792 789
 				// {par FONCTION(champ)}
793 790
 				if (count($match) > 2) {
794 791
 					$par = substr($match[2], 1, -1);
@@ -798,7 +795,7 @@  discard block
 block discarded – undo
798 795
 				if ($par == 'hasard') {
799 796
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
800 797
 				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
801
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
798
+					$order = "'".$boucle->id_table.".".$boucle->show['date']."'";
802 799
 				} else {
803 800
 					// cas général {par champ}, {par table.champ}, ...
804 801
 					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
@@ -807,7 +804,7 @@  discard block
 block discarded – undo
807 804
 
808 805
 			// on ne sait pas traiter…
809 806
 			else {
810
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
807
+				return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
811 808
 			}
812 809
 
813 810
 			// En cas d'erreur de squelette retournée par une fonction
@@ -827,14 +824,14 @@  discard block
 block discarded – undo
827 824
 
828 825
 		if ($fct) {
829 826
 			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
830
-				$order = "'$fct(" . $r[1] . ")'";
827
+				$order = "'$fct(".$r[1].")'";
831 828
 			} else {
832 829
 				$order = "'$fct(' . $order . ')'";
833 830
 			}
834 831
 		}
835
-		$t = $order . $collecte . $sens;
832
+		$t = $order.$collecte.$sens;
836 833
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
837
-			$t = $r[1] . $r[2];
834
+			$t = $r[1].$r[2];
838 835
 		}
839 836
 
840 837
 		$boucle->order[] = $t;
@@ -884,16 +881,16 @@  discard block
 block discarded – undo
884 881
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
885 882
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
886 883
 	if (is_array($_champ)) {
887
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
884
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." num $champ"));
888 885
 	}
889 886
 	$boucle = &$boucles[$idb];
890
-	$texte = '0+' . $_champ;
887
+	$texte = '0+'.$_champ;
891 888
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
892 889
 	if ($suite !== "''") {
893
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
890
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
894 891
 	}
895
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
896
-	$boucle->select[] = $texte . " AS $as";
892
+	$as = 'num'.($boucle->order ? count($boucle->order) : "");
893
+	$boucle->select[] = $texte." AS $as";
897 894
 	$order = "'$as'";
898 895
 	return $order;
899 896
 }
@@ -918,16 +915,16 @@  discard block
 block discarded – undo
918 915
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
919 916
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
920 917
 	if (is_array($_champ)) {
921
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
918
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." sinum $champ"));
922 919
 	}
923 920
 	$boucle = &$boucles[$idb];
924
-	$texte = '0+' . $_champ;
921
+	$texte = '0+'.$_champ;
925 922
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
926 923
 	if ($suite !== "''") {
927
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
924
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
928 925
 	}
929
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
930
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
926
+	$as = 'sinum'.($boucle->order ? count($boucle->order) : "");
927
+	$boucle->select[] = 'CASE ('.$texte.') WHEN 0 THEN 1 ELSE 0 END AS '.$as;
931 928
 	$order = "'$as'";
932 929
 	return $order;
933 930
 }
@@ -951,10 +948,10 @@  discard block
 block discarded – undo
951 948
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
952 949
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
953 950
 	if (is_array($_champ)) {
954
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
951
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." multi $champ"));
955 952
 	}
956 953
 	$boucle = &$boucles[$idb];
957
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
954
+	$boucle->select[] = "\".sql_multi('".$_champ."', \$GLOBALS['spip_lang']).\"";
958 955
 	$order = "'multi'";
959 956
 	return $order;
960 957
 }
@@ -974,13 +971,13 @@  discard block
 block discarded – undo
974 971
  * @param bool $raw Retourne le champ pour le compilateur ("'alias.champ'") ou brut ('alias.champ')
975 972
  * @return array|string
976 973
  */
977
-function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
974
+function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
978 975
 	$boucle = &$boucles[$idb];
979 976
 	$desc = $boucle->show;
980 977
 
981 978
 	// le champ existe dans la table, pas de souci (le plus commun)
982 979
 	if (isset($desc['field'][$par])) {
983
-		$par = $boucle->id_table . "." . $par;
980
+		$par = $boucle->id_table.".".$par;
984 981
 	}
985 982
 	// le champ est peut être une jointure
986 983
 	else {
@@ -1001,24 +998,24 @@  discard block
 block discarded – undo
1001 998
 		// Sinon on cherche le champ dans les tables possibles de jointures
1002 999
 		// Si la table est déjà dans le from, on la réutilise.
1003 1000
 		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1004
-			$par = $infos['alias'] . "." . $champ;
1001
+			$par = $infos['alias'].".".$champ;
1005 1002
 		} elseif (
1006 1003
 			$boucle->jointures_explicites
1007 1004
 			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1008 1005
 		) {
1009
-			$par = $alias . "." . $champ;
1006
+			$par = $alias.".".$champ;
1010 1007
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1011
-			$par = $alias . "." . $champ;
1008
+			$par = $alias.".".$champ;
1012 1009
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1013 1010
 		} elseif (
1014 1011
 			$table_alias
1015 1012
 			and isset($boucle->from[$table_alias])
1016 1013
 			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1017 1014
 		) {
1018
-			$par = $infos['alias'] . "." . $champ;
1015
+			$par = $infos['alias'].".".$champ;
1019 1016
 		} elseif ($table) {
1020 1017
 			// On avait table + champ, mais on ne les a pas trouvés
1021
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1018
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
1022 1019
 		} else {
1023 1020
 			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1024 1021
 		}
@@ -1042,7 +1039,7 @@  discard block
 block discarded – undo
1042 1039
 	if (!$t) {
1043 1040
 		$t = trouver_jointure_champ($champ, $boucle);
1044 1041
 	}
1045
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1042
+	return !$t ? '' : ("'".$t.'.'.$champ."'");
1046 1043
 }
1047 1044
 
1048 1045
 /**
@@ -1087,9 +1084,9 @@  discard block
 block discarded – undo
1087 1084
 				$boucle->default_order[] = ' DESC';
1088 1085
 			}
1089 1086
 		} else {
1090
-			$t = $boucle->order[$n - 1] . " . $order";
1087
+			$t = $boucle->order[$n - 1]." . $order";
1091 1088
 			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1092
-				$t = $r[1] . $r[2];
1089
+				$t = $r[1].$r[2];
1093 1090
 			}
1094 1091
 			$boucle->order[$n - 1] = $t;
1095 1092
 		}
@@ -1103,11 +1100,11 @@  discard block
 block discarded – undo
1103 1100
  * @param $crit
1104 1101
  * @return array|string
1105 1102
  */
1106
-function critere_par_ordre_liste_dist($idb, &$boucles, $crit){
1103
+function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1107 1104
 	$boucle = &$boucles[$idb];
1108 1105
 
1109 1106
 	$sens = $collecte = '';
1110
-	if ($crit->not){
1107
+	if ($crit->not) {
1111 1108
 		$sens = " . ' DESC'";
1112 1109
 	}
1113 1110
 
@@ -1117,14 +1114,14 @@  discard block
 block discarded – undo
1117 1114
 	$res = critere_parinverse($idb, $boucles, $crit2);
1118 1115
 
1119 1116
 	// erreur ?
1120
-	if (is_array($res)){
1117
+	if (is_array($res)) {
1121 1118
 		return $res;
1122 1119
 	}
1123 1120
 
1124 1121
 	$_order = array_pop($boucle->order);
1125 1122
 
1126 1123
 	$_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1127
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1124
+	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'".$boucle->sql_serveur."')) ? \$zl : '0').')'$sens";
1128 1125
 }
1129 1126
 
1130 1127
 
@@ -1133,7 +1130,7 @@  discard block
 block discarded – undo
1133 1130
 	$params = $crit->param;
1134 1131
 
1135 1132
 	if (count($params) < 1) {
1136
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1133
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." ?"));
1137 1134
 	}
1138 1135
 
1139 1136
 	$boucle = &$boucles[$idb];
@@ -1154,7 +1151,7 @@  discard block
 block discarded – undo
1154 1151
 	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1155 1152
 		$date = $date[0]->texte;
1156 1153
 		if (!isset($fields[$date])) {
1157
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1154
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." ".$date));
1158 1155
 		}
1159 1156
 	} else {
1160 1157
 		$a = calculer_liste($date, $idb, $boucles, $parent);
@@ -1166,38 +1163,38 @@  discard block
 block discarded – undo
1166 1163
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1167 1164
 	}
1168 1165
 	$annee = $params ? array_shift($params) : "";
1169
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1170
-		calculer_liste($annee, $idb, $boucles, $parent) .
1166
+	$annee = "\n".'sprintf("%04d", ($x = '.
1167
+		calculer_liste($annee, $idb, $boucles, $parent).
1171 1168
 		') ? $x : date("Y"))';
1172 1169
 
1173 1170
 	$mois = $params ? array_shift($params) : "";
1174
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1175
-		calculer_liste($mois, $idb, $boucles, $parent) .
1171
+	$mois = "\n".'sprintf("%02d", ($x = '.
1172
+		calculer_liste($mois, $idb, $boucles, $parent).
1176 1173
 		') ? $x : date("m"))';
1177 1174
 
1178 1175
 	$jour = $params ? array_shift($params) : "";
1179
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1180
-		calculer_liste($jour, $idb, $boucles, $parent) .
1176
+	$jour = "\n".'sprintf("%02d", ($x = '.
1177
+		calculer_liste($jour, $idb, $boucles, $parent).
1181 1178
 		') ? $x : date("d"))';
1182 1179
 
1183 1180
 	$annee2 = $params ? array_shift($params) : "";
1184
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1185
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1181
+	$annee2 = "\n".'sprintf("%04d", ($x = '.
1182
+		calculer_liste($annee2, $idb, $boucles, $parent).
1186 1183
 		') ? $x : date("Y"))';
1187 1184
 
1188 1185
 	$mois2 = $params ? array_shift($params) : "";
1189
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1190
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1186
+	$mois2 = "\n".'sprintf("%02d", ($x = '.
1187
+		calculer_liste($mois2, $idb, $boucles, $parent).
1191 1188
 		') ? $x : date("m"))';
1192 1189
 
1193 1190
 	$jour2 = $params ? array_shift($params) : "";
1194
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1195
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1191
+	$jour2 = "\n".'sprintf("%02d", ($x = '.
1192
+		calculer_liste($jour2, $idb, $boucles, $parent).
1196 1193
 		') ? $x : date("d"))';
1197 1194
 
1198
-	$date = $boucle->id_table . ".$date";
1195
+	$date = $boucle->id_table.".$date";
1199 1196
 
1200
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1197
+	$quote_end = ",'".$boucle->sql_serveur."','text'";
1201 1198
 	if ($type == 'jour') {
1202 1199
 		$boucle->where[] = array(
1203 1200
 			"'='",
@@ -1269,14 +1266,13 @@  discard block
 block discarded – undo
1269 1266
 	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1270 1267
 
1271 1268
 	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1272
-		$boucle->limit = $a11 . ',' . $a21;
1269
+		$boucle->limit = $a11.','.$a21;
1273 1270
 	} else {
1274 1271
 		// 3 dans {1/3}, {2,3} ou {1,n-3}
1275 1272
 		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1276 1273
 		// 2 dans {2/3}, {2,5}, {n-2,1}
1277 1274
 		$partie = ($a11 != 'n') ? $a11 : $a12;
1278
-		$mode = (($op == '/') ? '/' :
1279
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1275
+		$mode = (($op == '/') ? '/' : (($a11 == 'n') ? '-' : '+').(($a21 == 'n') ? '-' : '+'));
1280 1276
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1281 1277
 		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1282 1278
 			$boucle->limit =
@@ -1322,8 +1318,7 @@  discard block
 block discarded – undo
1322 1318
 	// {1/3}
1323 1319
 	if ($op1 == '/') {
1324 1320
 		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1325
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1326
-			"($total_parties ? $total_parties : 1)";
1321
+		$totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)";
1327 1322
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1328 1323
 		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1329 1324
 	} else {
@@ -1334,15 +1329,13 @@  discard block
 block discarded – undo
1334 1329
 
1335 1330
 		// cas {x,n-1}
1336 1331
 		if ($op2 == '-') {
1337
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1338
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1339
-					($total_parties . ' - 1'));
1332
+			$fin = '$debut_boucle + '.$nombre_boucle.' - '
1333
+				. (is_numeric($total_parties) ? ($total_parties + 1) : ($total_parties.' - 1'));
1340 1334
 		} else {
1341 1335
 			// {x,1} ou {pagination}
1342 1336
 			$fin = '$debut_boucle'
1343 1337
 				. (is_numeric($total_parties) ?
1344
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1345
-					('+' . $total_parties . ' - 1'));
1338
+					(($total_parties == 1) ? "" : (' + '.($total_parties - 1))) : ('+'.$total_parties.' - 1'));
1346 1339
 		}
1347 1340
 
1348 1341
 		// {pagination}, gerer le debut_xx=-1 pour tout voir
@@ -1360,11 +1353,11 @@  discard block
 block discarded – undo
1360 1353
 	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1361 1354
 
1362 1355
 	$boucles[$id_boucle]->mode_partie = "\n\t"
1363
-		. '$debut_boucle = ' . $debut . ";\n	"
1356
+		. '$debut_boucle = '.$debut.";\n	"
1364 1357
 		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1365
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1366
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1367
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1358
+		. '$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n	"
1359
+		. '$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1360
+		. '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1368 1361
 		. "\n\tif (\$debut_boucle>0"
1369 1362
 		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1370 1363
 		. " AND \$iter->seek(\$debut_boucle,'continue'))"
@@ -1449,16 +1442,16 @@  discard block
 block discarded – undo
1449 1442
 		// critere personnalise ?
1450 1443
 		if (
1451 1444
 			(!$serveur or
1452
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1453
-					and (!function_exists($f = $f . "_dist"))
1454
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1455
-					and (!function_exists($f = $f . "_dist"))
1445
+				((!function_exists($f = "critere_".$serveur."_".$table."_".$critere))
1446
+					and (!function_exists($f = $f."_dist"))
1447
+					and (!function_exists($f = "critere_".$serveur."_".$critere))
1448
+					and (!function_exists($f = $f."_dist"))
1456 1449
 				)
1457 1450
 			)
1458
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1459
-			and (!function_exists($f = $f . "_dist"))
1460
-			and (!function_exists($f = "critere_" . $critere))
1461
-			and (!function_exists($f = $f . "_dist"))
1451
+			and (!function_exists($f = "critere_".$table."_".$critere))
1452
+			and (!function_exists($f = $f."_dist"))
1453
+			and (!function_exists($f = "critere_".$critere))
1454
+			and (!function_exists($f = $f."_dist"))
1462 1455
 		) {
1463 1456
 			// fonction critere standard
1464 1457
 			$f = $defaut;
@@ -1491,9 +1484,9 @@  discard block
 block discarded – undo
1491 1484
  */
1492 1485
 function kwote($lisp, $serveur = '', $type = '') {
1493 1486
 	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1494
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1487
+		return $r[1]."\"".sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type)."\"";
1495 1488
 	} else {
1496
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1489
+		return "sql_quote($lisp, '$serveur', '".str_replace("'", "\\'", $type)."')";
1497 1490
 	}
1498 1491
 }
1499 1492
 
@@ -1515,7 +1508,7 @@  discard block
 block discarded – undo
1515 1508
 function critere_IN_dist($idb, &$boucles, $crit) {
1516 1509
 	$r = calculer_critere_infixe($idb, $boucles, $crit);
1517 1510
 	if (!$r) {
1518
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1511
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ?")));
1519 1512
 	}
1520 1513
 	list($arg, $op, $val, $col, $where_complement) = $r;
1521 1514
 
@@ -1542,8 +1535,8 @@  discard block
 block discarded – undo
1542 1535
 				"'NOT'",
1543 1536
 				array(
1544 1537
 					"'IN'",
1545
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1546
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1538
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1539
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1547 1540
 				)
1548 1541
 			);
1549 1542
 		}
@@ -1562,22 +1555,22 @@  discard block
 block discarded – undo
1562 1555
 	$descr = $boucles[$idb]->descr;
1563 1556
 	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1564 1557
 
1565
-	$var = '$in' . $cpt++;
1558
+	$var = '$in'.$cpt++;
1566 1559
 	$x = "\n\t$var = array();";
1567 1560
 	foreach ($val as $k => $v) {
1568 1561
 		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1569 1562
 			// optimiser le traitement des constantes
1570 1563
 			if (is_numeric($r[2])) {
1571
-				$x .= "\n\t$var" . "[]= $r[2];";
1564
+				$x .= "\n\t$var"."[]= $r[2];";
1572 1565
 			} else {
1573
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1566
+				$x .= "\n\t$var"."[]= ".sql_quote($r[2]).";";
1574 1567
 			}
1575 1568
 		} else {
1576 1569
 			// Pour permettre de passer des tableaux de valeurs
1577 1570
 			// on repere l'utilisation brute de #ENV**{X},
1578 1571
 			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1579 1572
 			// et on deballe mais en rajoutant l'anti XSS
1580
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1573
+			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);";
1581 1574
 		}
1582 1575
 	}
1583 1576
 
@@ -1591,7 +1584,7 @@  discard block
 block discarded – undo
1591 1584
 		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1592 1585
 	}
1593 1586
 
1594
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1587
+	return "sql_in('$arg', $var".($crit2 == 'NOT' ? ",'NOT'" : "").")";
1595 1588
 }
1596 1589
 
1597 1590
 /**
@@ -1664,7 +1657,7 @@  discard block
 block discarded – undo
1664 1657
 		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1665 1658
 	}
1666 1659
 	// nous aider en mode debug.
1667
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1660
+	$boucle->debug[] = "id_ : ".implode(', ', $champs);
1668 1661
 	$boucle->modificateur['id_'] = $champs;
1669 1662
 
1670 1663
 	// créer un critère {id_xxx?} de chaque champ retenu
@@ -1705,7 +1698,7 @@  discard block
 block discarded – undo
1705 1698
 	// Les champs id_xx de la table demandée
1706 1699
 	$champs = array_filter(
1707 1700
 		array_keys($desc['field']),
1708
-		function($champ){
1701
+		function($champ) {
1709 1702
 			return
1710 1703
 				strpos($champ, 'id_') === 0
1711 1704
 				or (in_array($champ, array('objet')));
@@ -1920,8 +1913,8 @@  discard block
 block discarded – undo
1920 1913
 				"'NOT'",
1921 1914
 				array(
1922 1915
 					"'IN'",
1923
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1924
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1916
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1917
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1925 1918
 				)
1926 1919
 			);
1927 1920
 		}
@@ -1932,7 +1925,7 @@  discard block
 block discarded – undo
1932 1925
 	if ($crit->cond) {
1933 1926
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
1934 1927
 		if ($col == "date" or $col == "date_redac") {
1935
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1928
+			if ($pred == "\$Pile[0]['".$col."']") {
1936 1929
 				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1937 1930
 			}
1938 1931
 		}
@@ -2093,7 +2086,7 @@  discard block
 block discarded – undo
2093 2086
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2094 2087
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2095 2088
 		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2096
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2089
+			$val[0] = $r[1].'"'.sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote).'"';
2097 2090
 		}
2098 2091
 		// sinon expliciter les
2099 2092
 		// sql_quote(truc) en sql_quote(truc,'',type)
@@ -2104,22 +2097,22 @@  discard block
 block discarded – undo
2104 2097
 		// sql_quote(truc,'','varchar')
2105 2098
 		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2106 2099
 			// si pas deja un type
2107
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2100
+			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2108 2101
 		) {
2109 2102
 			$r = $r[1]
2110 2103
 				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2111
-				. ",'" . addslashes($type_cast_quote) . "'";
2104
+				. ",'".addslashes($type_cast_quote)."'";
2112 2105
 			$val[0] = "sql_quote($r)";
2113 2106
 		}
2114
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2107
+		elseif (strpos($val[0], '@@defaultcast@@') !== false
2115 2108
 		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2116
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2109
+			$val[0] = substr($val[0], 0, -strlen($r[0]))."'".addslashes($type_cast_quote)."')";
2117 2110
 		}
2118 2111
 	}
2119 2112
 
2120
-	if(strpos($val[0], '@@defaultcast@@') !== false
2113
+	if (strpos($val[0], '@@defaultcast@@') !== false
2121 2114
 	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2122
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2115
+		$val[0] = substr($val[0], 0, -strlen($r[0]))."'char')";
2123 2116
 	}
2124 2117
 
2125 2118
 	// Indicateur pour permettre aux fonctionx boucle_X de modifier
@@ -2144,7 +2137,7 @@  discard block
 block discarded – undo
2144 2137
 	// inserer le nom de la table SQL devant le nom du champ
2145 2138
 	if ($table) {
2146 2139
 		if ($col[0] == "`") {
2147
-			$arg = "$table." . substr($col, 1, -1);
2140
+			$arg = "$table.".substr($col, 1, -1);
2148 2141
 		} else {
2149 2142
 			$arg = "$table.$col";
2150 2143
 		}
@@ -2278,9 +2271,9 @@  discard block
 block discarded – undo
2278 2271
  **/
2279 2272
 function primary_doublee($decompose, $table) {
2280 2273
 	$e1 = reset($decompose);
2281
-	$e2 = "sql_quote('" . end($decompose) . "')";
2274
+	$e2 = "sql_quote('".end($decompose)."')";
2282 2275
 
2283
-	return array("'='", "'$table." . $e1 . "'", $e2);
2276
+	return array("'='", "'$table.".$e1."'", $e2);
2284 2277
 }
2285 2278
 
2286 2279
 /**
@@ -2318,7 +2311,7 @@  discard block
 block discarded – undo
2318 2311
 	if ($checkarrivee
2319 2312
 		and is_string($checkarrivee)
2320 2313
 		and $a = table_objet($checkarrivee)
2321
-		and in_array($a . '_liens', $joints)
2314
+		and in_array($a.'_liens', $joints)
2322 2315
 	) {
2323 2316
 		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2324 2317
 			return $res;
@@ -2338,12 +2331,12 @@  discard block
 block discarded – undo
2338 2331
 				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2339 2332
 				$joindre = false;
2340 2333
 				foreach ($cols as $col) {
2341
-					$c = '/\b' . $t . ".$col" . '\b/';
2334
+					$c = '/\b'.$t.".$col".'\b/';
2342 2335
 					if (trouver_champ($c, $boucle->where)) {
2343 2336
 						$joindre = true;
2344 2337
 					} else {
2345 2338
 						// mais ca peut etre dans le FIELD pour le Having
2346
-						$c = "/FIELD.$t" . ".$col,/";
2339
+						$c = "/FIELD.$t".".$col,/";
2347 2340
 						if (trouver_champ($c, $boucle->select)) {
2348 2341
 							$joindre = true;
2349 2342
 						}
@@ -2390,7 +2383,7 @@  discard block
 block discarded – undo
2390 2383
 	$primary_arrivee = id_table_objet($checkarrivee);
2391 2384
 
2392 2385
 	// [FIXME] $checkarrivee peut-il arriver avec false ????
2393
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2386
+	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee."_liens");
2394 2387
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2395 2388
 
2396 2389
 	if (!$intermediaire or !$arrivee) {
@@ -2488,7 +2481,7 @@  discard block
 block discarded – undo
2488 2481
 			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2489 2482
 				// un critere conditionnel sur date est traite a part
2490 2483
 				// car la date est mise d'office par SPIP,
2491
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2484
+				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])";
2492 2485
 			}
2493 2486
 
2494 2487
 			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
@@ -2519,7 +2512,7 @@  discard block
 block discarded – undo
2519 2512
 			and (($p == "'") or ($p == '"'))
2520 2513
 			and $params[0][1]->type == 'champ'
2521 2514
 		) {
2522
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2515
+			$val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p";
2523 2516
 		} else {
2524 2517
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2525 2518
 				$a = calculer_liste($p, $idb, $boucles, $parent);
@@ -2535,7 +2528,7 @@  discard block
 block discarded – undo
2535 2528
 	$fct = $args_sql = '';
2536 2529
 	// fonction SQL ?
2537 2530
 	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2538
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2531
+	if (preg_match('/^(.*)'.SQL_ARGS.'$/', $col, $m)) {
2539 2532
 		$fct = $m[1];
2540 2533
 		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2541 2534
 		$col = $a[1];
@@ -2625,7 +2618,7 @@  discard block
 block discarded – undo
2625 2618
 		# si oui choisir ce champ, sinon choisir xxxx
2626 2619
 
2627 2620
 		if (isset($table['field']["date$suite"])) {
2628
-			$date_orig = 'date' . $suite;
2621
+			$date_orig = 'date'.$suite;
2629 2622
 		} else {
2630 2623
 			$date_orig = substr($suite, 1);
2631 2624
 		}
@@ -2636,12 +2629,12 @@  discard block
 block discarded – undo
2636 2629
 		}
2637 2630
 	}
2638 2631
 
2639
-	$date_compare = "\"' . normaliser_date(" .
2640
-		calculer_argument_precedent($idb, $pred, $boucles) .
2632
+	$date_compare = "\"' . normaliser_date(".
2633
+		calculer_argument_precedent($idb, $pred, $boucles).
2641 2634
 		") . '\"";
2642 2635
 
2643 2636
 	$col_vraie = $date_orig;
2644
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2637
+	$date_orig = $boucle->id_table.'.'.$date_orig;
2645 2638
 
2646 2639
 	switch ($col) {
2647 2640
 		case 'date':
@@ -2661,26 +2654,26 @@  discard block
 block discarded – undo
2661 2654
 			break;
2662 2655
 		case 'age':
2663 2656
 			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2664
-			$col_vraie = "";// comparer a un int (par defaut)
2657
+			$col_vraie = ""; // comparer a un int (par defaut)
2665 2658
 			break;
2666 2659
 		case 'age_relatif':
2667 2660
 			$col = calculer_param_date($date_compare, $date_orig);
2668
-			$col_vraie = "";// comparer a un int (par defaut)
2661
+			$col_vraie = ""; // comparer a un int (par defaut)
2669 2662
 			break;
2670 2663
 		case 'jour_relatif':
2671
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2672
-			$col_vraie = "";// comparer a un int (par defaut)
2664
+			$col = "(TO_DAYS(".$date_compare.")-TO_DAYS(".$date_orig."))";
2665
+			$col_vraie = ""; // comparer a un int (par defaut)
2673 2666
 			break;
2674 2667
 		case 'mois_relatif':
2675
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2676
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2677
-				")-YEAR(" . $date_orig . "))";
2678
-			$col_vraie = "";// comparer a un int (par defaut)
2668
+			$col = "MONTH(".$date_compare.")-MONTH(".
2669
+				$date_orig.")+12*(YEAR(".$date_compare.
2670
+				")-YEAR(".$date_orig."))";
2671
+			$col_vraie = ""; // comparer a un int (par defaut)
2679 2672
 			break;
2680 2673
 		case 'annee_relatif':
2681
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2682
-				$date_orig . ")";
2683
-			$col_vraie = "";// comparer a un int (par defaut)
2674
+			$col = "YEAR(".$date_compare.")-YEAR(".
2675
+				$date_orig.")";
2676
+			$col_vraie = ""; // comparer a un int (par defaut)
2684 2677
 			break;
2685 2678
 	}
2686 2679
 
@@ -2739,10 +2732,10 @@  discard block
 block discarded – undo
2739 2732
 	}
2740 2733
 
2741 2734
 	$boucle->hash .= '
2742
-	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2735
+	$command[\'sourcemode\'] = ' . array_shift($args).";\n";
2743 2736
 
2744 2737
 	$boucle->hash .= '
2745
-	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2738
+	$command[\'source\'] = array(' . join(', ', $args).");\n";
2746 2739
 }
2747 2740
 
2748 2741
 
@@ -2760,8 +2753,8 @@  discard block
 block discarded – undo
2760 2753
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2761 2754
 	$boucle = &$boucles[$idb];
2762 2755
 	$boucle->hash .= '
2763
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2764
-	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2756
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2757
+	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent).';';
2765 2758
 }
2766 2759
 
2767 2760
 
@@ -2781,7 +2774,7 @@  discard block
 block discarded – undo
2781 2774
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2782 2775
 	$boucle = &$boucles[$idb];
2783 2776
 	$boucle->hash .= '
2784
-	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2777
+	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).';';
2785 2778
 }
2786 2779
 
2787 2780
 
@@ -2800,7 +2793,7 @@  discard block
 block discarded – undo
2800 2793
 	$boucle->hash .= '$command[\'args\']=array();';
2801 2794
 	foreach ($crit->param as $param) {
2802 2795
 		$boucle->hash .= '
2803
-			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2796
+			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2804 2797
 	}
2805 2798
 }
2806 2799
 
@@ -2819,10 +2812,10 @@  discard block
 block discarded – undo
2819 2812
  */
2820 2813
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2821 2814
 	$boucle = &$boucles[$idb];
2822
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2815
+	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
2823 2816
 	foreach ($crit->param as $param) {
2824
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2825
-				$boucles[$idb]->id_parent) . ";\n";
2817
+		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste($param, $idb, $boucles,
2818
+				$boucles[$idb]->id_parent).";\n";
2826 2819
 	}
2827 2820
 }
2828 2821
 
@@ -2849,10 +2842,10 @@  discard block
 block discarded – undo
2849 2842
  */
2850 2843
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2851 2844
 	$boucle = &$boucles[$idb];
2852
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2845
+	$boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n";
2853 2846
 	foreach ($crit->param as $param) {
2854
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2855
-				$boucles[$idb]->id_parent) . ";\n";
2847
+		$boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste($param, $idb, $boucles,
2848
+				$boucles[$idb]->id_parent).";\n";
2856 2849
 	}
2857 2850
 }
2858 2851
 
@@ -2871,7 +2864,7 @@  discard block
 block discarded – undo
2871 2864
 	$boucle = &$boucles[$idb];
2872 2865
 	foreach ($crit->param as $param) {
2873 2866
 		$boucle->hash .= '
2874
-			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2867
+			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2875 2868
 	}
2876 2869
 }
2877 2870
 
@@ -2912,7 +2905,7 @@  discard block
 block discarded – undo
2912 2905
 	if ($crit->param) {
2913 2906
 		foreach ($crit->param as $param) {
2914 2907
 			$boucle->hash .= "\t\$command['si'][] = "
2915
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2908
+				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).";\n";
2916 2909
 		}
2917 2910
 		// interdire {si 0} aussi !
2918 2911
 	} else {
@@ -2935,7 +2928,7 @@  discard block
 block discarded – undo
2935 2928
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2936 2929
 	$boucle = &$boucles[$idb];
2937 2930
 	$boucle->hash .= '
2938
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2931
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2939 2932
 	$command[\'sourcemode\'] = \'table\';';
2940 2933
 }
2941 2934
 
@@ -2968,11 +2961,10 @@  discard block
 block discarded – undo
2968 2961
 	$table_sql = table_objet_sql(objet_type($table));
2969 2962
 
2970 2963
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2971
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2972
-		'id_parent';
2964
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
2973 2965
 
2974 2966
 	$in = "IN";
2975
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2967
+	$where = array("'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2976 2968
 	if ($not) {
2977 2969
 		$where = array("'NOT'", $where);
2978 2970
 	}
Please login to merge, or discard this patch.