Completed
Push — master ( 93ef02...05da1d )
by cam
01:11
created
ecrire/public/criteres.php 2 patches
Indentation   +1697 added lines, -1697 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,7 +614,7 @@  discard block
 block discarded – undo
614 614
  * @return void
615 615
  **/
616 616
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit){
617
-	$boucles[$idb]->group = array();
617
+    $boucles[$idb]->group = array();
618 618
 }
619 619
 
620 620
 /**
@@ -651,45 +651,45 @@  discard block
 block discarded – undo
651 651
  * @param Critere $crit Paramètres du critère dans cette boucle
652 652
  */
653 653
 function critere_collecte_dist($idb, &$boucles, $crit) {
654
-	if (isset($crit->param[0])) {
655
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
656
-		$boucle = $boucles[$idb];
657
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
658
-		$n = count($boucle->order);
659
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
660
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
661
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
662
-			if (
663
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664
-				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665
-			) {
666
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
667
-			} else {
668
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
669
-			}
670
-		}
671
-	} else {
672
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
673
-	}
654
+    if (isset($crit->param[0])) {
655
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
656
+        $boucle = $boucles[$idb];
657
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
658
+        $n = count($boucle->order);
659
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
660
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
661
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
662
+            if (
663
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664
+                OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665
+            ) {
666
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
667
+            } else {
668
+                $boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
669
+            }
670
+        }
671
+    } else {
672
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
673
+    }
674 674
 }
675 675
 
676 676
 // https://code.spip.net/@calculer_critere_arg_dynamique
677 677
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
678
-	$boucle = $boucles[$idb];
679
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
-	$var = '$champs_' . $idb;
681
-	$desc = (strpos($boucle->in, "static $var =") !== false);
682
-	if (!$desc) {
683
-		$desc = $boucle->show['field'];
684
-		$desc = implode(',', array_map('_q', array_keys($desc)));
685
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
686
-	}
687
-	if ($desc) {
688
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
689
-	}
690
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
691
-
692
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
678
+    $boucle = $boucles[$idb];
679
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
+    $var = '$champs_' . $idb;
681
+    $desc = (strpos($boucle->in, "static $var =") !== false);
682
+    if (!$desc) {
683
+        $desc = $boucle->show['field'];
684
+        $desc = implode(',', array_map('_q', array_keys($desc)));
685
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
686
+    }
687
+    if ($desc) {
688
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
689
+    }
690
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
691
+
692
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
693 693
 }
694 694
 
695 695
 /**
@@ -728,7 +728,7 @@  discard block
 block discarded – undo
728 728
  * @param Critere $crit Paramètres du critère dans cette boucle
729 729
  */
730 730
 function critere_par_dist($idb, &$boucles, $crit) {
731
-	return critere_parinverse($idb, $boucles, $crit);
731
+    return critere_parinverse($idb, $boucles, $crit);
732 732
 }
733 733
 
734 734
 /**
@@ -750,93 +750,93 @@  discard block
 block discarded – undo
750 750
  * @param Critere $crit Paramètres du critère dans cette boucle
751 751
  */
752 752
 function critere_parinverse($idb, &$boucles, $crit) {
753
-	$boucle = &$boucles[$idb];
754
-
755
-	$sens = $collecte = '';
756
-	if ($crit->not) {
757
-		$sens = " . ' DESC'";
758
-	}
759
-	if (isset($boucle->modificateur['collate'])) {
760
-		$collecte = ' . ' . $boucle->modificateur['collate'];
761
-	}
762
-
763
-	// Pour chaque paramètre du critère
764
-	foreach ($crit->param as $tri) {
765
-		$order = $fct = '';
766
-		// tris specifiés dynamiquement {par #ENV{tri}}
767
-		if ($tri[0]->type != 'texte') {
768
-			// calculer le order dynamique qui verifie les champs
769
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
770
-			// ajouter 'hasard' comme possibilité de tri dynamique
771
-			calculer_critere_par_hasard($idb, $boucles, $crit);
772
-		}
773
-		// tris textuels {par titre}
774
-		else {
775
-			$par = array_shift($tri);
776
-			$par = $par->texte;
777
-
778
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
779
-			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
780
-				$expression = trim($m[1]);
781
-				$champ = trim($m[2]);
782
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
783
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
784
-				} else {
785
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
786
-				}
787
-
788
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
789
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
790
-				// {par FONCTION(champ)}
791
-				if (count($match) > 2) {
792
-					$par = substr($match[2], 1, -1);
793
-					$fct = $match[1];
794
-				}
795
-				// quelques cas spécifiques {par hasard}, {par date}
796
-				if ($par == 'hasard') {
797
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
798
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
800
-				} else {
801
-					// cas général {par champ}, {par table.champ}, ...
802
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
803
-				}
804
-			}
805
-
806
-			// on ne sait pas traiter…
807
-			else {
808
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
809
-			}
810
-
811
-			// En cas d'erreur de squelette retournée par une fonction
812
-			if (is_array($order)) {
813
-				return $order;
814
-			}
815
-		}
816
-
817
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
818
-			$t = $m[1];
819
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
820
-				$boucle->select[] = $t;
821
-			}
822
-		} else {
823
-			$sens = '';
824
-		}
825
-
826
-		if ($fct) {
827
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
-				$order = "'$fct(" . $r[1] . ")'";
829
-			} else {
830
-				$order = "'$fct(' . $order . ')'";
831
-			}
832
-		}
833
-		$t = $order . $collecte . $sens;
834
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
-			$t = $r[1] . $r[2];
836
-		}
837
-
838
-		$boucle->order[] = $t;
839
-	}
753
+    $boucle = &$boucles[$idb];
754
+
755
+    $sens = $collecte = '';
756
+    if ($crit->not) {
757
+        $sens = " . ' DESC'";
758
+    }
759
+    if (isset($boucle->modificateur['collate'])) {
760
+        $collecte = ' . ' . $boucle->modificateur['collate'];
761
+    }
762
+
763
+    // Pour chaque paramètre du critère
764
+    foreach ($crit->param as $tri) {
765
+        $order = $fct = '';
766
+        // tris specifiés dynamiquement {par #ENV{tri}}
767
+        if ($tri[0]->type != 'texte') {
768
+            // calculer le order dynamique qui verifie les champs
769
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
770
+            // ajouter 'hasard' comme possibilité de tri dynamique
771
+            calculer_critere_par_hasard($idb, $boucles, $crit);
772
+        }
773
+        // tris textuels {par titre}
774
+        else {
775
+            $par = array_shift($tri);
776
+            $par = $par->texte;
777
+
778
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
779
+            if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
780
+                $expression = trim($m[1]);
781
+                $champ = trim($m[2]);
782
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
783
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
784
+                } else {
785
+                    return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
786
+                }
787
+
788
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
789
+            } elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
790
+                // {par FONCTION(champ)}
791
+                if (count($match) > 2) {
792
+                    $par = substr($match[2], 1, -1);
793
+                    $fct = $match[1];
794
+                }
795
+                // quelques cas spécifiques {par hasard}, {par date}
796
+                if ($par == 'hasard') {
797
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
798
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
+                    $order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
800
+                } else {
801
+                    // cas général {par champ}, {par table.champ}, ...
802
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
803
+                }
804
+            }
805
+
806
+            // on ne sait pas traiter…
807
+            else {
808
+                return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
809
+            }
810
+
811
+            // En cas d'erreur de squelette retournée par une fonction
812
+            if (is_array($order)) {
813
+                return $order;
814
+            }
815
+        }
816
+
817
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
818
+            $t = $m[1];
819
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
820
+                $boucle->select[] = $t;
821
+            }
822
+        } else {
823
+            $sens = '';
824
+        }
825
+
826
+        if ($fct) {
827
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
+                $order = "'$fct(" . $r[1] . ")'";
829
+            } else {
830
+                $order = "'$fct(' . $order . ')'";
831
+            }
832
+        }
833
+        $t = $order . $collecte . $sens;
834
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
+            $t = $r[1] . $r[2];
836
+        }
837
+
838
+        $boucle->order[] = $t;
839
+    }
840 840
 }
841 841
 
842 842
 /**
@@ -850,13 +850,13 @@  discard block
 block discarded – undo
850 850
  * @return string Clause pour le Order by
851 851
  */
852 852
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
853
-	$boucle = &$boucles[$idb];
854
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
855
-	$parha = "rand() AS hasard";
856
-	if (!in_array($parha, $boucle->select)) {
857
-		$boucle->select[] = $parha;
858
-	}
859
-	return "'hasard'";
853
+    $boucle = &$boucles[$idb];
854
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
855
+    $parha = "rand() AS hasard";
856
+    if (!in_array($parha, $boucle->select)) {
857
+        $boucle->select[] = $parha;
858
+    }
859
+    return "'hasard'";
860 860
 }
861 861
 
862 862
 /**
@@ -880,24 +880,24 @@  discard block
 block discarded – undo
880 880
  * @return string Clause pour le Order by
881 881
  */
882 882
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
883
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884
-	if (is_array($_champ)) {
885
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
886
-	}
887
-	$boucle = &$boucles[$idb];
888
-	$texte = '0+' . $_champ;
889
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890
-	if ($suite !== "''") {
891
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
892
-	}
893
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : "");
894
-	$boucle->select[] = $texte . " AS $asnum";
895
-
896
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
897
-	$orderassinum = trim($orderassinum, "'");
898
-
899
-	$order = "'$orderassinum, $asnum'";
900
-	return $order;
883
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884
+    if (is_array($_champ)) {
885
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
886
+    }
887
+    $boucle = &$boucles[$idb];
888
+    $texte = '0+' . $_champ;
889
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890
+    if ($suite !== "''") {
891
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
892
+    }
893
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : "");
894
+    $boucle->select[] = $texte . " AS $asnum";
895
+
896
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
897
+    $orderassinum = trim($orderassinum, "'");
898
+
899
+    $order = "'$orderassinum, $asnum'";
900
+    return $order;
901 901
 }
902 902
 
903 903
 /**
@@ -918,35 +918,35 @@  discard block
 block discarded – undo
918 918
  * @return string Clause pour le Order by
919 919
  */
920 920
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
921
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
922
-	if (is_array($_champ)) {
923
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
924
-	}
925
-	$boucle = &$boucles[$idb];
926
-	$texte = '0+' . $_champ;
927
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
928
-	if ($suite !== "''") {
929
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
930
-	}
931
-
932
-	$as = false;
933
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
934
-	foreach ($boucle->select as $s) {
935
-		if (strpos($s, $select) === 0) {
936
-			$as = trim(substr($s, strlen($select)));
937
-			if (!preg_match(",\W,", $as)) {
938
-				break;
939
-			}
940
-			$as = false;
941
-		}
942
-	}
943
-
944
-	if (!$as) {
945
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
946
-		$boucle->select[] = $select . $as;
947
-	}
948
-	$order = "'$as'";
949
-	return $order;
921
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
922
+    if (is_array($_champ)) {
923
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
924
+    }
925
+    $boucle = &$boucles[$idb];
926
+    $texte = '0+' . $_champ;
927
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
928
+    if ($suite !== "''") {
929
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
930
+    }
931
+
932
+    $as = false;
933
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
934
+    foreach ($boucle->select as $s) {
935
+        if (strpos($s, $select) === 0) {
936
+            $as = trim(substr($s, strlen($select)));
937
+            if (!preg_match(",\W,", $as)) {
938
+                break;
939
+            }
940
+            $as = false;
941
+        }
942
+    }
943
+
944
+    if (!$as) {
945
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
946
+        $boucle->select[] = $select . $as;
947
+    }
948
+    $order = "'$as'";
949
+    return $order;
950 950
 }
951 951
 
952 952
 
@@ -966,14 +966,14 @@  discard block
 block discarded – undo
966 966
  * @return string Clause pour le Order by
967 967
  */
968 968
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
969
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
970
-	if (is_array($_champ)) {
971
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
972
-	}
973
-	$boucle = &$boucles[$idb];
974
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
975
-	$order = "'multi'";
976
-	return $order;
969
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
970
+    if (is_array($_champ)) {
971
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
972
+    }
973
+    $boucle = &$boucles[$idb];
974
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
975
+    $order = "'multi'";
976
+    return $order;
977 977
 }
978 978
 
979 979
 /**
@@ -992,56 +992,56 @@  discard block
 block discarded – undo
992 992
  * @return array|string
993 993
  */
994 994
 function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
995
-	$boucle = &$boucles[$idb];
996
-	$desc = $boucle->show;
997
-
998
-	// le champ existe dans la table, pas de souci (le plus commun)
999
-	if (isset($desc['field'][$par])) {
1000
-		$par = $boucle->id_table . "." . $par;
1001
-	}
1002
-	// le champ est peut être une jointure
1003
-	else {
1004
-		$table = $table_alias = false; // toutes les tables de jointure possibles
1005
-		$champ = $par;
1006
-
1007
-		// le champ demandé est une exception de jointure {par titre_mot}
1008
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1009
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
1010
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1011
-		elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
1012
-			list(, $table, $champ) = $r;
1013
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1014
-			$table = table_objet_sql($table);
1015
-		}
1016
-
1017
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1018
-		// Sinon on cherche le champ dans les tables possibles de jointures
1019
-		// Si la table est déjà dans le from, on la réutilise.
1020
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1021
-			$par = $infos['alias'] . "." . $champ;
1022
-		} elseif (
1023
-			$boucle->jointures_explicites
1024
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1025
-		) {
1026
-			$par = $alias . "." . $champ;
1027
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1028
-			$par = $alias . "." . $champ;
1029
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1030
-		} elseif (
1031
-			$table_alias
1032
-			and isset($boucle->from[$table_alias])
1033
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1034
-		) {
1035
-			$par = $infos['alias'] . "." . $champ;
1036
-		} elseif ($table) {
1037
-			// On avait table + champ, mais on ne les a pas trouvés
1038
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1039
-		} else {
1040
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1041
-		}
1042
-	}
1043
-
1044
-	return $raw ? $par : "'$par'";
995
+    $boucle = &$boucles[$idb];
996
+    $desc = $boucle->show;
997
+
998
+    // le champ existe dans la table, pas de souci (le plus commun)
999
+    if (isset($desc['field'][$par])) {
1000
+        $par = $boucle->id_table . "." . $par;
1001
+    }
1002
+    // le champ est peut être une jointure
1003
+    else {
1004
+        $table = $table_alias = false; // toutes les tables de jointure possibles
1005
+        $champ = $par;
1006
+
1007
+        // le champ demandé est une exception de jointure {par titre_mot}
1008
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1009
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
1010
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1011
+        elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
1012
+            list(, $table, $champ) = $r;
1013
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1014
+            $table = table_objet_sql($table);
1015
+        }
1016
+
1017
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1018
+        // Sinon on cherche le champ dans les tables possibles de jointures
1019
+        // Si la table est déjà dans le from, on la réutilise.
1020
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1021
+            $par = $infos['alias'] . "." . $champ;
1022
+        } elseif (
1023
+            $boucle->jointures_explicites
1024
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1025
+        ) {
1026
+            $par = $alias . "." . $champ;
1027
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1028
+            $par = $alias . "." . $champ;
1029
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1030
+        } elseif (
1031
+            $table_alias
1032
+            and isset($boucle->from[$table_alias])
1033
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1034
+        ) {
1035
+            $par = $infos['alias'] . "." . $champ;
1036
+        } elseif ($table) {
1037
+            // On avait table + champ, mais on ne les a pas trouvés
1038
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1039
+        } else {
1040
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1041
+        }
1042
+    }
1043
+
1044
+    return $raw ? $par : "'$par'";
1045 1045
 }
1046 1046
 
1047 1047
 /**
@@ -1055,11 +1055,11 @@  discard block
 block discarded – undo
1055 1055
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1056 1056
  */
1057 1057
 function critere_par_joint($table, $champ, &$boucle) {
1058
-	$t = array_search($table, $boucle->from);
1059
-	if (!$t) {
1060
-		$t = trouver_jointure_champ($champ, $boucle);
1061
-	}
1062
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1058
+    $t = array_search($table, $boucle->from);
1059
+    if (!$t) {
1060
+        $t = trouver_jointure_champ($champ, $boucle);
1061
+    }
1062
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1063 1063
 }
1064 1064
 
1065 1065
 /**
@@ -1084,33 +1084,33 @@  discard block
 block discarded – undo
1084 1084
  */
1085 1085
 function critere_inverse_dist($idb, &$boucles, $crit) {
1086 1086
 
1087
-	$boucle = &$boucles[$idb];
1088
-	// Classement par ordre inverse
1089
-	if ($crit->not) {
1090
-		critere_parinverse($idb, $boucles, $crit);
1091
-	} else {
1092
-		$order = "' DESC'";
1093
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1094
-		if (isset($crit->param[0])) {
1095
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1096
-			$order = "(($critere)?' DESC':'')";
1097
-		}
1098
-
1099
-		$n = count($boucle->order);
1100
-		if (!$n) {
1101
-			if (isset($boucle->default_order[0])) {
1102
-				$boucle->default_order[0] .= ' . " DESC"';
1103
-			} else {
1104
-				$boucle->default_order[] = ' DESC';
1105
-			}
1106
-		} else {
1107
-			$t = $boucle->order[$n - 1] . " . $order";
1108
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1109
-				$t = $r[1] . $r[2];
1110
-			}
1111
-			$boucle->order[$n - 1] = $t;
1112
-		}
1113
-	}
1087
+    $boucle = &$boucles[$idb];
1088
+    // Classement par ordre inverse
1089
+    if ($crit->not) {
1090
+        critere_parinverse($idb, $boucles, $crit);
1091
+    } else {
1092
+        $order = "' DESC'";
1093
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1094
+        if (isset($crit->param[0])) {
1095
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1096
+            $order = "(($critere)?' DESC':'')";
1097
+        }
1098
+
1099
+        $n = count($boucle->order);
1100
+        if (!$n) {
1101
+            if (isset($boucle->default_order[0])) {
1102
+                $boucle->default_order[0] .= ' . " DESC"';
1103
+            } else {
1104
+                $boucle->default_order[] = ' DESC';
1105
+            }
1106
+        } else {
1107
+            $t = $boucle->order[$n - 1] . " . $order";
1108
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1109
+                $t = $r[1] . $r[2];
1110
+            }
1111
+            $boucle->order[$n - 1] = $t;
1112
+        }
1113
+    }
1114 1114
 }
1115 1115
 
1116 1116
 /**
@@ -1121,138 +1121,138 @@  discard block
 block discarded – undo
1121 1121
  * @return array|string
1122 1122
  */
1123 1123
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit){
1124
-	$boucle = &$boucles[$idb];
1124
+    $boucle = &$boucles[$idb];
1125 1125
 
1126
-	$sens = $collecte = '';
1127
-	if ($crit->not){
1128
-		$sens = " . ' DESC'";
1129
-	}
1126
+    $sens = $collecte = '';
1127
+    if ($crit->not){
1128
+        $sens = " . ' DESC'";
1129
+    }
1130 1130
 
1131
-	$crit2 = clone $crit;
1132
-	$crit2->not = false;
1133
-	$crit2->param = [reset($crit->param)];
1134
-	$res = critere_parinverse($idb, $boucles, $crit2);
1131
+    $crit2 = clone $crit;
1132
+    $crit2->not = false;
1133
+    $crit2->param = [reset($crit->param)];
1134
+    $res = critere_parinverse($idb, $boucles, $crit2);
1135 1135
 
1136
-	// erreur ?
1137
-	if (is_array($res)){
1138
-		return $res;
1139
-	}
1136
+    // erreur ?
1137
+    if (is_array($res)){
1138
+        return $res;
1139
+    }
1140 1140
 
1141
-	$_order = array_pop($boucle->order);
1141
+    $_order = array_pop($boucle->order);
1142 1142
 
1143
-	$_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1144
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1143
+    $_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1144
+    $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1145 1145
 }
1146 1146
 
1147 1147
 
