Completed
Push — master ( 171d66...b8912c )
by cam
05:49
created
ecrire/public/criteres.php 1 patch
Indentation   +1655 added lines, -1655 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], array(), $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], array(), $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]), array(), $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]), array(), $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]), array(), $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]), array(), $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]), array(), $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]), array(), $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], array(), $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], array(), $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], array(), $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], array(), $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,22 +540,22 @@  discard block
 block discarded – undo
540 540
  **/
541 541
 function critere_logo_dist($idb, &$boucles, $crit) {
542 542
 
543
-	$not = $crit->not;
544
-	$boucle = &$boucles[$idb];
543
+    $not = $crit->not;
544
+    $boucle = &$boucles[$idb];
545 545
 
546
-	$c = "sql_in('" .
547
-		$boucle->id_table . '.' . $boucle->primary
548
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '')";
546
+    $c = "sql_in('" .
547
+        $boucle->id_table . '.' . $boucle->primary
548
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '')";
549 549
 
550
-	if ($crit->cond) {
551
-		$c = "($arg ? $c : 1)";
552
-	}
550
+    if ($crit->cond) {
551
+        $c = "($arg ? $c : 1)";
552
+    }
553 553
 
554
-	if ($not) {
555
-		$boucle->where[] = array("'NOT'", $c);
556
-	} else {
557
-		$boucle->where[] = $c;
558
-	}
554
+    if ($not) {
555
+        $boucle->where[] = array("'NOT'", $c);
556
+    } else {
557
+        $boucle->where[] = $c;
558
+    }
559 559
 }
560 560
 
561 561
 
@@ -577,31 +577,31 @@  discard block
 block discarded – undo
577 577
  * @return void
578 578
  **/
579 579
 function critere_fusion_dist($idb, &$boucles, $crit) {
580
-	if ($t = isset($crit->param[0])) {
581
-		$t = $crit->param[0];
582
-		if ($t[0]->type == 'texte') {
583
-			$t = $t[0]->texte;
584
-			if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
585
-				$t = table_objet_sql($r[1]);
586
-				$t = array_search($t, $boucles[$idb]->from);
587
-				if ($t) {
588
-					$t .= '.' . $r[2];
589
-				}
590
-			}
591
-		} else {
592
-			$t = '".'
593
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
594
-				. '."';
595
-		}
596
-	}
597
-	if ($t) {
598
-		$boucles[$idb]->group[] = $t;
599
-		if (!in_array($t, $boucles[$idb]->select)) {
600
-			$boucles[$idb]->select[] = $t;
601
-		}
602
-	} else {
603
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
604
-	}
580
+    if ($t = isset($crit->param[0])) {
581
+        $t = $crit->param[0];
582
+        if ($t[0]->type == 'texte') {
583
+            $t = $t[0]->texte;
584
+            if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
585
+                $t = table_objet_sql($r[1]);
586
+                $t = array_search($t, $boucles[$idb]->from);
587
+                if ($t) {
588
+                    $t .= '.' . $r[2];
589
+                }
590
+            }
591
+        } else {
592
+            $t = '".'
593
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
594
+                . '."';
595
+        }
596
+    }
597
+    if ($t) {
598
+        $boucles[$idb]->group[] = $t;
599
+        if (!in_array($t, $boucles[$idb]->select)) {
600
+            $boucles[$idb]->select[] = $t;
601
+        }
602
+    } else {
603
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
604
+    }
605 605
 }
606 606
 
607 607
 /**
@@ -638,45 +638,45 @@  discard block
 block discarded – undo
638 638
  * @param Critere $crit Paramètres du critère dans cette boucle
639 639
  */
640 640
 function critere_collecte_dist($idb, &$boucles, $crit) {
641
-	if (isset($crit->param[0])) {
642
-		$_coll = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
643
-		$boucle = $boucles[$idb];
644
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
645
-		$n = count($boucle->order);
646
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
647
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
648
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
649
-			if (
650
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
651
-				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
652
-			) {
653
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
654
-			} else {
655
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
656
-			}
657
-		}
658
-	} else {
659
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
660
-	}
641
+    if (isset($crit->param[0])) {
642
+        $_coll = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
643
+        $boucle = $boucles[$idb];
644
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
645
+        $n = count($boucle->order);
646
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
647
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
648
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
649
+            if (
650
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
651
+                OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
652
+            ) {
653
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
654
+            } else {
655
+                $boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
656
+            }
657
+        }
658
+    } else {
659
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
660
+    }
661 661
 }
662 662
 
663 663
 // http://code.spip.net/@calculer_critere_arg_dynamique
664 664
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
665
-	$boucle = $boucles[$idb];
666
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
667
-	$var = '$champs_' . $idb;
668
-	$desc = (strpos($boucle->in, "static $var =") !== false);
669
-	if (!$desc) {
670
-		$desc = $boucle->show['field'];
671
-		$desc = implode(',', array_map('_q', array_keys($desc)));
672
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
673
-	}
674
-	if ($desc) {
675
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
676
-	}
677
-	$arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
678
-
679
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
665
+    $boucle = $boucles[$idb];
666
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
667
+    $var = '$champs_' . $idb;
668
+    $desc = (strpos($boucle->in, "static $var =") !== false);
669
+    if (!$desc) {
670
+        $desc = $boucle->show['field'];
671
+        $desc = implode(',', array_map('_q', array_keys($desc)));
672
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
673
+    }
674
+    if ($desc) {
675
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
676
+    }
677
+    $arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
678
+
679
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
680 680
 }
681 681
 
682 682
 /**
@@ -715,7 +715,7 @@  discard block
 block discarded – undo
715 715
  * @param Critere $crit Paramètres du critère dans cette boucle
716 716
  */
717 717
 function critere_par_dist($idb, &$boucles, $crit) {
718
-	return critere_parinverse($idb, $boucles, $crit);
718
+    return critere_parinverse($idb, $boucles, $crit);
719 719
 }
720 720
 
721 721
 /**
@@ -737,93 +737,93 @@  discard block
 block discarded – undo
737 737
  * @param Critere $crit Paramètres du critère dans cette boucle
738 738
  */
739 739
 function critere_parinverse($idb, &$boucles, $crit) {
740
-	$boucle = &$boucles[$idb];
741
-
742
-	$sens = $collecte = '';
743
-	if ($crit->not) {
744
-		$sens = " . ' DESC'";
745
-	}
746
-	if (isset($boucle->modificateur['collate'])) {
747
-		$collecte = ' . ' . $boucle->modificateur['collate'];
748
-	}
749
-
750
-	// Pour chaque paramètre du critère
751
-	foreach ($crit->param as $tri) {
752
-		$order = $fct = '';
753
-		// tris specifiés dynamiquement {par #ENV{tri}}
754
-		if ($tri[0]->type != 'texte') {
755
-			// calculer le order dynamique qui verifie les champs
756
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
757
-			// ajouter 'hasard' comme possibilité de tri dynamique
758
-			calculer_critere_par_hasard($idb, $boucles, $crit);
759
-		}
760
-		// tris textuels {par titre}
761
-		else {
762
-			$par = array_shift($tri);
763
-			$par = $par->texte;
764
-
765
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
766
-			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
767
-				$expression = trim($m[1]);
768
-				$champ = trim($m[2]);
769
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
770
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
771
-				} else {
772
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
773
-				}
774
-
775
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
776
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
777
-				// {par FONCTION(champ)}
778
-				if (count($match) > 2) {
779
-					$par = substr($match[2], 1, -1);
780
-					$fct = $match[1];
781
-				}
782
-				// quelques cas spécifiques {par hasard}, {par date}
783
-				if ($par == 'hasard') {
784
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
785
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
786
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
787
-				} else {
788
-					// cas général {par champ}, {par table.champ}, ...
789
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
790
-				}
791
-			}
792
-
793
-			// on ne sait pas traiter…
794
-			else {
795
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
796
-			}
797
-
798
-			// En cas d'erreur de squelette retournée par une fonction
799
-			if (is_array($order)) {
800
-				return $order;
801
-			}
802
-		}
803
-
804
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
805
-			$t = $m[1];
806
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
807
-				$boucle->select[] = $t;
808
-			}
809
-		} else {
810
-			$sens = '';
811
-		}
812
-
813
-		if ($fct) {
814
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
815
-				$order = "'$fct(" . $r[1] . ")'";
816
-			} else {
817
-				$order = "'$fct(' . $order . ')'";
818
-			}
819
-		}
820
-		$t = $order . $collecte . $sens;
821
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
822
-			$t = $r[1] . $r[2];
823
-		}
824
-
825
-		$boucle->order[] = $t;
826
-	}
740
+    $boucle = &$boucles[$idb];
741
+
742
+    $sens = $collecte = '';
743
+    if ($crit->not) {
744
+        $sens = " . ' DESC'";
745
+    }
746
+    if (isset($boucle->modificateur['collate'])) {
747
+        $collecte = ' . ' . $boucle->modificateur['collate'];
748
+    }
749
+
750
+    // Pour chaque paramètre du critère
751
+    foreach ($crit->param as $tri) {
752
+        $order = $fct = '';
753
+        // tris specifiés dynamiquement {par #ENV{tri}}
754
+        if ($tri[0]->type != 'texte') {
755
+            // calculer le order dynamique qui verifie les champs
756
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
757
+            // ajouter 'hasard' comme possibilité de tri dynamique
758
+            calculer_critere_par_hasard($idb, $boucles, $crit);
759
+        }
760
+        // tris textuels {par titre}
761
+        else {
762
+            $par = array_shift($tri);
763
+            $par = $par->texte;
764
+
765
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
766
+            if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
767
+                $expression = trim($m[1]);
768
+                $champ = trim($m[2]);
769
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
770
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
771
+                } else {
772
+                    return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
773
+                }
774
+
775
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
776
+            } elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
777
+                // {par FONCTION(champ)}
778
+                if (count($match) > 2) {
779
+                    $par = substr($match[2], 1, -1);
780
+                    $fct = $match[1];
781
+                }
782
+                // quelques cas spécifiques {par hasard}, {par date}
783
+                if ($par == 'hasard') {
784
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
785
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
786
+                    $order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
787
+                } else {
788
+                    // cas général {par champ}, {par table.champ}, ...
789
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
790
+                }
791
+            }
792
+
793
+            // on ne sait pas traiter…
794
+            else {
795
+                return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
796
+            }
797
+
798
+            // En cas d'erreur de squelette retournée par une fonction
799
+            if (is_array($order)) {
800
+                return $order;
801
+            }
802
+        }
803
+
804
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
805
+            $t = $m[1];
806
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
807
+                $boucle->select[] = $t;
808
+            }
809
+        } else {
810
+            $sens = '';
811
+        }
812
+
813
+        if ($fct) {
814
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
815
+                $order = "'$fct(" . $r[1] . ")'";
816
+            } else {
817
+                $order = "'$fct(' . $order . ')'";
818
+            }
819
+        }
820
+        $t = $order . $collecte . $sens;
821
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
822
+            $t = $r[1] . $r[2];
823
+        }
824
+
825
+        $boucle->order[] = $t;
826
+    }
827 827
 }
828 828
 
829 829
 /**
@@ -837,13 +837,13 @@  discard block
 block discarded – undo
837 837
  * @return string Clause pour le Order by
838 838
  */
839 839
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
840
-	$boucle = &$boucles[$idb];
841
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
842
-	$parha = "rand() AS hasard";
843
-	if (!in_array($parha, $boucle->select)) {
844
-		$boucle->select[] = $parha;
845
-	}
846
-	return "'hasard'";
840
+    $boucle = &$boucles[$idb];
841
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
842
+    $parha = "rand() AS hasard";
843
+    if (!in_array($parha, $boucle->select)) {
844
+        $boucle->select[] = $parha;
845
+    }
846
+    return "'hasard'";
847 847
 }
848 848
 
849 849
 /**
@@ -867,20 +867,20 @@  discard block
 block discarded – undo
867 867
  * @return string Clause pour le Order by
868 868
  */
869 869
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
870
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
871
-	if (is_array($_champ)) {
872
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
873
-	}
874
-	$boucle = &$boucles[$idb];
875
-	$texte = '0+' . $_champ;
876
-	$suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
877
-	if ($suite !== "''") {
878
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
879
-	}
880
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
881
-	$boucle->select[] = $texte . " AS $as";
882
-	$order = "'$as'";
883
-	return $order;
870
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
871
+    if (is_array($_champ)) {
872
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
873
+    }
874
+    $boucle = &$boucles[$idb];
875
+    $texte = '0+' . $_champ;
876
+    $suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
877
+    if ($suite !== "''") {
878
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
879
+    }
880
+    $as = 'num' . ($boucle->order ? count($boucle->order) : "");
881
+    $boucle->select[] = $texte . " AS $as";
882
+    $order = "'$as'";
883
+    return $order;
884 884
 }