1148 1148
 // https://code.spip.net/@critere_agenda_dist
1149 1149
 function critere_agenda_dist($idb, &$boucles, $crit) {
1150
-	$params = $crit->param;
1151
-
1152
-	if (count($params) < 1) {
1153
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1154
-	}
1155
-
1156
-	$boucle = &$boucles[$idb];
1157
-	$parent = $boucle->id_parent;
1158
-	$fields = $boucle->show['field'];
1159
-
1160
-	$date = array_shift($params);
1161
-	$type = array_shift($params);
1162
-
1163
-	// la valeur $type doit etre connue a la compilation
1164
-	// donc etre forcement reduite a un litteral unique dans le source
1165
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1166
-
1167
-	// La valeur date doit designer un champ de la table SQL.
1168
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1169
-	// sinon synthetiser le test de verif pour execution ulterieure
1170
-	// On prendra arbitrairement le premier champ si test negatif.
1171
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1172
-		$date = $date[0]->texte;
1173
-		if (!isset($fields[$date])) {
1174
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1175
-		}
1176
-	} else {
1177
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1178
-		$noms = array_keys($fields);
1179
-		$defaut = $noms[0];
1180
-		$noms = join(" ", $noms);
1181
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1182
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1183
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1184
-	}
1185
-	$annee = $params ? array_shift($params) : "";
1186
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1187
-		calculer_liste($annee, $idb, $boucles, $parent) .
1188
-		') ? $x : date("Y"))';
1189
-
1190
-	$mois = $params ? array_shift($params) : "";
1191
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1192
-		calculer_liste($mois, $idb, $boucles, $parent) .
1193
-		') ? $x : date("m"))';
1194
-
1195
-	$jour = $params ? array_shift($params) : "";
1196
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1197
-		calculer_liste($jour, $idb, $boucles, $parent) .
1198
-		') ? $x : date("d"))';
1199
-
1200
-	$annee2 = $params ? array_shift($params) : "";
1201
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1202
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1203
-		') ? $x : date("Y"))';
1204
-
1205
-	$mois2 = $params ? array_shift($params) : "";
1206
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1207
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1208
-		') ? $x : date("m"))';
1209
-
1210
-	$jour2 = $params ? array_shift($params) : "";
1211
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1212
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1213
-		') ? $x : date("d"))';
1214
-
1215
-	$date = $boucle->id_table . ".$date";
1216
-
1217
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1218
-	if ($type == 'jour') {
1219
-		$boucle->where[] = array(
1220
-			"'='",
1221
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1222
-			("sql_quote($annee . $mois . $jour$quote_end)")
1223
-		);
1224
-	} elseif ($type == 'mois') {
1225
-		$boucle->where[] = array(
1226
-			"'='",
1227
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1228
-			("sql_quote($annee . $mois$quote_end)")
1229
-		);
1230
-	} elseif ($type == 'semaine') {
1231
-		$boucle->where[] = array(
1232
-			"'AND'",
1233
-			array(
1234
-				"'>='",
1235
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1236
-				("date_debut_semaine($annee, $mois, $jour)")
1237
-			),
1238
-			array(
1239
-				"'<='",
1240
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
-				("date_fin_semaine($annee, $mois, $jour)")
1242
-			)
1243
-		);
1244
-	} elseif (count($crit->param) > 2) {
1245
-		$boucle->where[] = array(
1246
-			"'AND'",
1247
-			array(
1248
-				"'>='",
1249
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1250
-				("sql_quote($annee . $mois . $jour$quote_end)")
1251
-			),
1252
-			array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1253
-		);
1254
-	}
1255
-	// sinon on prend tout
1150
+    $params = $crit->param;
1151
+
1152
+    if (count($params) < 1) {
1153
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1154
+    }
1155
+
1156
+    $boucle = &$boucles[$idb];
1157
+    $parent = $boucle->id_parent;
1158
+    $fields = $boucle->show['field'];
1159
+
1160
+    $date = array_shift($params);
1161
+    $type = array_shift($params);
1162
+
1163
+    // la valeur $type doit etre connue a la compilation
1164
+    // donc etre forcement reduite a un litteral unique dans le source
1165
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1166
+
1167
+    // La valeur date doit designer un champ de la table SQL.
1168
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1169
+    // sinon synthetiser le test de verif pour execution ulterieure
1170
+    // On prendra arbitrairement le premier champ si test negatif.
1171
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1172
+        $date = $date[0]->texte;
1173
+        if (!isset($fields[$date])) {
1174
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1175
+        }
1176
+    } else {
1177
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1178
+        $noms = array_keys($fields);
1179
+        $defaut = $noms[0];
1180
+        $noms = join(" ", $noms);
1181
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1182
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1183
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1184
+    }
1185
+    $annee = $params ? array_shift($params) : "";
1186
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1187
+        calculer_liste($annee, $idb, $boucles, $parent) .
1188
+        ') ? $x : date("Y"))';
1189
+
1190
+    $mois = $params ? array_shift($params) : "";
1191
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1192
+        calculer_liste($mois, $idb, $boucles, $parent) .
1193
+        ') ? $x : date("m"))';
1194
+
1195
+    $jour = $params ? array_shift($params) : "";
1196
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1197
+        calculer_liste($jour, $idb, $boucles, $parent) .
1198
+        ') ? $x : date("d"))';
1199
+
1200
+    $annee2 = $params ? array_shift($params) : "";
1201
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1202
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1203
+        ') ? $x : date("Y"))';
1204
+
1205
+    $mois2 = $params ? array_shift($params) : "";
1206
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1207
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1208
+        ') ? $x : date("m"))';
1209
+
1210
+    $jour2 = $params ? array_shift($params) : "";
1211
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1212
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1213
+        ') ? $x : date("d"))';
1214
+
1215
+    $date = $boucle->id_table . ".$date";
1216
+
1217
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1218
+    if ($type == 'jour') {
1219
+        $boucle->where[] = array(
1220
+            "'='",
1221
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1222
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1223
+        );
1224
+    } elseif ($type == 'mois') {
1225
+        $boucle->where[] = array(
1226
+            "'='",
1227
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1228
+            ("sql_quote($annee . $mois$quote_end)")
1229
+        );
1230
+    } elseif ($type == 'semaine') {
1231
+        $boucle->where[] = array(
1232
+            "'AND'",
1233
+            array(
1234
+                "'>='",
1235
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1236
+                ("date_debut_semaine($annee, $mois, $jour)")
1237
+            ),
1238
+            array(
1239
+                "'<='",
1240
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1241
+                ("date_fin_semaine($annee, $mois, $jour)")
1242
+            )
1243
+        );
1244
+    } elseif (count($crit->param) > 2) {
1245
+        $boucle->where[] = array(
1246
+            "'AND'",
1247
+            array(
1248
+                "'>='",
1249
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1250
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1251
+            ),
1252
+            array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1253
+        );
1254
+    }
1255
+    // sinon on prend tout
1256 1256
 }
1257 1257
 
1258 1258
 
@@ -1277,33 +1277,33 @@  discard block
 block discarded – undo
1277 1277
  * @return void
1278 1278
  **/
1279 1279
 function calculer_critere_parties($idb, &$boucles, $crit) {
1280
-	$boucle = &$boucles[$idb];
1281
-	$a1 = $crit->param[0];
1282
-	$a2 = $crit->param[1];
1283
-	$op = $crit->op;
1284
-
1285
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1286
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1287
-
1288
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1289
-		$boucle->limit = $a11 . ',' . $a21;
1290
-	} else {
1291
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1292
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1293
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1294
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1295
-		$mode = (($op == '/') ? '/' :
1296
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1297
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1298
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1299
-			$boucle->limit =
1300
-				(is_numeric($a11) ? "'$a11'" : $a11)
1301
-				. ".','."
1302
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1303
-		} else {
1304
-			calculer_parties($boucles, $idb, $partie, $mode);
1305
-		}
1306
-	}
1280
+    $boucle = &$boucles[$idb];
1281
+    $a1 = $crit->param[0];
1282
+    $a2 = $crit->param[1];
1283
+    $op = $crit->op;
1284
+
1285
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1286
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1287
+
1288
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1289
+        $boucle->limit = $a11 . ',' . $a21;
1290
+    } else {
1291
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1292
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1293
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1294
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1295
+        $mode = (($op == '/') ? '/' :
1296
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1297
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1298
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1299
+            $boucle->limit =
1300
+                (is_numeric($a11) ? "'$a11'" : $a11)
1301
+                . ".','."
1302
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1303
+        } else {
1304
+            calculer_parties($boucles, $idb, $partie, $mode);
1305
+        }
1306
+    }
1307 1307
 }
1308 1308
 
1309 1309
 /**
@@ -1331,63 +1331,63 @@  discard block
 block discarded – undo
1331 1331
  * @return void
1332 1332
  **/
1333 1333
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1334
-	$total_parties = $boucles[$id_boucle]->total_parties;
1335
-
1336
-	preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1337
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1338
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1339
-	// {1/3}
1340
-	if ($op1 == '/') {
1341
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1342
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1343
-			"($total_parties ? $total_parties : 1)";
1344
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1345
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1346
-	} else {
1347
-		// cas {n-1,x}
1348
-		if ($op1 == '-') {
1349
-			$debut = "$nombre_boucle - $debut;";
1350
-		}
1351
-
1352
-		// cas {x,n-1}
1353
-		if ($op2 == '-') {
1354
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1355
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1356
-					($total_parties . ' - 1'));
1357
-		} else {
1358
-			// {x,1} ou {pagination}
1359
-			$fin = '$debut_boucle'
1360
-				. (is_numeric($total_parties) ?
1361
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1362
-					('+' . $total_parties . ' - 1'));
1363
-		}
1364
-
1365
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1366
-		if ($op1 == 'p') {
1367
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1368
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1369
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1370
-		}
1371
-	}
1372
-
1373
-	// Notes :
1374
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1375
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1376
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1377
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1378
-
1379
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1380
-		. '$debut_boucle = ' . $debut . ";\n	"
1381
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1382
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1383
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1384
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1385
-		. "\n\tif (\$debut_boucle>0"
1386
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1387
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1388
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1389
-
1390
-	$boucles[$id_boucle]->partie = "
1334
+    $total_parties = $boucles[$id_boucle]->total_parties;
1335
+
1336
+    preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1337
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1338
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1339
+    // {1/3}
1340
+    if ($op1 == '/') {
1341
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1342
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1343
+            "($total_parties ? $total_parties : 1)";
1344
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1345
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1346
+    } else {
1347
+        // cas {n-1,x}
1348
+        if ($op1 == '-') {
1349
+            $debut = "$nombre_boucle - $debut;";
1350
+        }
1351
+
1352
+        // cas {x,n-1}
1353
+        if ($op2 == '-') {
1354
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1355
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1356
+                    ($total_parties . ' - 1'));
1357
+        } else {
1358
+            // {x,1} ou {pagination}
1359
+            $fin = '$debut_boucle'
1360
+                . (is_numeric($total_parties) ?
1361
+                    (($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1362
+                    ('+' . $total_parties . ' - 1'));
1363
+        }
1364
+
1365
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1366
+        if ($op1 == 'p') {
1367
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1368
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1369
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1370
+        }
1371
+    }
1372
+
1373
+    // Notes :
1374
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1375
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1376
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1377
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1378
+
1379
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1380
+        . '$debut_boucle = ' . $debut . ";\n	"
1381
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1382
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1383
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1384
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1385
+        . "\n\tif (\$debut_boucle>0"
1386
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1387
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1388
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1389
+
1390
+    $boucles[$id_boucle]->partie = "
1391 1391
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1392 1392
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1393 1393
 }
@@ -1404,26 +1404,26 @@  discard block
 block discarded – undo
1404 1404
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1405 1405
  **/
1406 1406
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1407
-	if ($param[0]->type != 'texte') {
1408
-		$a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1409
-		if (isset($param[1]->texte)) {
1410
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1411
-
1412
-			return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1413
-		} else {
1414
-			return array("intval($a1)", 0);
1415
-		}
1416
-	} else {
1417
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1418
-		$a1 = $m[1];
1419
-		if (empty($m[3])) {
1420
-			return array($a1, 0);
1421
-		} elseif (!empty($m[4])) {
1422
-			return array($a1, $m[4]);
1423
-		} else {
1424
-			return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1425
-		}
1426
-	}
1407
+    if ($param[0]->type != 'texte') {
1408
+        $a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1409
+        if (isset($param[1]->texte)) {
1410
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1411
+
1412
+            return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1413
+        } else {
1414
+            return array("intval($a1)", 0);
1415
+        }
1416
+    } else {
1417
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1418
+        $a1 = $m[1];
1419
+        if (empty($m[3])) {
1420
+            return array($a1, 0);
1421
+        } elseif (!empty($m[4])) {
1422
+            return array($a1, $m[4]);
1423
+        } else {
1424
+            return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1425
+        }
1426
+    }
1427 1427
 }
1428 1428
 
1429 1429
 
@@ -1450,47 +1450,47 @@  discard block
 block discarded – undo
1450 1450
  *     array : Erreur sur un des critères
1451 1451
  **/
1452 1452
 function calculer_criteres($idb, &$boucles) {
1453
-	$msg = '';
1454
-	$boucle = $boucles[$idb];
1455
-	$table = strtoupper($boucle->type_requete);
1456
-	$serveur = strtolower($boucle->sql_serveur);
1457
-
1458
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1459
-	// s'il y avait une erreur de syntaxe, propager cette info
1460
-	if (!is_array($boucle->criteres)) {
1461
-		return array();
1462
-	}
1463
-
1464
-	foreach ($boucle->criteres as $crit) {
1465
-		$critere = $crit->op;
1466
-		// critere personnalise ?
1467
-		if (
1468
-			(!$serveur or
1469
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1470
-					and (!function_exists($f = $f . "_dist"))
1471
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1472
-					and (!function_exists($f = $f . "_dist"))
1473
-				)
1474
-			)
1475
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1476
-			and (!function_exists($f = $f . "_dist"))
1477
-			and (!function_exists($f = "critere_" . $critere))
1478
-			and (!function_exists($f = $f . "_dist"))
1479
-		) {
1480
-			// fonction critere standard
1481
-			$f = $defaut;
1482
-		}
1483
-		// compile le critere
1484
-		$res = $f($idb, $boucles, $crit);
1485
-
1486
-		// Gestion centralisee des erreurs pour pouvoir propager
1487
-		if (is_array($res)) {
1488
-			$msg = $res;
1489
-			erreur_squelette($msg, $boucle);
1490
-		}
1491
-	}
1492
-
1493
-	return $msg;
1453
+    $msg = '';
1454
+    $boucle = $boucles[$idb];
1455
+    $table = strtoupper($boucle->type_requete);
1456
+    $serveur = strtolower($boucle->sql_serveur);
1457
+
1458
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1459
+    // s'il y avait une erreur de syntaxe, propager cette info
1460
+    if (!is_array($boucle->criteres)) {
1461
+        return array();
1462
+    }
1463
+
1464
+    foreach ($boucle->criteres as $crit) {
1465
+        $critere = $crit->op;
1466
+        // critere personnalise ?
1467
+        if (
1468
+            (!$serveur or
1469
+                ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1470
+                    and (!function_exists($f = $f . "_dist"))
1471
+                    and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1472
+                    and (!function_exists($f = $f . "_dist"))
1473
+                )
1474
+            )
1475
+            and (!function_exists($f = "critere_" . $table . "_" . $critere))
1476
+            and (!function_exists($f = $f . "_dist"))
1477
+            and (!function_exists($f = "critere_" . $critere))
1478
+            and (!function_exists($f = $f . "_dist"))
1479
+        ) {
1480
+            // fonction critere standard
1481
+            $f = $defaut;
1482
+        }
1483
+        // compile le critere
1484
+        $res = $f($idb, $boucles, $crit);
1485
+
1486
+        // Gestion centralisee des erreurs pour pouvoir propager
1487
+        if (is_array($res)) {
1488
+            $msg = $res;
1489
+            erreur_squelette($msg, $boucle);
1490
+        }
1491
+    }
1492
+
1493
+    return $msg;
1494 1494
 }
1495 1495
 
1496 1496
 /**
@@ -1507,11 +1507,11 @@  discard block
 block discarded – undo
1507 1507
  * @return string         Code compilé rééchappé
1508 1508
  */
1509 1509
 function kwote($lisp, $serveur = '', $type = '') {
1510
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1511
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1512
-	} else {
1513
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1514
-	}
1510
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1511
+        return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1512
+    } else {
1513
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1514
+    }
1515 1515
 }
1516 1516
 
1517 1517
 
@@ -1530,85 +1530,85 @@  discard block
 block discarded – undo
1530 1530
  * @return void
1531 1531
  **/
1532 1532
 function critere_IN_dist($idb, &$boucles, $crit) {
1533
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1534
-	if (!$r) {
1535
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1536
-	}
1537
-	list($arg, $op, $val, $col, $where_complement) = $r;
1538
-
1539
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1540
-
1541
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1542
-	$where = $in;
1543
-	if ($crit->cond) {
1544
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1545
-		$where = array("'?'", $pred, $where, "''");
1546
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1547
-		{
1548
-			$where_complement = array("'?'", $pred, $where_complement, "''");
1549
-		}
1550
-	}
1551
-	if ($crit->exclus) {
1552
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1553
-			$where = array("'NOT'", $where);
1554
-		} else
1555
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1556
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1557
-		{
1558
-			$where = array(
1559
-				"'NOT'",
1560
-				array(
1561
-					"'IN'",
1562
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1563
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1564
-				)
1565
-			);
1566
-		}
1567
-	}
1568
-
1569
-	$boucles[$idb]->where[] = $where;
1570
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1571
-	{
1572
-		$boucles[$idb]->where[] = $where_complement;
1573
-	}
1533
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1534
+    if (!$r) {
1535
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1536
+    }
1537
+    list($arg, $op, $val, $col, $where_complement) = $r;
1538
+
1539
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1540
+
1541
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1542
+    $where = $in;
1543
+    if ($crit->cond) {
1544
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1545
+        $where = array("'?'", $pred, $where, "''");
1546
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1547
+        {
1548
+            $where_complement = array("'?'", $pred, $where_complement, "''");
1549
+        }
1550
+    }
1551
+    if ($crit->exclus) {
1552
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1553
+            $where = array("'NOT'", $where);
1554
+        } else
1555
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1556
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1557
+        {
1558
+            $where = array(
1559
+                "'NOT'",
1560
+                array(
1561
+                    "'IN'",
1562
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1563
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1564
+                )
1565
+            );
1566
+        }
1567
+    }
1568
+
1569
+    $boucles[$idb]->where[] = $where;
1570
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1571
+    {
1572
+        $boucles[$idb]->where[] = $where_complement;
1573
+    }
1574 1574
 }
1575 1575
 
1576 1576
 // https://code.spip.net/@critere_IN_cas
1577 1577
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1578
-	static $num = array();
1579
-	$descr = $boucles[$idb]->descr;
1580
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1581
-
1582
-	$var = '$in' . $cpt++;
1583
-	$x = "\n\t$var = array();";
1584
-	foreach ($val as $k => $v) {
1585
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1586
-			// optimiser le traitement des constantes
1587
-			if (is_numeric($r[2])) {
1588
-				$x .= "\n\t$var" . "[]= $r[2];";
1589
-			} else {
1590
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1591
-			}
1592
-		} else {
1593
-			// Pour permettre de passer des tableaux de valeurs
1594
-			// on repere l'utilisation brute de #ENV**{X},
1595
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1596
-			// et on deballe mais en rajoutant l'anti XSS
1597
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1598
-		}
1599
-	}
1600
-
1601
-	$boucles[$idb]->in .= $x;
1602
-
1603
-	// inserer le tri par defaut selon les ordres du IN ...
1604
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1605
-	// et que l'on limite donc strictement aux cas necessaires :
1606
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1607
-	if (!$crit2) {
1608
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1609
-	}
1610
-
1611
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1578
+    static $num = array();
1579
+    $descr = $boucles[$idb]->descr;
1580
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1581
+
1582
+    $var = '$in' . $cpt++;
1583
+    $x = "\n\t$var = array();";
1584
+    foreach ($val as $k => $v) {
1585
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1586
+            // optimiser le traitement des constantes
1587
+            if (is_numeric($r[2])) {
1588
+                $x .= "\n\t$var" . "[]= $r[2];";
1589
+            } else {
1590
+                $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1591
+            }
1592
+        } else {
1593
+            // Pour permettre de passer des tableaux de valeurs
1594
+            // on repere l'utilisation brute de #ENV**{X},
1595
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1596
+            // et on deballe mais en rajoutant l'anti XSS
1597
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1598
+        }
1599
+    }
1600
+
1601
+    $boucles[$idb]->in .= $x;
1602
+
1603
+    // inserer le tri par defaut selon les ordres du IN ...
1604
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1605
+    // et que l'on limite donc strictement aux cas necessaires :
1606
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1607
+    if (!$crit2) {
1608
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1609
+    }
1610
+
1611
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1612 1612
 }