885 885
 
886 886
 /**
@@ -901,20 +901,20 @@  discard block
 block discarded – undo
901 901
  * @return string Clause pour le Order by
902 902
  */
903 903
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
904
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
905
-	if (is_array($_champ)) {
906
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
907
-	}
908
-	$boucle = &$boucles[$idb];
909
-	$texte = '0+' . $_champ;
910
-	$suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
911
-	if ($suite !== "''") {
912
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
913
-	}
914
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
915
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
916
-	$order = "'$as'";
917
-	return $order;
904
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
905
+    if (is_array($_champ)) {
906
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
907
+    }
908
+    $boucle = &$boucles[$idb];
909
+    $texte = '0+' . $_champ;
910
+    $suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
911
+    if ($suite !== "''") {
912
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
913
+    }
914
+    $as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
915
+    $boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
916
+    $order = "'$as'";
917
+    return $order;
918 918
 }
919 919
 
920 920
 
@@ -934,14 +934,14 @@  discard block
 block discarded – undo
934 934
  * @return string Clause pour le Order by
935 935
  */
936 936
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
937
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
938
-	if (is_array($_champ)) {
939
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
940
-	}
941
-	$boucle = &$boucles[$idb];
942
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
943
-	$order = "'multi'";
944
-	return $order;
937
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
938
+    if (is_array($_champ)) {
939
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
940
+    }
941
+    $boucle = &$boucles[$idb];
942
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
943
+    $order = "'multi'";
944
+    return $order;
945 945
 }
946 946
 
947 947
 /**
@@ -960,55 +960,55 @@  discard block
 block discarded – undo
960 960
  * @return array|string
961 961
  */
962 962
 function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
963
-	$boucle = &$boucles[$idb];
964
-
965
-	// le champ existe dans la table, pas de souci (le plus commun)
966
-	if (isset($desc['field'][$par])) {
967
-		$par = $boucle->id_table . "." . $par;
968
-	}
969
-	// le champ est peut être une jointure
970
-	else {
971
-		$table = $table_alias = false; // toutes les tables de jointure possibles
972
-		$champ = $par;
973
-
974
-		// le champ demandé est une exception de jointure {par titre_mot}
975
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
976
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
977
-		} // la table de jointure est explicitement indiquée {par truc.muche}
978
-		elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
979
-			list(, $table, $champ) = $r;
980
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
981
-			$table = table_objet_sql($table);
982
-		}
983
-
984
-		// Si on connait la table d'arrivée, on la demande donc explicitement
985
-		// Sinon on cherche le champ dans les tables possibles de jointures
986
-		// Si la table est déjà dans le from, on la réutilise.
987
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
988
-			$par = $infos['alias'] . "." . $champ;
989
-		} elseif (
990
-			$boucle->jointures_explicites
991
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
992
-		) {
993
-			$par = $alias . "." . $champ;
994
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
995
-			$par = $alias . "." . $champ;
996
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
997
-		} elseif (
998
-			$table_alias
999
-			and isset($boucle->from[$table_alias])
1000
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1001
-		) {
1002
-			$par = $infos['alias'] . "." . $champ;
1003
-		} elseif ($table) {
1004
-			// On avait table + champ, mais on ne les a pas trouvés
1005
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1006
-		} else {
1007
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1008
-		}
1009
-	}
1010
-
1011
-	return $raw ? $par : "'$par'";
963
+    $boucle = &$boucles[$idb];
964
+
965
+    // le champ existe dans la table, pas de souci (le plus commun)
966
+    if (isset($desc['field'][$par])) {
967
+        $par = $boucle->id_table . "." . $par;
968
+    }
969
+    // le champ est peut être une jointure
970
+    else {
971
+        $table = $table_alias = false; // toutes les tables de jointure possibles
972
+        $champ = $par;
973
+
974
+        // le champ demandé est une exception de jointure {par titre_mot}
975
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
976
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
977
+        } // la table de jointure est explicitement indiquée {par truc.muche}
978
+        elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
979
+            list(, $table, $champ) = $r;
980
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
981
+            $table = table_objet_sql($table);
982
+        }
983
+
984
+        // Si on connait la table d'arrivée, on la demande donc explicitement
985
+        // Sinon on cherche le champ dans les tables possibles de jointures
986
+        // Si la table est déjà dans le from, on la réutilise.
987
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
988
+            $par = $infos['alias'] . "." . $champ;
989
+        } elseif (
990
+            $boucle->jointures_explicites
991
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
992
+        ) {
993
+            $par = $alias . "." . $champ;
994
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
995
+            $par = $alias . "." . $champ;
996
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
997
+        } elseif (
998
+            $table_alias
999
+            and isset($boucle->from[$table_alias])
1000
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1001
+        ) {
1002
+            $par = $infos['alias'] . "." . $champ;
1003
+        } elseif ($table) {
1004
+            // On avait table + champ, mais on ne les a pas trouvés
1005
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1006
+        } else {
1007
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1008
+        }
1009
+    }
1010
+
1011
+    return $raw ? $par : "'$par'";
1012 1012
 }
1013 1013
 
1014 1014
 /**
@@ -1022,11 +1022,11 @@  discard block
 block discarded – undo
1022 1022
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1023 1023
  */
1024 1024
 function critere_par_joint($table, $champ, &$boucle) {
1025
-	$t = array_search($table, $boucle->from);
1026
-	if (!$t) {
1027
-		$t = trouver_jointure_champ($champ, $boucle);
1028
-	}
1029
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1025
+    $t = array_search($table, $boucle->from);
1026
+    if (!$t) {
1027
+        $t = trouver_jointure_champ($champ, $boucle);
1028
+    }
1029
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1030 1030
 }
1031 1031
 
1032 1032
 /**
@@ -1051,143 +1051,143 @@  discard block
 block discarded – undo
1051 1051
  */
1052 1052
 function critere_inverse_dist($idb, &$boucles, $crit) {
1053 1053
 
1054
-	$boucle = &$boucles[$idb];
1055
-	// Classement par ordre inverse
1056
-	if ($crit->not) {
1057
-		critere_parinverse($idb, $boucles, $crit);
1058
-	} else {
1059
-		$order = "' DESC'";
1060
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1061
-		if (isset($crit->param[0])) {
1062
-			$critere = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
1063
-			$order = "(($critere)?' DESC':'')";
1064
-		}
1065
-
1066
-		$n = count($boucle->order);
1067
-		if (!$n) {
1068
-			if (isset($boucle->default_order[0])) {
1069
-				$boucle->default_order[0] .= ' . " DESC"';
1070
-			} else {
1071
-				$boucle->default_order[] = ' DESC';
1072
-			}
1073
-		} else {
1074
-			$t = $boucle->order[$n - 1] . " . $order";
1075
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1076
-				$t = $r[1] . $r[2];
1077
-			}
1078
-			$boucle->order[$n - 1] = $t;
1079
-		}
1080
-	}
1054
+    $boucle = &$boucles[$idb];
1055
+    // Classement par ordre inverse
1056
+    if ($crit->not) {
1057
+        critere_parinverse($idb, $boucles, $crit);
1058
+    } else {
1059
+        $order = "' DESC'";
1060
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1061
+        if (isset($crit->param[0])) {
1062
+            $critere = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
1063
+            $order = "(($critere)?' DESC':'')";
1064
+        }
1065
+
1066
+        $n = count($boucle->order);
1067
+        if (!$n) {
1068
+            if (isset($boucle->default_order[0])) {
1069
+                $boucle->default_order[0] .= ' . " DESC"';
1070
+            } else {
1071
+                $boucle->default_order[] = ' DESC';
1072
+            }
1073
+        } else {
1074
+            $t = $boucle->order[$n - 1] . " . $order";
1075
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1076
+                $t = $r[1] . $r[2];
1077
+            }
1078
+            $boucle->order[$n - 1] = $t;
1079
+        }
1080
+    }
1081 1081
 }
1082 1082
 
1083 1083
 // http://code.spip.net/@critere_agenda_dist
1084 1084
 function critere_agenda_dist($idb, &$boucles, $crit) {
1085
-	$params = $crit->param;
1086
-
1087
-	if (count($params) < 1) {
1088
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1089
-	}
1090
-
1091
-	$boucle = &$boucles[$idb];
1092
-	$parent = $boucle->id_parent;
1093
-	$fields = $boucle->show['field'];
1094
-
1095
-	$date = array_shift($params);
1096
-	$type = array_shift($params);
1097
-
1098
-	// la valeur $type doit etre connue a la compilation
1099
-	// donc etre forcement reduite a un litteral unique dans le source
1100
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1101
-
1102
-	// La valeur date doit designer un champ de la table SQL.
1103
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1104
-	// sinon synthetiser le test de verif pour execution ulterieure
1105
-	// On prendra arbitrairement le premier champ si test negatif.
1106
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1107
-		$date = $date[0]->texte;
1108
-		if (!isset($fields[$date])) {
1109
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1110
-		}
1111
-	} else {
1112
-		$a = calculer_liste($date, array(), $boucles, $parent);
1113
-		$noms = array_keys($fields);
1114
-		$defaut = $noms[0];
1115
-		$noms = join(" ", $noms);
1116
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1117
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1118
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1119
-	}
1120
-	$annee = $params ? array_shift($params) : "";
1121
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1122
-		calculer_liste($annee, array(), $boucles, $parent) .
1123
-		') ? $x : date("Y"))';
1124
-
1125
-	$mois = $params ? array_shift($params) : "";
1126
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1127
-		calculer_liste($mois, array(), $boucles, $parent) .
1128
-		') ? $x : date("m"))';
1129
-
1130
-	$jour = $params ? array_shift($params) : "";
1131
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1132
-		calculer_liste($jour, array(), $boucles, $parent) .
1133
-		') ? $x : date("d"))';
1134
-
1135
-	$annee2 = $params ? array_shift($params) : "";
1136
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1137
-		calculer_liste($annee2, array(), $boucles, $parent) .
1138
-		') ? $x : date("Y"))';
1139
-
1140
-	$mois2 = $params ? array_shift($params) : "";
1141
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1142
-		calculer_liste($mois2, array(), $boucles, $parent) .
1143
-		') ? $x : date("m"))';
1144
-
1145
-	$jour2 = $params ? array_shift($params) : "";
1146
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1147
-		calculer_liste($jour2, array(), $boucles, $parent) .
1148
-		') ? $x : date("d"))';
1149
-
1150
-	$date = $boucle->id_table . ".$date";
1151
-
1152
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1153
-	if ($type == 'jour') {
1154
-		$boucle->where[] = array(
1155
-			"'='",
1156
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1157
-			("sql_quote($annee . $mois . $jour$quote_end)")
1158
-		);
1159
-	} elseif ($type == 'mois') {
1160
-		$boucle->where[] = array(
1161
-			"'='",
1162
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1163
-			("sql_quote($annee . $mois$quote_end)")
1164
-		);
1165
-	} elseif ($type == 'semaine') {
1166
-		$boucle->where[] = array(
1167
-			"'AND'",
1168
-			array(
1169
-				"'>='",
1170
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1171
-				("date_debut_semaine($annee, $mois, $jour)")
1172
-			),
1173
-			array(
1174
-				"'<='",
1175
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1176
-				("date_fin_semaine($annee, $mois, $jour)")
1177
-			)
1178
-		);
1179
-	} elseif (count($crit->param) > 2) {
1180
-		$boucle->where[] = array(
1181
-			"'AND'",
1182
-			array(
1183
-				"'>='",
1184
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1185
-				("sql_quote($annee . $mois . $jour$quote_end)")
1186
-			),
1187
-			array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1188
-		);
1189
-	}
1190
-	// sinon on prend tout
1085
+    $params = $crit->param;
1086
+
1087
+    if (count($params) < 1) {
1088
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1089
+    }
1090
+
1091
+    $boucle = &$boucles[$idb];
1092
+    $parent = $boucle->id_parent;
1093
+    $fields = $boucle->show['field'];
1094
+
1095
+    $date = array_shift($params);
1096
+    $type = array_shift($params);
1097
+
1098
+    // la valeur $type doit etre connue a la compilation
1099
+    // donc etre forcement reduite a un litteral unique dans le source
1100
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1101
+
1102
+    // La valeur date doit designer un champ de la table SQL.
1103
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1104
+    // sinon synthetiser le test de verif pour execution ulterieure
1105
+    // On prendra arbitrairement le premier champ si test negatif.
1106
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1107
+        $date = $date[0]->texte;
1108
+        if (!isset($fields[$date])) {
1109
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1110
+        }
1111
+    } else {
1112
+        $a = calculer_liste($date, array(), $boucles, $parent);
1113
+        $noms = array_keys($fields);
1114
+        $defaut = $noms[0];
1115
+        $noms = join(" ", $noms);
1116
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1117
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1118
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1119
+    }
1120
+    $annee = $params ? array_shift($params) : "";
1121
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1122
+        calculer_liste($annee, array(), $boucles, $parent) .
1123
+        ') ? $x : date("Y"))';
1124
+
1125
+    $mois = $params ? array_shift($params) : "";
1126
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1127
+        calculer_liste($mois, array(), $boucles, $parent) .
1128
+        ') ? $x : date("m"))';
1129
+
1130
+    $jour = $params ? array_shift($params) : "";
1131
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1132
+        calculer_liste($jour, array(), $boucles, $parent) .
1133
+        ') ? $x : date("d"))';
1134
+
1135
+    $annee2 = $params ? array_shift($params) : "";
1136
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1137
+        calculer_liste($annee2, array(), $boucles, $parent) .
1138
+        ') ? $x : date("Y"))';
1139
+
1140
+    $mois2 = $params ? array_shift($params) : "";
1141
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1142
+        calculer_liste($mois2, array(), $boucles, $parent) .
1143
+        ') ? $x : date("m"))';
1144
+
1145
+    $jour2 = $params ? array_shift($params) : "";
1146
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1147
+        calculer_liste($jour2, array(), $boucles, $parent) .
1148
+        ') ? $x : date("d"))';
1149
+
1150
+    $date = $boucle->id_table . ".$date";
1151
+
1152
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1153
+    if ($type == 'jour') {
1154
+        $boucle->where[] = array(
1155
+            "'='",
1156
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1157
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1158
+        );
1159
+    } elseif ($type == 'mois') {
1160
+        $boucle->where[] = array(
1161
+            "'='",
1162
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1163
+            ("sql_quote($annee . $mois$quote_end)")
1164
+        );
1165
+    } elseif ($type == 'semaine') {
1166
+        $boucle->where[] = array(
1167
+            "'AND'",
1168
+            array(
1169
+                "'>='",
1170
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1171
+                ("date_debut_semaine($annee, $mois, $jour)")
1172
+            ),
1173
+            array(
1174
+                "'<='",
1175
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1176
+                ("date_fin_semaine($annee, $mois, $jour)")
1177
+            )
1178
+        );
1179
+    } elseif (count($crit->param) > 2) {
1180
+        $boucle->where[] = array(
1181
+            "'AND'",
1182
+            array(
1183
+                "'>='",
1184
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1185
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1186
+            ),
1187
+            array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1188
+        );
1189
+    }
1190
+    // sinon on prend tout
1191 1191
 }
1192 1192
 
1193 1193
 
@@ -1212,33 +1212,33 @@  discard block
 block discarded – undo
1212 1212
  * @return void
1213 1213
  **/
1214 1214
 function calculer_critere_parties($idb, &$boucles, $crit) {
1215
-	$boucle = &$boucles[$idb];
1216
-	$a1 = $crit->param[0];
1217
-	$a2 = $crit->param[1];
1218
-	$op = $crit->op;
1219
-
1220
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1221
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1222
-
1223
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1224
-		$boucle->limit = $a11 . ',' . $a21;
1225
-	} else {
1226
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1227
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1228
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1229
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1230
-		$mode = (($op == '/') ? '/' :
1231
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1232
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1233
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1234
-			$boucle->limit =
1235
-				(is_numeric($a11) ? "'$a11'" : $a11)
1236
-				. ".','."
1237
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1238
-		} else {
1239
-			calculer_parties($boucles, $idb, $partie, $mode);
1240
-		}
1241
-	}
1215
+    $boucle = &$boucles[$idb];
1216
+    $a1 = $crit->param[0];
1217
+    $a2 = $crit->param[1];
1218
+    $op = $crit->op;
1219
+
1220
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1221
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1222
+
1223
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1224
+        $boucle->limit = $a11 . ',' . $a21;
1225
+    } else {
1226
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1227
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1228
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1229
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1230
+        $mode = (($op == '/') ? '/' :
1231
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1232
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1233
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1234
+            $boucle->limit =
1235
+                (is_numeric($a11) ? "'$a11'" : $a11)
1236
+                . ".','."
1237
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1238
+        } else {
1239
+            calculer_parties($boucles, $idb, $partie, $mode);
1240
+        }
1241
+    }
1242 1242
 }
1243 1243
 
1244 1244
 /**
@@ -1266,63 +1266,63 @@  discard block
 block discarded – undo
1266 1266
  * @return void
1267 1267
  **/
1268 1268
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1269
-	$total_parties = $boucles[$id_boucle]->total_parties;
1270
-
1271
-	preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1272
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1273
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1274
-	// {1/3}
1275
-	if ($op1 == '/') {
1276
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1277
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1278
-			"($total_parties ? $total_parties : 1)";
1279
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1280
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1281
-	} else {
1282
-		// cas {n-1,x}
1283
-		if ($op1 == '-') {
1284
-			$debut = "$nombre_boucle - $debut;";
1285
-		}
1286
-
1287
-		// cas {x,n-1}
1288
-		if ($op2 == '-') {
1289
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1290
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1291
-					($total_parties . ' - 1'));
1292
-		} else {
1293
-			// {x,1} ou {pagination}
1294
-			$fin = '$debut_boucle'
1295
-				. (is_numeric($total_parties) ?
1296
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1297
-					('+' . $total_parties . ' - 1'));
1298
-		}
1299
-
1300
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1301
-		if ($op1 == 'p') {
1302
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1303
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1304
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1305
-		}
1306
-	}
1307
-
1308
-	// Notes :
1309
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1310
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1311
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1312
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1313
-
1314
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1315
-		. '$debut_boucle = ' . $debut . ";\n	"
1316
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1317
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1318
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1319
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1320
-		. "\n\tif (\$debut_boucle>0"
1321
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1322
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1323
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1324
-
1325
-	$boucles[$id_boucle]->partie = "
1269
+    $total_parties = $boucles[$id_boucle]->total_parties;
1270
+
1271
+    preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1272
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1273
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1274
+    // {1/3}
1275
+    if ($op1 == '/') {
1276
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1277
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1278
+            "($total_parties ? $total_parties : 1)";
1279
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1280
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1281
+    } else {
1282
+        // cas {n-1,x}
1283
+        if ($op1 == '-') {
1284
+            $debut = "$nombre_boucle - $debut;";
1285
+        }
1286
+
1287
+        // cas {x,n-1}
1288
+        if ($op2 == '-') {
1289
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1290
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1291
+                    ($total_parties . ' - 1'));
1292
+        } else {
1293
+            // {x,1} ou {pagination}
1294
+            $fin = '$debut_boucle'
1295
+                . (is_numeric($total_parties) ?
1296
+                    (($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1297
+                    ('+' . $total_parties . ' - 1'));
1298
+        }
1299
+
1300
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1301
+        if ($op1 == 'p') {
1302
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1303
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1304
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1305
+        }
1306
+    }
1307
+
1308
+    // Notes :
1309
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1310
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1311
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1312
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1313
+
1314
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1315
+        . '$debut_boucle = ' . $debut . ";\n	"
1316
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1317
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1318
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1319
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1320
+        . "\n\tif (\$debut_boucle>0"
1321
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1322
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1323
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1324
+
1325
+    $boucles[$id_boucle]->partie = "
1326 1326
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1327 1327
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1328 1328
 }
@@ -1339,26 +1339,26 @@  discard block
 block discarded – undo
1339 1339
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1340 1340
  **/
1341 1341
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1342
-	if ($param[0]->type != 'texte') {
1343
-		$a1 = calculer_liste(array($param[0]), array('id_mere' => $idb), $boucles, $boucles[$idb]->id_parent);
1344
-		if (isset($param[1]->texte)) {
1345
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1346
-
1347
-			return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1348
-		} else {
1349
-			return array("intval($a1)", 0);
1350
-		}
1351
-	} else {
1352
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1353
-		$a1 = $m[1];
1354
-		if (empty($m[3])) {
1355
-			return array($a1, 0);
1356
-		} elseif (!empty($m[4])) {
1357
-			return array($a1, $m[4]);
1358
-		} else {
1359
-			return array($a1, calculer_liste(array($param[1]), array(), $boucles, $boucles[$idb]->id_parent));
1360
-		}
1361
-	}
1342
+    if ($param[0]->type != 'texte') {
1343
+        $a1 = calculer_liste(array($param[0]), array('id_mere' => $idb), $boucles, $boucles[$idb]->id_parent);
1344
+        if (isset($param[1]->texte)) {
1345
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1346
+
1347
+            return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1348
+        } else {
1349
+            return array("intval($a1)", 0);
1350
+        }
1351
+    } else {
1352
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1353
+        $a1 = $m[1];
1354
+        if (empty($m[3])) {
1355
+            return array($a1, 0);
1356
+        } elseif (!empty($m[4])) {
1357
+            return array($a1, $m[4]);
1358
+        } else {
1359
+            return array($a1, calculer_liste(array($param[1]), array(), $boucles, $boucles[$idb]->id_parent));
1360
+        }
1361
+    }
1362 1362
 }
1363 1363
 
1364 1364
 
@@ -1385,47 +1385,47 @@  discard block
 block discarded – undo
1385 1385
  *     array : Erreur sur un des critères
1386 1386
  **/
1387 1387
 function calculer_criteres($idb, &$boucles) {
1388
-	$msg = '';
1389
-	$boucle = $boucles[$idb];
1390
-	$table = strtoupper($boucle->type_requete);
1391
-	$serveur = strtolower($boucle->sql_serveur);
1392
-
1393
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1394
-	// s'il y avait une erreur de syntaxe, propager cette info
1395
-	if (!is_array($boucle->criteres)) {
1396
-		return array();
1397
-	}
1398
-
1399
-	foreach ($boucle->criteres as $crit) {
1400
-		$critere = $crit->op;
1401
-		// critere personnalise ?
1402
-		if (
1403
-			(!$serveur or
1404
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1405
-					and (!function_exists($f = $f . "_dist"))
1406
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1407
-					and (!function_exists($f = $f . "_dist"))
1408
-				)
1409
-			)
1410
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1411
-			and (!function_exists($f = $f . "_dist"))
1412
-			and (!function_exists($f = "critere_" . $critere))
1413
-			and (!function_exists($f = $f . "_dist"))
1414
-		) {
1415
-			// fonction critere standard
1416
-			$f = $defaut;
1417
-		}
1418
-		// compile le critere
1419
-		$res = $f($idb, $boucles, $crit);
1420
-
1421
-		// Gestion centralisee des erreurs pour pouvoir propager
1422
-		if (is_array($res)) {
1423
-			$msg = $res;
1424
-			erreur_squelette($msg, $boucle);
1425
-		}
1426
-	}
1427
-
1428
-	return $msg;
1388
+    $msg = '';
1389
+    $boucle = $boucles[$idb];
1390
+    $table = strtoupper($boucle->type_requete);
1391
+    $serveur = strtolower($boucle->sql_serveur);
1392
+
1393
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1394
+    // s'il y avait une erreur de syntaxe, propager cette info
1395
+    if (!is_array($boucle->criteres)) {
1396
+        return array();
1397
+    }
1398
+
1399
+    foreach ($boucle->criteres as $crit) {
1400
+        $critere = $crit->op;
1401
+        // critere personnalise ?
1402
+        if (
1403
+            (!$serveur or
1404
+                ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1405
+                    and (!function_exists($f = $f . "_dist"))
1406
+                    and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1407
+                    and (!function_exists($f = $f . "_dist"))
1408
+                )
1409
+            )
1410
+            and (!function_exists($f = "critere_" . $table . "_" . $critere))
1411
+            and (!function_exists($f = $f . "_dist"))
1412
+            and (!function_exists($f = "critere_" . $critere))
1413
+            and (!function_exists($f = $f . "_dist"))
1414
+        ) {
1415
+            // fonction critere standard
1416
+            $f = $defaut;
1417
+        }
1418
+        // compile le critere
1419
+        $res = $f($idb, $boucles, $crit);
1420
+
1421
+        // Gestion centralisee des erreurs pour pouvoir propager
1422
+        if (is_array($res)) {
1423
+            $msg = $res;
1424
+            erreur_squelette($msg, $boucle);
1425
+        }
1426
+    }
1427
+
1428
+    return $msg;
1429 1429
 }
1430 1430
 
1431 1431
 /**
@@ -1442,11 +1442,11 @@  discard block
 block discarded – undo
1442 1442
  * @return string         Code compilé rééchappé
1443 1443
  */