1613 1613
 
1614 1614
 /**
@@ -1624,22 +1624,22 @@  discard block
 block discarded – undo
1624 1624
  * @return void
1625 1625
  */
1626 1626
 function critere_where_dist($idb, &$boucles, $crit) {
1627
-	$boucle = &$boucles[$idb];
1628
-	if (isset($crit->param[0])) {
1629
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1630
-	} else {
1631
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1632
-	}
1633
-
1634
-	if ($crit->cond) {
1635
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1636
-	}
1637
-
1638
-	if ($crit->not) {
1639
-		$_where = "array('NOT',$_where)";
1640
-	}
1641
-
1642
-	$boucle->where[] = $_where;
1627
+    $boucle = &$boucles[$idb];
1628
+    if (isset($crit->param[0])) {
1629
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1630
+    } else {
1631
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1632
+    }
1633
+
1634
+    if ($crit->cond) {
1635
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1636
+    }
1637
+
1638
+    if ($crit->not) {
1639
+        $_where = "array('NOT',$_where)";
1640
+    }
1641
+
1642
+    $boucle->where[] = $_where;
1643 1643
 }
1644 1644
 
1645 1645
 /**
@@ -1667,31 +1667,31 @@  discard block
 block discarded – undo
1667 1667
  * @return void
1668 1668
  */
1669 1669
 function critere_id__dist($idb, &$boucles, $crit) {
1670
-	/** @var Boucle $boucle */
1671
-	$boucle = $boucles[$idb];
1672
-
1673
-	$champs = lister_champs_id_conditionnel(
1674
-		$boucle->show['table'],
1675
-		$boucle->show,
1676
-		$boucle->sql_serveur
1677
-	);
1678
-
1679
-	// ne pas tenir compte des critères identiques déjà présents.
1680
-	if (!empty($boucle->modificateur['criteres'])) {
1681
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1682
-	}
1683
-	// nous aider en mode debug.
1684
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1685
-	$boucle->modificateur['id_'] = $champs;
1686
-
1687
-	// créer un critère {id_xxx?} de chaque champ retenu
1688
-	foreach ($champs as $champ) {
1689
-		$critere_id_table = new Critere;
1690
-		$critere_id_table->op = $champ;
1691
-		$critere_id_table->cond = '?';
1692
-		$critere_id_table->ligne = $crit->ligne;
1693
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1694
-	}
1670
+    /** @var Boucle $boucle */
1671
+    $boucle = $boucles[$idb];
1672
+
1673
+    $champs = lister_champs_id_conditionnel(
1674
+        $boucle->show['table'],
1675
+        $boucle->show,
1676
+        $boucle->sql_serveur
1677
+    );
1678
+
1679
+    // ne pas tenir compte des critères identiques déjà présents.
1680
+    if (!empty($boucle->modificateur['criteres'])) {
1681
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1682
+    }
1683
+    // nous aider en mode debug.
1684
+    $boucle->debug[] = "id_ : " . implode(', ', $champs);
1685
+    $boucle->modificateur['id_'] = $champs;
1686
+
1687
+    // créer un critère {id_xxx?} de chaque champ retenu
1688
+    foreach ($champs as $champ) {
1689
+        $critere_id_table = new Critere;
1690
+        $critere_id_table->op = $champ;
1691
+        $critere_id_table->cond = '?';
1692
+        $critere_id_table->ligne = $crit->ligne;
1693
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1694
+    }
1695 1695
 }
1696 1696
 
1697 1697
 /**
@@ -1711,79 +1711,79 @@  discard block
 block discarded – undo
1711 1711
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1712 1712
  */
1713 1713
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1714
-	// calculer la description de la table
1715
-	if (!is_array($desc)) {
1716
-		$desc = description_table($table, $serveur);
1717
-	}
1718
-	if (!$desc) {
1719
-		return [];
1720
-	}
1721
-
1722
-	// Les champs id_xx de la table demandée
1723
-	$champs = array_filter(
1724
-		array_keys($desc['field']),
1725
-		function($champ){
1726
-			return
1727
-				strpos($champ, 'id_') === 0
1728
-				or (in_array($champ, array('objet')));
1729
-		}
1730
-	);
1731
-
1732
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1733
-	if (
1734
-		in_array('id_rubrique', $champs)
1735
-		and !in_array('id_secteur', $champs)
1736
-	) {
1737
-		$champs[] = 'id_secteur';
1738
-	}
1739
-
1740
-	// On ne fera pas mieux pour les tables d’un autre serveur
1741
-	if ($serveur) {
1742
-		return $champs;
1743
-	}
1744
-
1745
-	$primary = false;
1746
-	$associable = false;
1747
-	include_spip('action/editer_liens');
1748
-
1749
-	if (isset($desc['type'])) {
1750
-		$primary = id_table_objet($desc['type']);
1751
-		$associable = objet_associable($desc['type']);
1752
-	}
1753
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1754
-		$associable = true;
1755
-	}
1756
-
1757
-	// liste de toutes les tables principales, sauf la notre
1758
-	$tables = lister_tables_objets_sql();
1759
-	unset($tables[$table]);
1760
-
1761
-	foreach ($tables as $_table => $_desc) {
1762
-		if (
1763
-			$associable
1764
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1765
-			or objet_associable($_desc['type'])
1766
-		) {
1767
-			$champs[] = id_table_objet($_table);
1768
-		}
1769
-	}
1770
-	$champs = array_values(array_unique($champs));
1771
-
1772
-	// Exclusions de certains id
1773
-	$exclusions = pipeline(
1774
-		'exclure_id_conditionnel',
1775
-		array(
1776
-			'args' => array(
1777
-				'table' => $table,
1778
-				'id_table_objet' => $primary,
1779
-				'associable' => $associable,
1780
-			),
1781
-			'data' => array(),
1782
-		)
1783
-	);
1784
-	$champs = array_diff($champs, $exclusions);
1785
-
1786
-	return $champs;
1714
+    // calculer la description de la table
1715
+    if (!is_array($desc)) {
1716
+        $desc = description_table($table, $serveur);
1717
+    }
1718
+    if (!$desc) {
1719
+        return [];
1720
+    }
1721
+
1722
+    // Les champs id_xx de la table demandée
1723
+    $champs = array_filter(
1724
+        array_keys($desc['field']),
1725
+        function($champ){
1726
+            return
1727
+                strpos($champ, 'id_') === 0
1728
+                or (in_array($champ, array('objet')));
1729
+        }
1730
+    );
1731
+
1732
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1733
+    if (
1734
+        in_array('id_rubrique', $champs)
1735
+        and !in_array('id_secteur', $champs)
1736
+    ) {
1737
+        $champs[] = 'id_secteur';
1738
+    }
1739
+
1740
+    // On ne fera pas mieux pour les tables d’un autre serveur
1741
+    if ($serveur) {
1742
+        return $champs;
1743
+    }
1744
+
1745
+    $primary = false;
1746
+    $associable = false;
1747
+    include_spip('action/editer_liens');
1748
+
1749
+    if (isset($desc['type'])) {
1750
+        $primary = id_table_objet($desc['type']);
1751
+        $associable = objet_associable($desc['type']);
1752
+    }
1753
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1754
+        $associable = true;
1755
+    }
1756
+
1757
+    // liste de toutes les tables principales, sauf la notre
1758
+    $tables = lister_tables_objets_sql();
1759
+    unset($tables[$table]);
1760
+
1761
+    foreach ($tables as $_table => $_desc) {
1762
+        if (
1763
+            $associable
1764
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1765
+            or objet_associable($_desc['type'])
1766
+        ) {
1767
+            $champs[] = id_table_objet($_table);
1768
+        }
1769
+    }
1770
+    $champs = array_values(array_unique($champs));
1771
+
1772
+    // Exclusions de certains id
1773
+    $exclusions = pipeline(
1774
+        'exclure_id_conditionnel',
1775
+        array(
1776
+            'args' => array(
1777
+                'table' => $table,
1778
+                'id_table_objet' => $primary,
1779
+                'associable' => $associable,
1780
+            ),
1781
+            'data' => array(),
1782
+        )
1783
+    );
1784
+    $champs = array_diff($champs, $exclusions);
1785
+
1786
+    return $champs;
1787 1787
 }
1788 1788
 
1789 1789
 /**
@@ -1838,27 +1838,27 @@  discard block
 block discarded – undo
1838 1838
  * @return void
1839 1839
  */
1840 1840
 function critere_tri_dist($idb, &$boucles, $crit) {
1841
-	$boucle = &$boucles[$idb];
1842
-
1843
-	// definition du champ par defaut
1844
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1845
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1846
-	$_sens_defaut = !isset($crit->param[1][0]) ? "1"
1847
-		: calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1848
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1849
-		: calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1850
-
1851
-	$_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):'')";
1852
-
1853
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1854
-	$_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)";
1855
-
1856
-	$boucle->modificateur['tri_champ'] = $_tri;
1857
-	$boucle->modificateur['tri_sens'] = $_sens;
1858
-	$boucle->modificateur['tri_nom'] = $_variable;
1859
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1860
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1861
-	$boucle->hash .= "
1841
+    $boucle = &$boucles[$idb];
1842
+
1843
+    // definition du champ par defaut
1844
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1845
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1846
+    $_sens_defaut = !isset($crit->param[1][0]) ? "1"
1847
+        : calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1848
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1849
+        : calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1850
+
1851
+    $_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):'')";
1852
+
1853
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1854
+    $_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)";
1855
+
1856
+    $boucle->modificateur['tri_champ'] = $_tri;
1857
+    $boucle->modificateur['tri_sens'] = $_sens;
1858
+    $boucle->modificateur['tri_nom'] = $_variable;
1859
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1860
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1861
+    $boucle->hash .= "
1862 1862
 	\$senstri = '';
1863 1863
 	\$tri = $_tri;
1864 1864
 	if (\$tri){
@@ -1866,8 +1866,8 @@  discard block
 block discarded – undo
1866 1866
 		\$senstri = (\$senstri<0)?' DESC':'';
1867 1867
 	};
1868 1868
 	";
1869
-	$boucle->select[] = "\".tri_champ_select(\$tri).\"";
1870
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1869
+    $boucle->select[] = "\".tri_champ_select(\$tri).\"";
1870
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1871 1871
 }
1872 1872
 
1873 1873
 # Criteres de comparaison
@@ -1884,20 +1884,20 @@  discard block
 block discarded – undo
1884 1884
  * @return void
1885 1885
  **/
1886 1886
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1887
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1888
-	if (($crit->op == ",") or ($crit->op == '/')) {
1889
-		return calculer_critere_parties($idb, $boucles, $crit);
1890
-	}
1891
-
1892
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1893
-	if (!$r) {
1894
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1895
-		#	if (!$crit->cond) {
1896
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1897
-		#	}
1898
-	} else {
1899
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1900
-	}
1887
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1888
+    if (($crit->op == ",") or ($crit->op == '/')) {
1889
+        return calculer_critere_parties($idb, $boucles, $crit);
1890
+    }
1891
+
1892
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1893
+    if (!$r) {
1894
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1895
+        #	if (!$crit->cond) {
1896
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1897
+        #	}
1898
+    } else {
1899
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1900
+    }
1901 1901
 }
1902 1902
 
1903 1903
 
@@ -1917,63 +1917,63 @@  discard block
 block discarded – undo
1917 1917
  * @return void
1918 1918
  **/
1919 1919
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1920
-	list($arg, $op, $val, $col, $where_complement) = $args;
1921
-
1922
-	$where = array("'$op'", "'$arg'", $val[0]);
1923
-
1924
-	// inserer la negation (cf !...)
1925
-
1926
-	if ($crit->not) {
1927
-		$where = array("'NOT'", $where);
1928
-	}
1929
-	if ($crit->exclus) {
1930
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1931
-			$where = array("'NOT'", $where);
1932
-		} else
1933
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1934
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1935
-		{
1936
-			$where = array(
1937
-				"'NOT'",
1938
-				array(
1939
-					"'IN'",
1940
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1941
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1942
-				)
1943
-			);
1944
-		}
1945
-	}
1946
-
1947
-	// inserer la condition (cf {lang?})
1948
-	// traiter a part la date, elle est mise d'office par SPIP,
1949
-	if ($crit->cond) {
1950
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1951
-		if ($col == "date" or $col == "date_redac") {
1952
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1953
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1954
-			}
1955
-		}
1956
-
1957
-		if ($op == '=' and !$crit->not) {
1958
-			$where = array(
1959
-				"'?'",
1960
-				"(is_array($pred))",
1961
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1962
-				$where
1963
-			);
1964
-		}
1965
-		$where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1966
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1967
-		{
1968
-			$where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1969
-		}
1970
-	}
1971
-
1972
-	$boucles[$idb]->where[] = $where;
1973
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1974
-	{
1975
-		$boucles[$idb]->where[] = $where_complement;
1976
-	}
1920
+    list($arg, $op, $val, $col, $where_complement) = $args;
1921
+
1922
+    $where = array("'$op'", "'$arg'", $val[0]);
1923
+
1924
+    // inserer la negation (cf !...)
1925
+
1926
+    if ($crit->not) {
1927
+        $where = array("'NOT'", $where);
1928
+    }
1929
+    if ($crit->exclus) {
1930
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1931
+            $where = array("'NOT'", $where);
1932
+        } else
1933
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1934
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1935
+        {
1936
+            $where = array(
1937
+                "'NOT'",
1938
+                array(
1939
+                    "'IN'",
1940
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1941
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1942
+                )
1943
+            );
1944
+        }
1945
+    }
1946
+
1947
+    // inserer la condition (cf {lang?})
1948
+    // traiter a part la date, elle est mise d'office par SPIP,
1949
+    if ($crit->cond) {
1950
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1951
+        if ($col == "date" or $col == "date_redac") {
1952
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1953
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1954
+            }
1955
+        }
1956
+
1957
+        if ($op == '=' and !$crit->not) {
1958
+            $where = array(
1959
+                "'?'",
1960
+                "(is_array($pred))",
1961
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1962
+                $where
1963
+            );
1964
+        }
1965
+        $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1966
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1967
+        {
1968
+            $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1969
+        }
1970
+    }
1971
+
1972
+    $boucles[$idb]->where[] = $where;
1973
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1974
+    {
1975
+        $boucles[$idb]->where[] = $where_complement;
1976
+    }
1977 1977
 }
1978 1978
 
1979 1979
 
@@ -2014,158 +2014,158 @@  discard block
 block discarded – undo
2014 2014
  **/
2015 2015
 function calculer_critere_infixe($idb, &$boucles, $crit) {
2016 2016
 
2017
-	$boucle = &$boucles[$idb];
2018
-	$type = $boucle->type_requete;
2019
-	$table = $boucle->id_table;
2020
-	$desc = $boucle->show;
2021
-	$col_vraie = null;
2022
-
2023
-	list($fct, $col, $op, $val, $args_sql) =
2024
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2025
-
2026
-	$col_alias = $col;
2027
-	$where_complement = false;
2028
-
2029
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2030
-	if ($col == 'id_enfant') {
2031
-		$col = $boucle->primary;
2032
-	}
2033
-
2034
-	// Cas particulier : id_parent => verifier les exceptions de tables
2035
-	if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2036
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2037
-	) {
2038
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2039
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2040
-	else {
2041
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
2042
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2043
-		}
2044
-
2045
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2046
-		// sauf si exception declaree : sauter cette etape
2047
-		else {
2048
-			if (
2049
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2050
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2051
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2052
-			) {
2053
-				$e = decompose_champ_id_objet($col);
2054
-				$col = array_shift($e);
2055
-				$where_complement = primary_doublee($e, $table);
2056
-			} // Cas particulier : expressions de date
2057
-			else {
2058
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2059
-					list($col, $col_vraie) = $c;
2060
-					$table = '';
2061
-				} // table explicitée {mots.titre}
2062
-				else {
2063
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2064
-						list(, $table, $col) = $r;
2065
-						$col_alias = $col;
2066
-
2067
-						$trouver_table = charger_fonction('trouver_table', 'base');
2068
-						if ($desc = $trouver_table($table, $boucle->sql_serveur)
2069
-							and isset($desc['field'][$col])
2070
-							and $cle = array_search($desc['table'], $boucle->from)
2071
-						) {
2072
-							$table = $cle;
2073
-						} else {
2074
-							$table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2075
-						}
2076
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2077
-						if (!$table) {
2078
-							return '';
2079
-						}
2080
-					}
2081
-					// si le champ n'est pas trouvé dans la table,
2082
-					// on cherche si une jointure peut l'obtenir
2083
-					elseif (@!array_key_exists($col, $desc['field'])) {
2084
-						// Champ joker * des iterateurs DATA qui accepte tout
2085
-						if (@array_key_exists('*', $desc['field'])) {
2086
-							$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
2087
-						}
2088
-						else {
2089
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2090
-							if (!$r) {
2091
-								return '';
2092
-							}
2093
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2094
-						}
2095
-					}
2096
-				}
2097
-			}
2098
-		}
2099
-	}
2100
-
2101
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2102
-	// Dans tous les cas,
2103
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2104
-	// et passer dans sql_quote avec le type si connu
2105
-	// et int sinon si la valeur est numerique
2106
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2107
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2108
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2109
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2110
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2111
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2112
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2113
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2114
-		}
2115
-		// sinon expliciter les
2116
-		// sql_quote(truc) en sql_quote(truc,'',type)
2117
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2118
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2119
-		// sans toucher aux
2120
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2121
-		// sql_quote(truc,'','varchar')
2122
-		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2123
-			// si pas deja un type
2124
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2125
-		) {
2126
-			$r = $r[1]
2127
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2128
-				. ",'" . addslashes($type_cast_quote) . "'";
2129
-			$val[0] = "sql_quote($r)";
2130
-		}
2131
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2132
-		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2133
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2134
-		}
2135
-	}
2136
-
2137
-	if(strpos($val[0], '@@defaultcast@@') !== false
2138
-	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2139
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2140
-	}
2141
-
2142
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2143
-	// leurs requetes par defaut, notamment le champ statut
2144
-	// Ne pas confondre champs de la table principale et des jointures
2145
-	if ($table === $boucle->id_table) {
2146
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2147
-		if ($col_alias != $col_vraie) {
2148
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2149
-		}
2150
-	}
2151
-
2152
-	// inserer le nom de la table SQL devant le nom du champ
2153
-	if ($table) {
2154
-		if ($col[0] == "`") {
2155
-			$arg = "$table." . substr($col, 1, -1);
2156
-		} else {
2157
-			$arg = "$table.$col";
2158
-		}
2159
-	} else {
2160
-		$arg = $col;
2161
-	}
2162
-
2163
-	// inserer la fonction SQL
2164
-	if ($fct) {
2165
-		$arg = "$fct($arg$args_sql)";
2166
-	}
2167
-
2168
-	return array($arg, $op, $val, $col_alias, $where_complement);
2017
+    $boucle = &$boucles[$idb];
2018
+    $type = $boucle->type_requete;
2019
+    $table = $boucle->id_table;
2020
+    $desc = $boucle->show;
2021
+    $col_vraie = null;
2022
+
2023
+    list($fct, $col, $op, $val, $args_sql) =
2024
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2025
+
2026
+    $col_alias = $col;
2027
+    $where_complement = false;
2028
+
2029
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2030
+    if ($col == 'id_enfant') {
2031
+        $col = $boucle->primary;
2032
+    }
2033
+
2034
+    // Cas particulier : id_parent => verifier les exceptions de tables
2035
+    if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2036
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2037
+    ) {
2038
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2039
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2040
+    else {
2041
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
2042
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2043
+        }
2044
+
2045
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2046
+        // sauf si exception declaree : sauter cette etape
2047
+        else {
2048
+            if (
2049
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2050
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2051
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2052
+            ) {
2053
+                $e = decompose_champ_id_objet($col);
2054
+                $col = array_shift($e);
2055
+                $where_complement = primary_doublee($e, $table);
2056
+            } // Cas particulier : expressions de date
2057
+            else {
2058
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2059
+                    list($col, $col_vraie) = $c;
2060
+                    $table = '';
2061
+                } // table explicitée {mots.titre}
2062
+                else {
2063
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2064
+                        list(, $table, $col) = $r;
2065
+                        $col_alias = $col;
2066
+
2067
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2068
+                        if ($desc = $trouver_table($table, $boucle->sql_serveur)
2069
+                            and isset($desc['field'][$col])
2070
+                            and $cle = array_search($desc['table'], $boucle->from)
2071
+                        ) {
2072
+                            $table = $cle;
2073
+                        } else {
2074
+                            $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2075
+                        }
2076
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2077
+                        if (!$table) {
2078
+                            return '';
2079
+                        }
2080
+                    }
2081
+                    // si le champ n'est pas trouvé dans la table,
2082
+                    // on cherche si une jointure peut l'obtenir
2083
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2084
+                        // Champ joker * des iterateurs DATA qui accepte tout
2085
+                        if (@array_key_exists('*', $desc['field'])) {
2086
+                            $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
2087
+                        }
2088
+                        else {
2089
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2090
+                            if (!$r) {
2091
+                                return '';
2092
+                            }
2093
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2094
+                        }
2095
+                    }
2096
+                }
2097
+            }
2098
+        }
2099
+    }
2100
+
2101
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2102
+    // Dans tous les cas,
2103
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2104
+    // et passer dans sql_quote avec le type si connu
2105
+    // et int sinon si la valeur est numerique
2106
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2107
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2108
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2109
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2110
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2111
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2112
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2113
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2114
+        }
2115
+        // sinon expliciter les
2116
+        // sql_quote(truc) en sql_quote(truc,'',type)
2117
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2118
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2119
+        // sans toucher aux
2120
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2121
+        // sql_quote(truc,'','varchar')
2122
+        elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2123
+            // si pas deja un type
2124
+            and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2125
+        ) {
2126
+            $r = $r[1]
2127
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2128
+                . ",'" . addslashes($type_cast_quote) . "'";
2129
+            $val[0] = "sql_quote($r)";
2130
+        }
2131
+        elseif(strpos($val[0], '@@defaultcast@@') !== false
2132
+          and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2133
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2134
+        }
2135
+    }
2136
+
2137
+    if(strpos($val[0], '@@defaultcast@@') !== false
2138
+      and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2139
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2140
+    }
2141
+
2142
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2143
+    // leurs requetes par defaut, notamment le champ statut
2144
+    // Ne pas confondre champs de la table principale et des jointures
2145
+    if ($table === $boucle->id_table) {
2146
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2147
+        if ($col_alias != $col_vraie) {
2148
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2149
+        }
2150
+    }
2151
+
2152
+    // inserer le nom de la table SQL devant le nom du champ
2153
+    if ($table) {
2154
+        if ($col[0] == "`") {
2155
+            $arg = "$table." . substr($col, 1, -1);
2156
+        } else {
2157
+            $arg = "$table.$col";
2158
+        }
2159
+    } else {
2160
+        $arg = $col;
2161
+    }
2162
+
2163
+    // inserer la fonction SQL
2164
+    if ($fct) {
2165
+        $arg = "$fct($arg$args_sql)";
2166
+    }
2167
+
2168
+    return array($arg, $op, $val, $col_alias, $where_complement);
2169 2169
 }