1444 1444
 function kwote($lisp, $serveur = '', $type = '') {
1445
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1446
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1447
-	} else {
1448
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1449
-	}
1445
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1446
+        return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1447
+    } else {
1448
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1449
+    }
1450 1450
 }
1451 1451
 
1452 1452
 
@@ -1465,85 +1465,85 @@  discard block
 block discarded – undo
1465 1465
  * @return void
1466 1466
  **/
1467 1467
 function critere_IN_dist($idb, &$boucles, $crit) {
1468
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1469
-	if (!$r) {
1470
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1471
-	}
1472
-	list($arg, $op, $val, $col, $where_complement) = $r;
1473
-
1474
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1475
-
1476
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1477
-	$where = $in;
1478
-	if ($crit->cond) {
1479
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1480
-		$where = array("'?'", $pred, $where, "''");
1481
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1482
-		{
1483
-			$where_complement = array("'?'", $pred, $where_complement, "''");
1484
-		}
1485
-	}
1486
-	if ($crit->exclus) {
1487
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1488
-			$where = array("'NOT'", $where);
1489
-		} else
1490
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1491
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1492
-		{
1493
-			$where = array(
1494
-				"'NOT'",
1495
-				array(
1496
-					"'IN'",
1497
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1498
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1499
-				)
1500
-			);
1501
-		}
1502
-	}
1503
-
1504
-	$boucles[$idb]->where[] = $where;
1505
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1506
-	{
1507
-		$boucles[$idb]->where[] = $where_complement;
1508
-	}
1468
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1469
+    if (!$r) {
1470
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1471
+    }
1472
+    list($arg, $op, $val, $col, $where_complement) = $r;
1473
+
1474
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1475
+
1476
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1477
+    $where = $in;
1478
+    if ($crit->cond) {
1479
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1480
+        $where = array("'?'", $pred, $where, "''");
1481
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1482
+        {
1483
+            $where_complement = array("'?'", $pred, $where_complement, "''");
1484
+        }
1485
+    }
1486
+    if ($crit->exclus) {
1487
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1488
+            $where = array("'NOT'", $where);
1489
+        } else
1490
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1491
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1492
+        {
1493
+            $where = array(
1494
+                "'NOT'",
1495
+                array(
1496
+                    "'IN'",
1497
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1498
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1499
+                )
1500
+            );
1501
+        }
1502
+    }
1503
+
1504
+    $boucles[$idb]->where[] = $where;
1505
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1506
+    {
1507
+        $boucles[$idb]->where[] = $where_complement;
1508
+    }
1509 1509
 }
1510 1510
 
1511 1511
 // http://code.spip.net/@critere_IN_cas
1512 1512
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1513
-	static $num = array();
1514
-	$descr = $boucles[$idb]->descr;
1515
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1516
-
1517
-	$var = '$in' . $cpt++;
1518
-	$x = "\n\t$var = array();";
1519
-	foreach ($val as $k => $v) {
1520
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1521
-			// optimiser le traitement des constantes
1522
-			if (is_numeric($r[2])) {
1523
-				$x .= "\n\t$var" . "[]= $r[2];";
1524
-			} else {
1525
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1526
-			}
1527
-		} else {
1528
-			// Pour permettre de passer des tableaux de valeurs
1529
-			// on repere l'utilisation brute de #ENV**{X},
1530
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1531
-			// et on deballe mais en rajoutant l'anti XSS
1532
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1533
-		}
1534
-	}
1535
-
1536
-	$boucles[$idb]->in .= $x;
1537
-
1538
-	// inserer le tri par defaut selon les ordres du IN ...
1539
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1540
-	// et que l'on limite donc strictement aux cas necessaires :
1541
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1542
-	if (!$crit2) {
1543
-		$boucles[$idb]->default_order[] = "((!sql_quote($var) OR sql_quote($var)===\"''\") ? 0 : ('FIELD($arg,' . sql_quote($var) . ')'))";
1544
-	}
1545
-
1546
-	return "sql_in('$arg',sql_quote($var)" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1513
+    static $num = array();
1514
+    $descr = $boucles[$idb]->descr;
1515
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1516
+
1517
+    $var = '$in' . $cpt++;
1518
+    $x = "\n\t$var = array();";
1519
+    foreach ($val as $k => $v) {
1520
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1521
+            // optimiser le traitement des constantes
1522
+            if (is_numeric($r[2])) {
1523
+                $x .= "\n\t$var" . "[]= $r[2];";
1524
+            } else {
1525
+                $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1526
+            }
1527
+        } else {
1528
+            // Pour permettre de passer des tableaux de valeurs
1529
+            // on repere l'utilisation brute de #ENV**{X},
1530
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1531
+            // et on deballe mais en rajoutant l'anti XSS
1532
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1533
+        }
1534
+    }
1535
+
1536
+    $boucles[$idb]->in .= $x;
1537
+
1538
+    // inserer le tri par defaut selon les ordres du IN ...
1539
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1540
+    // et que l'on limite donc strictement aux cas necessaires :
1541
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1542
+    if (!$crit2) {
1543
+        $boucles[$idb]->default_order[] = "((!sql_quote($var) OR sql_quote($var)===\"''\") ? 0 : ('FIELD($arg,' . sql_quote($var) . ')'))";
1544
+    }
1545
+
1546
+    return "sql_in('$arg',sql_quote($var)" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1547 1547
 }
1548 1548
 
1549 1549
 /**
@@ -1559,22 +1559,22 @@  discard block
 block discarded – undo
1559 1559
  * @return void
1560 1560
  */
1561 1561
 function critere_where_dist($idb, &$boucles, $crit) {
1562
-	$boucle = &$boucles[$idb];
1563
-	if (isset($crit->param[0])) {
1564
-		$_where = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
1565
-	} else {
1566
-		$_where = '@$Pile[0]["where"]';
1567
-	}
1568
-
1569
-	if ($crit->cond) {
1570
-		$_where = "(($_where) ? ($_where) : '')";
1571
-	}
1572
-
1573
-	if ($crit->not) {
1574
-		$_where = "array('NOT',$_where)";
1575
-	}
1576
-
1577
-	$boucle->where[] = $_where;
1562
+    $boucle = &$boucles[$idb];
1563
+    if (isset($crit->param[0])) {
1564
+        $_where = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
1565
+    } else {
1566
+        $_where = '@$Pile[0]["where"]';
1567
+    }
1568
+
1569
+    if ($crit->cond) {
1570
+        $_where = "(($_where) ? ($_where) : '')";
1571
+    }
1572
+
1573
+    if ($crit->not) {
1574
+        $_where = "array('NOT',$_where)";
1575
+    }
1576
+
1577
+    $boucle->where[] = $_where;
1578 1578
 }
1579 1579
 
1580 1580
 /**
@@ -1603,20 +1603,20 @@  discard block
 block discarded – undo
1603 1603
  */
1604 1604
 function critere_id__dist($idb, &$boucles, $crit) {
1605 1605
 
1606
-	$champs = lister_champs_selection_conditionnelle(
1607
-		$boucles[$idb]->show['table'],
1608
-		$boucles[$idb]->show,
1609
-		$boucles[$idb]->sql_serveur
1610
-	);
1611
-
1612
-	// créer un critère {id_xxx?} de chaque champ retenu
1613
-	foreach ($champs as $champ) {
1614
-		$critere_id_table = new Critere;
1615
-		$critere_id_table->op = $champ;
1616
-		$critere_id_table->cond = '?';
1617
-		$critere_id_table->ligne = $crit->ligne;
1618
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1619
-	}
1606
+    $champs = lister_champs_selection_conditionnelle(
1607
+        $boucles[$idb]->show['table'],
1608
+        $boucles[$idb]->show,
1609
+        $boucles[$idb]->sql_serveur
1610
+    );
1611
+
1612
+    // créer un critère {id_xxx?} de chaque champ retenu
1613
+    foreach ($champs as $champ) {
1614
+        $critere_id_table = new Critere;
1615
+        $critere_id_table->op = $champ;
1616
+        $critere_id_table->cond = '?';
1617
+        $critere_id_table->ligne = $crit->ligne;
1618
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1619
+    }
1620 1620
 }
1621 1621
 
1622 1622
 /**
@@ -1636,67 +1636,67 @@  discard block
 block discarded – undo
1636 1636
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1637 1637
  */
1638 1638
 function lister_champs_selection_conditionnelle($table, $desc = null, $serveur = '') {
1639
-	// calculer la description de la table
1640
-	if (!is_array($desc)) {
1641
-		$desc = description_table($table, $serveur);
1642
-	}
1643
-	if (!$desc) {
1644
-		return [];
1645
-	}
1646
-
1647
-	// Les champs id_xx de la table demandée
1648
-	$champs = array_filter(
1649
-		array_keys($desc['field']),
1650
-		function($champ){
1651
-			return
1652
-				strpos($champ, 'id_') === 0
1653
-				or (in_array($champ, array('objet')));
1654
-		}
1655
-	);
1656
-
1657
-	// On ne fera pas mieux pour les tables d’un autre serveur
1658
-	if ($serveur) {
1659
-		return $champs;
1660
-	}
1661
-
1662
-	$primary = false;
1663
-	$associable = false;
1664
-	include_spip('action/editer_liens');
1665
-
1666
-	if (isset($desc['type'])) {
1667
-		$primary = id_table_objet($desc['type']);
1668
-		$associable = objet_associable($desc['type']);
1669
-	}
1670
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1671
-		$associable = true;
1672
-	}
1673
-
1674
-	// liste de toutes les tables principales, sauf la notre
1675
-	$tables = lister_tables_objets_sql();
1676
-	unset($tables[$table]);
1677
-
1678
-	foreach ($tables as $_table => $_desc) {
1679
-		if (
1680
-			$associable
1681
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1682
-			or objet_associable($_desc['type'])
1683
-		) {
1684
-			$champs[] = id_table_objet($_table);
1685
-		}
1686
-	}
1687
-	$champs = array_unique($champs);
1688
-	$champs = pipeline(
1689
-		'lister_champs_selection_conditionnelle',
1690
-		array(
1691
-			'args' => array(
1692
-				'table' => $table,
1693
-				'id_table_objet' => $primary,
1694
-				'associable' => $associable,
1695
-			),
1696
-			'data' => $champs,
1697
-		)
1698
-	);
1699
-	return $champs;
1639
+    // calculer la description de la table
1640
+    if (!is_array($desc)) {
1641
+        $desc = description_table($table, $serveur);
1642
+    }
1643
+    if (!$desc) {
1644
+        return [];
1645
+    }
1646
+
1647
+    // Les champs id_xx de la table demandée
1648
+    $champs = array_filter(
1649
+        array_keys($desc['field']),
1650
+        function($champ){
1651
+            return
1652
+                strpos($champ, 'id_') === 0
1653
+                or (in_array($champ, array('objet')));
1654
+        }
1655
+    );
1656
+
1657
+    // On ne fera pas mieux pour les tables d’un autre serveur
1658
+    if ($serveur) {
1659
+        return $champs;
1660
+    }
1661
+
1662
+    $primary = false;
1663
+    $associable = false;
1664
+    include_spip('action/editer_liens');
1665
+
1666
+    if (isset($desc['type'])) {
1667
+        $primary = id_table_objet($desc['type']);
1668
+        $associable = objet_associable($desc['type']);
1669
+    }
1670
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1671
+        $associable = true;
1672
+    }
1673
+
1674
+    // liste de toutes les tables principales, sauf la notre
1675
+    $tables = lister_tables_objets_sql();
1676
+    unset($tables[$table]);
1677
+
1678
+    foreach ($tables as $_table => $_desc) {
1679
+        if (
1680
+            $associable
1681
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1682
+            or objet_associable($_desc['type'])
1683
+        ) {
1684
+            $champs[] = id_table_objet($_table);
1685
+        }
1686
+    }
1687
+    $champs = array_unique($champs);
1688
+    $champs = pipeline(
1689
+        'lister_champs_selection_conditionnelle',
1690
+        array(
1691
+            'args' => array(
1692
+                'table' => $table,
1693
+                'id_table_objet' => $primary,
1694
+                'associable' => $associable,
1695
+            ),
1696
+            'data' => $champs,
1697
+        )
1698
+    );
1699
+    return $champs;
1700 1700
 }
1701 1701
 
1702 1702
 /**
@@ -1751,27 +1751,27 @@  discard block
 block discarded – undo
1751 1751
  * @return void
1752 1752
  */
1753 1753
 function critere_tri_dist($idb, &$boucles, $crit) {
1754
-	$boucle = &$boucles[$idb];
1755
-
1756
-	// definition du champ par defaut
1757
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1758
-		: calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
1759
-	$_sens_defaut = !isset($crit->param[1][0]) ? "1"
1760
-		: calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
1761
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1762
-		: calculer_liste(array($crit->param[2][0]), array(), $boucles, $boucle->id_parent);
1763
-
1764
-	$_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):'')";
1765
-
1766
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1767
-	$_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)";
1768
-
1769
-	$boucle->modificateur['tri_champ'] = $_tri;
1770
-	$boucle->modificateur['tri_sens'] = $_sens;
1771
-	$boucle->modificateur['tri_nom'] = $_variable;
1772
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1773
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1774
-	$boucle->hash .= "
1754
+    $boucle = &$boucles[$idb];
1755
+
1756
+    // definition du champ par defaut
1757
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1758
+        : calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
1759
+    $_sens_defaut = !isset($crit->param[1][0]) ? "1"
1760
+        : calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
1761
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1762
+        : calculer_liste(array($crit->param[2][0]), array(), $boucles, $boucle->id_parent);
1763
+
1764
+    $_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):'')";
1765
+
1766
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1767
+    $_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)";
1768
+
1769
+    $boucle->modificateur['tri_champ'] = $_tri;
1770
+    $boucle->modificateur['tri_sens'] = $_sens;
1771
+    $boucle->modificateur['tri_nom'] = $_variable;
1772
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1773
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1774
+    $boucle->hash .= "
1775 1775
 	\$senstri = '';
1776 1776
 	\$tri = $_tri;
1777 1777
 	if (\$tri){
@@ -1779,8 +1779,8 @@  discard block
 block discarded – undo
1779 1779
 		\$senstri = (\$senstri<0)?' DESC':'';
1780 1780
 	};
1781 1781
 	";
1782
-	$boucle->select[] = "\".tri_champ_select(\$tri).\"";
1783
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1782
+    $boucle->select[] = "\".tri_champ_select(\$tri).\"";
1783
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1784 1784
 }
1785 1785
 
1786 1786
 # Criteres de comparaison
@@ -1797,20 +1797,20 @@  discard block
 block discarded – undo
1797 1797
  * @return void
1798 1798
  **/
1799 1799
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1800
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1801
-	if (($crit->op == ",") or ($crit->op == '/')) {
1802
-		return calculer_critere_parties($idb, $boucles, $crit);
1803
-	}
1804
-
1805
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1806
-	if (!$r) {
1807
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1808
-		#	if (!$crit->cond) {
1809
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1810
-		#	}
1811
-	} else {
1812
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1813
-	}
1800
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1801
+    if (($crit->op == ",") or ($crit->op == '/')) {
1802
+        return calculer_critere_parties($idb, $boucles, $crit);
1803
+    }
1804
+
1805
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1806
+    if (!$r) {
1807
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1808
+        #	if (!$crit->cond) {
1809
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1810
+        #	}
1811
+    } else {
1812
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1813
+    }
1814 1814
 }
1815 1815
 
1816 1816
 
@@ -1830,63 +1830,63 @@  discard block
 block discarded – undo
1830 1830
  * @return void
1831 1831
  **/
1832 1832
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1833
-	list($arg, $op, $val, $col, $where_complement) = $args;
1834
-
1835
-	$where = array("'$op'", "'$arg'", $val[0]);
1836
-
1837
-	// inserer la negation (cf !...)
1838
-
1839
-	if ($crit->not) {
1840
-		$where = array("'NOT'", $where);
1841
-	}
1842
-	if ($crit->exclus) {
1843
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1844
-			$where = array("'NOT'", $where);
1845
-		} else
1846
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1847
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1848
-		{
1849
-			$where = array(
1850
-				"'NOT'",
1851
-				array(
1852
-					"'IN'",
1853
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1854
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1855
-				)
1856
-			);
1857
-		}
1858
-	}
1859
-
1860
-	// inserer la condition (cf {lang?})
1861
-	// traiter a part la date, elle est mise d'office par SPIP,
1862
-	if ($crit->cond) {
1863
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1864
-		if ($col == "date" or $col == "date_redac") {
1865
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1866
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1867
-			}
1868
-		}
1869
-
1870
-		if ($op == '=' and !$crit->not) {
1871
-			$where = array(
1872
-				"'?'",
1873
-				"(is_array($pred))",
1874
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1875
-				$where
1876
-			);
1877
-		}
1878
-		$where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1879
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1880
-		{
1881
-			$where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1882
-		}
1883
-	}
1884
-
1885
-	$boucles[$idb]->where[] = $where;
1886
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1887
-	{
1888
-		$boucles[$idb]->where[] = $where_complement;
1889
-	}
1833
+    list($arg, $op, $val, $col, $where_complement) = $args;
1834
+
1835
+    $where = array("'$op'", "'$arg'", $val[0]);
1836
+
1837
+    // inserer la negation (cf !...)
1838
+
1839
+    if ($crit->not) {
1840
+        $where = array("'NOT'", $where);
1841
+    }
1842
+    if ($crit->exclus) {
1843
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1844
+            $where = array("'NOT'", $where);
1845
+        } else
1846
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1847
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1848
+        {
1849
+            $where = array(
1850
+                "'NOT'",
1851
+                array(
1852
+                    "'IN'",
1853
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1854
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1855
+                )
1856
+            );
1857
+        }
1858
+    }
1859
+
1860
+    // inserer la condition (cf {lang?})
1861
+    // traiter a part la date, elle est mise d'office par SPIP,
1862
+    if ($crit->cond) {
1863
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1864
+        if ($col == "date" or $col == "date_redac") {
1865
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1866
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1867
+            }
1868
+        }
1869
+
1870
+        if ($op == '=' and !$crit->not) {
1871
+            $where = array(
1872
+                "'?'",
1873
+                "(is_array($pred))",
1874
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1875
+                $where
1876
+            );
1877
+        }
1878
+        $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1879
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1880
+        {
1881
+            $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1882
+        }
1883
+    }
1884
+
1885
+    $boucles[$idb]->where[] = $where;
1886
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1887
+    {
1888
+        $boucles[$idb]->where[] = $where_complement;
1889
+    }
1890 1890
 }
1891 1891
 
1892 1892
 
@@ -1927,167 +1927,167 @@  discard block
 block discarded – undo
1927 1927
  **/
1928 1928
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1929 1929
 
1930
-	$boucle = &$boucles[$idb];
1931
-	$type = $boucle->type_requete;
1932
-	$table = $boucle->id_table;
1933
-	$desc = $boucle->show;
1934
-	$col_vraie = null;
1935
-
1936
-	list($fct, $col, $op, $val, $args_sql) =
1937
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
1938
-
1939
-	$col_alias = $col;
1940
-	$where_complement = false;
1941
-
1942
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
1943
-	if ($col == 'id_enfant') {
1944
-		$col = $boucle->primary;
1945
-	}
1946
-
1947
-	// Cas particulier : id_parent => verifier les exceptions de tables
1948
-	if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
1949
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
1950
-	) {
1951
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
1952
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
1953
-	else {
1954
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
1955
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
1956
-		}
1957
-
1958
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
1959
-		// sauf si exception declaree : sauter cette etape
1960
-		else {
1961
-			if (
1962
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
1963
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
1964
-				and count(trouver_champs_decomposes($col, $desc)) > 1
1965
-			) {
1966
-				$e = decompose_champ_id_objet($col);
1967
-				$col = array_shift($e);
1968
-				$where_complement = primary_doublee($e, $table);
1969
-			} // Cas particulier : expressions de date
1970
-			else {
1971
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
1972
-					list($col, $col_vraie) = $c;
1973
-					$table = '';
1974
-				} // table explicitée {mots.titre}
1975
-				else {
1976
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
1977
-						list(, $table, $col) = $r;
1978
-						$col_alias = $col;
1979
-
1980
-						$trouver_table = charger_fonction('trouver_table', 'base');
1981
-						if ($desc = $trouver_table($table, $boucle->sql_serveur)
1982
-							and isset($desc['field'][$col])
1983
-							and $cle = array_search($desc['table'], $boucle->from)
1984
-						) {
1985
-							$table = $cle;
1986
-						} else {
1987
-							$table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
1988
-						}
1989
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
1990
-						if (!$table) {
1991
-							return '';
1992
-						}
1993
-					}
1994
-					// si le champ n'est pas trouvé dans la table,
1995
-					// on cherche si une jointure peut l'obtenir
1996
-					elseif (@!array_key_exists($col, $desc['field'])) {
1997
-						// Champ joker * des iterateurs DATA qui accepte tout
1998
-						if (@array_key_exists('*', $desc['field'])) {
1999
-							$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
2000
-						}
2001
-						else {
2002
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2003
-							if (!$r) {
2004
-								return '';
2005
-							}
2006
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2007
-						}
2008
-					}
2009
-				}
2010
-			}
2011
-		}
2012
-	}
2013
-
2014
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2015
-	// Dans tous les cas,
2016
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2017
-	// et passer dans sql_quote avec le type si connu
2018
-	// et int sinon si la valeur est numerique
2019
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2020
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2021
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2022
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2023
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2024
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2025
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2026
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2027
-		}
2028
-		// sinon expliciter les
2029
-		// sql_quote(truc) en sql_quote(truc,'',type)
2030
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2031
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2032
-		// sans toucher aux
2033
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2034
-		// sql_quote(truc,'','varchar')
2035
-		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2036
-			// si pas deja un type
2037
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2038
-		) {
2039
-			$r = $r[1]
2040
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2041
-				. ",'" . addslashes($type_cast_quote) . "'";
2042
-			$val[0] = "sql_quote($r)";
2043
-		}
2044
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2045
-		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2046
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2047
-		}
2048
-	}
2049
-
2050
-	if(strpos($val[0], '@@defaultcast@@') !== false
2051
-	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2052
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2053
-	}
2054
-
2055
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2056
-	// leurs requetes par defaut, notamment le champ statut
2057
-	// Ne pas confondre champs de la table principale et des jointures
2058
-	if ($table === $boucle->id_table) {
2059
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2060
-		if ($col_alias != $col_vraie) {
2061
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2062
-		}
2063
-	}
2064
-
2065
-	// ajout pour le cas special d'une condition sur le champ statut:
2066
-	// il faut alors interdire a la fonction de boucle
2067
-	// de mettre ses propres criteres de statut
2068
-	// http://www.spip.net/@statut (a documenter)
2069
-	// garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2070
-	if ($col == 'statut') {
2071
-		$boucles[$idb]->statut = true;
2072
-	}
2073
-
2074
-	// inserer le nom de la table SQL devant le nom du champ
2075
-	if ($table) {
2076
-		if ($col[0] == "`") {
2077
-			$arg = "$table." . substr($col, 1, -1);
2078
-		} else {
2079
-			$arg = "$table.$col";
2080
-		}
2081
-	} else {
2082
-		$arg = $col;
2083
-	}
2084
-
2085
-	// inserer la fonction SQL
2086
-	if ($fct) {
2087
-		$arg = "$fct($arg$args_sql)";
2088
-	}
2089
-
2090
-	return array($arg, $op, $val, $col_alias, $where_complement);
1930
+    $boucle = &$boucles[$idb];
1931
+    $type = $boucle->type_requete;
1932
+    $table = $boucle->id_table;
1933
+    $desc = $boucle->show;
1934
+    $col_vraie = null;
1935
+
1936
+    list($fct, $col, $op, $val, $args_sql) =
1937
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
1938
+
1939
+    $col_alias = $col;
1940
+    $where_complement = false;
1941
+
1942
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
1943
+    if ($col == 'id_enfant') {
1944
+        $col = $boucle->primary;
1945
+    }
1946
+
1947
+    // Cas particulier : id_parent => verifier les exceptions de tables
1948
+    if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
1949
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
1950
+    ) {
1951
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
1952
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
1953
+    else {
1954
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
1955
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
1956
+        }
1957
+
1958
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
1959
+        // sauf si exception declaree : sauter cette etape
1960
+        else {
1961
+            if (
1962
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
1963
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
1964
+                and count(trouver_champs_decomposes($col, $desc)) > 1
1965
+            ) {
1966
+                $e = decompose_champ_id_objet($col);
1967
+                $col = array_shift($e);
1968
+                $where_complement = primary_doublee($e, $table);
1969
+            } // Cas particulier : expressions de date
1970
+            else {
1971
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
1972
+                    list($col, $col_vraie) = $c;
1973
+                    $table = '';
1974
+                } // table explicitée {mots.titre}
1975
+                else {
1976
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
1977
+                        list(, $table, $col) = $r;
1978
+                        $col_alias = $col;
1979
+
1980
+                        $trouver_table = charger_fonction('trouver_table', 'base');
1981
+                        if ($desc = $trouver_table($table, $boucle->sql_serveur)
1982
+                            and isset($desc['field'][$col])
1983
+                            and $cle = array_search($desc['table'], $boucle->from)
1984
+                        ) {
1985
+                            $table = $cle;
1986
+                        } else {
1987
+                            $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
1988
+                        }
1989
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
1990
+                        if (!$table) {
1991
+                            return '';
1992
+                        }
1993
+                    }
1994
+                    // si le champ n'est pas trouvé dans la table,
1995
+                    // on cherche si une jointure peut l'obtenir
1996
+                    elseif (@!array_key_exists($col, $desc['field'])) {
1997
+                        // Champ joker * des iterateurs DATA qui accepte tout
1998
+                        if (@array_key_exists('*', $desc['field'])) {
1999
+                            $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
2000
+                        }
2001
+                        else {
2002
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2003
+                            if (!$r) {
2004
+                                return '';
2005
+                            }
2006
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2007
+                        }
2008
+                    }
2009
+                }
2010
+            }
2011
+        }
2012
+    }
2013
+
2014
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2015
+    // Dans tous les cas,
2016
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2017
+    // et passer dans sql_quote avec le type si connu
2018
+    // et int sinon si la valeur est numerique
2019
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2020
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2021
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2022
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2023
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2024
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2025
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2026
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2027
+        }
2028
+        // sinon expliciter les
2029
+        // sql_quote(truc) en sql_quote(truc,'',type)
2030
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2031
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2032
+        // sans toucher aux
2033
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2034
+        // sql_quote(truc,'','varchar')
2035
+        elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2036
+            // si pas deja un type
2037
+            and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2038
+        ) {
2039
+            $r = $r[1]
2040
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2041
+                . ",'" . addslashes($type_cast_quote) . "'";
2042
+            $val[0] = "sql_quote($r)";
2043
+        }
2044
+        elseif(strpos($val[0], '@@defaultcast@@') !== false
2045
+          and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2046
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2047
+        }
2048
+    }
2049
+
2050
+    if(strpos($val[0], '@@defaultcast@@') !== false
2051
+      and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2052
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2053
+    }
2054
+
2055
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2056
+    // leurs requetes par defaut, notamment le champ statut
2057
+    // Ne pas confondre champs de la table principale et des jointures
2058
+    if ($table === $boucle->id_table) {
2059
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2060
+        if ($col_alias != $col_vraie) {
2061
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2062
+        }
2063
+    }
2064
+
2065
+    // ajout pour le cas special d'une condition sur le champ statut:
2066
+    // il faut alors interdire a la fonction de boucle
2067
+    // de mettre ses propres criteres de statut
2068
+    // http://www.spip.net/@statut (a documenter)
2069
+    // garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2070
+    if ($col == 'statut') {
2071
+        $boucles[$idb]->statut = true;
2072
+    }
2073
+
2074
+    // inserer le nom de la table SQL devant le nom du champ
2075
+    if ($table) {
2076
+        if ($col[0] == "`") {
2077
+            $arg = "$table." . substr($col, 1, -1);
2078
+        } else {
2079
+            $arg = "$table.$col";
2080
+        }
2081
+    } else {
2082
+        $arg = $col;
2083
+    }
2084
+
2085
+    // inserer la fonction SQL
2086
+    if ($fct) {
2087
+        $arg = "$fct($arg$args_sql)";
2088
+    }
2089
+
2090
+    return array($arg, $op, $val, $col_alias, $where_complement);
2091 2091
 }