2170 2170
 
2171 2171
 
@@ -2194,77 +2194,77 @@  discard block
 block discarded – undo
2194 2194
  **/
2195 2195
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2196 2196
 
2197
-	$where = '';
2198
-
2199
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2200
-	// gestion par les plugins des jointures tordues
2201
-	// pas automatiques mais necessaires
2202
-	$table_sql = table_objet_sql($table);
2203
-	if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2204
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2205
-		and
2206
-		(
2207
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2208
-			or
2209
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2210
-		)
2211
-	) {
2212
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2213
-		$index = isset($t[$col])
2214
-			? $t[$col] : (isset($t['']) ? $t[''] : array());
2215
-
2216
-		if (count($index) == 3) {
2217
-			list($t, $col, $calculer_critere_externe) = $index;
2218
-		} elseif (count($index) == 2) {
2219
-			list($t, $col) = $t[$col];
2220
-		} elseif (count($index) == 1) {
2221
-			list($calculer_critere_externe) = $index;
2222
-			$t = $table;
2223
-		} else {
2224
-			$t = '';
2225
-		} // jointure non declaree. La trouver.
2226
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2227
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2228
-	} else {
2229
-		$t = '';
2230
-	} // jointure non declaree. La trouver.
2231
-
2232
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2233
-
2234
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2235
-	// permet de forcer une table de lien quand il y a ambiguite
2236
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2237
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2238
-	$table = "";
2239
-	if ($boucle->jointures_explicites) {
2240
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2241
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2242
-	}
2243
-
2244
-	// et sinon on cherche parmi toutes les jointures declarees
2245
-	if (!$table) {
2246
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2247
-	}
2248
-
2249
-	if (!$table) {
2250
-		return '';
2251
-	}
2252
-
2253
-	// il ne reste plus qu'a trouver le champ dans les from
2254
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2255
-
2256
-	if (count($cle) > 1 or reset($cle) !== $col) {
2257
-		$col_alias = $col; // id_article devient juste le nom d'origine
2258
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2259
-			$e = decompose_champ_id_objet($col);
2260
-			$col = array_shift($e);
2261
-			$where = primary_doublee($e, $table);
2262
-		} else {
2263
-			$col = reset($cle);
2264
-		}
2265
-	}
2266
-
2267
-	return array($col, $col_alias, $table, $where, $desc);
2197
+    $where = '';
2198
+
2199
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2200
+    // gestion par les plugins des jointures tordues
2201
+    // pas automatiques mais necessaires
2202
+    $table_sql = table_objet_sql($table);
2203
+    if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2204
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2205
+        and
2206
+        (
2207
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2208
+            or
2209
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2210
+        )
2211
+    ) {
2212
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2213
+        $index = isset($t[$col])
2214
+            ? $t[$col] : (isset($t['']) ? $t[''] : array());
2215
+
2216
+        if (count($index) == 3) {
2217
+            list($t, $col, $calculer_critere_externe) = $index;
2218
+        } elseif (count($index) == 2) {
2219
+            list($t, $col) = $t[$col];
2220
+        } elseif (count($index) == 1) {
2221
+            list($calculer_critere_externe) = $index;
2222
+            $t = $table;
2223
+        } else {
2224
+            $t = '';
2225
+        } // jointure non declaree. La trouver.
2226
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2227
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2228
+    } else {
2229
+        $t = '';
2230
+    } // jointure non declaree. La trouver.
2231
+
2232
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2233
+
2234
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2235
+    // permet de forcer une table de lien quand il y a ambiguite
2236
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2237
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2238
+    $table = "";
2239
+    if ($boucle->jointures_explicites) {
2240
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2241
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2242
+    }
2243
+
2244
+    // et sinon on cherche parmi toutes les jointures declarees
2245
+    if (!$table) {
2246
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2247
+    }
2248
+
2249
+    if (!$table) {
2250
+        return '';
2251
+    }
2252
+
2253
+    // il ne reste plus qu'a trouver le champ dans les from
2254
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2255
+
2256
+    if (count($cle) > 1 or reset($cle) !== $col) {
2257
+        $col_alias = $col; // id_article devient juste le nom d'origine
2258
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2259
+            $e = decompose_champ_id_objet($col);
2260
+            $col = array_shift($e);
2261
+            $where = primary_doublee($e, $table);
2262
+        } else {
2263
+            $col = reset($cle);
2264
+        }
2265
+    }
2266
+
2267
+    return array($col, $col_alias, $table, $where, $desc);
2268 2268
 }
2269 2269
 
2270 2270
 
@@ -2285,10 +2285,10 @@  discard block
 block discarded – undo
2285 2285
  *     - valeur
2286 2286
  **/
2287 2287
 function primary_doublee($decompose, $table) {
2288
-	$e1 = reset($decompose);
2289
-	$e2 = "sql_quote('" . end($decompose) . "')";
2288
+    $e1 = reset($decompose);
2289
+    $e2 = "sql_quote('" . end($decompose) . "')";
2290 2290
 
2291
-	return array("'='", "'$table." . $e1 . "'", $e2);
2291
+    return array("'='", "'$table." . $e1 . "'", $e2);
2292 2292
 }
2293 2293
 
2294 2294
 /**
@@ -2319,56 +2319,56 @@  discard block
 block discarded – undo
2319 2319
  *     Vide sinon.
2320 2320
  */
2321 2321
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2322
-	// si on demande un truc du genre spip_mots
2323
-	// avec aussi spip_mots_liens dans les jointures dispo
2324
-	// et qu'on est la
2325
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2326
-	if ($checkarrivee
2327
-		and is_string($checkarrivee)
2328
-		and $a = table_objet($checkarrivee)
2329
-		and in_array($a . '_liens', $joints)
2330
-	) {
2331
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2332
-			return $res;
2333
-		}
2334
-	}
2335
-	foreach ($joints as $joint) {
2336
-		if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2337
-			// alias de table dans le from
2338
-			$t = array_search($arrivee[0], $boucle->from);
2339
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2340
-			$cols = $arrivee[2];
2341
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2342
-			if (count($cols) > 2) {
2343
-				array_pop($cols);
2344
-			}
2345
-			if ($t) {
2346
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2347
-				$joindre = false;
2348
-				foreach ($cols as $col) {
2349
-					$c = '/\b' . $t . ".$col" . '\b/';
2350
-					if (trouver_champ($c, $boucle->where)) {
2351
-						$joindre = true;
2352
-					} else {
2353
-						// mais ca peut etre dans le FIELD pour le Having
2354
-						$c = "/FIELD.$t" . ".$col,/";
2355
-						if (trouver_champ($c, $boucle->select)) {
2356
-							$joindre = true;
2357
-						}
2358
-					}
2359
-				}
2360
-				if (!$joindre) {
2361
-					return $t;
2362
-				}
2363
-			}
2364
-			array_pop($arrivee);
2365
-			if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2366
-				return $res;
2367
-			}
2368
-		}
2369
-	}
2370
-
2371
-	return '';
2322
+    // si on demande un truc du genre spip_mots
2323
+    // avec aussi spip_mots_liens dans les jointures dispo
2324
+    // et qu'on est la
2325
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2326
+    if ($checkarrivee
2327
+        and is_string($checkarrivee)
2328
+        and $a = table_objet($checkarrivee)
2329
+        and in_array($a . '_liens', $joints)
2330
+    ) {
2331
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2332
+            return $res;
2333
+        }
2334
+    }
2335
+    foreach ($joints as $joint) {
2336
+        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2337
+            // alias de table dans le from
2338
+            $t = array_search($arrivee[0], $boucle->from);
2339
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2340
+            $cols = $arrivee[2];
2341
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2342
+            if (count($cols) > 2) {
2343
+                array_pop($cols);
2344
+            }
2345
+            if ($t) {
2346
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2347
+                $joindre = false;
2348
+                foreach ($cols as $col) {
2349
+                    $c = '/\b' . $t . ".$col" . '\b/';
2350
+                    if (trouver_champ($c, $boucle->where)) {
2351
+                        $joindre = true;
2352
+                    } else {
2353
+                        // mais ca peut etre dans le FIELD pour le Having
2354
+                        $c = "/FIELD.$t" . ".$col,/";
2355
+                        if (trouver_champ($c, $boucle->select)) {
2356
+                            $joindre = true;
2357
+                        }
2358
+                    }
2359
+                }
2360
+                if (!$joindre) {
2361
+                    return $t;
2362
+                }
2363
+            }
2364
+            array_pop($arrivee);
2365
+            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2366
+                return $res;
2367
+            }
2368
+        }
2369
+    }
2370
+
2371
+    return '';
2372 2372
 
2373 2373
 }
2374 2374
 
@@ -2395,29 +2395,29 @@  discard block
 block discarded – undo
2395 2395
  *     Alias de la table de jointure (Lx)
2396 2396
  */
2397 2397
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2398
-	$primary_arrivee = id_table_objet($checkarrivee);
2399
-
2400
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2401
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2402
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2403
-
2404
-	if (!$intermediaire or !$arrivee) {
2405
-		return '';
2406
-	}
2407
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2408
-	array_pop($arrivee); // enlever la cle en 3eme argument
2409
-
2410
-	$res = fabrique_jointures($boucle,
2411
-		array(
2412
-			array(
2413
-				$boucle->id_table,
2414
-				$intermediaire,
2415
-				array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2416
-			),
2417
-			array(reset($intermediaire), $arrivee, $primary_arrivee)
2418
-		), $cond, $desc, $boucle->id_table, array($col));
2419
-
2420
-	return $res;
2398
+    $primary_arrivee = id_table_objet($checkarrivee);
2399
+
2400
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2401
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2402
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2403
+
2404
+    if (!$intermediaire or !$arrivee) {
2405
+        return '';
2406
+    }
2407
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2408
+    array_pop($arrivee); // enlever la cle en 3eme argument
2409
+
2410
+    $res = fabrique_jointures($boucle,
2411
+        array(
2412
+            array(
2413
+                $boucle->id_table,
2414
+                $intermediaire,
2415
+                array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2416
+            ),
2417
+            array(reset($intermediaire), $arrivee, $primary_arrivee)
2418
+        ), $cond, $desc, $boucle->id_table, array($col));
2419
+
2420
+    return $res;
2421 2421
 }
2422 2422
 
2423 2423
 
@@ -2434,17 +2434,17 @@  discard block
 block discarded – undo
2434 2434
  *     false sinon.
2435 2435
  **/
2436 2436
 function trouver_champ($champ, $where) {
2437
-	if (!is_array($where)) {
2438
-		return preg_match($champ, $where);
2439
-	} else {
2440
-		foreach ($where as $clause) {
2441
-			if (trouver_champ($champ, $clause)) {
2442
-				return true;
2443
-			}
2444
-		}
2445
-
2446
-		return false;
2447
-	}
2437
+    if (!is_array($where)) {
2438
+        return preg_match($champ, $where);
2439
+    } else {
2440
+        foreach ($where as $clause) {
2441
+            if (trouver_champ($champ, $clause)) {
2442
+                return true;
2443
+            }
2444
+        }
2445
+
2446
+        return false;
2447
+    }
2448 2448
 }
2449 2449
 
2450 2450
 
@@ -2470,128 +2470,128 @@  discard block
 block discarded – undo
2470 2470
  *     - string $args_sql  Suite des arguments du critère. ?
2471 2471
  **/
2472 2472
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2473
-	// cas d'une valeur comparee a elle-meme ou son referent
2474
-	if (count($crit->param) == 0) {
2475
-		$op = '=';
2476
-		$col = $val = $crit->op;
2477
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2478
-			$val = $r[2];
2479
-		}
2480
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2481
-		if ($val == 'lang') {
2482
-			$val = array(kwote('$GLOBALS[\'spip_lang\']'));
2483
-		} else {
2484
-			$defaut = null;
2485
-			if ($val == 'id_parent') {
2486
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2487
-				// de la boucle superieure.... faudrait verifier qu'il existe
2488
-				// pour eviter l'erreur SQL
2489
-				$val = $boucles[$idb]->primary;
2490
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2491
-				$defaut = "@\$Pile[0]['id_parent']";
2492
-			} elseif ($val == 'id_enfant') {
2493
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2494
-				// de la boucle superieure
2495
-				$val = 'id_parent';
2496
-			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2497
-				// un critere conditionnel sur date est traite a part
2498
-				// car la date est mise d'office par SPIP,
2499
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2500
-			}
2501
-
2502
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2503
-			$val = array(kwote($val));
2504
-		}
2505
-	} else {
2506
-		// comparaison explicite
2507
-		// le phraseur impose que le premier param soit du texte
2508
-		$params = $crit->param;
2509
-		$op = $crit->op;
2510
-		if ($op == '==') {
2511
-			$op = 'REGEXP';
2512
-		}
2513
-		$col = array_shift($params);
2514
-		$col = $col[0]->texte;
2515
-
2516
-		$val = array();
2517
-		$parent = $boucles[$idb]->id_parent;
2518
-
2519
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2520
-		// celui ne sachant pas ce qu'est un critere infixe
2521
-		// et a fortiori son 2e operande qu'entoure " ou '
2522
-		if (count($params) == 1
2523
-			and count($params[0]) == 3
2524
-			and $params[0][0]->type == 'texte'
2525
-			and $params[0][2]->type == 'texte'
2526
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2527
-			and (($p == "'") or ($p == '"'))
2528
-			and $params[0][1]->type == 'champ'
2529
-		) {
2530
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2531
-		} else {
2532
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2533
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2534
-				if (strcasecmp($op, 'IN') == 0) {
2535
-					$val[] = $a;
2536
-				} else {
2537
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2538
-				} // toujours quoter en char ici
2539
-			}
2540
-		}
2541
-	}
2542
-
2543
-	$fct = $args_sql = '';
2544
-	// fonction SQL ?
2545
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2546
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2547
-		$fct = $m[1];
2548
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2549
-		$col = $a[1];
2550
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2551
-			$col = $m[1];
2552
-			$args_sql = $m[2];
2553
-		}
2554
-		$args_sql .= $a[2];
2555
-	}
2556
-
2557
-	return array($fct, $col, $op, $val, $args_sql);
2473
+    // cas d'une valeur comparee a elle-meme ou son referent
2474
+    if (count($crit->param) == 0) {
2475
+        $op = '=';
2476
+        $col = $val = $crit->op;
2477
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2478
+            $val = $r[2];
2479
+        }
2480
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2481
+        if ($val == 'lang') {
2482
+            $val = array(kwote('$GLOBALS[\'spip_lang\']'));
2483
+        } else {
2484
+            $defaut = null;
2485
+            if ($val == 'id_parent') {
2486
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2487
+                // de la boucle superieure.... faudrait verifier qu'il existe
2488
+                // pour eviter l'erreur SQL
2489
+                $val = $boucles[$idb]->primary;
2490
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2491
+                $defaut = "@\$Pile[0]['id_parent']";
2492
+            } elseif ($val == 'id_enfant') {
2493
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2494
+                // de la boucle superieure
2495
+                $val = 'id_parent';
2496
+            } elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2497
+                // un critere conditionnel sur date est traite a part
2498
+                // car la date est mise d'office par SPIP,
2499
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2500
+            }
2501
+
2502
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2503
+            $val = array(kwote($val));
2504
+        }
2505
+    } else {
2506
+        // comparaison explicite
2507
+        // le phraseur impose que le premier param soit du texte
2508
+        $params = $crit->param;
2509
+        $op = $crit->op;
2510
+        if ($op == '==') {
2511
+            $op = 'REGEXP';
2512
+        }
2513
+        $col = array_shift($params);
2514
+        $col = $col[0]->texte;
2515
+
2516
+        $val = array();
2517
+        $parent = $boucles[$idb]->id_parent;
2518
+
2519
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2520
+        // celui ne sachant pas ce qu'est un critere infixe
2521
+        // et a fortiori son 2e operande qu'entoure " ou '
2522
+        if (count($params) == 1
2523
+            and count($params[0]) == 3
2524
+            and $params[0][0]->type == 'texte'
2525
+            and $params[0][2]->type == 'texte'
2526
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2527
+            and (($p == "'") or ($p == '"'))
2528
+            and $params[0][1]->type == 'champ'
2529
+        ) {
2530
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2531
+        } else {
2532
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2533
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2534
+                if (strcasecmp($op, 'IN') == 0) {
2535
+                    $val[] = $a;
2536
+                } else {
2537
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2538
+                } // toujours quoter en char ici
2539
+            }
2540
+        }
2541
+    }
2542
+
2543
+    $fct = $args_sql = '';
2544
+    // fonction SQL ?
2545
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2546
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2547
+        $fct = $m[1];
2548
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2549
+        $col = $a[1];
2550
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2551
+            $col = $m[1];
2552
+            $args_sql = $m[2];
2553
+        }
2554
+        $args_sql .= $a[2];
2555
+    }
2556
+
2557
+    return array($fct, $col, $op, $val, $args_sql);
2558 2558
 }