2092 2092
 
2093 2093
 
@@ -2116,77 +2116,77 @@  discard block
 block discarded – undo
2116 2116
  **/
2117 2117
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2118 2118
 
2119
-	$where = '';
2120
-
2121
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2122
-	// gestion par les plugins des jointures tordues
2123
-	// pas automatiques mais necessaires
2124
-	$table_sql = table_objet_sql($table);
2125
-	if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2126
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2127
-		and
2128
-		(
2129
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2130
-			or
2131
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2132
-		)
2133
-	) {
2134
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2135
-		$index = isset($t[$col])
2136
-			? $t[$col] : (isset($t['']) ? $t[''] : array());
2137
-
2138
-		if (count($index) == 3) {
2139
-			list($t, $col, $calculer_critere_externe) = $index;
2140
-		} elseif (count($index) == 2) {
2141
-			list($t, $col) = $t[$col];
2142
-		} elseif (count($index) == 1) {
2143
-			list($calculer_critere_externe) = $index;
2144
-			$t = $table;
2145
-		} else {
2146
-			$t = '';
2147
-		} // jointure non declaree. La trouver.
2148
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2149
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2150
-	} else {
2151
-		$t = '';
2152
-	} // jointure non declaree. La trouver.
2153
-
2154
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2155
-
2156
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2157
-	// permet de forcer une table de lien quand il y a ambiguite
2158
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2159
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2160
-	$table = "";
2161
-	if ($boucle->jointures_explicites) {
2162
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2163
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2164
-	}
2165
-
2166
-	// et sinon on cherche parmi toutes les jointures declarees
2167
-	if (!$table) {
2168
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2169
-	}
2170
-
2171
-	if (!$table) {
2172
-		return '';
2173
-	}
2174
-
2175
-	// il ne reste plus qu'a trouver le champ dans les from
2176
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2177
-
2178
-	if (count($cle) > 1 or reset($cle) !== $col) {
2179
-		$col_alias = $col; // id_article devient juste le nom d'origine
2180
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2181
-			$e = decompose_champ_id_objet($col);
2182
-			$col = array_shift($e);
2183
-			$where = primary_doublee($e, $table);
2184
-		} else {
2185
-			$col = reset($cle);
2186
-		}
2187
-	}
2188
-
2189
-	return array($col, $col_alias, $table, $where, $desc);
2119
+    $where = '';
2120
+
2121
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2122
+    // gestion par les plugins des jointures tordues
2123
+    // pas automatiques mais necessaires
2124
+    $table_sql = table_objet_sql($table);
2125
+    if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2126
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2127
+        and
2128
+        (
2129
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2130
+            or
2131
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2132
+        )
2133
+    ) {
2134
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2135
+        $index = isset($t[$col])
2136
+            ? $t[$col] : (isset($t['']) ? $t[''] : array());
2137
+
2138
+        if (count($index) == 3) {
2139
+            list($t, $col, $calculer_critere_externe) = $index;
2140
+        } elseif (count($index) == 2) {
2141
+            list($t, $col) = $t[$col];
2142
+        } elseif (count($index) == 1) {
2143
+            list($calculer_critere_externe) = $index;
2144
+            $t = $table;
2145
+        } else {
2146
+            $t = '';
2147
+        } // jointure non declaree. La trouver.
2148
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2149
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2150
+    } else {
2151
+        $t = '';
2152
+    } // jointure non declaree. La trouver.
2153
+
2154
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2155
+
2156
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2157
+    // permet de forcer une table de lien quand il y a ambiguite
2158
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2159
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2160
+    $table = "";
2161
+    if ($boucle->jointures_explicites) {
2162
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2163
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2164
+    }
2165
+
2166
+    // et sinon on cherche parmi toutes les jointures declarees
2167
+    if (!$table) {
2168
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2169
+    }
2170
+
2171
+    if (!$table) {
2172
+        return '';
2173
+    }
2174
+
2175
+    // il ne reste plus qu'a trouver le champ dans les from
2176
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2177
+
2178
+    if (count($cle) > 1 or reset($cle) !== $col) {
2179
+        $col_alias = $col; // id_article devient juste le nom d'origine
2180
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2181
+            $e = decompose_champ_id_objet($col);
2182
+            $col = array_shift($e);
2183
+            $where = primary_doublee($e, $table);
2184
+        } else {
2185
+            $col = reset($cle);
2186
+        }
2187
+    }
2188
+
2189
+    return array($col, $col_alias, $table, $where, $desc);
2190 2190
 }
2191 2191
 
2192 2192
 
@@ -2207,10 +2207,10 @@  discard block
 block discarded – undo
2207 2207
  *     - valeur
2208 2208
  **/
2209 2209
 function primary_doublee($decompose, $table) {
2210
-	$e1 = reset($decompose);
2211
-	$e2 = "sql_quote('" . end($decompose) . "')";
2210
+    $e1 = reset($decompose);
2211
+    $e2 = "sql_quote('" . end($decompose) . "')";
2212 2212
 
2213
-	return array("'='", "'$table." . $e1 . "'", $e2);
2213
+    return array("'='", "'$table." . $e1 . "'", $e2);
2214 2214
 }
2215 2215
 
2216 2216
 /**
@@ -2241,56 +2241,56 @@  discard block
 block discarded – undo
2241 2241
  *     Vide sinon.
2242 2242
  */
2243 2243
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2244
-	// si on demande un truc du genre spip_mots
2245
-	// avec aussi spip_mots_liens dans les jointures dispo
2246
-	// et qu'on est la
2247
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2248
-	if ($checkarrivee
2249
-		and is_string($checkarrivee)
2250
-		and $a = table_objet($checkarrivee)
2251
-		and in_array($a . '_liens', $joints)
2252
-	) {
2253
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2254
-			return $res;
2255
-		}
2256
-	}
2257
-	foreach ($joints as $joint) {
2258
-		if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2259
-			// alias de table dans le from
2260
-			$t = array_search($arrivee[0], $boucle->from);
2261
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2262
-			$cols = $arrivee[2];
2263
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2264
-			if (count($cols) > 2) {
2265
-				array_pop($cols);
2266
-			}
2267
-			if ($t) {
2268
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2269
-				$joindre = false;
2270
-				foreach ($cols as $col) {
2271
-					$c = '/\b' . $t . ".$col" . '\b/';
2272
-					if (trouver_champ($c, $boucle->where)) {
2273
-						$joindre = true;
2274
-					} else {
2275
-						// mais ca peut etre dans le FIELD pour le Having
2276
-						$c = "/FIELD.$t" . ".$col,/";
2277
-						if (trouver_champ($c, $boucle->select)) {
2278
-							$joindre = true;
2279
-						}
2280
-					}
2281
-				}
2282
-				if (!$joindre) {
2283
-					return $t;
2284
-				}
2285
-			}
2286
-			array_pop($arrivee);
2287
-			if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2288
-				return $res;
2289
-			}
2290
-		}
2291
-	}
2292
-
2293
-	return '';
2244
+    // si on demande un truc du genre spip_mots
2245
+    // avec aussi spip_mots_liens dans les jointures dispo
2246
+    // et qu'on est la
2247
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2248
+    if ($checkarrivee
2249
+        and is_string($checkarrivee)
2250
+        and $a = table_objet($checkarrivee)
2251
+        and in_array($a . '_liens', $joints)
2252
+    ) {
2253
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2254
+            return $res;
2255
+        }
2256
+    }
2257
+    foreach ($joints as $joint) {
2258
+        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2259
+            // alias de table dans le from
2260
+            $t = array_search($arrivee[0], $boucle->from);
2261
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2262
+            $cols = $arrivee[2];
2263
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2264
+            if (count($cols) > 2) {
2265
+                array_pop($cols);
2266
+            }
2267
+            if ($t) {
2268
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2269
+                $joindre = false;
2270
+                foreach ($cols as $col) {
2271
+                    $c = '/\b' . $t . ".$col" . '\b/';
2272
+                    if (trouver_champ($c, $boucle->where)) {
2273
+                        $joindre = true;
2274
+                    } else {
2275
+                        // mais ca peut etre dans le FIELD pour le Having
2276
+                        $c = "/FIELD.$t" . ".$col,/";
2277
+                        if (trouver_champ($c, $boucle->select)) {
2278
+                            $joindre = true;
2279
+                        }
2280
+                    }
2281
+                }
2282
+                if (!$joindre) {
2283
+                    return $t;
2284
+                }
2285
+            }
2286
+            array_pop($arrivee);
2287
+            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2288
+                return $res;
2289
+            }
2290
+        }
2291
+    }
2292
+
2293
+    return '';
2294 2294
 
2295 2295
 }
2296 2296
 
@@ -2317,29 +2317,29 @@  discard block
 block discarded – undo
2317 2317
  *     Alias de la table de jointure (Lx)
2318 2318
  */