2559 2559
 
2560 2560
 // compatibilite ancienne version
2561 2561
 
2562 2562
 // https://code.spip.net/@calculer_vieux_in
2563 2563
 function calculer_vieux_in($params) {
2564
-	$deb = $params[0][0];
2565
-	$k = count($params) - 1;
2566
-	$last = $params[$k];
2567
-	$j = count($last) - 1;
2568
-	$last = $last[$j];
2569
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2570
-
2571
-	if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2572
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2573
-	) {
2574
-		return $params;
2575
-	}
2576
-	$params[0][0]->texte = substr($deb->texte, 1);
2577
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2578
-	$last = $params[$k][$j];
2579
-	$n = strlen($last->texte);
2580
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2581
-	$newp = array();
2582
-	foreach ($params as $v) {
2583
-		if ($v[0]->type != 'texte') {
2584
-			$newp[] = $v;
2585
-		} else {
2586
-			foreach (explode(',', $v[0]->texte) as $x) {
2587
-				$t = new Texte;
2588
-				$t->texte = $x;
2589
-				$newp[] = array($t);
2590
-			}
2591
-		}
2592
-	}
2593
-
2594
-	return $newp;
2564
+    $deb = $params[0][0];
2565
+    $k = count($params) - 1;
2566
+    $last = $params[$k];
2567
+    $j = count($last) - 1;
2568
+    $last = $last[$j];
2569
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2570
+
2571
+    if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2572
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2573
+    ) {
2574
+        return $params;
2575
+    }
2576
+    $params[0][0]->texte = substr($deb->texte, 1);
2577
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2578
+    $last = $params[$k][$j];
2579
+    $n = strlen($last->texte);
2580
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2581
+    $newp = array();
2582
+    foreach ($params as $v) {
2583
+        if ($v[0]->type != 'texte') {
2584
+            $newp[] = $v;
2585
+        } else {
2586
+            foreach (explode(',', $v[0]->texte) as $x) {
2587
+                $t = new Texte;
2588
+                $t->texte = $x;
2589
+                $newp[] = array($t);
2590
+            }
2591
+        }
2592
+    }
2593
+
2594
+    return $newp;
2595 2595
 }
2596 2596
 
2597 2597
 /**
@@ -2610,89 +2610,89 @@  discard block
 block discarded – undo
2610 2610
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2611 2611
  **/
2612 2612
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2613
-	if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
2614
-		return '';
2615
-	}
2616
-
2617
-	$boucle = $boucles[$idb];
2618
-	$table = $boucle->show;
2619
-
2620
-	// si c'est une colonne de la table, ne rien faire
2621
-	if (isset($table['field'][$col])) {
2622
-		return '';
2623
-	}
2624
-
2625
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2626
-		return '';
2627
-	}
2628
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2629
-
2630
-	$col = $regs[1];
2631
-	if (isset($regs[3]) and $suite = $regs[3]) {
2632
-		# Recherche de l'existence du champ date_xxxx,
2633
-		# si oui choisir ce champ, sinon choisir xxxx
2634
-
2635
-		if (isset($table['field']["date$suite"])) {
2636
-			$date_orig = 'date' . $suite;
2637
-		} else {
2638
-			$date_orig = substr($suite, 1);
2639
-		}
2640
-		$pred = $date_orig;
2641
-	} else {
2642
-		if (isset($regs[2]) and $rel = $regs[2]) {
2643
-			$pred = 'date';
2644
-		}
2645
-	}
2646
-
2647
-	$date_compare = "\"' . normaliser_date(" .
2648
-		calculer_argument_precedent($idb, $pred, $boucles) .
2649
-		") . '\"";
2650
-
2651
-	$col_vraie = $date_orig;
2652
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2653
-
2654
-	switch ($col) {
2655
-		case 'date':
2656
-			$col = $date_orig;
2657
-			break;
2658
-		case 'jour':
2659
-			$col = "DAYOFMONTH($date_orig)";
2660
-			break;
2661
-		case 'mois':
2662
-			$col = "MONTH($date_orig)";
2663
-			break;
2664
-		case 'annee':
2665
-			$col = "YEAR($date_orig)";
2666
-			break;
2667
-		case 'heure':
2668
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2669
-			break;
2670
-		case 'age':
2671
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2672
-			$col_vraie = "";// comparer a un int (par defaut)
2673
-			break;
2674
-		case 'age_relatif':
2675
-			$col = calculer_param_date($date_compare, $date_orig);
2676
-			$col_vraie = "";// comparer a un int (par defaut)
2677
-			break;
2678
-		case 'jour_relatif':
2679
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2680
-			$col_vraie = "";// comparer a un int (par defaut)
2681
-			break;
2682
-		case 'mois_relatif':
2683
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2684
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2685
-				")-YEAR(" . $date_orig . "))";
2686
-			$col_vraie = "";// comparer a un int (par defaut)
2687
-			break;
2688
-		case 'annee_relatif':
2689
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2690
-				$date_orig . ")";
2691
-			$col_vraie = "";// comparer a un int (par defaut)
2692
-			break;
2693
-	}
2694
-
2695
-	return array($col, $col_vraie);
2613
+    if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
2614
+        return '';
2615
+    }
2616
+
2617
+    $boucle = $boucles[$idb];
2618
+    $table = $boucle->show;
2619
+
2620
+    // si c'est une colonne de la table, ne rien faire
2621
+    if (isset($table['field'][$col])) {
2622
+        return '';
2623
+    }
2624
+
2625
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2626
+        return '';
2627
+    }
2628
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2629
+
2630
+    $col = $regs[1];
2631
+    if (isset($regs[3]) and $suite = $regs[3]) {
2632
+        # Recherche de l'existence du champ date_xxxx,
2633
+        # si oui choisir ce champ, sinon choisir xxxx
2634
+
2635
+        if (isset($table['field']["date$suite"])) {
2636
+            $date_orig = 'date' . $suite;
2637
+        } else {
2638
+            $date_orig = substr($suite, 1);
2639
+        }
2640
+        $pred = $date_orig;
2641
+    } else {
2642
+        if (isset($regs[2]) and $rel = $regs[2]) {
2643
+            $pred = 'date';
2644
+        }
2645
+    }
2646
+
2647
+    $date_compare = "\"' . normaliser_date(" .
2648
+        calculer_argument_precedent($idb, $pred, $boucles) .
2649
+        ") . '\"";
2650
+
2651
+    $col_vraie = $date_orig;
2652
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2653
+
2654
+    switch ($col) {
2655
+        case 'date':
2656
+            $col = $date_orig;
2657
+            break;
2658
+        case 'jour':
2659
+            $col = "DAYOFMONTH($date_orig)";
2660
+            break;
2661
+        case 'mois':
2662
+            $col = "MONTH($date_orig)";
2663
+            break;
2664
+        case 'annee':
2665
+            $col = "YEAR($date_orig)";
2666
+            break;
2667
+        case 'heure':
2668
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2669
+            break;
2670
+        case 'age':
2671
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2672
+            $col_vraie = "";// comparer a un int (par defaut)
2673
+            break;
2674
+        case 'age_relatif':
2675
+            $col = calculer_param_date($date_compare, $date_orig);
2676
+            $col_vraie = "";// comparer a un int (par defaut)
2677
+            break;
2678
+        case 'jour_relatif':
2679
+            $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2680
+            $col_vraie = "";// comparer a un int (par defaut)
2681
+            break;
2682
+        case 'mois_relatif':
2683
+            $col = "MONTH(" . $date_compare . ")-MONTH(" .
2684
+                $date_orig . ")+12*(YEAR(" . $date_compare .
2685
+                ")-YEAR(" . $date_orig . "))";
2686
+            $col_vraie = "";// comparer a un int (par defaut)
2687
+            break;
2688
+        case 'annee_relatif':
2689
+            $col = "YEAR(" . $date_compare . ")-YEAR(" .
2690
+                $date_orig . ")";
2691
+            $col_vraie = "";// comparer a un int (par defaut)
2692
+            break;
2693
+    }
2694
+
2695
+    return array($col, $col_vraie);
2696 2696
 }
2697 2697
 
2698 2698
 /**
@@ -2711,16 +2711,16 @@  discard block
 block discarded – undo
2711 2711
  *     de colonne SQL et une date.
2712 2712
  **/
2713 2713
 function calculer_param_date($date_compare, $date_orig) {
2714
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2715
-		$init = "'\" . (\$x = $r[1]) . \"'";
2716
-		$date_compare = '\'$x\'';
2717
-	} else {
2718
-		$init = $date_compare;
2719
-	}
2720
-
2721
-	return
2722
-		// optimisation : mais prevoir le support SQLite avant
2723
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2714
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2715
+        $init = "'\" . (\$x = $r[1]) . \"'";
2716
+        $date_compare = '\'$x\'';
2717
+    } else {
2718
+        $init = $date_compare;
2719
+    }
2720
+
2721
+    return
2722
+        // optimisation : mais prevoir le support SQLite avant
2723
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2724 2724
 }
2725 2725
 
2726 2726
 /**
@@ -2738,18 +2738,18 @@  discard block
 block discarded – undo
2738 2738
  * @param Critere $crit Paramètres du critère dans cette boucle
2739 2739
  */
2740 2740
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2741
-	$boucle = &$boucles[$idb];
2741
+    $boucle = &$boucles[$idb];
2742 2742
 
2743
-	$args = array();
2744
-	foreach ($crit->param as &$param) {
2745
-		array_push($args,
2746
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2747
-	}
2743
+    $args = array();
2744
+    foreach ($crit->param as &$param) {
2745
+        array_push($args,
2746
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2747
+    }
2748 2748
 
2749
-	$boucle->hash .= '
2749
+    $boucle->hash .= '
2750 2750
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2751 2751
 
2752
-	$boucle->hash .= '
2752
+    $boucle->hash .= '
2753 2753
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2754 2754
 }
2755 2755
 
@@ -2767,8 +2767,8 @@  discard block
 block discarded – undo
2767 2767
  * @param Critere $crit Paramètres du critère dans cette boucle
2768 2768
  */
2769 2769
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2770
-	$boucle = &$boucles[$idb];
2771
-	$boucle->hash .= '
2770
+    $boucle = &$boucles[$idb];
2771
+    $boucle->hash .= '
2772 2772
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2773 2773
 }
2774 2774
 
@@ -2784,12 +2784,12 @@  discard block
 block discarded – undo
2784 2784
  * @param Critere $crit Paramètres du critère dans cette boucle
2785 2785
  */
2786 2786
 function critere_php_args_dist($idb, &$boucles, $crit) {
2787
-	$boucle = &$boucles[$idb];
2788
-	$boucle->hash .= '$command[\'args\']=array();';
2789
-	foreach ($crit->param as $param) {
2790
-		$boucle->hash .= '
2787
+    $boucle = &$boucles[$idb];
2788
+    $boucle->hash .= '$command[\'args\']=array();';
2789
+    foreach ($crit->param as $param) {
2790
+        $boucle->hash .= '
2791 2791
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2792
-	}
2792
+    }
2793 2793
 }
2794 2794
 
2795 2795
 /**
@@ -2806,12 +2806,12 @@  discard block
 block discarded – undo
2806 2806
  * @param Critere $crit Paramètres du critère dans cette boucle
2807 2807
  */
2808 2808
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2809
-	$boucle = &$boucles[$idb];
2810
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2811
-	foreach ($crit->param as $param) {
2812
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2813
-				$boucles[$idb]->id_parent) . ";\n";
2814
-	}
2809
+    $boucle = &$boucles[$idb];
2810
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2811
+    foreach ($crit->param as $param) {
2812
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2813
+                $boucles[$idb]->id_parent) . ";\n";
2814
+    }
2815 2815
 }
2816 2816
 
2817 2817
 /**
@@ -2836,12 +2836,12 @@  discard block
 block discarded – undo
2836 2836
  * @param Critere $crit Paramètres du critère dans cette boucle
2837 2837
  */
2838 2838
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2839
-	$boucle = &$boucles[$idb];
2840
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2841
-	foreach ($crit->param as $param) {
2842
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2843
-				$boucles[$idb]->id_parent) . ";\n";
2844
-	}
2839
+    $boucle = &$boucles[$idb];
2840
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2841
+    foreach ($crit->param as $param) {
2842
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2843
+                $boucles[$idb]->id_parent) . ";\n";
2844
+    }
2845 2845
 }
2846 2846
 
2847 2847
 /**
@@ -2856,11 +2856,11 @@  discard block
 block discarded – undo
2856 2856
  * @param Critere $crit Paramètres du critère dans cette boucle
2857 2857
  */
2858 2858
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2859
-	$boucle = &$boucles[$idb];
2860
-	foreach ($crit->param as $param) {
2861
-		$boucle->hash .= '
2859
+    $boucle = &$boucles[$idb];
2860
+    foreach ($crit->param as $param) {
2861
+        $boucle->hash .= '
2862 2862
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2863
-	}
2863
+    }
2864 2864
 }
2865 2865
 
2866 2866
 
@@ -2892,20 +2892,20 @@  discard block
 block discarded – undo
2892 2892
  * @param Critere $crit Paramètres du critère dans cette boucle
2893 2893
  */
2894 2894
 function critere_si_dist($idb, &$boucles, $crit) {
2895
-	$boucle = &$boucles[$idb];
2896
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2897
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2898
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2899
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2900
-	if ($crit->param) {
2901
-		foreach ($crit->param as $param) {
2902
-			$boucle->hash .= "\t\$command['si'][] = "
2903
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2904
-		}
2905
-		// interdire {si 0} aussi !
2906
-	} else {
2907
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2908
-	}
2895
+    $boucle = &$boucles[$idb];
2896
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2897
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2898
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2899
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2900
+    if ($crit->param) {
2901
+        foreach ($crit->param as $param) {
2902
+            $boucle->hash .= "\t\$command['si'][] = "
2903
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2904
+        }
2905
+        // interdire {si 0} aussi !
2906
+    } else {
2907
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2908
+    }
2909 2909
 }
2910 2910
 
2911 2911
 /**
@@ -2922,8 +2922,8 @@  discard block
 block discarded – undo
2922 2922
  * @param Critere $crit Paramètres du critère dans cette boucle
2923 2923
  */
2924 2924
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2925
-	$boucle = &$boucles[$idb];
2926
-	$boucle->hash .= '
2925
+    $boucle = &$boucles[$idb];
2926
+    $boucle->hash .= '
2927 2927
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2928 2928
 	$command[\'sourcemode\'] = \'table\';';
2929 2929
 }
@@ -2944,29 +2944,29 @@  discard block
 block discarded – undo
2944 2944
  */
2945 2945
 function critere_noeud_dist($idb, &$boucles, $crit) {
2946 2946
 
2947
-	$not = $crit->not;
2948
-	$boucle = &$boucles[$idb];
2949
-	$primary = $boucle->primary;
2947
+    $not = $crit->not;
2948
+    $boucle = &$boucles[$idb];
2949
+    $primary = $boucle->primary;
2950 2950
 
2951
-	if (!$primary or strpos($primary, ',')) {
2952
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2951
+    if (!$primary or strpos($primary, ',')) {
2952
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2953 2953
 
2954
-		return;
2955
-	}
2956
-	$table = $boucle->type_requete;
2957
-	$table_sql = table_objet_sql(objet_type($table));
2954
+        return;
2955
+    }
2956
+    $table = $boucle->type_requete;
2957
+    $table_sql = table_objet_sql(objet_type($table));
2958 2958
 
2959
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2960
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2961
-		'id_parent';
2959
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2960
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2961
+        'id_parent';
2962 2962
 
2963
-	$in = "IN";
2964
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2965
-	if ($not) {
2966
-		$where = array("'NOT'", $where);
2967
-	}
2963
+    $in = "IN";
2964
+    $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2965
+    if ($not) {
2966
+        $where = array("'NOT'", $where);
2967
+    }
2968 2968
 
2969
-	$boucle->where[] = $where;
2969
+    $boucle->where[] = $where;
2970 2970
 }
2971 2971
 
2972 2972
 /**
@@ -2982,8 +2982,8 @@  discard block
 block discarded – undo
2982 2982
  * @param Critere $crit Paramètres du critère dans cette boucle
2983 2983
  */
2984 2984
 function critere_feuille_dist($idb, &$boucles, $crit) {
2985
-	$not = $crit->not;
2986
-	$crit->not = $not ? false : true;
2987
-	critere_noeud_dist($idb, $boucles, $crit);
2988
-	$crit->not = $not;
2985
+    $not = $crit->not;
2986
+    $crit->not = $not ? false : true;
2987
+    critere_noeud_dist($idb, $boucles, $crit);
2988
+    $crit->not = $not;
2989 2989
 }
Please login to merge, or discard this patch.
Spacing   +180 added lines, -188 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
 
@@ -613,7 +610,7 @@  discard block
 block discarded – undo
613 610
  * @param Critere $crit Paramètres du critère dans cette boucle
614 611
  * @return void
615 612
  **/
616
-function critere_fusion_supprimer_dist($idb, &$boucles, $crit){
613
+function critere_fusion_supprimer_dist($idb, &$boucles, $crit) {
617 614
 	$boucles[$idb]->group = array();
618 615
 }
619 616
 
@@ -663,26 +660,26 @@  discard block
 block discarded – undo
663 660
 				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664 661
 				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665 662
 			) {
666
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
663
+				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . ".$boucle->modificateur['collate']." . ' ", $i, 0);
667 664
 			} else {
668
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
665
+				$boucle->order[$n - 1] .= " . ".$boucle->modificateur['collate'];
669 666
 			}
670 667
 		}
671 668
 	} else {
672
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
669
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ".count($boucles[$idb]->order))));
673 670
 	}
674 671
 }
675 672
 
676 673
 // https://code.spip.net/@calculer_critere_arg_dynamique
677 674
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
678 675
 	$boucle = $boucles[$idb];
679
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
-	$var = '$champs_' . $idb;
676
+	$alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')';
677
+	$var = '$champs_'.$idb;
681 678
 	$desc = (strpos($boucle->in, "static $var =") !== false);
682 679
 	if (!$desc) {
683 680
 		$desc = $boucle->show['field'];
684 681
 		$desc = implode(',', array_map('_q', array_keys($desc)));
685
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
682
+		$boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.");";
686 683
 	}
687 684
 	if ($desc) {
688 685
 		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
@@ -757,7 +754,7 @@  discard block
 block discarded – undo
757 754
 		$sens = " . ' DESC'";
758 755
 	}
759 756
 	if (isset($boucle->modificateur['collate'])) {
760
-		$collecte = ' . ' . $boucle->modificateur['collate'];
757
+		$collecte = ' . '.$boucle->modificateur['collate'];
761 758
 	}