2319 2319
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2320
-	$primary_arrivee = id_table_objet($checkarrivee);
2321
-
2322
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2323
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2324
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2325
-
2326
-	if (!$intermediaire or !$arrivee) {
2327
-		return '';
2328
-	}
2329
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2330
-	array_pop($arrivee); // enlever la cle en 3eme argument
2331
-
2332
-	$res = fabrique_jointures($boucle,
2333
-		array(
2334
-			array(
2335
-				$boucle->id_table,
2336
-				$intermediaire,
2337
-				array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2338
-			),
2339
-			array(reset($intermediaire), $arrivee, $primary_arrivee)
2340
-		), $cond, $desc, $boucle->id_table, array($col));
2341
-
2342
-	return $res;
2320
+    $primary_arrivee = id_table_objet($checkarrivee);
2321
+
2322
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2323
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2324
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2325
+
2326
+    if (!$intermediaire or !$arrivee) {
2327
+        return '';
2328
+    }
2329
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2330
+    array_pop($arrivee); // enlever la cle en 3eme argument
2331
+
2332
+    $res = fabrique_jointures($boucle,
2333
+        array(
2334
+            array(
2335
+                $boucle->id_table,
2336
+                $intermediaire,
2337
+                array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2338
+            ),
2339
+            array(reset($intermediaire), $arrivee, $primary_arrivee)
2340
+        ), $cond, $desc, $boucle->id_table, array($col));
2341
+
2342
+    return $res;
2343 2343
 }
2344 2344
 
2345 2345
 
@@ -2356,17 +2356,17 @@  discard block
 block discarded – undo
2356 2356
  *     false sinon.
2357 2357
  **/
2358 2358
 function trouver_champ($champ, $where) {
2359
-	if (!is_array($where)) {
2360
-		return preg_match($champ, $where);
2361
-	} else {
2362
-		foreach ($where as $clause) {
2363
-			if (trouver_champ($champ, $clause)) {
2364
-				return true;
2365
-			}
2366
-		}
2367
-
2368
-		return false;
2369
-	}
2359
+    if (!is_array($where)) {
2360
+        return preg_match($champ, $where);
2361
+    } else {
2362
+        foreach ($where as $clause) {
2363
+            if (trouver_champ($champ, $clause)) {
2364
+                return true;
2365
+            }
2366
+        }
2367
+
2368
+        return false;
2369
+    }
2370 2370
 }
2371 2371
 
2372 2372
 
@@ -2392,129 +2392,129 @@  discard block
 block discarded – undo
2392 2392
  *     - string $args_sql  Suite des arguments du critère. ?
2393 2393
  **/
2394 2394
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2395
-	// cas d'une valeur comparee a elle-meme ou son referent
2396
-	if (count($crit->param) == 0) {
2397
-		$op = '=';
2398
-		$col = $val = $crit->op;
2399
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2400
-			$val = $r[2];
2401
-		}
2402
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2403
-		if ($val == 'lang') {
2404
-			$val = array(kwote('$GLOBALS[\'spip_lang\']'));
2405
-		} else {
2406
-			$defaut = null;
2407
-			if ($val == 'id_parent') {
2408
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2409
-				// de la boucle superieure.... faudrait verifier qu'il existe
2410
-				// pour eviter l'erreur SQL
2411
-				$val = $boucles[$idb]->primary;
2412
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2413
-				$defaut = "@\$Pile[0]['id_parent']";
2414
-			} elseif ($val == 'id_enfant') {
2415
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2416
-				// de la boucle superieure
2417
-				$val = 'id_parent';
2418
-			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2419
-				// un critere conditionnel sur date est traite a part
2420
-				// car la date est mise d'office par SPIP,
2421
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2422
-			}
2423
-
2424
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2425
-			$val = array(kwote($val));
2426
-		}
2427
-	} else {
2428
-		// comparaison explicite
2429
-		// le phraseur impose que le premier param soit du texte
2430
-		$params = $crit->param;
2431
-		$op = $crit->op;
2432
-		if ($op == '==') {
2433
-			$op = 'REGEXP';
2434
-		}
2435
-		$col = array_shift($params);
2436
-		$col = $col[0]->texte;
2437
-
2438
-		$val = array();
2439
-		$desc = array('id_mere' => $idb);
2440
-		$parent = $boucles[$idb]->id_parent;
2441
-
2442
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2443
-		// celui ne sachant pas ce qu'est un critere infixe
2444
-		// et a fortiori son 2e operande qu'entoure " ou '
2445
-		if (count($params) == 1
2446
-			and count($params[0]) == 3
2447
-			and $params[0][0]->type == 'texte'
2448
-			and $params[0][2]->type == 'texte'
2449
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2450
-			and (($p == "'") or ($p == '"'))
2451
-			and $params[0][1]->type == 'champ'
2452
-		) {
2453
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2454
-		} else {
2455
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2456
-				$a = calculer_liste($p, $desc, $boucles, $parent);
2457
-				if (strcasecmp($op, 'IN') == 0) {
2458
-					$val[] = $a;
2459
-				} else {
2460
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2461
-				} // toujours quoter en char ici
2462
-			}
2463
-		}
2464
-	}
2465
-
2466
-	$fct = $args_sql = '';
2467
-	// fonction SQL ?
2468
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2469
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2470
-		$fct = $m[1];
2471
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2472
-		$col = $a[1];
2473
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2474
-			$col = $m[1];
2475
-			$args_sql = $m[2];
2476
-		}
2477
-		$args_sql .= $a[2];
2478
-	}
2479
-
2480
-	return array($fct, $col, $op, $val, $args_sql);
2395
+    // cas d'une valeur comparee a elle-meme ou son referent
2396
+    if (count($crit->param) == 0) {
2397
+        $op = '=';
2398
+        $col = $val = $crit->op;
2399
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2400
+            $val = $r[2];
2401
+        }
2402
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2403
+        if ($val == 'lang') {
2404
+            $val = array(kwote('$GLOBALS[\'spip_lang\']'));
2405
+        } else {
2406
+            $defaut = null;
2407
+            if ($val == 'id_parent') {
2408
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2409
+                // de la boucle superieure.... faudrait verifier qu'il existe
2410
+                // pour eviter l'erreur SQL
2411
+                $val = $boucles[$idb]->primary;
2412
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2413
+                $defaut = "@\$Pile[0]['id_parent']";
2414
+            } elseif ($val == 'id_enfant') {
2415
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2416
+                // de la boucle superieure
2417
+                $val = 'id_parent';
2418
+            } elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2419
+                // un critere conditionnel sur date est traite a part
2420
+                // car la date est mise d'office par SPIP,
2421
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2422
+            }
2423
+
2424
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2425
+            $val = array(kwote($val));
2426
+        }
2427
+    } else {
2428
+        // comparaison explicite
2429
+        // le phraseur impose que le premier param soit du texte
2430
+        $params = $crit->param;
2431
+        $op = $crit->op;
2432
+        if ($op == '==') {
2433
+            $op = 'REGEXP';
2434
+        }
2435
+        $col = array_shift($params);
2436
+        $col = $col[0]->texte;
2437
+
2438
+        $val = array();
2439
+        $desc = array('id_mere' => $idb);
2440
+        $parent = $boucles[$idb]->id_parent;
2441
+
2442
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2443
+        // celui ne sachant pas ce qu'est un critere infixe
2444
+        // et a fortiori son 2e operande qu'entoure " ou '
2445
+        if (count($params) == 1
2446
+            and count($params[0]) == 3
2447
+            and $params[0][0]->type == 'texte'
2448
+            and $params[0][2]->type == 'texte'
2449
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2450
+            and (($p == "'") or ($p == '"'))
2451
+            and $params[0][1]->type == 'champ'
2452
+        ) {
2453
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2454
+        } else {
2455
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2456
+                $a = calculer_liste($p, $desc, $boucles, $parent);
2457
+                if (strcasecmp($op, 'IN') == 0) {
2458
+                    $val[] = $a;
2459
+                } else {
2460
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2461
+                } // toujours quoter en char ici
2462
+            }
2463
+        }
2464
+    }
2465
+
2466
+    $fct = $args_sql = '';
2467
+    // fonction SQL ?
2468
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2469
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2470
+        $fct = $m[1];
2471
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2472
+        $col = $a[1];
2473
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2474
+            $col = $m[1];
2475
+            $args_sql = $m[2];
2476
+        }
2477
+        $args_sql .= $a[2];
2478
+    }
2479
+
2480
+    return array($fct, $col, $op, $val, $args_sql);
2481 2481
 }
2482 2482
 
2483 2483
 // compatibilite ancienne version
2484 2484
 
2485 2485
 // http://code.spip.net/@calculer_vieux_in
2486 2486
 function calculer_vieux_in($params) {
2487
-	$deb = $params[0][0];
2488
-	$k = count($params) - 1;
2489
-	$last = $params[$k];
2490
-	$j = count($last) - 1;
2491
-	$last = $last[$j];
2492
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2493
-
2494
-	if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2495
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2496
-	) {
2497
-		return $params;
2498
-	}
2499
-	$params[0][0]->texte = substr($deb->texte, 1);
2500
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2501
-	$last = $params[$k][$j];
2502
-	$n = strlen($last->texte);
2503
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2504
-	$newp = array();
2505
-	foreach ($params as $v) {
2506
-		if ($v[0]->type != 'texte') {
2507
-			$newp[] = $v;
2508
-		} else {
2509
-			foreach (explode(',', $v[0]->texte) as $x) {
2510
-				$t = new Texte;
2511
-				$t->texte = $x;
2512
-				$newp[] = array($t);
2513
-			}
2514
-		}
2515
-	}
2516
-
2517
-	return $newp;
2487
+    $deb = $params[0][0];
2488
+    $k = count($params) - 1;
2489
+    $last = $params[$k];
2490
+    $j = count($last) - 1;
2491
+    $last = $last[$j];
2492
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2493
+
2494
+    if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2495
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2496
+    ) {
2497
+        return $params;
2498
+    }
2499
+    $params[0][0]->texte = substr($deb->texte, 1);
2500
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2501
+    $last = $params[$k][$j];
2502
+    $n = strlen($last->texte);
2503
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2504
+    $newp = array();
2505
+    foreach ($params as $v) {
2506
+        if ($v[0]->type != 'texte') {
2507
+            $newp[] = $v;
2508
+        } else {
2509
+            foreach (explode(',', $v[0]->texte) as $x) {
2510
+                $t = new Texte;
2511
+                $t->texte = $x;
2512
+                $newp[] = array($t);
2513
+            }
2514
+        }
2515
+    }
2516
+
2517
+    return $newp;
2518 2518
 }
2519 2519
 
2520 2520
 /**
@@ -2533,89 +2533,89 @@  discard block
 block discarded – undo
2533 2533
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2534 2534
  **/
2535 2535
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2536
-	if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
2537
-		return '';
2538
-	}
2539
-
2540
-	$boucle = $boucles[$idb];
2541
-	$table = $boucle->show;
2542
-
2543
-	// si c'est une colonne de la table, ne rien faire
2544
-	if (isset($table['field'][$col])) {
2545
-		return '';
2546
-	}
2547
-
2548
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2549
-		return '';
2550
-	}
2551
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2552
-
2553
-	$col = $regs[1];
2554
-	if (isset($regs[3]) and $suite = $regs[3]) {
2555
-		# Recherche de l'existence du champ date_xxxx,
2556
-		# si oui choisir ce champ, sinon choisir xxxx
2557
-
2558
-		if (isset($table['field']["date$suite"])) {
2559
-			$date_orig = 'date' . $suite;
2560
-		} else {
2561
-			$date_orig = substr($suite, 1);
2562
-		}
2563
-		$pred = $date_orig;
2564
-	} else {
2565
-		if (isset($regs[2]) and $rel = $regs[2]) {
2566
-			$pred = 'date';
2567
-		}
2568
-	}
2569
-
2570
-	$date_compare = "\"' . normaliser_date(" .
2571
-		calculer_argument_precedent($idb, $pred, $boucles) .
2572
-		") . '\"";
2573
-
2574
-	$col_vraie = $date_orig;
2575
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2576
-
2577
-	switch ($col) {
2578
-		case 'date':
2579
-			$col = $date_orig;
2580
-			break;
2581
-		case 'jour':
2582
-			$col = "DAYOFMONTH($date_orig)";
2583
-			break;
2584
-		case 'mois':
2585
-			$col = "MONTH($date_orig)";
2586
-			break;
2587
-		case 'annee':
2588
-			$col = "YEAR($date_orig)";
2589
-			break;
2590
-		case 'heure':
2591
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2592
-			break;
2593
-		case 'age':
2594
-			$col = calculer_param_date("NOW()", $date_orig);
2595
-			$col_vraie = "";// comparer a un int (par defaut)
2596
-			break;
2597
-		case 'age_relatif':
2598
-			$col = calculer_param_date($date_compare, $date_orig);
2599
-			$col_vraie = "";// comparer a un int (par defaut)
2600
-			break;
2601
-		case 'jour_relatif':
2602
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2603
-			$col_vraie = "";// comparer a un int (par defaut)
2604
-			break;
2605
-		case 'mois_relatif':
2606
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2607
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2608
-				")-YEAR(" . $date_orig . "))";
2609
-			$col_vraie = "";// comparer a un int (par defaut)
2610
-			break;
2611
-		case 'annee_relatif':
2612
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2613
-				$date_orig . ")";
2614
-			$col_vraie = "";// comparer a un int (par defaut)
2615
-			break;
2616
-	}
2617
-
2618
-	return array($col, $col_vraie);
2536
+    if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
2537
+        return '';
2538
+    }
2539
+
2540
+    $boucle = $boucles[$idb];
2541
+    $table = $boucle->show;
2542
+
2543
+    // si c'est une colonne de la table, ne rien faire
2544
+    if (isset($table['field'][$col])) {
2545
+        return '';
2546
+    }
2547
+
2548
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2549
+        return '';
2550
+    }
2551
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2552
+
2553
+    $col = $regs[1];
2554
+    if (isset($regs[3]) and $suite = $regs[3]) {
2555
+        # Recherche de l'existence du champ date_xxxx,
2556
+        # si oui choisir ce champ, sinon choisir xxxx
2557
+
2558
+        if (isset($table['field']["date$suite"])) {
2559
+            $date_orig = 'date' . $suite;
2560
+        } else {
2561
+            $date_orig = substr($suite, 1);
2562
+        }
2563
+        $pred = $date_orig;
2564
+    } else {
2565
+        if (isset($regs[2]) and $rel = $regs[2]) {
2566
+            $pred = 'date';
2567
+        }
2568
+    }
2569
+
2570
+    $date_compare = "\"' . normaliser_date(" .
2571
+        calculer_argument_precedent($idb, $pred, $boucles) .
2572
+        ") . '\"";
2573
+
2574
+    $col_vraie = $date_orig;
2575
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2576
+
2577
+    switch ($col) {
2578
+        case 'date':
2579
+            $col = $date_orig;
2580
+            break;
2581
+        case 'jour':
2582
+            $col = "DAYOFMONTH($date_orig)";
2583
+            break;
2584
+        case 'mois':
2585
+            $col = "MONTH($date_orig)";
2586
+            break;
2587
+        case 'annee':
2588
+            $col = "YEAR($date_orig)";
2589
+            break;
2590
+        case 'heure':
2591
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2592
+            break;
2593
+        case 'age':
2594
+            $col = calculer_param_date("NOW()", $date_orig);
2595
+            $col_vraie = "";// comparer a un int (par defaut)
2596
+            break;
2597
+        case 'age_relatif':
2598
+            $col = calculer_param_date($date_compare, $date_orig);
2599
+            $col_vraie = "";// comparer a un int (par defaut)
2600
+            break;
2601
+        case 'jour_relatif':
2602
+            $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2603
+            $col_vraie = "";// comparer a un int (par defaut)
2604
+            break;
2605
+        case 'mois_relatif':
2606
+            $col = "MONTH(" . $date_compare . ")-MONTH(" .
2607
+                $date_orig . ")+12*(YEAR(" . $date_compare .
2608
+                ")-YEAR(" . $date_orig . "))";
2609
+            $col_vraie = "";// comparer a un int (par defaut)
2610
+            break;
2611
+        case 'annee_relatif':
2612
+            $col = "YEAR(" . $date_compare . ")-YEAR(" .
2613
+                $date_orig . ")";
2614
+            $col_vraie = "";// comparer a un int (par defaut)
2615
+            break;
2616
+    }
2617
+
2618
+    return array($col, $col_vraie);
2619 2619
 }
2620 2620
 
2621 2621
 /**
@@ -2634,16 +2634,16 @@  discard block
 block discarded – undo
2634 2634
  *     de colonne SQL et une date.
2635 2635
  **/
2636 2636
 function calculer_param_date($date_compare, $date_orig) {
2637
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2638
-		$init = "'\" . (\$x = $r[1]) . \"'";
2639
-		$date_compare = '\'$x\'';
2640
-	} else {
2641
-		$init = $date_compare;
2642
-	}
2643
-
2644
-	return
2645
-		// optimisation : mais prevoir le support SQLite avant
2646
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2637
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2638
+        $init = "'\" . (\$x = $r[1]) . \"'";
2639
+        $date_compare = '\'$x\'';
2640
+    } else {
2641
+        $init = $date_compare;
2642
+    }
2643
+
2644
+    return
2645
+        // optimisation : mais prevoir le support SQLite avant
2646
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2647 2647
 }
2648 2648
 
2649 2649
 /**
@@ -2661,18 +2661,18 @@  discard block
 block discarded – undo
2661 2661
  * @param Critere $crit Paramètres du critère dans cette boucle
2662 2662
  */
2663 2663
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2664
-	$boucle = &$boucles[$idb];
2664
+    $boucle = &$boucles[$idb];
2665 2665
 
2666
-	$args = array();
2667
-	foreach ($crit->param as &$param) {
2668
-		array_push($args,
2669
-			calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent));
2670
-	}
2666
+    $args = array();
2667
+    foreach ($crit->param as &$param) {
2668
+        array_push($args,
2669
+            calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent));
2670
+    }
2671 2671
 
2672
-	$boucle->hash .= '
2672
+    $boucle->hash .= '
2673 2673
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2674 2674
 
2675
-	$boucle->hash .= '
2675
+    $boucle->hash .= '
2676 2676
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2677 2677
 }
2678 2678
 
@@ -2689,8 +2689,8 @@  discard block
 block discarded – undo
2689 2689
  * @param Critere $crit Paramètres du critère dans cette boucle
2690 2690
  */
2691 2691
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2692
-	$boucle = &$boucles[$idb];
2693
-	$boucle->hash .= '
2692
+    $boucle = &$boucles[$idb];
2693
+    $boucle->hash .= '
2694 2694
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ');
2695 2695
 	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent) . ';';
2696 2696
 }
@@ -2710,8 +2710,8 @@  discard block
 block discarded – undo
2710 2710
  * @param Critere $crit Paramètres du critère dans cette boucle
2711 2711
  */
2712 2712
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2713
-	$boucle = &$boucles[$idb];
2714
-	$boucle->hash .= '
2713
+    $boucle = &$boucles[$idb];
2714
+    $boucle->hash .= '
2715 2715
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ';';
2716 2716
 }
2717 2717
 
@@ -2727,12 +2727,12 @@  discard block
 block discarded – undo
2727 2727
  * @param Critere $crit Paramètres du critère dans cette boucle
2728 2728
  */
2729 2729
 function critere_php_args_dist($idb, &$boucles, $crit) {
2730
-	$boucle = &$boucles[$idb];
2731
-	$boucle->hash .= '$command[\'args\']=array();';
2732
-	foreach ($crit->param as $param) {
2733
-		$boucle->hash .= '
2730
+    $boucle = &$boucles[$idb];
2731
+    $boucle->hash .= '$command[\'args\']=array();';
2732
+    foreach ($crit->param as $param) {
2733
+        $boucle->hash .= '
2734 2734
 			$command[\'args\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';';
2735
-	}
2735
+    }
2736 2736
 }
2737 2737
 
2738 2738
 /**
@@ -2749,12 +2749,12 @@  discard block
 block discarded – undo
2749 2749
  * @param Critere $crit Paramètres du critère dans cette boucle
2750 2750
  */
2751 2751
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2752
-	$boucle = &$boucles[$idb];
2753
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2754
-	foreach ($crit->param as $param) {
2755
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, array(), $boucles,
2756
-				$boucles[$idb]->id_parent) . ";\n";
2757
-	}
2752
+    $boucle = &$boucles[$idb];
2753
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2754
+    foreach ($crit->param as $param) {
2755
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, array(), $boucles,
2756
+                $boucles[$idb]->id_parent) . ";\n";
2757
+    }
2758 2758
 }
2759 2759
 
2760 2760
 /**
@@ -2779,12 +2779,12 @@  discard block
 block discarded – undo
2779 2779
  * @param Critere $crit Paramètres du critère dans cette boucle
2780 2780
  */
2781 2781
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2782
-	$boucle = &$boucles[$idb];
2783
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2784
-	foreach ($crit->param as $param) {
2785
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, array(), $boucles,
2786
-				$boucles[$idb]->id_parent) . ";\n";
2787
-	}
2782
+    $boucle = &$boucles[$idb];
2783
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2784
+    foreach ($crit->param as $param) {
2785
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, array(), $boucles,
2786
+                $boucles[$idb]->id_parent) . ";\n";
2787
+    }
2788 2788
 }
2789 2789
 
2790 2790
 /**
@@ -2799,11 +2799,11 @@  discard block
 block discarded – undo
2799 2799
  * @param Critere $crit Paramètres du critère dans cette boucle
2800 2800
  */
2801 2801
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2802
-	$boucle = &$boucles[$idb];
2803
-	foreach ($crit->param as $param) {
2804
-		$boucle->hash .= '
2802
+    $boucle = &$boucles[$idb];
2803
+    foreach ($crit->param as $param) {
2804
+        $boucle->hash .= '
2805 2805
 			$command[\'datapath\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';';
2806
-	}
2806
+    }
2807 2807
 }
2808 2808
 
2809 2809
 
@@ -2835,20 +2835,20 @@  discard block
 block discarded – undo
2835 2835
  * @param Critere $crit Paramètres du critère dans cette boucle
2836 2836
  */
2837 2837
 function critere_si_dist($idb, &$boucles, $crit) {
2838
-	$boucle = &$boucles[$idb];
2839
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2840
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2841
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2842
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2843
-	if ($crit->param) {
2844
-		foreach ($crit->param as $param) {
2845
-			$boucle->hash .= "\t\$command['si'][] = "
2846
-				. calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n";
2847
-		}
2848
-		// interdire {si 0} aussi !
2849
-	} else {
2850
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2851
-	}
2838
+    $boucle = &$boucles[$idb];
2839
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2840
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2841
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2842
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2843
+    if ($crit->param) {
2844
+        foreach ($crit->param as $param) {
2845
+            $boucle->hash .= "\t\$command['si'][] = "
2846
+                . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n";
2847
+        }
2848
+        // interdire {si 0} aussi !
2849
+    } else {
2850
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2851
+    }
2852 2852
 }
2853 2853
 
2854 2854
 /**
@@ -2864,8 +2864,8 @@  discard block
 block discarded – undo
2864 2864
  * @param Critere $crit Paramètres du critère dans cette boucle
2865 2865
  */
2866 2866
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2867
-	$boucle = &$boucles[$idb];
2868
-	$boucle->hash .= '
2867
+    $boucle = &$boucles[$idb];
2868
+    $boucle->hash .= '
2869 2869
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ');
2870 2870
 	$command[\'sourcemode\'] = \'table\';';
2871 2871
 }
@@ -2886,29 +2886,29 @@  discard block
 block discarded – undo
2886 2886
  */
2887 2887
 function critere_noeud_dist($idb, &$boucles, $crit) {
2888 2888
 
2889
-	$not = $crit->not;
2890
-	$boucle = &$boucles[$idb];
2891
-	$primary = $boucle->primary;
2889
+    $not = $crit->not;
2890
+    $boucle = &$boucles[$idb];
2891
+    $primary = $boucle->primary;
2892 2892
 
2893
-	if (!$primary or strpos($primary, ',')) {
2894
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2893
+    if (!$primary or strpos($primary, ',')) {
2894
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2895 2895
 
2896
-		return;
2897
-	}
2898
-	$table = $boucle->type_requete;
2899
-	$table_sql = table_objet_sql(objet_type($table));
2896
+        return;
2897
+    }
2898
+    $table = $boucle->type_requete;
2899
+    $table_sql = table_objet_sql(objet_type($table));
2900 2900
 
2901
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2902
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2903
-		'id_parent';
2901
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2902
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2903
+        'id_parent';
2904 2904
 
2905
-	$in = "IN";
2906
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2907
-	if ($not) {
2908
-		$where = array("'NOT'", $where);
2909
-	}
2905
+    $in = "IN";
2906
+    $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2907
+    if ($not) {
2908
+        $where = array("'NOT'", $where);
2909
+    }
2910 2910
 
2911
-	$boucle->where[] = $where;
2911
+    $boucle->where[] = $where;
2912 2912
 }
2913 2913
 
2914 2914
 /**
@@ -2924,8 +2924,8 @@  discard block
 block discarded – undo
2924 2924
  * @param Critere $crit Paramètres du critère dans cette boucle
2925 2925
  */
2926 2926
 function critere_feuille_dist($idb, &$boucles, $crit) {
2927
-	$not = $crit->not;
2928
-	$crit->not = $not ? false : true;
2929
-	critere_noeud_dist($idb, $boucles, $crit);
2930
-	$crit->not = $not;
2927
+    $not = $crit->not;
2928
+    $crit->not = $not ? false : true;
2929
+    critere_noeud_dist($idb, $boucles, $crit);
2930
+    $crit->not = $not;
2931 2931
 }
Please login to merge, or discard this patch.