762 759
 
763 760
 	// Pour chaque paramètre du critère
@@ -779,14 +776,14 @@  discard block
 block discarded – undo
779 776
 			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
780 777
 				$expression = trim($m[1]);
781 778
 				$champ = trim($m[2]);
782
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
779
+				if (function_exists($f = 'calculer_critere_par_expression_'.$expression)) {
783 780
 					$order = $f($idb, $boucles, $crit, $tri, $champ);
784 781
 				} else {
785
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
782
+					return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
786 783
 				}
787 784
 
788 785
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
789
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
786
+			} elseif (preg_match(",^".CHAMP_SQL_PLUS_FONC.'$,is', $par, $match)) {
790 787
 				// {par FONCTION(champ)}
791 788
 				if (count($match) > 2) {
792 789
 					$par = substr($match[2], 1, -1);
@@ -796,7 +793,7 @@  discard block
 block discarded – undo
796 793
 				if ($par == 'hasard') {
797 794
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
798 795
 				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
796
+					$order = "'".$boucle->id_table.".".$boucle->show['date']."'";
800 797
 				} else {
801 798
 					// cas général {par champ}, {par table.champ}, ...
802 799
 					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
@@ -805,7 +802,7 @@  discard block
 block discarded – undo
805 802
 
806 803
 			// on ne sait pas traiter…
807 804
 			else {
808
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
805
+				return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
809 806
 			}
810 807
 
811 808
 			// En cas d'erreur de squelette retournée par une fonction
@@ -825,14 +822,14 @@  discard block
 block discarded – undo
825 822
 
826 823
 		if ($fct) {
827 824
 			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
-				$order = "'$fct(" . $r[1] . ")'";
825
+				$order = "'$fct(".$r[1].")'";
829 826
 			} else {
830 827
 				$order = "'$fct(' . $order . ')'";
831 828
 			}
832 829
 		}
833
-		$t = $order . $collecte . $sens;
830
+		$t = $order.$collecte.$sens;
834 831
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
-			$t = $r[1] . $r[2];
832
+			$t = $r[1].$r[2];
836 833
 		}
837 834
 
838 835
 		$boucle->order[] = $t;
@@ -882,16 +879,16 @@  discard block
 block discarded – undo
882 879
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
883 880
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884 881
 	if (is_array($_champ)) {
885
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
882
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." num $champ"));
886 883
 	}
887 884
 	$boucle = &$boucles[$idb];
888
-	$texte = '0+' . $_champ;
885
+	$texte = '0+'.$_champ;
889 886
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890 887
 	if ($suite !== "''") {
891
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
888
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
892 889
 	}
893
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : "");
894
-	$boucle->select[] = $texte . " AS $asnum";
890
+	$asnum = 'num'.($boucle->order ? count($boucle->order) : "");
891
+	$boucle->select[] = $texte." AS $asnum";
895 892
 
896 893
 	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
897 894
 	$orderassinum = trim($orderassinum, "'");
@@ -920,13 +917,13 @@  discard block
 block discarded – undo
920 917
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
921 918
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
922 919
 	if (is_array($_champ)) {
923
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
920
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." sinum $champ"));
924 921
 	}
925 922
 	$boucle = &$boucles[$idb];
926
-	$texte = '0+' . $_champ;
923
+	$texte = '0+'.$_champ;
927 924
 	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
928 925
 	if ($suite !== "''") {
929
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
926
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
930 927
 	}
931 928
 
932 929
 	$as = false;
@@ -942,8 +939,8 @@  discard block
 block discarded – undo
942 939
 	}
943 940
 
944 941
 	if (!$as) {
945
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
946
-		$boucle->select[] = $select . $as;
942
+		$as = 'sinum'.($boucle->order ? count($boucle->order) : "");
943
+		$boucle->select[] = $select.$as;
947 944
 	}
948 945
 	$order = "'$as'";
949 946
 	return $order;
@@ -968,10 +965,10 @@  discard block
 block discarded – undo
968 965
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
969 966
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
970 967
 	if (is_array($_champ)) {
971
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
968
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." multi $champ"));
972 969
 	}
973 970
 	$boucle = &$boucles[$idb];
974
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
971
+	$boucle->select[] = "\".sql_multi('".$_champ."', \$GLOBALS['spip_lang']).\"";
975 972
 	$order = "'multi'";
976 973
 	return $order;
977 974
 }
@@ -991,13 +988,13 @@  discard block
 block discarded – undo
991 988
  * @param bool $raw Retourne le champ pour le compilateur ("'alias.champ'") ou brut ('alias.champ')
992 989
  * @return array|string
993 990
  */
994
-function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
991
+function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
995 992
 	$boucle = &$boucles[$idb];
996 993
 	$desc = $boucle->show;
997 994
 
998 995
 	// le champ existe dans la table, pas de souci (le plus commun)
999 996
 	if (isset($desc['field'][$par])) {
1000
-		$par = $boucle->id_table . "." . $par;
997
+		$par = $boucle->id_table.".".$par;
1001 998
 	}
1002 999
 	// le champ est peut être une jointure
1003 1000
 	else {
@@ -1018,24 +1015,24 @@  discard block
 block discarded – undo
1018 1015
 		// Sinon on cherche le champ dans les tables possibles de jointures
1019 1016
 		// Si la table est déjà dans le from, on la réutilise.
1020 1017
 		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1021
-			$par = $infos['alias'] . "." . $champ;
1018
+			$par = $infos['alias'].".".$champ;
1022 1019
 		} elseif (
1023 1020
 			$boucle->jointures_explicites
1024 1021
 			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1025 1022
 		) {
1026
-			$par = $alias . "." . $champ;
1023
+			$par = $alias.".".$champ;
1027 1024
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1028
-			$par = $alias . "." . $champ;
1025
+			$par = $alias.".".$champ;
1029 1026
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1030 1027
 		} elseif (
1031 1028
 			$table_alias
1032 1029
 			and isset($boucle->from[$table_alias])
1033 1030
 			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1034 1031
 		) {
1035
-			$par = $infos['alias'] . "." . $champ;
1032
+			$par = $infos['alias'].".".$champ;
1036 1033
 		} elseif ($table) {
1037 1034
 			// On avait table + champ, mais on ne les a pas trouvés
1038
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1035
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
1039 1036
 		} else {
1040 1037
 			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1041 1038
 		}
@@ -1059,7 +1056,7 @@  discard block
 block discarded – undo
1059 1056
 	if (!$t) {
1060 1057
 		$t = trouver_jointure_champ($champ, $boucle);
1061 1058
 	}
1062
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1059
+	return !$t ? '' : ("'".$t.'.'.$champ."'");
1063 1060
 }
1064 1061
 
1065 1062
 /**
@@ -1104,9 +1101,9 @@  discard block
 block discarded – undo
1104 1101
 				$boucle->default_order[] = ' DESC';
1105 1102
 			}
1106 1103
 		} else {
1107
-			$t = $boucle->order[$n - 1] . " . $order";
1104
+			$t = $boucle->order[$n - 1]." . $order";
1108 1105
 			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1109
-				$t = $r[1] . $r[2];
1106
+				$t = $r[1].$r[2];
1110 1107
 			}
1111 1108
 			$boucle->order[$n - 1] = $t;
1112 1109
 		}
@@ -1120,11 +1117,11 @@  discard block
 block discarded – undo
1120 1117
  * @param $crit
1121 1118
  * @return array|string
1122 1119
  */
1123
-function critere_par_ordre_liste_dist($idb, &$boucles, $crit){
1120
+function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1124 1121
 	$boucle = &$boucles[$idb];
1125 1122
 
1126 1123
 	$sens = $collecte = '';
1127
-	if ($crit->not){
1124
+	if ($crit->not) {
1128 1125
 		$sens = " . ' DESC'";
1129 1126
 	}
1130 1127
 
@@ -1134,14 +1131,14 @@  discard block
 block discarded – undo
1134 1131
 	$res = critere_parinverse($idb, $boucles, $crit2);
1135 1132
 
1136 1133
 	// erreur ?
1137
-	if (is_array($res)){
1134
+	if (is_array($res)) {
1138 1135
 		return $res;
1139 1136
 	}
1140 1137
 
1141 1138
 	$_order = array_pop($boucle->order);
1142 1139
 
1143 1140
 	$_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1144
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1141
+	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'".$boucle->sql_serveur."')) ? \$zl : '0').')'$sens";
1145 1142
 }
1146 1143
 
1147 1144
 
@@ -1150,7 +1147,7 @@  discard block
 block discarded – undo
1150 1147
 	$params = $crit->param;
1151 1148
 
1152 1149
 	if (count($params) < 1) {
1153
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1150
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." ?"));
1154 1151
 	}
1155 1152
 
1156 1153
 	$boucle = &$boucles[$idb];
@@ -1171,7 +1168,7 @@  discard block
 block discarded – undo
1171 1168
 	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1172 1169
 		$date = $date[0]->texte;
1173 1170
 		if (!isset($fields[$date])) {
1174
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1171
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." ".$date));
1175 1172
 		}
1176 1173
 	} else {
1177 1174
 		$a = calculer_liste($date, $idb, $boucles, $parent);
@@ -1183,38 +1180,38 @@  discard block
 block discarded – undo
1183 1180
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1184 1181
 	}
1185 1182
 	$annee = $params ? array_shift($params) : "";
1186
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1187
-		calculer_liste($annee, $idb, $boucles, $parent) .
1183
+	$annee = "\n".'sprintf("%04d", ($x = '.
1184
+		calculer_liste($annee, $idb, $boucles, $parent).
1188 1185
 		') ? $x : date("Y"))';
1189 1186
 
1190 1187
 	$mois = $params ? array_shift($params) : "";
1191
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1192
-		calculer_liste($mois, $idb, $boucles, $parent) .
1188
+	$mois = "\n".'sprintf("%02d", ($x = '.
1189
+		calculer_liste($mois, $idb, $boucles, $parent).
1193 1190
 		') ? $x : date("m"))';
1194 1191
 
1195 1192
 	$jour = $params ? array_shift($params) : "";
1196
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1197
-		calculer_liste($jour, $idb, $boucles, $parent) .
1193
+	$jour = "\n".'sprintf("%02d", ($x = '.
1194
+		calculer_liste($jour, $idb, $boucles, $parent).
1198 1195
 		') ? $x : date("d"))';
1199 1196
 
1200 1197
 	$annee2 = $params ? array_shift($params) : "";
1201
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1202
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1198
+	$annee2 = "\n".'sprintf("%04d", ($x = '.
1199
+		calculer_liste($annee2, $idb, $boucles, $parent).
1203 1200
 		') ? $x : date("Y"))';
1204 1201
 
1205 1202
 	$mois2 = $params ? array_shift($params) : "";
1206
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1207
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1203
+	$mois2 = "\n".'sprintf("%02d", ($x = '.
1204
+		calculer_liste($mois2, $idb, $boucles, $parent).
1208 1205
 		') ? $x : date("m"))';
1209 1206
 
1210 1207
 	$jour2 = $params ? array_shift($params) : "";
1211
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1212
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1208
+	$jour2 = "\n".'sprintf("%02d", ($x = '.
1209
+		calculer_liste($jour2, $idb, $boucles, $parent).
1213 1210
 		') ? $x : date("d"))';
1214 1211
 
1215
-	$date = $boucle->id_table . ".$date";
1212
+	$date = $boucle->id_table.".$date";
1216 1213
 
1217
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1214
+	$quote_end = ",'".$boucle->sql_serveur."','text'";
1218 1215
 	if ($type == 'jour') {
1219 1216
 		$boucle->where[] = array(
1220 1217
 			"'='",
@@ -1286,14 +1283,13 @@  discard block
 block discarded – undo
1286 1283
 	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1287 1284
 
1288 1285
 	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1289
-		$boucle->limit = $a11 . ',' . $a21;
1286
+		$boucle->limit = $a11.','.$a21;
1290 1287
 	} else {
1291 1288
 		// 3 dans {1/3}, {2,3} ou {1,n-3}
1292 1289
 		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1293 1290
 		// 2 dans {2/3}, {2,5}, {n-2,1}
1294 1291
 		$partie = ($a11 != 'n') ? $a11 : $a12;
1295
-		$mode = (($op == '/') ? '/' :
1296
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1292
+		$mode = (($op == '/') ? '/' : (($a11 == 'n') ? '-' : '+').(($a21 == 'n') ? '-' : '+'));
1297 1293
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1298 1294
 		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1299 1295
 			$boucle->limit =
@@ -1339,8 +1335,7 @@  discard block
 block discarded – undo
1339 1335
 	// {1/3}
1340 1336
 	if ($op1 == '/') {
1341 1337
 		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1342
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1343
-			"($total_parties ? $total_parties : 1)";
1338
+		$totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)";
1344 1339
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1345 1340
 		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1346 1341
 	} else {
@@ -1351,15 +1346,13 @@  discard block
 block discarded – undo
1351 1346
 
1352 1347
 		// cas {x,n-1}
1353 1348
 		if ($op2 == '-') {
1354
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1355
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1356
-					($total_parties . ' - 1'));
1349
+			$fin = '$debut_boucle + '.$nombre_boucle.' - '
1350
+				. (is_numeric($total_parties) ? ($total_parties + 1) : ($total_parties.' - 1'));
1357 1351
 		} else {
1358 1352
 			// {x,1} ou {pagination}
1359 1353
 			$fin = '$debut_boucle'
1360 1354
 				. (is_numeric($total_parties) ?
1361
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1362
-					('+' . $total_parties . ' - 1'));
1355
+					(($total_parties == 1) ? "" : (' + '.($total_parties - 1))) : ('+'.$total_parties.' - 1'));
1363 1356
 		}
1364 1357
 
1365 1358
 		// {pagination}, gerer le debut_xx=-1 pour tout voir
@@ -1377,11 +1370,11 @@  discard block
 block discarded – undo
1377 1370
 	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1378 1371
 
1379 1372
 	$boucles[$id_boucle]->mode_partie = "\n\t"
1380
-		. '$debut_boucle = ' . $debut . ";\n	"
1373
+		. '$debut_boucle = '.$debut.";\n	"
1381 1374
 		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1382
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1383
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1384
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1375
+		. '$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n	"
1376
+		. '$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1377
+		. '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1385 1378
 		. "\n\tif (\$debut_boucle>0"
1386 1379
 		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1387 1380
 		. " AND \$iter->seek(\$debut_boucle,'continue'))"
@@ -1466,16 +1459,16 @@  discard block
 block discarded – undo
1466 1459
 		// critere personnalise ?
1467 1460
 		if (
1468 1461
 			(!$serveur or
1469
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1470
-					and (!function_exists($f = $f . "_dist"))
1471
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1472
-					and (!function_exists($f = $f . "_dist"))
1462
+				((!function_exists($f = "critere_".$serveur."_".$table."_".$critere))
1463
+					and (!function_exists($f = $f."_dist"))
1464
+					and (!function_exists($f = "critere_".$serveur."_".$critere))
1465
+					and (!function_exists($f = $f."_dist"))
1473 1466
 				)
1474 1467
 			)
1475
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1476
-			and (!function_exists($f = $f . "_dist"))
1477
-			and (!function_exists($f = "critere_" . $critere))
1478
-			and (!function_exists($f = $f . "_dist"))
1468
+			and (!function_exists($f = "critere_".$table."_".$critere))
1469
+			and (!function_exists($f = $f."_dist"))
1470
+			and (!function_exists($f = "critere_".$critere))
1471
+			and (!function_exists($f = $f."_dist"))
1479 1472
 		) {
1480 1473
 			// fonction critere standard
1481 1474
 			$f = $defaut;
@@ -1508,9 +1501,9 @@  discard block
 block discarded – undo
1508 1501
  */
1509 1502
 function kwote($lisp, $serveur = '', $type = '') {
1510 1503
 	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1511
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1504
+		return $r[1]."\"".sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type)."\"";
1512 1505
 	} else {
1513
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1506
+		return "sql_quote($lisp, '$serveur', '".str_replace("'", "\\'", $type)."')";
1514 1507
 	}
1515 1508
 }
1516 1509
 
@@ -1532,7 +1525,7 @@  discard block
 block discarded – undo
1532 1525
 function critere_IN_dist($idb, &$boucles, $crit) {
1533 1526
 	$r = calculer_critere_infixe($idb, $boucles, $crit);
1534 1527
 	if (!$r) {
1535
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1528
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ?")));
1536 1529
 	}
1537 1530
 	list($arg, $op, $val, $col, $where_complement) = $r;
1538 1531
 
@@ -1559,8 +1552,8 @@  discard block
 block discarded – undo
1559 1552
 				"'NOT'",
1560 1553
 				array(
1561 1554
 					"'IN'",
1562
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1563
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1555
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1556
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1564 1557
 				)
1565 1558
 			);
1566 1559
 		}
@@ -1579,22 +1572,22 @@  discard block
 block discarded – undo
1579 1572
 	$descr = $boucles[$idb]->descr;
1580 1573
 	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1581 1574
 
1582
-	$var = '$in' . $cpt++;
1575
+	$var = '$in'.$cpt++;
1583 1576
 	$x = "\n\t$var = array();";
1584 1577
 	foreach ($val as $k => $v) {
1585 1578
 		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1586 1579
 			// optimiser le traitement des constantes
1587 1580
 			if (is_numeric($r[2])) {
1588
-				$x .= "\n\t$var" . "[]= $r[2];";
1581
+				$x .= "\n\t$var"."[]= $r[2];";
1589 1582
 			} else {
1590
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1583
+				$x .= "\n\t$var"."[]= ".sql_quote($r[2]).";";
1591 1584
 			}
1592 1585
 		} else {
1593 1586
 			// Pour permettre de passer des tableaux de valeurs
1594 1587
 			// on repere l'utilisation brute de #ENV**{X},
1595 1588
 			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1596 1589
 			// et on deballe mais en rajoutant l'anti XSS
1597
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1590
+			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);";
1598 1591
 		}
1599 1592
 	}
1600 1593
 
@@ -1608,7 +1601,7 @@  discard block
 block discarded – undo
1608 1601
 		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1609 1602
 	}
1610 1603
 
1611
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1604
+	return "sql_in('$arg', $var".($crit2 == 'NOT' ? ",'NOT'" : "").")";
1612 1605
 }
1613 1606
 
1614 1607
 /**
@@ -1681,7 +1674,7 @@  discard block
 block discarded – undo
1681 1674
 		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1682 1675
 	}
1683 1676
 	// nous aider en mode debug.
1684
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1677
+	$boucle->debug[] = "id_ : ".implode(', ', $champs);
1685 1678
 	$boucle->modificateur['id_'] = $champs;
1686 1679
 
1687 1680
 	// créer un critère {id_xxx?} de chaque champ retenu
@@ -1722,7 +1715,7 @@  discard block
 block discarded – undo
1722 1715
 	// Les champs id_xx de la table demandée
1723 1716
 	$champs = array_filter(
1724 1717
 		array_keys($desc['field']),
1725
-		function($champ){
1718
+		function($champ) {
1726 1719
 			return
1727 1720
 				strpos($champ, 'id_') === 0
1728 1721
 				or (in_array($champ, array('objet')));
@@ -1937,8 +1930,8 @@  discard block
 block discarded – undo
1937 1930
 				"'NOT'",
1938 1931
 				array(
1939 1932
 					"'IN'",
1940
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1941
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1933
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1934
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1942 1935
 				)
1943 1936
 			);
1944 1937
 		}
@@ -1949,7 +1942,7 @@  discard block
 block discarded – undo
1949 1942
 	if ($crit->cond) {
1950 1943
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
1951 1944
 		if ($col == "date" or $col == "date_redac") {
1952
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1945
+			if ($pred == "\$Pile[0]['".$col."']") {
1953 1946
 				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1954 1947
 			}
1955 1948
 		}
@@ -2110,7 +2103,7 @@  discard block
 block discarded – undo
2110 2103
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2111 2104
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2112 2105
 		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2113
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2106
+			$val[0] = $r[1].'"'.sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote).'"';
2114 2107
 		}
2115 2108
 		// sinon expliciter les
2116 2109
 		// sql_quote(truc) en sql_quote(truc,'',type)
@@ -2121,22 +2114,22 @@  discard block
 block discarded – undo
2121 2114
 		// sql_quote(truc,'','varchar')
2122 2115
 		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2123 2116
 			// si pas deja un type
2124
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2117
+			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2125 2118
 		) {
2126 2119
 			$r = $r[1]
2127 2120
 				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2128
-				. ",'" . addslashes($type_cast_quote) . "'";
2121
+				. ",'".addslashes($type_cast_quote)."'";
2129 2122
 			$val[0] = "sql_quote($r)";
2130 2123
 		}
2131
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2124
+		elseif (strpos($val[0], '@@defaultcast@@') !== false
2132 2125
 		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2133
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2126
+			$val[0] = substr($val[0], 0, -strlen($r[0]))."'".addslashes($type_cast_quote)."')";
2134 2127
 		}
2135 2128
 	}
2136 2129
 
2137
-	if(strpos($val[0], '@@defaultcast@@') !== false
2130
+	if (strpos($val[0], '@@defaultcast@@') !== false
2138 2131
 	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2139
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2132
+		$val[0] = substr($val[0], 0, -strlen($r[0]))."'char')";
2140 2133
 	}
2141 2134
 
2142 2135
 	// Indicateur pour permettre aux fonctionx boucle_X de modifier
@@ -2152,7 +2145,7 @@  discard block
 block discarded – undo
2152 2145
 	// inserer le nom de la table SQL devant le nom du champ
2153 2146
 	if ($table) {
2154 2147
 		if ($col[0] == "`") {
2155
-			$arg = "$table." . substr($col, 1, -1);
2148
+			$arg = "$table.".substr($col, 1, -1);
2156 2149
 		} else {
2157 2150
 			$arg = "$table.$col";
2158 2151
 		}
@@ -2286,9 +2279,9 @@  discard block
 block discarded – undo
2286 2279
  **/
2287 2280
 function primary_doublee($decompose, $table) {
2288 2281
 	$e1 = reset($decompose);
2289
-	$e2 = "sql_quote('" . end($decompose) . "')";
2282
+	$e2 = "sql_quote('".end($decompose)."')";
2290 2283
 
2291
-	return array("'='", "'$table." . $e1 . "'", $e2);
2284
+	return array("'='", "'$table.".$e1."'", $e2);
2292 2285
 }
2293 2286
 
2294 2287
 /**
@@ -2326,7 +2319,7 @@  discard block
 block discarded – undo
2326 2319
 	if ($checkarrivee
2327 2320
 		and is_string($checkarrivee)
2328 2321
 		and $a = table_objet($checkarrivee)
2329
-		and in_array($a . '_liens', $joints)
2322
+		and in_array($a.'_liens', $joints)
2330 2323
 	) {
2331 2324
 		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2332 2325
 			return $res;
@@ -2346,12 +2339,12 @@  discard block
 block discarded – undo
2346 2339
 				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2347 2340
 				$joindre = false;
2348 2341
 				foreach ($cols as $col) {
2349
-					$c = '/\b' . $t . ".$col" . '\b/';
2342
+					$c = '/\b'.$t.".$col".'\b/';
2350 2343
 					if (trouver_champ($c, $boucle->where)) {
2351 2344
 						$joindre = true;
2352 2345
 					} else {
2353 2346
 						// mais ca peut etre dans le FIELD pour le Having
2354
-						$c = "/FIELD.$t" . ".$col,/";
2347
+						$c = "/FIELD.$t".".$col,/";
2355 2348
 						if (trouver_champ($c, $boucle->select)) {
2356 2349
 							$joindre = true;
2357 2350
 						}
@@ -2398,7 +2391,7 @@  discard block
 block discarded – undo
2398 2391
 	$primary_arrivee = id_table_objet($checkarrivee);
2399 2392
 
2400 2393
 	// [FIXME] $checkarrivee peut-il arriver avec false ????
2401
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2394
+	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee."_liens");
2402 2395
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2403 2396
 
2404 2397
 	if (!$intermediaire or !$arrivee) {
@@ -2496,7 +2489,7 @@  discard block
 block discarded – undo
2496 2489
 			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2497 2490
 				// un critere conditionnel sur date est traite a part
2498 2491
 				// car la date est mise d'office par SPIP,
2499
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2492
+				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])";
2500 2493
 			}
2501 2494
 
2502 2495
 			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
@@ -2527,7 +2520,7 @@  discard block
 block discarded – undo
2527 2520
 			and (($p == "'") or ($p == '"'))
2528 2521
 			and $params[0][1]->type == 'champ'
2529 2522
 		) {
2530
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2523
+			$val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p";
2531 2524
 		} else {
2532 2525
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2533 2526
 				$a = calculer_liste($p, $idb, $boucles, $parent);
@@ -2543,7 +2536,7 @@  discard block
 block discarded – undo
2543 2536
 	$fct = $args_sql = '';
2544 2537
 	// fonction SQL ?
2545 2538
 	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2546
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2539
+	if (preg_match('/^(.*)'.SQL_ARGS.'$/', $col, $m)) {
2547 2540
 		$fct = $m[1];
2548 2541
 		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2549 2542
 		$col = $a[1];
@@ -2633,7 +2626,7 @@  discard block
 block discarded – undo
2633 2626
 		# si oui choisir ce champ, sinon choisir xxxx
2634 2627
 
2635 2628
 		if (isset($table['field']["date$suite"])) {
2636
-			$date_orig = 'date' . $suite;
2629
+			$date_orig = 'date'.$suite;
2637 2630
 		} else {
2638 2631
 			$date_orig = substr($suite, 1);
2639 2632
 		}
@@ -2644,12 +2637,12 @@  discard block
 block discarded – undo
2644 2637
 		}
2645 2638
 	}
2646 2639
 
2647
-	$date_compare = "\"' . normaliser_date(" .
2648
-		calculer_argument_precedent($idb, $pred, $boucles) .
2640
+	$date_compare = "\"' . normaliser_date(".
2641
+		calculer_argument_precedent($idb, $pred, $boucles).
2649 2642
 		") . '\"";
2650 2643
 
2651 2644
 	$col_vraie = $date_orig;
2652
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2645
+	$date_orig = $boucle->id_table.'.'.$date_orig;
2653 2646
 
2654 2647
 	switch ($col) {
2655 2648
 		case 'date':
@@ -2669,26 +2662,26 @@  discard block
 block discarded – undo
2669 2662
 			break;
2670 2663
 		case 'age':
2671 2664
 			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2672
-			$col_vraie = "";// comparer a un int (par defaut)
2665
+			$col_vraie = ""; // comparer a un int (par defaut)
2673 2666
 			break;
2674 2667
 		case 'age_relatif':
2675 2668
 			$col = calculer_param_date($date_compare, $date_orig);
2676
-			$col_vraie = "";// comparer a un int (par defaut)
2669
+			$col_vraie = ""; // comparer a un int (par defaut)
2677 2670
 			break;
2678 2671
 		case 'jour_relatif':
2679
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2680
-			$col_vraie = "";// comparer a un int (par defaut)
2672
+			$col = "(TO_DAYS(".$date_compare.")-TO_DAYS(".$date_orig."))";
2673
+			$col_vraie = ""; // comparer a un int (par defaut)
2681 2674
 			break;
2682 2675
 		case 'mois_relatif':
2683
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2684
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2685
-				")-YEAR(" . $date_orig . "))";
2686
-			$col_vraie = "";// comparer a un int (par defaut)
2676
+			$col = "MONTH(".$date_compare.")-MONTH(".
2677
+				$date_orig.")+12*(YEAR(".$date_compare.
2678
+				")-YEAR(".$date_orig."))";
2679
+			$col_vraie = ""; // comparer a un int (par defaut)
2687 2680
 			break;
2688 2681
 		case 'annee_relatif':
2689
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2690
-				$date_orig . ")";
2691
-			$col_vraie = "";// comparer a un int (par defaut)
2682
+			$col = "YEAR(".$date_compare.")-YEAR(".
2683
+				$date_orig.")";
2684
+			$col_vraie = ""; // comparer a un int (par defaut)
2692 2685
 			break;
2693 2686
 	}
2694 2687
 
@@ -2747,10 +2740,10 @@  discard block
 block discarded – undo
2747 2740
 	}
2748 2741
 
2749 2742
 	$boucle->hash .= '
2750
-	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2743
+	$command[\'sourcemode\'] = ' . array_shift($args).";\n";
2751 2744
 
2752 2745
 	$boucle->hash .= '
2753
-	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2746
+	$command[\'source\'] = array(' . join(', ', $args).");\n";
2754 2747
 }
2755 2748
 
2756 2749
 /**
@@ -2769,7 +2762,7 @@  discard block
 block discarded – undo
2769 2762
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2770 2763
 	$boucle = &$boucles[$idb];
2771 2764
 	$boucle->hash .= '
2772
-	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2765
+	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).';';
2773 2766
 }
2774 2767
 
2775 2768
 
@@ -2788,7 +2781,7 @@  discard block
 block discarded – undo
2788 2781
 	$boucle->hash .= '$command[\'args\']=array();';
2789 2782
 	foreach ($crit->param as $param) {
2790 2783
 		$boucle->hash .= '
2791
-			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2784
+			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2792 2785
 	}
2793 2786
 }
2794 2787
 
@@ -2807,10 +2800,10 @@  discard block
 block discarded – undo
2807 2800
  */
2808 2801
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2809 2802
 	$boucle = &$boucles[$idb];
2810
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2803
+	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
2811 2804
 	foreach ($crit->param as $param) {
2812
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2813
-				$boucles[$idb]->id_parent) . ";\n";
2805
+		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste($param, $idb, $boucles,
2806
+				$boucles[$idb]->id_parent).";\n";
2814 2807
 	}
2815 2808
 }
2816 2809
 
@@ -2837,10 +2830,10 @@  discard block
 block discarded – undo
2837 2830
  */
2838 2831
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2839 2832
 	$boucle = &$boucles[$idb];
2840
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2833
+	$boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n";
2841 2834
 	foreach ($crit->param as $param) {
2842
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2843
-				$boucles[$idb]->id_parent) . ";\n";
2835
+		$boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste($param, $idb, $boucles,
2836
+				$boucles[$idb]->id_parent).";\n";
2844 2837
 	}
2845 2838
 }
2846 2839
 
@@ -2859,7 +2852,7 @@  discard block
 block discarded – undo
2859 2852
 	$boucle = &$boucles[$idb];
2860 2853
 	foreach ($crit->param as $param) {
2861 2854
 		$boucle->hash .= '
2862
-			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2855
+			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).';';
2863 2856
 	}
2864 2857
 }
2865 2858
 
@@ -2900,7 +2893,7 @@  discard block
 block discarded – undo
2900 2893
 	if ($crit->param) {
2901 2894
 		foreach ($crit->param as $param) {
2902 2895
 			$boucle->hash .= "\t\$command['si'][] = "
2903
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2896
+				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent).";\n";
2904 2897
 		}
2905 2898
 		// interdire {si 0} aussi !
2906 2899
 	} else {
@@ -2924,7 +2917,7 @@  discard block
 block discarded – undo
2924 2917
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2925 2918
 	$boucle = &$boucles[$idb];
2926 2919
 	$boucle->hash .= '
2927
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2920
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent).');
2928 2921
 	$command[\'sourcemode\'] = \'table\';';
2929 2922
 }
2930 2923
 
@@ -2957,11 +2950,10 @@  discard block
 block discarded – undo
2957 2950
 	$table_sql = table_objet_sql(objet_type($table));
2958 2951
 
2959 2952
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2960
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2961
-		'id_parent';
2953
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
2962 2954
 
2963 2955
 	$in = "IN";
2964
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2956
+	$where = array("'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2965 2957
 	if ($not) {
2966 2958
 		$where = array("'NOT'", $where);
2967 2959
 	}
Please login to merge, or discard this patch.
ecrire/public/fonctions.php 2 patches
Indentation   +296 added lines, -296 removed lines patch added patch discarded remove patch
@@ -23,7 +23,7 @@  discard block
 block discarded – undo
23 23
  **/
24 24
 
25 25
 if (!defined('_ECRIRE_INC_VERSION')) {
26
-	return;
26
+    return;
27 27
 }
28 28
 
29 29
 
@@ -52,75 +52,75 @@  discard block
 block discarded – undo
52 52
  *     Introduction calculée
53 53
  **/
54 54
 function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) {
55
-	// Si un descriptif est envoye, on l'utilise directement
56
-	if (strlen($descriptif)) {
57
-		return appliquer_traitement_champ($descriptif, 'introduction', '', array(), $connect);
58
-	}
59
-
60
-	// De preference ce qui est marque <intro>...</intro>
61
-	$intro = '';
62
-	$texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte); // minuscules
63
-	while ($fin = strpos($texte, "</intro>")) {
64
-		$zone = substr($texte, 0, $fin);
65
-		$texte = substr($texte, $fin + strlen("</intro>"));
66
-		if ($deb = strpos($zone, "<intro>") or substr($zone, 0, 7) == "<intro>") {
67
-			$zone = substr($zone, $deb + 7);
68
-		}
69
-		$intro .= $zone;
70
-	}
71
-
72
-	// [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
73
-	// qui inclus raccourcis et modeles
74
-	// un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
75
-	// par ailleurs le nettoyage des raccourcis ne tient pas compte
76
-	// des surcharges et enrichissement de propre
77
-	// couper doit se faire apres propre
78
-	//$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
79
-
80
-	// Cependant pour des questions de perfs on coupe quand meme, en prenant
81
-	// large et en se mefiant des tableaux #1323
82
-
83
-	if (strlen($intro)) {
84
-		$texte = $intro;
85
-	} else {
86
-		if (strpos("\n" . $texte, "\n|") === false
87
-			and strlen($texte) > 2.5 * $longueur
88
-		) {
89
-			if (strpos($texte, "<multi") !== false) {
90
-				$texte = extraire_multi($texte);
91
-			}
92
-			$texte = couper($texte, 2 * $longueur);
93
-		}
94
-	}
95
-
96
-	// ne pas tenir compte des notes
97
-	if ($notes = charger_fonction('notes', 'inc', true)) {
98
-		$notes('', 'empiler');
99
-	}
100
-	// Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
101
-	// dans l'introduction.
102
-	$texte = supprime_img($texte, '');
103
-	$texte = appliquer_traitement_champ($texte, 'introduction', '', array(), $connect);
104
-
105
-	if ($notes) {
106
-		$notes('', 'depiler');
107
-	}
108
-
109
-	if (is_null($suite) and defined('_INTRODUCTION_SUITE')) {
110
-		$suite = _INTRODUCTION_SUITE;
111
-	}
112
-	$texte = couper($texte, $longueur, $suite);
113
-	// comme on a coupe il faut repasser la typo (on a perdu les insecables)
114
-	$texte = typo($texte, true, $connect, array());
115
-
116
-	// et reparagrapher si necessaire (coherence avec le cas descriptif)
117
-	// une introduction a tojours un <p>
118
-	if ($GLOBALS['toujours_paragrapher']) // Fermer les paragraphes
119
-	{
120
-		$texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
121
-	}
122
-
123
-	return $texte;
55
+    // Si un descriptif est envoye, on l'utilise directement
56
+    if (strlen($descriptif)) {
57
+        return appliquer_traitement_champ($descriptif, 'introduction', '', array(), $connect);
58
+    }
59
+
60
+    // De preference ce qui est marque <intro>...</intro>
61
+    $intro = '';
62
+    $texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte); // minuscules
63
+    while ($fin = strpos($texte, "</intro>")) {
64
+        $zone = substr($texte, 0, $fin);
65
+        $texte = substr($texte, $fin + strlen("</intro>"));
66
+        if ($deb = strpos($zone, "<intro>") or substr($zone, 0, 7) == "<intro>") {
67
+            $zone = substr($zone, $deb + 7);
68
+        }
69
+        $intro .= $zone;
70
+    }
71
+
72
+    // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
73
+    // qui inclus raccourcis et modeles
74
+    // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
75
+    // par ailleurs le nettoyage des raccourcis ne tient pas compte
76
+    // des surcharges et enrichissement de propre
77
+    // couper doit se faire apres propre
78
+    //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
79
+
80
+    // Cependant pour des questions de perfs on coupe quand meme, en prenant
81
+    // large et en se mefiant des tableaux #1323
82
+
83
+    if (strlen($intro)) {
84
+        $texte = $intro;
85
+    } else {
86
+        if (strpos("\n" . $texte, "\n|") === false
87
+            and strlen($texte) > 2.5 * $longueur
88
+        ) {
89
+            if (strpos($texte, "<multi") !== false) {
90
+                $texte = extraire_multi($texte);
91
+            }
92
+            $texte = couper($texte, 2 * $longueur);
93
+        }
94
+    }
95
+
96
+    // ne pas tenir compte des notes
97
+    if ($notes = charger_fonction('notes', 'inc', true)) {
98
+        $notes('', 'empiler');
99
+    }
100
+    // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
101
+    // dans l'introduction.
102
+    $texte = supprime_img($texte, '');
103
+    $texte = appliquer_traitement_champ($texte, 'introduction', '', array(), $connect);
104
+
105
+    if ($notes) {
106
+        $notes('', 'depiler');
107
+    }
108
+
109
+    if (is_null($suite) and defined('_INTRODUCTION_SUITE')) {
110
+        $suite = _INTRODUCTION_SUITE;
111
+    }
112
+    $texte = couper($texte, $longueur, $suite);
113
+    // comme on a coupe il faut repasser la typo (on a perdu les insecables)
114
+    $texte = typo($texte, true, $connect, array());
115
+
116
+    // et reparagrapher si necessaire (coherence avec le cas descriptif)
117
+    // une introduction a tojours un <p>
118
+    if ($GLOBALS['toujours_paragrapher']) // Fermer les paragraphes
119
+    {
120
+        $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
121
+    }
122
+
123
+    return $texte;
124 124
 }
125 125
 
126 126
 
@@ -155,73 +155,73 @@  discard block
 block discarded – undo
155 155
  *     Code HTML de la pagination
156 156
  **/
157 157
 function filtre_pagination_dist(
158
-	$total,
159
-	$nom,
160
-	$position,
161
-	$pas,
162
-	$liste = true,
163
-	$modele = '',
164
-	$connect = '',
165
-	$env = array()
158
+    $total,
159
+    $nom,
160
+    $position,
161
+    $pas,
162
+    $liste = true,
163
+    $modele = '',
164
+    $connect = '',
165
+    $env = array()
166 166
 ) {
167
-	static $ancres = array();
168
-	if ($pas < 1) {
169
-		return '';
170
-	}
171
-	$ancre = 'pagination' . $nom; // #pagination_articles
172
-	$debut = 'debut' . $nom; // 'debut_articles'
173
-
174
-	// n'afficher l'ancre qu'une fois
175
-	if (!isset($ancres[$ancre])) {
176
-		$bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>";
177
-	} else {
178
-		$bloc_ancre = '';
179
-	}
180
-	// liste = false : on ne veut que l'ancre
181
-	if (!$liste) {
182
-		return $ancres[$ancre];
183
-	}
184
-
185
-	$self = (empty($env['self']) ? self() : $env['self']);
186
-	$pagination = array(
187
-		'debut' => $debut,
188
-		'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
189
-		'total' => $total,
190
-		'position' => intval($position),
191
-		'pas' => $pas,
192
-		'nombre_pages' => floor(($total - 1) / $pas) + 1,
193
-		'page_courante' => floor(intval($position) / $pas) + 1,
194
-		'ancre' => $ancre,
195
-		'bloc_ancre' => $bloc_ancre
196
-	);
197
-	if (is_array($env)) {
198
-		$pagination = array_merge($env, $pagination);
199
-	}
200
-
201
-	// Pas de pagination
202
-	if ($pagination['nombre_pages'] <= 1) {
203
-		return '';
204
-	}
205
-
206
-	if ($modele) {
207
-		$pagination['type_pagination'] = $modele;
208
-		if (trouver_fond('pagination_'.$modele, 'modeles')) {
209
-			$modele = '_' . $modele;
210
-		}
211
-		else {
212
-			$modele = '';
213
-		}
214
-	}
215
-
216
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
217
-		define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
218
-	}
219
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
220
-		define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
221
-	}
222
-
223
-
224
-	return recuperer_fond("modeles/pagination$modele", $pagination, array('trim' => true), $connect);
167
+    static $ancres = array();
168
+    if ($pas < 1) {
169
+        return '';
170
+    }
171
+    $ancre = 'pagination' . $nom; // #pagination_articles
172
+    $debut = 'debut' . $nom; // 'debut_articles'
173
+
174
+    // n'afficher l'ancre qu'une fois
175
+    if (!isset($ancres[$ancre])) {
176
+        $bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>";
177
+    } else {
178
+        $bloc_ancre = '';
179
+    }
180
+    // liste = false : on ne veut que l'ancre
181
+    if (!$liste) {
182
+        return $ancres[$ancre];
183
+    }
184
+
185
+    $self = (empty($env['self']) ? self() : $env['self']);
186
+    $pagination = array(
187
+        'debut' => $debut,
188
+        'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
189
+        'total' => $total,
190
+        'position' => intval($position),
191
+        'pas' => $pas,
192
+        'nombre_pages' => floor(($total - 1) / $pas) + 1,
193
+        'page_courante' => floor(intval($position) / $pas) + 1,
194
+        'ancre' => $ancre,
195
+        'bloc_ancre' => $bloc_ancre
196
+    );
197
+    if (is_array($env)) {
198
+        $pagination = array_merge($env, $pagination);
199
+    }
200
+
201
+    // Pas de pagination
202
+    if ($pagination['nombre_pages'] <= 1) {
203
+        return '';
204
+    }
205
+
206
+    if ($modele) {
207
+        $pagination['type_pagination'] = $modele;
208
+        if (trouver_fond('pagination_'.$modele, 'modeles')) {
209
+            $modele = '_' . $modele;
210
+        }
211
+        else {
212
+            $modele = '';
213
+        }
214
+    }
215
+
216
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
217
+        define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
218
+    }
219
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
220
+        define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
221
+    }
222
+
223
+
224
+    return recuperer_fond("modeles/pagination$modele", $pagination, array('trim' => true), $connect);
225 225
 }
226 226
 
227 227
 
@@ -240,44 +240,44 @@  discard block
 block discarded – undo
240 240
  *     Liste (première page, dernière page).
241 241
  **/
242 242
 function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) {
243
-	if ($max <= 0 or $max >= $nombre) {
244
-		return array(1, $nombre);
245
-	}
246
-	if ($max <= 1) {
247
-		return array($courante, $courante);
248
-	}
249
-
250
-	$premiere = max(1, $courante - floor(($max - 1) / 2));
251
-	$derniere = min($nombre, $premiere + $max - 2);
252
-	$premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
253
-
254
-	return array($premiere, $derniere);
243
+    if ($max <= 0 or $max >= $nombre) {
244
+        return array(1, $nombre);
245
+    }
246
+    if ($max <= 1) {
247
+        return array($courante, $courante);
248
+    }
249
+
250
+    $premiere = max(1, $courante - floor(($max - 1) / 2));
251
+    $derniere = min($nombre, $premiere + $max - 2);
252
+    $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
253
+
254
+    return array($premiere, $derniere);
255 255
 }
256 256
 
257 257
 function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numero_page, $rang_item) {
258
-	if ($numero_page === 'tous') {
259
-		return '&#8734;';
260
-	}
261
-	if ($numero_page === 'prev') {
262
-		return '&lt;';
263
-	}
264
-	if ($numero_page === 'next') {
265
-		return '&gt;';
266
-	}
267
-
268
-	switch ($type_pagination) {
269
-		case 'resultats':
270
-			return $rang_item + 1; // 1 11 21 31...
271
-		case 'naturel':
272
-			return $rang_item ? $rang_item : 1; // 1 10 20 30...
273
-		case 'rang':
274
-			return $rang_item; // 0 10 20 30...
275
-
276
-		case 'page':
277
-		case 'prive':
278
-		default:
279
-			return $numero_page; // 1 2 3 4 5...
280
-	}
258
+    if ($numero_page === 'tous') {
259
+        return '&#8734;';
260
+    }
261
+    if ($numero_page === 'prev') {
262
+        return '&lt;';
263
+    }
264
+    if ($numero_page === 'next') {
265
+        return '&gt;';
266
+    }
267
+
268
+    switch ($type_pagination) {
269
+        case 'resultats':
270
+            return $rang_item + 1; // 1 11 21 31...
271
+        case 'naturel':
272
+            return $rang_item ? $rang_item : 1; // 1 10 20 30...
273
+        case 'rang':
274
+            return $rang_item; // 0 10 20 30...
275
+
276
+        case 'page':
277
+        case 'prive':
278
+        default:
279
+            return $numero_page; // 1 2 3 4 5...
280
+    }
281 281
 }
282 282
 
283 283
 /**
@@ -290,15 +290,15 @@  discard block
 block discarded – undo
290 290
  **/
291 291
 function lister_objets_avec_logos($type) {
292 292
 
293
-	$objet = objet_type($type);
294
-	$ids = sql_allfetsel("L.id_objet", "spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document", "D.mode=".sql_quote('logoon')." AND L.objet=".sql_quote($objet));
295
-	if ($ids) {
296
-		$ids = array_column($ids, 'id_objet');
297
-		return implode(',', $ids);
298
-	}
299
-	else {
300
-		return "0";
301
-	}
293
+    $objet = objet_type($type);
294
+    $ids = sql_allfetsel("L.id_objet", "spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document", "D.mode=".sql_quote('logoon')." AND L.objet=".sql_quote($objet));
295
+    if ($ids) {
296
+        $ids = array_column($ids, 'id_objet');
297
+        return implode(',', $ids);
298
+    }
299
+    else {
300
+        return "0";
301
+    }
302 302
 }
303 303
 
304 304
 
@@ -314,14 +314,14 @@  discard block
 block discarded – undo
314 314
  *     Code HTML des notes
315 315
  **/
316 316
 function calculer_notes() {
317
-	$r = '';
318
-	if ($notes = charger_fonction('notes', 'inc', true)) {
319
-		$r = $notes(array());
320
-		$notes('', 'depiler');
321
-		$notes('', 'empiler');
322
-	}
323
-
324
-	return $r;
317
+    $r = '';
318
+    if ($notes = charger_fonction('notes', 'inc', true)) {
319
+        $r = $notes(array());
320
+        $notes('', 'depiler');
321
+        $notes('', 'empiler');
322
+    }
323
+
324
+    return $r;
325 325
 }
326 326
 
327 327
 
@@ -338,10 +338,10 @@  discard block
 block discarded – undo
338 338
  * @return string
339 339
  */
340 340
 function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien){
341
-	$res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
342
-	$res = array_column($res, 'rang_lien', $objet_source);
341
+    $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
342
+    $res = array_column($res, 'rang_lien', $objet_source);
343 343
 
344
-	return (isset($res[$ids]) ? $res[$ids] : '');
344
+    return (isset($res[$ids]) ? $res[$ids] : '');
345 345
 }
346 346
 
347 347
 
@@ -358,19 +358,19 @@  discard block
 block discarded – undo
358 358
  * @private
359 359
  */
360 360
 function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) {
361
-	static $liens = array();
362
-	if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
363
-		include_spip('action/editer_liens');
364
-		// quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
365
-		if ($objet_lien == $objet and $objet_lien !== $objet_source) {
366
-			$res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*'));
367
-		} else {
368
-			$res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet));
369
-		}
370
-
371
-		$liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
372
-	}
373
-	return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
361
+    static $liens = array();
362
+    if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
363
+        include_spip('action/editer_liens');
364
+        // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
365
+        if ($objet_lien == $objet and $objet_lien !== $objet_source) {
366
+            $res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*'));
367
+        } else {
368
+            $res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet));
369
+        }
370
+
371
+        $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
372
+    }
373
+    return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
374 374
 }
375 375
 
376 376
 /**
@@ -384,23 +384,23 @@  discard block
 block discarded – undo
384 384
  * @return int|string
385 385
  */
386 386
 function calculer_rang_smart($titre, $objet_source, $id, $env) {
387
-	// Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
388
-	// permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
389
-	if (isset($env['form']) and $env['form']
390
-		and isset($env['_objet_lien']) and $env['_objet_lien']
391
-		and (function_exists('lien_triables') or include_spip('action/editer_liens'))
392
-		and $r = objet_associable($env['_objet_lien'])
393
-		and list($p, $table_lien) = $r
394
-	  and lien_triables($table_lien)
395
-	  and isset($env['objet']) and $env['objet']
396
-		and isset($env['id_objet']) and $env['id_objet']
397
-		and $objet_source
398
-		and $id = intval($id)
399
-	) {
400
-		$rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
401
-		return ($rang ? $rang : '');
402
-	}
403
-	return recuperer_numero($titre);
387
+    // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
388
+    // permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
389
+    if (isset($env['form']) and $env['form']
390
+        and isset($env['_objet_lien']) and $env['_objet_lien']
391
+        and (function_exists('lien_triables') or include_spip('action/editer_liens'))
392
+        and $r = objet_associable($env['_objet_lien'])
393
+        and list($p, $table_lien) = $r
394
+      and lien_triables($table_lien)
395
+      and isset($env['objet']) and $env['objet']
396
+        and isset($env['id_objet']) and $env['id_objet']
397
+        and $objet_source
398
+        and $id = intval($id)
399
+    ) {
400
+        $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
401
+        return ($rang ? $rang : '');
402
+    }
403
+    return recuperer_numero($titre);
404 404
 }
405 405
 
406 406
 
@@ -416,7 +416,7 @@  discard block
 block discarded – undo
416 416
  * @return string
417 417
  */
418 418
 function tri_protege_champ($t) {
419
-	return preg_replace(',[^\s\w.+\[\]],', '', $t);
419
+    return preg_replace(',[^\s\w.+\[\]],', '', $t);
420 420
 }
421 421
 
422 422
 /**
@@ -429,42 +429,42 @@  discard block
 block discarded – undo
429 429
  * @return string
430 430
  */
431 431
 function tri_champ_order($t, $from = null, $senstri='') {
432
-	if (strncmp($t, 'multi ', 6) == 0) {
433
-		return "multi";
434
-	}
435
-
436
-	$champ = $t;
437
-
438
-	$prefixe = '';
439
-	foreach (['num ', 'sinum '] as $p) {
440
-		if (strpos($t, $p) === 0) {
441
-			$champ = substr($t, strlen($p));
442
-			$prefixe = $p;
443
-		}
444
-	}
445
-
446
-	// enlever les autres espaces non evacues par tri_protege_champ
447
-	$champ = preg_replace(',\s,', '', $champ);
448
-
449
-	if (is_array($from)) {
450
-		$trouver_table = charger_fonction('trouver_table', 'base');
451
-		foreach ($from as $idt => $table_sql) {
452
-			if ($desc = $trouver_table($table_sql)
453
-				and isset($desc['field'][$champ])
454
-			) {
455
-				$champ = "$idt.$champ";
456
-				break;
457
-			}
458
-		}
459
-	}
460
-	switch ($prefixe) {
461
-		case 'num ':
462
-			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}";
463
-		case 'sinum ':
464
-			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}";
465
-		default:
466
-			return $champ . $senstri;
467
-	}
432
+    if (strncmp($t, 'multi ', 6) == 0) {
433
+        return "multi";
434
+    }
435
+
436
+    $champ = $t;
437
+
438
+    $prefixe = '';
439
+    foreach (['num ', 'sinum '] as $p) {
440
+        if (strpos($t, $p) === 0) {
441
+            $champ = substr($t, strlen($p));
442
+            $prefixe = $p;
443
+        }
444
+    }
445
+
446
+    // enlever les autres espaces non evacues par tri_protege_champ
447
+    $champ = preg_replace(',\s,', '', $champ);
448
+
449
+    if (is_array($from)) {
450
+        $trouver_table = charger_fonction('trouver_table', 'base');
451
+        foreach ($from as $idt => $table_sql) {
452
+            if ($desc = $trouver_table($table_sql)
453
+                and isset($desc['field'][$champ])
454
+            ) {
455
+                $champ = "$idt.$champ";
456
+                break;
457
+            }
458
+        }
459
+    }
460
+    switch ($prefixe) {
461
+        case 'num ':
462
+            return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}";
463
+        case 'sinum ':
464
+            return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}";
465
+        default:
466
+            return $champ . $senstri;
467
+    }
468 468
 }
469 469
 
470 470
 /**
@@ -478,18 +478,18 @@  discard block
 block discarded – undo
478 478
  * @return string
479 479
  */
480 480
 function tri_champ_select($t) {
481
-	if (strncmp($t, 'multi ', 6) == 0) {
482
-		$t = substr($t, 6);
483
-		$t = preg_replace(',\s,', '', $t);
484
-		$t = sql_multi($t, $GLOBALS['spip_lang']);
485
-
486
-		return $t;
487
-	}
488
-	if (trim($t) == 'hasard') {
489
-		return 'rand() AS hasard';
490
-	}
491
-
492
-	return "''";
481
+    if (strncmp($t, 'multi ', 6) == 0) {
482
+        $t = substr($t, 6);
483
+        $t = preg_replace(',\s,', '', $t);
484
+        $t = sql_multi($t, $GLOBALS['spip_lang']);
485
+
486
+        return $t;
487
+    }
488
+    if (trim($t) == 'hasard') {
489
+        return 'rand() AS hasard';
490
+    }
491
+
492
+    return "''";
493 493
 }
494 494
 
495 495
 /**
@@ -501,16 +501,16 @@  discard block
 block discarded – undo
501 501
  * @return string
502 502
  */
503 503
 function formate_liste_critere_par_ordre_liste($valeurs, $serveur = ''){
504
-	if (!is_array($valeurs)){
505
-		return '';
506
-	}
507
-	$f = sql_serveur('quote', $serveur, true);
508
-	if (!is_string($f) or !$f){
509
-		return '';
510
-	}
511
-	$valeurs = implode(',', array_map($f, array_unique($valeurs)));
512
-
513
-	return $valeurs;
504
+    if (!is_array($valeurs)){
505
+        return '';
506
+    }
507
+    $f = sql_serveur('quote', $serveur, true);
508
+    if (!is_string($f) or !$f){
509
+        return '';
510
+    }
511
+    $valeurs = implode(',', array_map($f, array_unique($valeurs)));
512
+
513
+    return $valeurs;
514 514
 }
515 515
 
516 516
 /**
@@ -533,20 +533,20 @@  discard block
 block discarded – undo
533 533
  *     Valeur $defaut sinon.
534 534
  **/
535 535
 function appliquer_filtre_sinon($arg, $filtre, $args, $defaut = '') {
536
-	// Si c'est un filtre d'image, on utilise image_filtrer()
537
-	// Attention : les 2 premiers arguments sont inversés dans ce cas
538
-	if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
539
-		$args[1] = $args[0];
540
-		$args[0] = $filtre;
541
-		return image_graver(image_filtrer($args));
542
-	}
543
-
544
-	$f = chercher_filtre($filtre);
545
-	if (!$f) {
546
-		return $defaut;
547
-	}
548
-	array_shift($args); // enlever $arg
549
-	array_shift($args); // enlever $filtre
550
-	array_unshift($args, $arg); // remettre $arg
551
-	return call_user_func_array($f, $args);
536
+    // Si c'est un filtre d'image, on utilise image_filtrer()
537
+    // Attention : les 2 premiers arguments sont inversés dans ce cas
538
+    if (trouver_filtre_matrice($filtre) and substr($filtre, 0, 6) == 'image_') {
539
+        $args[1] = $args[0];
540
+        $args[0] = $filtre;
541
+        return image_graver(image_filtrer($args));
542
+    }
543
+
544
+    $f = chercher_filtre($filtre);
545
+    if (!$f) {
546
+        return $defaut;
547
+    }
548
+    array_shift($args); // enlever $arg
549
+    array_shift($args); // enlever $filtre
550
+    array_unshift($args, $arg); // remettre $arg
551
+    return call_user_func_array($f, $args);
552 552
 }
Please login to merge, or discard this patch.
Spacing   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
 	if (strlen($intro)) {
84 84
 		$texte = $intro;
85 85
 	} else {
86
-		if (strpos("\n" . $texte, "\n|") === false
86
+		if (strpos("\n".$texte, "\n|") === false
87 87
 			and strlen($texte) > 2.5 * $longueur
88 88
 		) {
89 89
 			if (strpos($texte, "<multi") !== false) {
@@ -168,12 +168,12 @@  discard block
 block discarded – undo
168 168
 	if ($pas < 1) {
169 169
 		return '';
170 170
 	}
171
-	$ancre = 'pagination' . $nom; // #pagination_articles
172
-	$debut = 'debut' . $nom; // 'debut_articles'
171
+	$ancre = 'pagination'.$nom; // #pagination_articles
172
+	$debut = 'debut'.$nom; // 'debut_articles'
173 173
 
174 174
 	// n'afficher l'ancre qu'une fois
175 175
 	if (!isset($ancres[$ancre])) {
176
-		$bloc_ancre = $ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>";
176
+		$bloc_ancre = $ancres[$ancre] = "<a id='".$ancre."' class='pagination_ancre'></a>";
177 177
 	} else {
178 178
 		$bloc_ancre = '';
179 179
 	}
@@ -206,7 +206,7 @@  discard block
 block discarded – undo
206 206
 	if ($modele) {
207 207
 		$pagination['type_pagination'] = $modele;
208 208
 		if (trouver_fond('pagination_'.$modele, 'modeles')) {
209
-			$modele = '_' . $modele;
209
+			$modele = '_'.$modele;
210 210
 		}
211 211
 		else {
212 212
 			$modele = '';
@@ -337,7 +337,7 @@  discard block
 block discarded – undo
337 337
  * @param $objet_lien
338 338
  * @return string
339 339
  */
340
-function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien){
340
+function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien) {
341 341
 	$res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
342 342
 	$res = array_column($res, 'rang_lien', $objet_source);
343 343
 
@@ -428,7 +428,7 @@  discard block
 block discarded – undo
428 428
  * @param array $from
429 429
  * @return string
430 430
  */
431
-function tri_champ_order($t, $from = null, $senstri='') {
431
+function tri_champ_order($t, $from = null, $senstri = '') {
432 432
 	if (strncmp($t, 'multi ', 6) == 0) {
433 433
 		return "multi";
434 434
 	}
@@ -463,7 +463,7 @@  discard block
 block discarded – undo
463 463
 		case 'sinum ':
464 464
 			return "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}";
465 465
 		default:
466
-			return $champ . $senstri;
466
+			return $champ.$senstri;
467 467
 	}
468 468
 }
469 469
 
@@ -500,12 +500,12 @@  discard block
 block discarded – undo
500 500
  * @param string $serveur
501 501
  * @return string
502 502
  */
503
-function formate_liste_critere_par_ordre_liste($valeurs, $serveur = ''){
504
-	if (!is_array($valeurs)){
503
+function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') {
504
+	if (!is_array($valeurs)) {
505 505
 		return '';
506 506
 	}
507 507
 	$f = sql_serveur('quote', $serveur, true);
508
-	if (!is_string($f) or !$f){
508
+	if (!is_string($f) or !$f) {
509 509
 		return '';
510 510
 	}
511 511
 	$valeurs = implode(',', array_map($f, array_unique($valeurs)));
Please login to merge, or discard this patch.