Completed
Push — master ( f0f5a6...19ef56 )
by cam
06:11 queued 15s
created
ecrire/public/criteres.php 1 patch
Indentation   +1680 added lines, -1680 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
  **/
44 44
 function critere_racine_dist($idb, &$boucles, $crit) {
45 45
 
46
-	$not = $crit->not;
47
-	$boucle = &$boucles[$idb];
48
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
+        'id_parent';
51 51
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
52
+    $c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 54
 }
55 55
 
56 56
 
@@ -67,15 +67,15 @@  discard block
 block discarded – undo
67 67
  * @return void
68 68
  **/
69 69
 function critere_exclus_dist($idb, &$boucles, $crit) {
70
-	$not = $crit->not;
71
-	$boucle = &$boucles[$idb];
72
-	$id = $boucle->primary;
73
-
74
-	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
-	}
77
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
70
+    $not = $crit->not;
71
+    $boucle = &$boucles[$idb];
72
+    $id = $boucle->primary;
73
+
74
+    if ($not or !$id) {
75
+        return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
+    }
77
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
+    $boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
79 79
 }
80 80
 
81 81
 
@@ -95,73 +95,73 @@  discard block
 block discarded – undo
95 95
  * @return void
96 96
  **/
97 97
 function critere_doublons_dist($idb, &$boucles, $crit) {
98
-	$boucle = &$boucles[$idb];
99
-	$primary = $boucle->primary;
100
-
101
-	// la table nécessite une clé primaire, non composée
102
-	if (!$primary or strpos($primary, ',')) {
103
-		return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
-	}
105
-
106
-	$not = ($crit->not ? '' : 'NOT');
107
-
108
-	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
110
-
111
-	// compléter le nom avec un nom précisé {doublons nom}
112
-	// on obtient $nom = "'article' . 'nom'"
113
-	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
-	}
116
-
117
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
-
121
-	// on crée un sql_in avec la clé primaire de la table
122
-	// et la collection des doublons déjà emmagasinés dans le tableau
123
-	// $doublons et son index, ici $nom
124
-
125
-	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
128
-	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
-
131
-	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
133
-
134
-	// nom du doublon "('article' . 'nom')]"
135
-	$fin_doub = "($nom)]";
136
-
137
-	// si on trouve un autre critère doublon,
138
-	// on fusionne pour avoir un seul IN, et on s'en va !
139
-	foreach ($boucle->where as $k => $w) {
140
-		if (strpos($w[0], $debut_doub) === 0) {
141
-			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
-			// fusionner l'initialisation (du hash) pour faire plus joli
144
-			$x = strpos($boucle->hash, $init_comment);
145
-			$len = strlen($init_comment);
146
-			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
-
149
-			return;
150
-		}
151
-	}
152
-
153
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
-
156
-	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
158
-
159
-
160
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
161
-	# mais elle fait planter une boucle a 2 critere doublons:
162
-	# {!doublons A}{doublons B}
163
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
-	#	if ($crit->not) $boucle->doublons = "";
98
+    $boucle = &$boucles[$idb];
99
+    $primary = $boucle->primary;
100
+
101
+    // la table nécessite une clé primaire, non composée
102
+    if (!$primary or strpos($primary, ',')) {
103
+        return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
+    }
105
+
106
+    $not = ($crit->not ? '' : 'NOT');
107
+
108
+    // le doublon s'applique sur un type de boucle (article)
109
+    $nom = "'" . $boucle->type_requete . "'";
110
+
111
+    // compléter le nom avec un nom précisé {doublons nom}
112
+    // on obtient $nom = "'article' . 'nom'"
113
+    if (isset($crit->param[0])) {
114
+        $nom .= "." . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
115
+    }
116
+
117
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
+
121
+    // on crée un sql_in avec la clé primaire de la table
122
+    // et la collection des doublons déjà emmagasinés dans le tableau
123
+    // $doublons et son index, ici $nom
124
+
125
+    // debut du code "sql_in('articles.id_article', "
126
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
128
+    // Attention : boucle->doublons désigne une variable qu'on affecte
129
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
+
131
+    // le debut complet du code des doublons
132
+    $debut_doub = $debut_in . $debut_doub;
133
+
134
+    // nom du doublon "('article' . 'nom')]"
135
+    $fin_doub = "($nom)]";
136
+
137
+    // si on trouve un autre critère doublon,
138
+    // on fusionne pour avoir un seul IN, et on s'en va !
139
+    foreach ($boucle->where as $k => $w) {
140
+        if (strpos($w[0], $debut_doub) === 0) {
141
+            // fusionner le sql_in (du where)
142
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
+            // fusionner l'initialisation (du hash) pour faire plus joli
144
+            $x = strpos($boucle->hash, $init_comment);
145
+            $len = strlen($init_comment);
146
+            $boucle->hash =
147
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
+
149
+            return;
150
+        }
151
+    }
152
+
153
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
+    $boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
+
156
+    // déclarer le doublon s'il n'existe pas encore
157
+    $boucle->hash .= $init_comment . $init_code;
158
+
159
+
160
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
161
+    # mais elle fait planter une boucle a 2 critere doublons:
162
+    # {!doublons A}{doublons B}
163
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
+    #	if ($crit->not) $boucle->doublons = "";
165 165
 }
166 166
 
167 167
 
@@ -182,14 +182,14 @@  discard block
 block discarded – undo
182 182
  * @return void
183 183
  **/
184 184
 function critere_lang_select_dist($idb, &$boucles, $crit) {
185
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
-		$param = 'oui';
187
-	}
188
-	if ($crit->not) {
189
-		$param = ($param == 'oui') ? 'non' : 'oui';
190
-	}
191
-	$boucle = &$boucles[$idb];
192
-	$boucle->lang_select = $param;
185
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
+        $param = 'oui';
187
+    }
188
+    if ($crit->not) {
189
+        $param = ($param == 'oui') ? 'non' : 'oui';
190
+    }
191
+    $boucle = &$boucles[$idb];
192
+    $boucle->lang_select = $param;
193 193
 }
194 194
 
195 195
 
@@ -211,18 +211,18 @@  discard block
 block discarded – undo
211 211
  * @return void
212 212
  **/
213 213
 function critere_debut_dist($idb, &$boucles, $crit) {
214
-	list($un, $deux) = $crit->param;
215
-	$un = $un[0]->texte;
216
-	$deux = $deux[0]->texte;
217
-	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
222
-			'"';
223
-	} else {
224
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
-	}
214
+    list($un, $deux) = $crit->param;
215
+    $un = $un[0]->texte;
216
+    $deux = $deux[0]->texte;
217
+    if ($deux) {
218
+        $boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
+            $un .
220
+            '"]) . ",' .
221
+            $deux .
222
+            '"';
223
+    } else {
224
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
+    }
226 226
 }
227 227
 
228 228
 
@@ -256,57 +256,57 @@  discard block
 block discarded – undo
256 256
  **/
257 257
 function critere_pagination_dist($idb, &$boucles, $crit) {
258 258
 
259
-	$boucle = &$boucles[$idb];
260
-	// definition de la taille de la page
261
-	$pas = !isset($crit->param[0][0]) ? "''"
262
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
263
-
264
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
266
-	} else {
267
-		$r = intval($r[2]);
268
-		$pas = strval($r ? $r : 10);
269
-	}
270
-
271
-	// Calcul du nommage de la pagination si il existe.
272
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
274
-	$type = "'$idb'";
275
-	// Calcul d'un nommage spécifique de la pagination si précisé.
276
-	// Syntaxe {pagination 20, nom}
277
-	if (isset($crit->param[0][1])) {
278
-		$type = calculer_liste(array($crit->param[0][1]), $idb, $boucles, $boucle->id_parent);
279
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
-	elseif (isset($crit->param[1][0])) {
281
-		$type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282
-	}
283
-
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
-	$boucle->modificateur['debut_nom'] = $type;
286
-	$partie =
287
-		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
-		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
292
-		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
294
-
295
-	$boucle->hash .= '
259
+    $boucle = &$boucles[$idb];
260
+    // definition de la taille de la page
261
+    $pas = !isset($crit->param[0][0]) ? "''"
262
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
263
+
264
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
266
+    } else {
267
+        $r = intval($r[2]);
268
+        $pas = strval($r ? $r : 10);
269
+    }
270
+
271
+    // Calcul du nommage de la pagination si il existe.
272
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
274
+    $type = "'$idb'";
275
+    // Calcul d'un nommage spécifique de la pagination si précisé.
276
+    // Syntaxe {pagination 20, nom}
277
+    if (isset($crit->param[0][1])) {
278
+        $type = calculer_liste(array($crit->param[0][1]), $idb, $boucles, $boucle->id_parent);
279
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
+    elseif (isset($crit->param[1][0])) {
281
+        $type = calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
282
+    }
283
+
284
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
+    $boucle->modificateur['debut_nom'] = $type;
286
+    $partie =
287
+        // tester si le numero de page demande est de la forme '@yyy'
288
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
+        . "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
+        . "\t\t" . '$iter->seek(0);' . "\n"
292
+        . "\t}\n"
293
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
294
+
295
+    $boucle->hash .= '
296 296
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
297 297
 
298
-	$boucle->total_parties = $pas;
299
-	calculer_parties($boucles, $idb, $partie, 'p+');
300
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
-	// sauf si pas de primaire, ou si primaire composee
302
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
304
-	if ($boucle->primary
305
-		and !preg_match('/[,\s]/', $boucle->primary)
306
-		and !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
298
+    $boucle->total_parties = $pas;
299
+    calculer_parties($boucles, $idb, $partie, 'p+');
300
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
+    // sauf si pas de primaire, ou si primaire composee
302
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
303
+    $t = $boucle->id_table . '.' . $boucle->primary;
304
+    if ($boucle->primary
305
+        and !preg_match('/[,\s]/', $boucle->primary)
306
+        and !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
333
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		array(
397
-			"'OR'",
398
-			array(
399
-				"'AND'",
400
-				array("'='", "'$table.id_trad'", 0),
401
-				array("'='", "'$table.$prim'", $dprim)
402
-			),
403
-			array(
404
-				"'AND'",
405
-				array("'>'", "'$table.id_trad'", 0),
406
-				array("'='", "'$table.id_trad'", $arg)
407
-			)
408
-		);
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        array(
397
+            "'OR'",
398
+            array(
399
+                "'AND'",
400
+                array("'='", "'$table.id_trad'", 0),
401
+                array("'='", "'$table.$prim'", $dprim)
402
+            ),
403
+            array(
404
+                "'AND'",
405
+                array("'>'", "'$table.id_trad'", 0),
406
+                array("'='", "'$table.id_trad'", $arg)
407
+            )
408
+        );
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		array(
432
-			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
-			array("'='", "'$table.id_trad'", "'0'")
435
-		);
436
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        array(
432
+            "'OR'",
433
+            array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
+            array("'='", "'$table.id_trad'", "'0'")
435
+        );
436
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,20 +450,20 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
+        'id_parent';
458
+    $mparent = $boucle->id_table . '.' . $id_parent;
459 459
 
460
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
-		$boucle->where[] = array("'='", "'$mparent'", $arg);
460
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
+        $boucle->where[] = array("'='", "'$mparent'", $arg);
462 462
 
463
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
-	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
-	}
463
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
+    else {
465
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
+    }
467 467
 }
468 468
 
469 469
 
@@ -494,37 +494,37 @@  discard block
 block discarded – undo
494 494
  **/
495 495
 function critere_branche_dist($idb, &$boucles, $crit) {
496 496
 
497
-	$not = $crit->not;
498
-	$boucle = &$boucles[$idb];
499
-	// prendre en priorite un identifiant en parametre {branche XX}
500
-	if (isset($crit->param[0])) {
501
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
-		// sinon on le prend chez une boucle parente
503
-	} else {
504
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
-	}
506
-
507
-	//Trouver une jointure
508
-	$champ = "id_rubrique";
509
-	$desc = $boucle->show;
510
-	//Seulement si necessaire
511
-	if (!array_key_exists($champ, $desc['field'])) {
512
-		$cle = trouver_jointure_champ($champ, $boucle);
513
-		$trouver_table = charger_fonction("trouver_table", "base");
514
-		$desc = $trouver_table($boucle->from[$cle]);
515
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
-			$decompose = decompose_champ_id_objet($champ);
517
-			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
-		}
520
-	} else {
521
-		$cle = $boucle->id_table;
522
-	}
523
-
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
497
+    $not = $crit->not;
498
+    $boucle = &$boucles[$idb];
499
+    // prendre en priorite un identifiant en parametre {branche XX}
500
+    if (isset($crit->param[0])) {
501
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
502
+        // sinon on le prend chez une boucle parente
503
+    } else {
504
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
+    }
506
+
507
+    //Trouver une jointure
508
+    $champ = "id_rubrique";
509
+    $desc = $boucle->show;
510
+    //Seulement si necessaire
511
+    if (!array_key_exists($champ, $desc['field'])) {
512
+        $cle = trouver_jointure_champ($champ, $boucle);
513
+        $trouver_table = charger_fonction("trouver_table", "base");
514
+        $desc = $trouver_table($boucle->from[$cle]);
515
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
+            $decompose = decompose_champ_id_objet($champ);
517
+            $champ = array_shift($decompose);
518
+            $boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
+        }
520
+    } else {
521
+        $cle = $boucle->id_table;
522
+    }
523
+
524
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
+        . ($not ? ", 'NOT'" : '') . ")";
526
+    $boucle->where[] = !$crit->cond ? $c :
527
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
528 528
 }
529 529
 
530 530
 /**
@@ -540,15 +540,15 @@  discard block
 block discarded – undo
540 540
  **/
541 541
 function critere_logo_dist($idb, &$boucles, $crit) {
542 542
 
543
-	$boucle = &$boucles[$idb];
544
-	$not = ($crit->not ? 'NOT' : '');
545
-	$serveur = $boucle->sql_serveur;
543
+    $boucle = &$boucles[$idb];
544
+    $not = ($crit->not ? 'NOT' : '');
545
+    $serveur = $boucle->sql_serveur;
546 546
 
547
-	$c = "sql_in('" .
548
-		$boucle->id_table . '.' . $boucle->primary
549
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
547
+    $c = "sql_in('" .
548
+        $boucle->id_table . '.' . $boucle->primary
549
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
550 550
 
551
-	$boucle->where[] = $c;
551
+    $boucle->where[] = $c;
552 552
 }
553 553
 
554 554
 
@@ -570,31 +570,31 @@  discard block
 block discarded – undo
570 570
  * @return void
571 571
  **/
572 572
 function critere_fusion_dist($idb, &$boucles, $crit) {
573
-	if ($t = isset($crit->param[0])) {
574
-		$t = $crit->param[0];
575
-		if ($t[0]->type == 'texte') {
576
-			$t = $t[0]->texte;
577
-			if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
578
-				$t = table_objet_sql($r[1]);
579
-				$t = array_search($t, $boucles[$idb]->from);
580
-				if ($t) {
581
-					$t .= '.' . $r[2];
582
-				}
583
-			}
584
-		} else {
585
-			$t = '".'
586
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
587
-				. '."';
588
-		}
589
-	}
590
-	if ($t) {
591
-		$boucles[$idb]->group[] = $t;
592
-		if (!in_array($t, $boucles[$idb]->select)) {
593
-			$boucles[$idb]->select[] = $t;
594
-		}
595
-	} else {
596
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
597
-	}
573
+    if ($t = isset($crit->param[0])) {
574
+        $t = $crit->param[0];
575
+        if ($t[0]->type == 'texte') {
576
+            $t = $t[0]->texte;
577
+            if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
578
+                $t = table_objet_sql($r[1]);
579
+                $t = array_search($t, $boucles[$idb]->from);
580
+                if ($t) {
581
+                    $t .= '.' . $r[2];
582
+                }
583
+            }
584
+        } else {
585
+            $t = '".'
586
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
587
+                . '."';
588
+        }
589
+    }
590
+    if ($t) {
591
+        $boucles[$idb]->group[] = $t;
592
+        if (!in_array($t, $boucles[$idb]->select)) {
593
+            $boucles[$idb]->select[] = $t;
594
+        }
595
+    } else {
596
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
597
+    }
598 598
 }
599 599
 
600 600
 /**
@@ -614,7 +614,7 @@  discard block
 block discarded – undo
614 614
  * @return void
615 615
  **/
616 616
 function critere_fusion_supprimer_dist($idb, &$boucles, $crit){
617
-	$boucles[$idb]->group = array();
617
+    $boucles[$idb]->group = array();
618 618
 }
619 619
 
620 620
 /**
@@ -651,45 +651,45 @@  discard block
 block discarded – undo
651 651
  * @param Critere $crit Paramètres du critère dans cette boucle
652 652
  */
653 653
 function critere_collecte_dist($idb, &$boucles, $crit) {
654
-	if (isset($crit->param[0])) {
655
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
656
-		$boucle = $boucles[$idb];
657
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
658
-		$n = count($boucle->order);
659
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
660
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
661
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
662
-			if (
663
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664
-				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665
-			) {
666
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
667
-			} else {
668
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
669
-			}
670
-		}
671
-	} else {
672
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
673
-	}
654
+    if (isset($crit->param[0])) {
655
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
656
+        $boucle = $boucles[$idb];
657
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
658
+        $n = count($boucle->order);
659
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
660
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
661
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
662
+            if (
663
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
664
+                OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
665
+            ) {
666
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
667
+            } else {
668
+                $boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
669
+            }
670
+        }
671
+    } else {
672
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
673
+    }
674 674
 }
675 675
 
676 676
 // https://code.spip.net/@calculer_critere_arg_dynamique
677 677
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
678
-	$boucle = $boucles[$idb];
679
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
-	$var = '$champs_' . $idb;
681
-	$desc = (strpos($boucle->in, "static $var =") !== false);
682
-	if (!$desc) {
683
-		$desc = $boucle->show['field'];
684
-		$desc = implode(',', array_map('_q', array_keys($desc)));
685
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
686
-	}
687
-	if ($desc) {
688
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
689
-	}
690
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
691
-
692
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
678
+    $boucle = $boucles[$idb];
679
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
680
+    $var = '$champs_' . $idb;
681
+    $desc = (strpos($boucle->in, "static $var =") !== false);
682
+    if (!$desc) {
683
+        $desc = $boucle->show['field'];
684
+        $desc = implode(',', array_map('_q', array_keys($desc)));
685
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
686
+    }
687
+    if ($desc) {
688
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
689
+    }
690
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
691
+
692
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
693 693
 }
694 694
 
695 695
 /**
@@ -728,7 +728,7 @@  discard block
 block discarded – undo
728 728
  * @param Critere $crit Paramètres du critère dans cette boucle
729 729
  */
730 730
 function critere_par_dist($idb, &$boucles, $crit) {
731
-	return critere_parinverse($idb, $boucles, $crit);
731
+    return critere_parinverse($idb, $boucles, $crit);
732 732
 }
733 733
 
734 734
 /**
@@ -750,93 +750,93 @@  discard block
 block discarded – undo
750 750
  * @param Critere $crit Paramètres du critère dans cette boucle
751 751
  */
752 752
 function critere_parinverse($idb, &$boucles, $crit) {
753
-	$boucle = &$boucles[$idb];
754
-
755
-	$sens = $collecte = '';
756
-	if ($crit->not) {
757
-		$sens = " . ' DESC'";
758
-	}
759
-	if (isset($boucle->modificateur['collate'])) {
760
-		$collecte = ' . ' . $boucle->modificateur['collate'];
761
-	}
762
-
763
-	// Pour chaque paramètre du critère
764
-	foreach ($crit->param as $tri) {
765
-		$order = $fct = '';
766
-		// tris specifiés dynamiquement {par #ENV{tri}}
767
-		if ($tri[0]->type != 'texte') {
768
-			// calculer le order dynamique qui verifie les champs
769
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
770
-			// ajouter 'hasard' comme possibilité de tri dynamique
771
-			calculer_critere_par_hasard($idb, $boucles, $crit);
772
-		}
773
-		// tris textuels {par titre}
774
-		else {
775
-			$par = array_shift($tri);
776
-			$par = $par->texte;
777
-
778
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
779
-			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
780
-				$expression = trim($m[1]);
781
-				$champ = trim($m[2]);
782
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
783
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
784
-				} else {
785
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
786
-				}
787
-
788
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
789
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
790
-				// {par FONCTION(champ)}
791
-				if (count($match) > 2) {
792
-					$par = substr($match[2], 1, -1);
793
-					$fct = $match[1];
794
-				}
795
-				// quelques cas spécifiques {par hasard}, {par date}
796
-				if ($par == 'hasard') {
797
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
798
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
800
-				} else {
801
-					// cas général {par champ}, {par table.champ}, ...
802
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
803
-				}
804
-			}
805
-
806
-			// on ne sait pas traiter…
807
-			else {
808
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
809
-			}
810
-
811
-			// En cas d'erreur de squelette retournée par une fonction
812
-			if (is_array($order)) {
813
-				return $order;
814
-			}
815
-		}
816
-
817
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
818
-			$t = $m[1];
819
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
820
-				$boucle->select[] = $t;
821
-			}
822
-		} else {
823
-			$sens = '';
824
-		}
825
-
826
-		if ($fct) {
827
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
-				$order = "'$fct(" . $r[1] . ")'";
829
-			} else {
830
-				$order = "'$fct(' . $order . ')'";
831
-			}
832
-		}
833
-		$t = $order . $collecte . $sens;
834
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
-			$t = $r[1] . $r[2];
836
-		}
837
-
838
-		$boucle->order[] = $t;
839
-	}
753
+    $boucle = &$boucles[$idb];
754
+
755
+    $sens = $collecte = '';
756
+    if ($crit->not) {
757
+        $sens = " . ' DESC'";
758
+    }
759
+    if (isset($boucle->modificateur['collate'])) {
760
+        $collecte = ' . ' . $boucle->modificateur['collate'];
761
+    }
762
+
763
+    // Pour chaque paramètre du critère
764
+    foreach ($crit->param as $tri) {
765
+        $order = $fct = '';
766
+        // tris specifiés dynamiquement {par #ENV{tri}}
767
+        if ($tri[0]->type != 'texte') {
768
+            // calculer le order dynamique qui verifie les champs
769
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
770
+            // ajouter 'hasard' comme possibilité de tri dynamique
771
+            calculer_critere_par_hasard($idb, $boucles, $crit);
772
+        }
773
+        // tris textuels {par titre}
774
+        else {
775
+            $par = array_shift($tri);
776
+            $par = $par->texte;
777
+
778
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
779
+            if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
780
+                $expression = trim($m[1]);
781
+                $champ = trim($m[2]);
782
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
783
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
784
+                } else {
785
+                    return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
786
+                }
787
+
788
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
789
+            } elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
790
+                // {par FONCTION(champ)}
791
+                if (count($match) > 2) {
792
+                    $par = substr($match[2], 1, -1);
793
+                    $fct = $match[1];
794
+                }
795
+                // quelques cas spécifiques {par hasard}, {par date}
796
+                if ($par == 'hasard') {
797
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
798
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
799
+                    $order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
800
+                } else {
801
+                    // cas général {par champ}, {par table.champ}, ...
802
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
803
+                }
804
+            }
805
+
806
+            // on ne sait pas traiter…
807
+            else {
808
+                return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
809
+            }
810
+
811
+            // En cas d'erreur de squelette retournée par une fonction
812
+            if (is_array($order)) {
813
+                return $order;
814
+            }
815
+        }
816
+
817
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
818
+            $t = $m[1];
819
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
820
+                $boucle->select[] = $t;
821
+            }
822
+        } else {
823
+            $sens = '';
824
+        }
825
+
826
+        if ($fct) {
827
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
828
+                $order = "'$fct(" . $r[1] . ")'";
829
+            } else {
830
+                $order = "'$fct(' . $order . ')'";
831
+            }
832
+        }
833
+        $t = $order . $collecte . $sens;
834
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
835
+            $t = $r[1] . $r[2];
836
+        }
837
+
838
+        $boucle->order[] = $t;
839
+    }
840 840
 }
841 841
 
842 842
 /**
@@ -850,13 +850,13 @@  discard block
 block discarded – undo
850 850
  * @return string Clause pour le Order by
851 851
  */
852 852
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
853
-	$boucle = &$boucles[$idb];
854
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
855
-	$parha = "rand() AS hasard";
856
-	if (!in_array($parha, $boucle->select)) {
857
-		$boucle->select[] = $parha;
858
-	}
859
-	return "'hasard'";
853
+    $boucle = &$boucles[$idb];
854
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
855
+    $parha = "rand() AS hasard";
856
+    if (!in_array($parha, $boucle->select)) {
857
+        $boucle->select[] = $parha;
858
+    }
859
+    return "'hasard'";
860 860
 }
861 861
 
862 862
 /**
@@ -880,20 +880,20 @@  discard block
 block discarded – undo
880 880
  * @return string Clause pour le Order by
881 881
  */
882 882
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
883
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884
-	if (is_array($_champ)) {
885
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
886
-	}
887
-	$boucle = &$boucles[$idb];
888
-	$texte = '0+' . $_champ;
889
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890
-	if ($suite !== "''") {
891
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
892
-	}
893
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
894
-	$boucle->select[] = $texte . " AS $as";
895
-	$order = "'$as'";
896
-	return $order;
883
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
884
+    if (is_array($_champ)) {
885
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
886
+    }
887
+    $boucle = &$boucles[$idb];
888
+    $texte = '0+' . $_champ;
889
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
890
+    if ($suite !== "''") {
891
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
892
+    }
893
+    $as = 'num' . ($boucle->order ? count($boucle->order) : "");
894
+    $boucle->select[] = $texte . " AS $as";
895
+    $order = "'$as'";
896
+    return $order;
897 897
 }
898 898
 
899 899
 /**
@@ -914,20 +914,20 @@  discard block
 block discarded – undo
914 914
  * @return string Clause pour le Order by
915 915
  */
916 916
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
917
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
918
-	if (is_array($_champ)) {
919
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
920
-	}
921
-	$boucle = &$boucles[$idb];
922
-	$texte = '0+' . $_champ;
923
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
924
-	if ($suite !== "''") {
925
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
926
-	}
927
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
928
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
929
-	$order = "'$as'";
930
-	return $order;
917
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
918
+    if (is_array($_champ)) {
919
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
920
+    }
921
+    $boucle = &$boucles[$idb];
922
+    $texte = '0+' . $_champ;
923
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
924
+    if ($suite !== "''") {
925
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
926
+    }
927
+    $as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
928
+    $boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
929
+    $order = "'$as'";
930
+    return $order;
931 931
 }
932 932
 
933 933
 
@@ -947,14 +947,14 @@  discard block
 block discarded – undo
947 947
  * @return string Clause pour le Order by
948 948
  */
949 949
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
950
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
951
-	if (is_array($_champ)) {
952
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
953
-	}
954
-	$boucle = &$boucles[$idb];
955
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
956
-	$order = "'multi'";
957
-	return $order;
950
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
951
+    if (is_array($_champ)) {
952
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
953
+    }
954
+    $boucle = &$boucles[$idb];
955
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
956
+    $order = "'multi'";
957
+    return $order;
958 958
 }
959 959
 
960 960
 /**
@@ -973,56 +973,56 @@  discard block
 block discarded – undo
973 973
  * @return array|string
974 974
  */
975 975
 function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
976
-	$boucle = &$boucles[$idb];
977
-	$desc = $boucle->show;
978
-
979
-	// le champ existe dans la table, pas de souci (le plus commun)
980
-	if (isset($desc['field'][$par])) {
981
-		$par = $boucle->id_table . "." . $par;
982
-	}
983
-	// le champ est peut être une jointure
984
-	else {
985
-		$table = $table_alias = false; // toutes les tables de jointure possibles
986
-		$champ = $par;
987
-
988
-		// le champ demandé est une exception de jointure {par titre_mot}
989
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
990
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
991
-		} // la table de jointure est explicitement indiquée {par truc.muche}
992
-		elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
993
-			list(, $table, $champ) = $r;
994
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
995
-			$table = table_objet_sql($table);
996
-		}
997
-
998
-		// Si on connait la table d'arrivée, on la demande donc explicitement
999
-		// Sinon on cherche le champ dans les tables possibles de jointures
1000
-		// Si la table est déjà dans le from, on la réutilise.
1001
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1002
-			$par = $infos['alias'] . "." . $champ;
1003
-		} elseif (
1004
-			$boucle->jointures_explicites
1005
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1006
-		) {
1007
-			$par = $alias . "." . $champ;
1008
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1009
-			$par = $alias . "." . $champ;
1010
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1011
-		} elseif (
1012
-			$table_alias
1013
-			and isset($boucle->from[$table_alias])
1014
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1015
-		) {
1016
-			$par = $infos['alias'] . "." . $champ;
1017
-		} elseif ($table) {
1018
-			// On avait table + champ, mais on ne les a pas trouvés
1019
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1020
-		} else {
1021
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1022
-		}
1023
-	}
1024
-
1025
-	return $raw ? $par : "'$par'";
976
+    $boucle = &$boucles[$idb];
977
+    $desc = $boucle->show;
978
+
979
+    // le champ existe dans la table, pas de souci (le plus commun)
980
+    if (isset($desc['field'][$par])) {
981
+        $par = $boucle->id_table . "." . $par;
982
+    }
983
+    // le champ est peut être une jointure
984
+    else {
985
+        $table = $table_alias = false; // toutes les tables de jointure possibles
986
+        $champ = $par;
987
+
988
+        // le champ demandé est une exception de jointure {par titre_mot}
989
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
990
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
991
+        } // la table de jointure est explicitement indiquée {par truc.muche}
992
+        elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
993
+            list(, $table, $champ) = $r;
994
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
995
+            $table = table_objet_sql($table);
996
+        }
997
+
998
+        // Si on connait la table d'arrivée, on la demande donc explicitement
999
+        // Sinon on cherche le champ dans les tables possibles de jointures
1000
+        // Si la table est déjà dans le from, on la réutilise.
1001
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1002
+            $par = $infos['alias'] . "." . $champ;
1003
+        } elseif (
1004
+            $boucle->jointures_explicites
1005
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
1006
+        ) {
1007
+            $par = $alias . "." . $champ;
1008
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1009
+            $par = $alias . "." . $champ;
1010
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1011
+        } elseif (
1012
+            $table_alias
1013
+            and isset($boucle->from[$table_alias])
1014
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1015
+        ) {
1016
+            $par = $infos['alias'] . "." . $champ;
1017
+        } elseif ($table) {
1018
+            // On avait table + champ, mais on ne les a pas trouvés
1019
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1020
+        } else {
1021
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1022
+        }
1023
+    }
1024
+
1025
+    return $raw ? $par : "'$par'";
1026 1026
 }
1027 1027
 
1028 1028
 /**
@@ -1036,11 +1036,11 @@  discard block
 block discarded – undo
1036 1036
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1037 1037
  */
1038 1038
 function critere_par_joint($table, $champ, &$boucle) {
1039
-	$t = array_search($table, $boucle->from);
1040
-	if (!$t) {
1041
-		$t = trouver_jointure_champ($champ, $boucle);
1042
-	}
1043
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1039
+    $t = array_search($table, $boucle->from);
1040
+    if (!$t) {
1041
+        $t = trouver_jointure_champ($champ, $boucle);
1042
+    }
1043
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1044 1044
 }
1045 1045
 
1046 1046
 /**
@@ -1065,33 +1065,33 @@  discard block
 block discarded – undo
1065 1065
  */
1066 1066
 function critere_inverse_dist($idb, &$boucles, $crit) {
1067 1067
 
1068
-	$boucle = &$boucles[$idb];
1069
-	// Classement par ordre inverse
1070
-	if ($crit->not) {
1071
-		critere_parinverse($idb, $boucles, $crit);
1072
-	} else {
1073
-		$order = "' DESC'";
1074
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1075
-		if (isset($crit->param[0])) {
1076
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1077
-			$order = "(($critere)?' DESC':'')";
1078
-		}
1079
-
1080
-		$n = count($boucle->order);
1081
-		if (!$n) {
1082
-			if (isset($boucle->default_order[0])) {
1083
-				$boucle->default_order[0] .= ' . " DESC"';
1084
-			} else {
1085
-				$boucle->default_order[] = ' DESC';
1086
-			}
1087
-		} else {
1088
-			$t = $boucle->order[$n - 1] . " . $order";
1089
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1090
-				$t = $r[1] . $r[2];
1091
-			}
1092
-			$boucle->order[$n - 1] = $t;
1093
-		}
1094
-	}
1068
+    $boucle = &$boucles[$idb];
1069
+    // Classement par ordre inverse
1070
+    if ($crit->not) {
1071
+        critere_parinverse($idb, $boucles, $crit);
1072
+    } else {
1073
+        $order = "' DESC'";
1074
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1075
+        if (isset($crit->param[0])) {
1076
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1077
+            $order = "(($critere)?' DESC':'')";
1078
+        }
1079
+
1080
+        $n = count($boucle->order);
1081
+        if (!$n) {
1082
+            if (isset($boucle->default_order[0])) {
1083
+                $boucle->default_order[0] .= ' . " DESC"';
1084
+            } else {
1085
+                $boucle->default_order[] = ' DESC';
1086
+            }
1087
+        } else {
1088
+            $t = $boucle->order[$n - 1] . " . $order";
1089
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1090
+                $t = $r[1] . $r[2];
1091
+            }
1092
+            $boucle->order[$n - 1] = $t;
1093
+        }
1094
+    }
1095 1095
 }
1096 1096
 
1097 1097
 /**
@@ -1102,138 +1102,138 @@  discard block
 block discarded – undo
1102 1102
  * @return array|string
1103 1103
  */
1104 1104
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit){
1105
-	$boucle = &$boucles[$idb];
1105
+    $boucle = &$boucles[$idb];
1106 1106
 
1107
-	$sens = $collecte = '';
1108
-	if ($crit->not){
1109
-		$sens = " . ' DESC'";
1110
-	}
1107
+    $sens = $collecte = '';
1108
+    if ($crit->not){
1109
+        $sens = " . ' DESC'";
1110
+    }
1111 1111
 
1112
-	$crit2 = clone $crit;
1113
-	$crit2->not = false;
1114
-	$crit2->param = [reset($crit->param)];
1115
-	$res = critere_parinverse($idb, $boucles, $crit2);
1112
+    $crit2 = clone $crit;
1113
+    $crit2->not = false;
1114
+    $crit2->param = [reset($crit->param)];
1115
+    $res = critere_parinverse($idb, $boucles, $crit2);
1116 1116
 
1117
-	// erreur ?
1118
-	if (is_array($res)){
1119
-		return $res;
1120
-	}
1117
+    // erreur ?
1118
+    if (is_array($res)){
1119
+        return $res;
1120
+    }
1121 1121
 
1122
-	$_order = array_pop($boucle->order);
1122
+    $_order = array_pop($boucle->order);
1123 1123
 
1124
-	$_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1125
-	$boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1124
+    $_liste = calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent);
1125
+    $boucle->order[] = "'FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste($_liste,'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1126 1126
 }
1127 1127
 
1128 1128
 
1129 1129
 // https://code.spip.net/@critere_agenda_dist
1130 1130
 function critere_agenda_dist($idb, &$boucles, $crit) {
1131
-	$params = $crit->param;
1132
-
1133
-	if (count($params) < 1) {
1134
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1135
-	}
1136
-
1137
-	$boucle = &$boucles[$idb];
1138
-	$parent = $boucle->id_parent;
1139
-	$fields = $boucle->show['field'];
1140
-
1141
-	$date = array_shift($params);
1142
-	$type = array_shift($params);
1143
-
1144
-	// la valeur $type doit etre connue a la compilation
1145
-	// donc etre forcement reduite a un litteral unique dans le source
1146
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1147
-
1148
-	// La valeur date doit designer un champ de la table SQL.
1149
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1150
-	// sinon synthetiser le test de verif pour execution ulterieure
1151
-	// On prendra arbitrairement le premier champ si test negatif.
1152
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1153
-		$date = $date[0]->texte;
1154
-		if (!isset($fields[$date])) {
1155
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1156
-		}
1157
-	} else {
1158
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1159
-		$noms = array_keys($fields);
1160
-		$defaut = $noms[0];
1161
-		$noms = join(" ", $noms);
1162
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1163
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1164
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1165
-	}
1166
-	$annee = $params ? array_shift($params) : "";
1167
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1168
-		calculer_liste($annee, $idb, $boucles, $parent) .
1169
-		') ? $x : date("Y"))';
1170
-
1171
-	$mois = $params ? array_shift($params) : "";
1172
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1173
-		calculer_liste($mois, $idb, $boucles, $parent) .
1174
-		') ? $x : date("m"))';
1175
-
1176
-	$jour = $params ? array_shift($params) : "";
1177
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1178
-		calculer_liste($jour, $idb, $boucles, $parent) .
1179
-		') ? $x : date("d"))';
1180
-
1181
-	$annee2 = $params ? array_shift($params) : "";
1182
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1183
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1184
-		') ? $x : date("Y"))';
1185
-
1186
-	$mois2 = $params ? array_shift($params) : "";
1187
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1188
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1189
-		') ? $x : date("m"))';
1190
-
1191
-	$jour2 = $params ? array_shift($params) : "";
1192
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1193
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1194
-		') ? $x : date("d"))';
1195
-
1196
-	$date = $boucle->id_table . ".$date";
1197
-
1198
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1199
-	if ($type == 'jour') {
1200
-		$boucle->where[] = array(
1201
-			"'='",
1202
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1203
-			("sql_quote($annee . $mois . $jour$quote_end)")
1204
-		);
1205
-	} elseif ($type == 'mois') {
1206
-		$boucle->where[] = array(
1207
-			"'='",
1208
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1209
-			("sql_quote($annee . $mois$quote_end)")
1210
-		);
1211
-	} elseif ($type == 'semaine') {
1212
-		$boucle->where[] = array(
1213
-			"'AND'",
1214
-			array(
1215
-				"'>='",
1216
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1217
-				("date_debut_semaine($annee, $mois, $jour)")
1218
-			),
1219
-			array(
1220
-				"'<='",
1221
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1222
-				("date_fin_semaine($annee, $mois, $jour)")
1223
-			)
1224
-		);
1225
-	} elseif (count($crit->param) > 2) {
1226
-		$boucle->where[] = array(
1227
-			"'AND'",
1228
-			array(
1229
-				"'>='",
1230
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1231
-				("sql_quote($annee . $mois . $jour$quote_end)")
1232
-			),
1233
-			array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1234
-		);
1235
-	}
1236
-	// sinon on prend tout
1131
+    $params = $crit->param;
1132
+
1133
+    if (count($params) < 1) {
1134
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1135
+    }
1136
+
1137
+    $boucle = &$boucles[$idb];
1138
+    $parent = $boucle->id_parent;
1139
+    $fields = $boucle->show['field'];
1140
+
1141
+    $date = array_shift($params);
1142
+    $type = array_shift($params);
1143
+
1144
+    // la valeur $type doit etre connue a la compilation
1145
+    // donc etre forcement reduite a un litteral unique dans le source
1146
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1147
+
1148
+    // La valeur date doit designer un champ de la table SQL.
1149
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1150
+    // sinon synthetiser le test de verif pour execution ulterieure
1151
+    // On prendra arbitrairement le premier champ si test negatif.
1152
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1153
+        $date = $date[0]->texte;
1154
+        if (!isset($fields[$date])) {
1155
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1156
+        }
1157
+    } else {
1158
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1159
+        $noms = array_keys($fields);
1160
+        $defaut = $noms[0];
1161
+        $noms = join(" ", $noms);
1162
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1163
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1164
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1165
+    }
1166
+    $annee = $params ? array_shift($params) : "";
1167
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1168
+        calculer_liste($annee, $idb, $boucles, $parent) .
1169
+        ') ? $x : date("Y"))';
1170
+
1171
+    $mois = $params ? array_shift($params) : "";
1172
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1173
+        calculer_liste($mois, $idb, $boucles, $parent) .
1174
+        ') ? $x : date("m"))';
1175
+
1176
+    $jour = $params ? array_shift($params) : "";
1177
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1178
+        calculer_liste($jour, $idb, $boucles, $parent) .
1179
+        ') ? $x : date("d"))';
1180
+
1181
+    $annee2 = $params ? array_shift($params) : "";
1182
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1183
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1184
+        ') ? $x : date("Y"))';
1185
+
1186
+    $mois2 = $params ? array_shift($params) : "";
1187
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1188
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1189
+        ') ? $x : date("m"))';
1190
+
1191
+    $jour2 = $params ? array_shift($params) : "";
1192
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1193
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1194
+        ') ? $x : date("d"))';
1195
+
1196
+    $date = $boucle->id_table . ".$date";
1197
+
1198
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1199
+    if ($type == 'jour') {
1200
+        $boucle->where[] = array(
1201
+            "'='",
1202
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1203
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1204
+        );
1205
+    } elseif ($type == 'mois') {
1206
+        $boucle->where[] = array(
1207
+            "'='",
1208
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1209
+            ("sql_quote($annee . $mois$quote_end)")
1210
+        );
1211
+    } elseif ($type == 'semaine') {
1212
+        $boucle->where[] = array(
1213
+            "'AND'",
1214
+            array(
1215
+                "'>='",
1216
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1217
+                ("date_debut_semaine($annee, $mois, $jour)")
1218
+            ),
1219
+            array(
1220
+                "'<='",
1221
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1222
+                ("date_fin_semaine($annee, $mois, $jour)")
1223
+            )
1224
+        );
1225
+    } elseif (count($crit->param) > 2) {
1226
+        $boucle->where[] = array(
1227
+            "'AND'",
1228
+            array(
1229
+                "'>='",
1230
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1231
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1232
+            ),
1233
+            array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1234
+        );
1235
+    }
1236
+    // sinon on prend tout
1237 1237
 }
1238 1238
 
1239 1239
 
@@ -1258,33 +1258,33 @@  discard block
 block discarded – undo
1258 1258
  * @return void
1259 1259
  **/
1260 1260
 function calculer_critere_parties($idb, &$boucles, $crit) {
1261
-	$boucle = &$boucles[$idb];
1262
-	$a1 = $crit->param[0];
1263
-	$a2 = $crit->param[1];
1264
-	$op = $crit->op;
1265
-
1266
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1267
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1268
-
1269
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1270
-		$boucle->limit = $a11 . ',' . $a21;
1271
-	} else {
1272
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1273
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1274
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1275
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1276
-		$mode = (($op == '/') ? '/' :
1277
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1278
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1279
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1280
-			$boucle->limit =
1281
-				(is_numeric($a11) ? "'$a11'" : $a11)
1282
-				. ".','."
1283
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1284
-		} else {
1285
-			calculer_parties($boucles, $idb, $partie, $mode);
1286
-		}
1287
-	}
1261
+    $boucle = &$boucles[$idb];
1262
+    $a1 = $crit->param[0];
1263
+    $a2 = $crit->param[1];
1264
+    $op = $crit->op;
1265
+
1266
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1267
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1268
+
1269
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1270
+        $boucle->limit = $a11 . ',' . $a21;
1271
+    } else {
1272
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1273
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1274
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1275
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1276
+        $mode = (($op == '/') ? '/' :
1277
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1278
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1279
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1280
+            $boucle->limit =
1281
+                (is_numeric($a11) ? "'$a11'" : $a11)
1282
+                . ".','."
1283
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1284
+        } else {
1285
+            calculer_parties($boucles, $idb, $partie, $mode);
1286
+        }
1287
+    }
1288 1288
 }
1289 1289
 
1290 1290
 /**
@@ -1312,63 +1312,63 @@  discard block
 block discarded – undo
1312 1312
  * @return void
1313 1313
  **/
1314 1314
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1315
-	$total_parties = $boucles[$id_boucle]->total_parties;
1316
-
1317
-	preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1318
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1319
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1320
-	// {1/3}
1321
-	if ($op1 == '/') {
1322
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1323
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1324
-			"($total_parties ? $total_parties : 1)";
1325
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1326
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1327
-	} else {
1328
-		// cas {n-1,x}
1329
-		if ($op1 == '-') {
1330
-			$debut = "$nombre_boucle - $debut;";
1331
-		}
1332
-
1333
-		// cas {x,n-1}
1334
-		if ($op2 == '-') {
1335
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1336
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1337
-					($total_parties . ' - 1'));
1338
-		} else {
1339
-			// {x,1} ou {pagination}
1340
-			$fin = '$debut_boucle'
1341
-				. (is_numeric($total_parties) ?
1342
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1343
-					('+' . $total_parties . ' - 1'));
1344
-		}
1345
-
1346
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1347
-		if ($op1 == 'p') {
1348
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1349
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1350
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1351
-		}
1352
-	}
1353
-
1354
-	// Notes :
1355
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1356
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1357
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1358
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1359
-
1360
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1361
-		. '$debut_boucle = ' . $debut . ";\n	"
1362
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1363
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1364
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1365
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1366
-		. "\n\tif (\$debut_boucle>0"
1367
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1368
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1369
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1370
-
1371
-	$boucles[$id_boucle]->partie = "
1315
+    $total_parties = $boucles[$id_boucle]->total_parties;
1316
+
1317
+    preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1318
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1319
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1320
+    // {1/3}
1321
+    if ($op1 == '/') {
1322
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1323
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1324
+            "($total_parties ? $total_parties : 1)";
1325
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1326
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1327
+    } else {
1328
+        // cas {n-1,x}
1329
+        if ($op1 == '-') {
1330
+            $debut = "$nombre_boucle - $debut;";
1331
+        }
1332
+
1333
+        // cas {x,n-1}
1334
+        if ($op2 == '-') {
1335
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1336
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1337
+                    ($total_parties . ' - 1'));
1338
+        } else {
1339
+            // {x,1} ou {pagination}
1340
+            $fin = '$debut_boucle'
1341
+                . (is_numeric($total_parties) ?
1342
+                    (($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1343
+                    ('+' . $total_parties . ' - 1'));
1344
+        }
1345
+
1346
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1347
+        if ($op1 == 'p') {
1348
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1349
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1350
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1351
+        }
1352
+    }
1353
+
1354
+    // Notes :
1355
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1356
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1357
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1358
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1359
+
1360
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1361
+        . '$debut_boucle = ' . $debut . ";\n	"
1362
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1363
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1364
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1365
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1366
+        . "\n\tif (\$debut_boucle>0"
1367
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1368
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1369
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1370
+
1371
+    $boucles[$id_boucle]->partie = "
1372 1372
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1373 1373
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1374 1374
 }
@@ -1385,26 +1385,26 @@  discard block
 block discarded – undo
1385 1385
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1386 1386
  **/
1387 1387
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1388
-	if ($param[0]->type != 'texte') {
1389
-		$a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1390
-		if (isset($param[1]->texte)) {
1391
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1392
-
1393
-			return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1394
-		} else {
1395
-			return array("intval($a1)", 0);
1396
-		}
1397
-	} else {
1398
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1399
-		$a1 = $m[1];
1400
-		if (empty($m[3])) {
1401
-			return array($a1, 0);
1402
-		} elseif (!empty($m[4])) {
1403
-			return array($a1, $m[4]);
1404
-		} else {
1405
-			return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1406
-		}
1407
-	}
1388
+    if ($param[0]->type != 'texte') {
1389
+        $a1 = calculer_liste(array($param[0]), $idb, $boucles, $boucles[$idb]->id_parent);
1390
+        if (isset($param[1]->texte)) {
1391
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1392
+
1393
+            return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1394
+        } else {
1395
+            return array("intval($a1)", 0);
1396
+        }
1397
+    } else {
1398
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1399
+        $a1 = $m[1];
1400
+        if (empty($m[3])) {
1401
+            return array($a1, 0);
1402
+        } elseif (!empty($m[4])) {
1403
+            return array($a1, $m[4]);
1404
+        } else {
1405
+            return array($a1, calculer_liste(array($param[1]), $idb, $boucles, $boucles[$idb]->id_parent));
1406
+        }
1407
+    }
1408 1408
 }
1409 1409
 
1410 1410
 
@@ -1431,47 +1431,47 @@  discard block
 block discarded – undo
1431 1431
  *     array : Erreur sur un des critères
1432 1432
  **/
1433 1433
 function calculer_criteres($idb, &$boucles) {
1434
-	$msg = '';
1435
-	$boucle = $boucles[$idb];
1436
-	$table = strtoupper($boucle->type_requete);
1437
-	$serveur = strtolower($boucle->sql_serveur);
1438
-
1439
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1440
-	// s'il y avait une erreur de syntaxe, propager cette info
1441
-	if (!is_array($boucle->criteres)) {
1442
-		return array();
1443
-	}
1444
-
1445
-	foreach ($boucle->criteres as $crit) {
1446
-		$critere = $crit->op;
1447
-		// critere personnalise ?
1448
-		if (
1449
-			(!$serveur or
1450
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1451
-					and (!function_exists($f = $f . "_dist"))
1452
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1453
-					and (!function_exists($f = $f . "_dist"))
1454
-				)
1455
-			)
1456
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1457
-			and (!function_exists($f = $f . "_dist"))
1458
-			and (!function_exists($f = "critere_" . $critere))
1459
-			and (!function_exists($f = $f . "_dist"))
1460
-		) {
1461
-			// fonction critere standard
1462
-			$f = $defaut;
1463
-		}
1464
-		// compile le critere
1465
-		$res = $f($idb, $boucles, $crit);
1466
-
1467
-		// Gestion centralisee des erreurs pour pouvoir propager
1468
-		if (is_array($res)) {
1469
-			$msg = $res;
1470
-			erreur_squelette($msg, $boucle);
1471
-		}
1472
-	}
1473
-
1474
-	return $msg;
1434
+    $msg = '';
1435
+    $boucle = $boucles[$idb];
1436
+    $table = strtoupper($boucle->type_requete);
1437
+    $serveur = strtolower($boucle->sql_serveur);
1438
+
1439
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1440
+    // s'il y avait une erreur de syntaxe, propager cette info
1441
+    if (!is_array($boucle->criteres)) {
1442
+        return array();
1443
+    }
1444
+
1445
+    foreach ($boucle->criteres as $crit) {
1446
+        $critere = $crit->op;
1447
+        // critere personnalise ?
1448
+        if (
1449
+            (!$serveur or
1450
+                ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1451
+                    and (!function_exists($f = $f . "_dist"))
1452
+                    and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1453
+                    and (!function_exists($f = $f . "_dist"))
1454
+                )
1455
+            )
1456
+            and (!function_exists($f = "critere_" . $table . "_" . $critere))
1457
+            and (!function_exists($f = $f . "_dist"))
1458
+            and (!function_exists($f = "critere_" . $critere))
1459
+            and (!function_exists($f = $f . "_dist"))
1460
+        ) {
1461
+            // fonction critere standard
1462
+            $f = $defaut;
1463
+        }
1464
+        // compile le critere
1465
+        $res = $f($idb, $boucles, $crit);
1466
+
1467
+        // Gestion centralisee des erreurs pour pouvoir propager
1468
+        if (is_array($res)) {
1469
+            $msg = $res;
1470
+            erreur_squelette($msg, $boucle);
1471
+        }
1472
+    }
1473
+
1474
+    return $msg;
1475 1475
 }
1476 1476
 
1477 1477
 /**
@@ -1488,11 +1488,11 @@  discard block
 block discarded – undo
1488 1488
  * @return string         Code compilé rééchappé
1489 1489
  */
1490 1490
 function kwote($lisp, $serveur = '', $type = '') {
1491
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1492
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1493
-	} else {
1494
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1495
-	}
1491
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1492
+        return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1493
+    } else {
1494
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1495
+    }
1496 1496
 }
1497 1497
 
1498 1498
 
@@ -1511,85 +1511,85 @@  discard block
 block discarded – undo
1511 1511
  * @return void
1512 1512
  **/
1513 1513
 function critere_IN_dist($idb, &$boucles, $crit) {
1514
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1515
-	if (!$r) {
1516
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1517
-	}
1518
-	list($arg, $op, $val, $col, $where_complement) = $r;
1519
-
1520
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1521
-
1522
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1523
-	$where = $in;
1524
-	if ($crit->cond) {
1525
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1526
-		$where = array("'?'", $pred, $where, "''");
1527
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1528
-		{
1529
-			$where_complement = array("'?'", $pred, $where_complement, "''");
1530
-		}
1531
-	}
1532
-	if ($crit->exclus) {
1533
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1534
-			$where = array("'NOT'", $where);
1535
-		} else
1536
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1537
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1538
-		{
1539
-			$where = array(
1540
-				"'NOT'",
1541
-				array(
1542
-					"'IN'",
1543
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1544
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1545
-				)
1546
-			);
1547
-		}
1548
-	}
1549
-
1550
-	$boucles[$idb]->where[] = $where;
1551
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1552
-	{
1553
-		$boucles[$idb]->where[] = $where_complement;
1554
-	}
1514
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1515
+    if (!$r) {
1516
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1517
+    }
1518
+    list($arg, $op, $val, $col, $where_complement) = $r;
1519
+
1520
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1521
+
1522
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1523
+    $where = $in;
1524
+    if ($crit->cond) {
1525
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1526
+        $where = array("'?'", $pred, $where, "''");
1527
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1528
+        {
1529
+            $where_complement = array("'?'", $pred, $where_complement, "''");
1530
+        }
1531
+    }
1532
+    if ($crit->exclus) {
1533
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1534
+            $where = array("'NOT'", $where);
1535
+        } else
1536
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1537
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1538
+        {
1539
+            $where = array(
1540
+                "'NOT'",
1541
+                array(
1542
+                    "'IN'",
1543
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1544
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1545
+                )
1546
+            );
1547
+        }
1548
+    }
1549
+
1550
+    $boucles[$idb]->where[] = $where;
1551
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1552
+    {
1553
+        $boucles[$idb]->where[] = $where_complement;
1554
+    }
1555 1555
 }
1556 1556
 
1557 1557
 // https://code.spip.net/@critere_IN_cas
1558 1558
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1559
-	static $num = array();
1560
-	$descr = $boucles[$idb]->descr;
1561
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1562
-
1563
-	$var = '$in' . $cpt++;
1564
-	$x = "\n\t$var = array();";
1565
-	foreach ($val as $k => $v) {
1566
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1567
-			// optimiser le traitement des constantes
1568
-			if (is_numeric($r[2])) {
1569
-				$x .= "\n\t$var" . "[]= $r[2];";
1570
-			} else {
1571
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1572
-			}
1573
-		} else {
1574
-			// Pour permettre de passer des tableaux de valeurs
1575
-			// on repere l'utilisation brute de #ENV**{X},
1576
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1577
-			// et on deballe mais en rajoutant l'anti XSS
1578
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1579
-		}
1580
-	}
1581
-
1582
-	$boucles[$idb]->in .= $x;
1583
-
1584
-	// inserer le tri par defaut selon les ordres du IN ...
1585
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1586
-	// et que l'on limite donc strictement aux cas necessaires :
1587
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1588
-	if (!$crit2) {
1589
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1590
-	}
1591
-
1592
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1559
+    static $num = array();
1560
+    $descr = $boucles[$idb]->descr;
1561
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1562
+
1563
+    $var = '$in' . $cpt++;
1564
+    $x = "\n\t$var = array();";
1565
+    foreach ($val as $k => $v) {
1566
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1567
+            // optimiser le traitement des constantes
1568
+            if (is_numeric($r[2])) {
1569
+                $x .= "\n\t$var" . "[]= $r[2];";
1570
+            } else {
1571
+                $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1572
+            }
1573
+        } else {
1574
+            // Pour permettre de passer des tableaux de valeurs
1575
+            // on repere l'utilisation brute de #ENV**{X},
1576
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1577
+            // et on deballe mais en rajoutant l'anti XSS
1578
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1579
+        }
1580
+    }
1581
+
1582
+    $boucles[$idb]->in .= $x;
1583
+
1584
+    // inserer le tri par defaut selon les ordres du IN ...
1585
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1586
+    // et que l'on limite donc strictement aux cas necessaires :
1587
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1588
+    if (!$crit2) {
1589
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1590
+    }
1591
+
1592
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1593 1593
 }
1594 1594
 
1595 1595
 /**
@@ -1605,22 +1605,22 @@  discard block
 block discarded – undo
1605 1605
  * @return void
1606 1606
  */
1607 1607
 function critere_where_dist($idb, &$boucles, $crit) {
1608
-	$boucle = &$boucles[$idb];
1609
-	if (isset($crit->param[0])) {
1610
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1611
-	} else {
1612
-		$_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1613
-	}
1614
-
1615
-	if ($crit->cond) {
1616
-		$_where = "((\$zzw = $_where) ? \$zzw : '')";
1617
-	}
1618
-
1619
-	if ($crit->not) {
1620
-		$_where = "array('NOT',$_where)";
1621
-	}
1622
-
1623
-	$boucle->where[] = $_where;
1608
+    $boucle = &$boucles[$idb];
1609
+    if (isset($crit->param[0])) {
1610
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1611
+    } else {
1612
+        $_where = 'spip_sanitize_from_request(@$Pile[0]["where"],"where","vide")';
1613
+    }
1614
+
1615
+    if ($crit->cond) {
1616
+        $_where = "((\$zzw = $_where) ? \$zzw : '')";
1617
+    }
1618
+
1619
+    if ($crit->not) {
1620
+        $_where = "array('NOT',$_where)";
1621
+    }
1622
+
1623
+    $boucle->where[] = $_where;
1624 1624
 }
1625 1625
 
1626 1626
 /**
@@ -1648,31 +1648,31 @@  discard block
 block discarded – undo
1648 1648
  * @return void
1649 1649
  */
1650 1650
 function critere_id__dist($idb, &$boucles, $crit) {
1651
-	/** @var Boucle $boucle */
1652
-	$boucle = $boucles[$idb];
1653
-
1654
-	$champs = lister_champs_id_conditionnel(
1655
-		$boucle->show['table'],
1656
-		$boucle->show,
1657
-		$boucle->sql_serveur
1658
-	);
1659
-
1660
-	// ne pas tenir compte des critères identiques déjà présents.
1661
-	if (!empty($boucle->modificateur['criteres'])) {
1662
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1663
-	}
1664
-	// nous aider en mode debug.
1665
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1666
-	$boucle->modificateur['id_'] = $champs;
1667
-
1668
-	// créer un critère {id_xxx?} de chaque champ retenu
1669
-	foreach ($champs as $champ) {
1670
-		$critere_id_table = new Critere;
1671
-		$critere_id_table->op = $champ;
1672
-		$critere_id_table->cond = '?';
1673
-		$critere_id_table->ligne = $crit->ligne;
1674
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1675
-	}
1651
+    /** @var Boucle $boucle */
1652
+    $boucle = $boucles[$idb];
1653
+
1654
+    $champs = lister_champs_id_conditionnel(
1655
+        $boucle->show['table'],
1656
+        $boucle->show,
1657
+        $boucle->sql_serveur
1658
+    );
1659
+
1660
+    // ne pas tenir compte des critères identiques déjà présents.
1661
+    if (!empty($boucle->modificateur['criteres'])) {
1662
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1663
+    }
1664
+    // nous aider en mode debug.
1665
+    $boucle->debug[] = "id_ : " . implode(', ', $champs);
1666
+    $boucle->modificateur['id_'] = $champs;
1667
+
1668
+    // créer un critère {id_xxx?} de chaque champ retenu
1669
+    foreach ($champs as $champ) {
1670
+        $critere_id_table = new Critere;
1671
+        $critere_id_table->op = $champ;
1672
+        $critere_id_table->cond = '?';
1673
+        $critere_id_table->ligne = $crit->ligne;
1674
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1675
+    }
1676 1676
 }
1677 1677
 
1678 1678
 /**
@@ -1692,79 +1692,79 @@  discard block
 block discarded – undo
1692 1692
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1693 1693
  */
1694 1694
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1695
-	// calculer la description de la table
1696
-	if (!is_array($desc)) {
1697
-		$desc = description_table($table, $serveur);
1698
-	}
1699
-	if (!$desc) {
1700
-		return [];
1701
-	}
1702
-
1703
-	// Les champs id_xx de la table demandée
1704
-	$champs = array_filter(
1705
-		array_keys($desc['field']),
1706
-		function($champ){
1707
-			return
1708
-				strpos($champ, 'id_') === 0
1709
-				or (in_array($champ, array('objet')));
1710
-		}
1711
-	);
1712
-
1713
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1714
-	if (
1715
-		in_array('id_rubrique', $champs)
1716
-		and !in_array('id_secteur', $champs)
1717
-	) {
1718
-		$champs[] = 'id_secteur';
1719
-	}
1720
-
1721
-	// On ne fera pas mieux pour les tables d’un autre serveur
1722
-	if ($serveur) {
1723
-		return $champs;
1724
-	}
1725
-
1726
-	$primary = false;
1727
-	$associable = false;
1728
-	include_spip('action/editer_liens');
1729
-
1730
-	if (isset($desc['type'])) {
1731
-		$primary = id_table_objet($desc['type']);
1732
-		$associable = objet_associable($desc['type']);
1733
-	}
1734
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1735
-		$associable = true;
1736
-	}
1737
-
1738
-	// liste de toutes les tables principales, sauf la notre
1739
-	$tables = lister_tables_objets_sql();
1740
-	unset($tables[$table]);
1741
-
1742
-	foreach ($tables as $_table => $_desc) {
1743
-		if (
1744
-			$associable
1745
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1746
-			or objet_associable($_desc['type'])
1747
-		) {
1748
-			$champs[] = id_table_objet($_table);
1749
-		}
1750
-	}
1751
-	$champs = array_values(array_unique($champs));
1752
-
1753
-	// Exclusions de certains id
1754
-	$exclusions = pipeline(
1755
-		'exclure_id_conditionnel',
1756
-		array(
1757
-			'args' => array(
1758
-				'table' => $table,
1759
-				'id_table_objet' => $primary,
1760
-				'associable' => $associable,
1761
-			),
1762
-			'data' => array(),
1763
-		)
1764
-	);
1765
-	$champs = array_diff($champs, $exclusions);
1766
-
1767
-	return $champs;
1695
+    // calculer la description de la table
1696
+    if (!is_array($desc)) {
1697
+        $desc = description_table($table, $serveur);
1698
+    }
1699
+    if (!$desc) {
1700
+        return [];
1701
+    }
1702
+
1703
+    // Les champs id_xx de la table demandée
1704
+    $champs = array_filter(
1705
+        array_keys($desc['field']),
1706
+        function($champ){
1707
+            return
1708
+                strpos($champ, 'id_') === 0
1709
+                or (in_array($champ, array('objet')));
1710
+        }
1711
+    );
1712
+
1713
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1714
+    if (
1715
+        in_array('id_rubrique', $champs)
1716
+        and !in_array('id_secteur', $champs)
1717
+    ) {
1718
+        $champs[] = 'id_secteur';
1719
+    }
1720
+
1721
+    // On ne fera pas mieux pour les tables d’un autre serveur
1722
+    if ($serveur) {
1723
+        return $champs;
1724
+    }
1725
+
1726
+    $primary = false;
1727
+    $associable = false;
1728
+    include_spip('action/editer_liens');
1729
+
1730
+    if (isset($desc['type'])) {
1731
+        $primary = id_table_objet($desc['type']);
1732
+        $associable = objet_associable($desc['type']);
1733
+    }
1734
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1735
+        $associable = true;
1736
+    }
1737
+
1738
+    // liste de toutes les tables principales, sauf la notre
1739
+    $tables = lister_tables_objets_sql();
1740
+    unset($tables[$table]);
1741
+
1742
+    foreach ($tables as $_table => $_desc) {
1743
+        if (
1744
+            $associable
1745
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1746
+            or objet_associable($_desc['type'])
1747
+        ) {
1748
+            $champs[] = id_table_objet($_table);
1749
+        }
1750
+    }
1751
+    $champs = array_values(array_unique($champs));
1752
+
1753
+    // Exclusions de certains id
1754
+    $exclusions = pipeline(
1755
+        'exclure_id_conditionnel',
1756
+        array(
1757
+            'args' => array(
1758
+                'table' => $table,
1759
+                'id_table_objet' => $primary,
1760
+                'associable' => $associable,
1761
+            ),
1762
+            'data' => array(),
1763
+        )
1764
+    );
1765
+    $champs = array_diff($champs, $exclusions);
1766
+
1767
+    return $champs;
1768 1768
 }
1769 1769
 
1770 1770
 /**
@@ -1819,27 +1819,27 @@  discard block
 block discarded – undo
1819 1819
  * @return void
1820 1820
  */
1821 1821
 function critere_tri_dist($idb, &$boucles, $crit) {
1822
-	$boucle = &$boucles[$idb];
1823
-
1824
-	// definition du champ par defaut
1825
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1826
-		: calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1827
-	$_sens_defaut = !isset($crit->param[1][0]) ? "1"
1828
-		: calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1829
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1830
-		: calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1831
-
1832
-	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1833
-
1834
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1835
-	$_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1836
-
1837
-	$boucle->modificateur['tri_champ'] = $_tri;
1838
-	$boucle->modificateur['tri_sens'] = $_sens;
1839
-	$boucle->modificateur['tri_nom'] = $_variable;
1840
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1841
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1842
-	$boucle->hash .= "
1822
+    $boucle = &$boucles[$idb];
1823
+
1824
+    // definition du champ par defaut
1825
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1826
+        : calculer_liste(array($crit->param[0][0]), $idb, $boucles, $boucle->id_parent);
1827
+    $_sens_defaut = !isset($crit->param[1][0]) ? "1"
1828
+        : calculer_liste(array($crit->param[1][0]), $idb, $boucles, $boucle->id_parent);
1829
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1830
+        : calculer_liste(array($crit->param[2][0]), $idb, $boucles, $boucle->id_parent);
1831
+
1832
+    $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1833
+
1834
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1835
+    $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1836
+
1837
+    $boucle->modificateur['tri_champ'] = $_tri;
1838
+    $boucle->modificateur['tri_sens'] = $_sens;
1839
+    $boucle->modificateur['tri_nom'] = $_variable;
1840
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1841
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1842
+    $boucle->hash .= "
1843 1843
 	\$senstri = '';
1844 1844
 	\$tri = $_tri;
1845 1845
 	if (\$tri){
@@ -1847,8 +1847,8 @@  discard block
 block discarded – undo
1847 1847
 		\$senstri = (\$senstri<0)?' DESC':'';
1848 1848
 	};
1849 1849
 	";
1850
-	$boucle->select[] = "\".tri_champ_select(\$tri).\"";
1851
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1850
+    $boucle->select[] = "\".tri_champ_select(\$tri).\"";
1851
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1852 1852
 }
1853 1853
 
1854 1854
 # Criteres de comparaison
@@ -1865,20 +1865,20 @@  discard block
 block discarded – undo
1865 1865
  * @return void
1866 1866
  **/
1867 1867
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1868
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1869
-	if (($crit->op == ",") or ($crit->op == '/')) {
1870
-		return calculer_critere_parties($idb, $boucles, $crit);
1871
-	}
1872
-
1873
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1874
-	if (!$r) {
1875
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1876
-		#	if (!$crit->cond) {
1877
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1878
-		#	}
1879
-	} else {
1880
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1881
-	}
1868
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1869
+    if (($crit->op == ",") or ($crit->op == '/')) {
1870
+        return calculer_critere_parties($idb, $boucles, $crit);
1871
+    }
1872
+
1873
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1874
+    if (!$r) {
1875
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1876
+        #	if (!$crit->cond) {
1877
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1878
+        #	}
1879
+    } else {
1880
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1881
+    }
1882 1882
 }
1883 1883
 
1884 1884
 
@@ -1898,63 +1898,63 @@  discard block
 block discarded – undo
1898 1898
  * @return void
1899 1899
  **/
1900 1900
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1901
-	list($arg, $op, $val, $col, $where_complement) = $args;
1902
-
1903
-	$where = array("'$op'", "'$arg'", $val[0]);
1904
-
1905
-	// inserer la negation (cf !...)
1906
-
1907
-	if ($crit->not) {
1908
-		$where = array("'NOT'", $where);
1909
-	}
1910
-	if ($crit->exclus) {
1911
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1912
-			$where = array("'NOT'", $where);
1913
-		} else
1914
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1915
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1916
-		{
1917
-			$where = array(
1918
-				"'NOT'",
1919
-				array(
1920
-					"'IN'",
1921
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1922
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1923
-				)
1924
-			);
1925
-		}
1926
-	}
1927
-
1928
-	// inserer la condition (cf {lang?})
1929
-	// traiter a part la date, elle est mise d'office par SPIP,
1930
-	if ($crit->cond) {
1931
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1932
-		if ($col == "date" or $col == "date_redac") {
1933
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1934
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1935
-			}
1936
-		}
1937
-
1938
-		if ($op == '=' and !$crit->not) {
1939
-			$where = array(
1940
-				"'?'",
1941
-				"(is_array($pred))",
1942
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1943
-				$where
1944
-			);
1945
-		}
1946
-		$where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1947
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1948
-		{
1949
-			$where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1950
-		}
1951
-	}
1952
-
1953
-	$boucles[$idb]->where[] = $where;
1954
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1955
-	{
1956
-		$boucles[$idb]->where[] = $where_complement;
1957
-	}
1901
+    list($arg, $op, $val, $col, $where_complement) = $args;
1902
+
1903
+    $where = array("'$op'", "'$arg'", $val[0]);
1904
+
1905
+    // inserer la negation (cf !...)
1906
+
1907
+    if ($crit->not) {
1908
+        $where = array("'NOT'", $where);
1909
+    }
1910
+    if ($crit->exclus) {
1911
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1912
+            $where = array("'NOT'", $where);
1913
+        } else
1914
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1915
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1916
+        {
1917
+            $where = array(
1918
+                "'NOT'",
1919
+                array(
1920
+                    "'IN'",
1921
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1922
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1923
+                )
1924
+            );
1925
+        }
1926
+    }
1927
+
1928
+    // inserer la condition (cf {lang?})
1929
+    // traiter a part la date, elle est mise d'office par SPIP,
1930
+    if ($crit->cond) {
1931
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1932
+        if ($col == "date" or $col == "date_redac") {
1933
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1934
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1935
+            }
1936
+        }
1937
+
1938
+        if ($op == '=' and !$crit->not) {
1939
+            $where = array(
1940
+                "'?'",
1941
+                "(is_array($pred))",
1942
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1943
+                $where
1944
+            );
1945
+        }
1946
+        $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1947
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1948
+        {
1949
+            $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1950
+        }
1951
+    }
1952
+
1953
+    $boucles[$idb]->where[] = $where;
1954
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1955
+    {
1956
+        $boucles[$idb]->where[] = $where_complement;
1957
+    }
1958 1958
 }
1959 1959
 
1960 1960
 
@@ -1995,158 +1995,158 @@  discard block
 block discarded – undo
1995 1995
  **/
1996 1996
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1997 1997
 
1998
-	$boucle = &$boucles[$idb];
1999
-	$type = $boucle->type_requete;
2000
-	$table = $boucle->id_table;
2001
-	$desc = $boucle->show;
2002
-	$col_vraie = null;
2003
-
2004
-	list($fct, $col, $op, $val, $args_sql) =
2005
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2006
-
2007
-	$col_alias = $col;
2008
-	$where_complement = false;
2009
-
2010
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2011
-	if ($col == 'id_enfant') {
2012
-		$col = $boucle->primary;
2013
-	}
2014
-
2015
-	// Cas particulier : id_parent => verifier les exceptions de tables
2016
-	if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2017
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2018
-	) {
2019
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2020
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2021
-	else {
2022
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
2023
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2024
-		}
2025
-
2026
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2027
-		// sauf si exception declaree : sauter cette etape
2028
-		else {
2029
-			if (
2030
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2031
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
2032
-				and count(trouver_champs_decomposes($col, $desc)) > 1
2033
-			) {
2034
-				$e = decompose_champ_id_objet($col);
2035
-				$col = array_shift($e);
2036
-				$where_complement = primary_doublee($e, $table);
2037
-			} // Cas particulier : expressions de date
2038
-			else {
2039
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2040
-					list($col, $col_vraie) = $c;
2041
-					$table = '';
2042
-				} // table explicitée {mots.titre}
2043
-				else {
2044
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2045
-						list(, $table, $col) = $r;
2046
-						$col_alias = $col;
2047
-
2048
-						$trouver_table = charger_fonction('trouver_table', 'base');
2049
-						if ($desc = $trouver_table($table, $boucle->sql_serveur)
2050
-							and isset($desc['field'][$col])
2051
-							and $cle = array_search($desc['table'], $boucle->from)
2052
-						) {
2053
-							$table = $cle;
2054
-						} else {
2055
-							$table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2056
-						}
2057
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2058
-						if (!$table) {
2059
-							return '';
2060
-						}
2061
-					}
2062
-					// si le champ n'est pas trouvé dans la table,
2063
-					// on cherche si une jointure peut l'obtenir
2064
-					elseif (@!array_key_exists($col, $desc['field'])) {
2065
-						// Champ joker * des iterateurs DATA qui accepte tout
2066
-						if (@array_key_exists('*', $desc['field'])) {
2067
-							$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
2068
-						}
2069
-						else {
2070
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2071
-							if (!$r) {
2072
-								return '';
2073
-							}
2074
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2075
-						}
2076
-					}
2077
-				}
2078
-			}
2079
-		}
2080
-	}
2081
-
2082
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2083
-	// Dans tous les cas,
2084
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2085
-	// et passer dans sql_quote avec le type si connu
2086
-	// et int sinon si la valeur est numerique
2087
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2088
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2089
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2090
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2091
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2092
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2093
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2094
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2095
-		}
2096
-		// sinon expliciter les
2097
-		// sql_quote(truc) en sql_quote(truc,'',type)
2098
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2099
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2100
-		// sans toucher aux
2101
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2102
-		// sql_quote(truc,'','varchar')
2103
-		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2104
-			// si pas deja un type
2105
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2106
-		) {
2107
-			$r = $r[1]
2108
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2109
-				. ",'" . addslashes($type_cast_quote) . "'";
2110
-			$val[0] = "sql_quote($r)";
2111
-		}
2112
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2113
-		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2114
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2115
-		}
2116
-	}
2117
-
2118
-	if(strpos($val[0], '@@defaultcast@@') !== false
2119
-	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2120
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2121
-	}
2122
-
2123
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2124
-	// leurs requetes par defaut, notamment le champ statut
2125
-	// Ne pas confondre champs de la table principale et des jointures
2126
-	if ($table === $boucle->id_table) {
2127
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2128
-		if ($col_alias != $col_vraie) {
2129
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2130
-		}
2131
-	}
2132
-
2133
-	// inserer le nom de la table SQL devant le nom du champ
2134
-	if ($table) {
2135
-		if ($col[0] == "`") {
2136
-			$arg = "$table." . substr($col, 1, -1);
2137
-		} else {
2138
-			$arg = "$table.$col";
2139
-		}
2140
-	} else {
2141
-		$arg = $col;
2142
-	}
2143
-
2144
-	// inserer la fonction SQL
2145
-	if ($fct) {
2146
-		$arg = "$fct($arg$args_sql)";
2147
-	}
2148
-
2149
-	return array($arg, $op, $val, $col_alias, $where_complement);
1998
+    $boucle = &$boucles[$idb];
1999
+    $type = $boucle->type_requete;
2000
+    $table = $boucle->id_table;
2001
+    $desc = $boucle->show;
2002
+    $col_vraie = null;
2003
+
2004
+    list($fct, $col, $op, $val, $args_sql) =
2005
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2006
+
2007
+    $col_alias = $col;
2008
+    $where_complement = false;
2009
+
2010
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2011
+    if ($col == 'id_enfant') {
2012
+        $col = $boucle->primary;
2013
+    }
2014
+
2015
+    // Cas particulier : id_parent => verifier les exceptions de tables
2016
+    if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
2017
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
2018
+    ) {
2019
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2020
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2021
+    else {
2022
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
2023
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2024
+        }
2025
+
2026
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2027
+        // sauf si exception declaree : sauter cette etape
2028
+        else {
2029
+            if (
2030
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2031
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
2032
+                and count(trouver_champs_decomposes($col, $desc)) > 1
2033
+            ) {
2034
+                $e = decompose_champ_id_objet($col);
2035
+                $col = array_shift($e);
2036
+                $where_complement = primary_doublee($e, $table);
2037
+            } // Cas particulier : expressions de date
2038
+            else {
2039
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2040
+                    list($col, $col_vraie) = $c;
2041
+                    $table = '';
2042
+                } // table explicitée {mots.titre}
2043
+                else {
2044
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2045
+                        list(, $table, $col) = $r;
2046
+                        $col_alias = $col;
2047
+
2048
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2049
+                        if ($desc = $trouver_table($table, $boucle->sql_serveur)
2050
+                            and isset($desc['field'][$col])
2051
+                            and $cle = array_search($desc['table'], $boucle->from)
2052
+                        ) {
2053
+                            $table = $cle;
2054
+                        } else {
2055
+                            $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
2056
+                        }
2057
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2058
+                        if (!$table) {
2059
+                            return '';
2060
+                        }
2061
+                    }
2062
+                    // si le champ n'est pas trouvé dans la table,
2063
+                    // on cherche si une jointure peut l'obtenir
2064
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2065
+                        // Champ joker * des iterateurs DATA qui accepte tout
2066
+                        if (@array_key_exists('*', $desc['field'])) {
2067
+                            $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
2068
+                        }
2069
+                        else {
2070
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2071
+                            if (!$r) {
2072
+                                return '';
2073
+                            }
2074
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2075
+                        }
2076
+                    }
2077
+                }
2078
+            }
2079
+        }
2080
+    }
2081
+
2082
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2083
+    // Dans tous les cas,
2084
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2085
+    // et passer dans sql_quote avec le type si connu
2086
+    // et int sinon si la valeur est numerique
2087
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2088
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2089
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2090
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2091
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2092
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2093
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2094
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2095
+        }
2096
+        // sinon expliciter les
2097
+        // sql_quote(truc) en sql_quote(truc,'',type)
2098
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2099
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2100
+        // sans toucher aux
2101
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2102
+        // sql_quote(truc,'','varchar')
2103
+        elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2104
+            // si pas deja un type
2105
+            and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2106
+        ) {
2107
+            $r = $r[1]
2108
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2109
+                . ",'" . addslashes($type_cast_quote) . "'";
2110
+            $val[0] = "sql_quote($r)";
2111
+        }
2112
+        elseif(strpos($val[0], '@@defaultcast@@') !== false
2113
+          and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2114
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2115
+        }
2116
+    }
2117
+
2118
+    if(strpos($val[0], '@@defaultcast@@') !== false
2119
+      and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2120
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2121
+    }
2122
+
2123
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2124
+    // leurs requetes par defaut, notamment le champ statut
2125
+    // Ne pas confondre champs de la table principale et des jointures
2126
+    if ($table === $boucle->id_table) {
2127
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2128
+        if ($col_alias != $col_vraie) {
2129
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2130
+        }
2131
+    }
2132
+
2133
+    // inserer le nom de la table SQL devant le nom du champ
2134
+    if ($table) {
2135
+        if ($col[0] == "`") {
2136
+            $arg = "$table." . substr($col, 1, -1);
2137
+        } else {
2138
+            $arg = "$table.$col";
2139
+        }
2140
+    } else {
2141
+        $arg = $col;
2142
+    }
2143
+
2144
+    // inserer la fonction SQL
2145
+    if ($fct) {
2146
+        $arg = "$fct($arg$args_sql)";
2147
+    }
2148
+
2149
+    return array($arg, $op, $val, $col_alias, $where_complement);
2150 2150
 }
2151 2151
 
2152 2152
 
@@ -2175,77 +2175,77 @@  discard block
 block discarded – undo
2175 2175
  **/
2176 2176
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2177 2177
 
2178
-	$where = '';
2179
-
2180
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2181
-	// gestion par les plugins des jointures tordues
2182
-	// pas automatiques mais necessaires
2183
-	$table_sql = table_objet_sql($table);
2184
-	if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2185
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2186
-		and
2187
-		(
2188
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2189
-			or
2190
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2191
-		)
2192
-	) {
2193
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2194
-		$index = isset($t[$col])
2195
-			? $t[$col] : (isset($t['']) ? $t[''] : array());
2196
-
2197
-		if (count($index) == 3) {
2198
-			list($t, $col, $calculer_critere_externe) = $index;
2199
-		} elseif (count($index) == 2) {
2200
-			list($t, $col) = $t[$col];
2201
-		} elseif (count($index) == 1) {
2202
-			list($calculer_critere_externe) = $index;
2203
-			$t = $table;
2204
-		} else {
2205
-			$t = '';
2206
-		} // jointure non declaree. La trouver.
2207
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2208
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2209
-	} else {
2210
-		$t = '';
2211
-	} // jointure non declaree. La trouver.
2212
-
2213
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2214
-
2215
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2216
-	// permet de forcer une table de lien quand il y a ambiguite
2217
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2218
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2219
-	$table = "";
2220
-	if ($boucle->jointures_explicites) {
2221
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2222
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2223
-	}
2224
-
2225
-	// et sinon on cherche parmi toutes les jointures declarees
2226
-	if (!$table) {
2227
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2228
-	}
2229
-
2230
-	if (!$table) {
2231
-		return '';
2232
-	}
2233
-
2234
-	// il ne reste plus qu'a trouver le champ dans les from
2235
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2236
-
2237
-	if (count($cle) > 1 or reset($cle) !== $col) {
2238
-		$col_alias = $col; // id_article devient juste le nom d'origine
2239
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2240
-			$e = decompose_champ_id_objet($col);
2241
-			$col = array_shift($e);
2242
-			$where = primary_doublee($e, $table);
2243
-		} else {
2244
-			$col = reset($cle);
2245
-		}
2246
-	}
2247
-
2248
-	return array($col, $col_alias, $table, $where, $desc);
2178
+    $where = '';
2179
+
2180
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2181
+    // gestion par les plugins des jointures tordues
2182
+    // pas automatiques mais necessaires
2183
+    $table_sql = table_objet_sql($table);
2184
+    if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2185
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2186
+        and
2187
+        (
2188
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2189
+            or
2190
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2191
+        )
2192
+    ) {
2193
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2194
+        $index = isset($t[$col])
2195
+            ? $t[$col] : (isset($t['']) ? $t[''] : array());
2196
+
2197
+        if (count($index) == 3) {
2198
+            list($t, $col, $calculer_critere_externe) = $index;
2199
+        } elseif (count($index) == 2) {
2200
+            list($t, $col) = $t[$col];
2201
+        } elseif (count($index) == 1) {
2202
+            list($calculer_critere_externe) = $index;
2203
+            $t = $table;
2204
+        } else {
2205
+            $t = '';
2206
+        } // jointure non declaree. La trouver.
2207
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2208
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2209
+    } else {
2210
+        $t = '';
2211
+    } // jointure non declaree. La trouver.
2212
+
2213
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2214
+
2215
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2216
+    // permet de forcer une table de lien quand il y a ambiguite
2217
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2218
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2219
+    $table = "";
2220
+    if ($boucle->jointures_explicites) {
2221
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2222
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2223
+    }
2224
+
2225
+    // et sinon on cherche parmi toutes les jointures declarees
2226
+    if (!$table) {
2227
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2228
+    }
2229
+
2230
+    if (!$table) {
2231
+        return '';
2232
+    }
2233
+
2234
+    // il ne reste plus qu'a trouver le champ dans les from
2235
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2236
+
2237
+    if (count($cle) > 1 or reset($cle) !== $col) {
2238
+        $col_alias = $col; // id_article devient juste le nom d'origine
2239
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2240
+            $e = decompose_champ_id_objet($col);
2241
+            $col = array_shift($e);
2242
+            $where = primary_doublee($e, $table);
2243
+        } else {
2244
+            $col = reset($cle);
2245
+        }
2246
+    }
2247
+
2248
+    return array($col, $col_alias, $table, $where, $desc);
2249 2249
 }
2250 2250
 
2251 2251
 
@@ -2266,10 +2266,10 @@  discard block
 block discarded – undo
2266 2266
  *     - valeur
2267 2267
  **/
2268 2268
 function primary_doublee($decompose, $table) {
2269
-	$e1 = reset($decompose);
2270
-	$e2 = "sql_quote('" . end($decompose) . "')";
2269
+    $e1 = reset($decompose);
2270
+    $e2 = "sql_quote('" . end($decompose) . "')";
2271 2271
 
2272
-	return array("'='", "'$table." . $e1 . "'", $e2);
2272
+    return array("'='", "'$table." . $e1 . "'", $e2);
2273 2273
 }
2274 2274
 
2275 2275
 /**
@@ -2300,56 +2300,56 @@  discard block
 block discarded – undo
2300 2300
  *     Vide sinon.
2301 2301
  */
2302 2302
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2303
-	// si on demande un truc du genre spip_mots
2304
-	// avec aussi spip_mots_liens dans les jointures dispo
2305
-	// et qu'on est la
2306
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2307
-	if ($checkarrivee
2308
-		and is_string($checkarrivee)
2309
-		and $a = table_objet($checkarrivee)
2310
-		and in_array($a . '_liens', $joints)
2311
-	) {
2312
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2313
-			return $res;
2314
-		}
2315
-	}
2316
-	foreach ($joints as $joint) {
2317
-		if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2318
-			// alias de table dans le from
2319
-			$t = array_search($arrivee[0], $boucle->from);
2320
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2321
-			$cols = $arrivee[2];
2322
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2323
-			if (count($cols) > 2) {
2324
-				array_pop($cols);
2325
-			}
2326
-			if ($t) {
2327
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2328
-				$joindre = false;
2329
-				foreach ($cols as $col) {
2330
-					$c = '/\b' . $t . ".$col" . '\b/';
2331
-					if (trouver_champ($c, $boucle->where)) {
2332
-						$joindre = true;
2333
-					} else {
2334
-						// mais ca peut etre dans le FIELD pour le Having
2335
-						$c = "/FIELD.$t" . ".$col,/";
2336
-						if (trouver_champ($c, $boucle->select)) {
2337
-							$joindre = true;
2338
-						}
2339
-					}
2340
-				}
2341
-				if (!$joindre) {
2342
-					return $t;
2343
-				}
2344
-			}
2345
-			array_pop($arrivee);
2346
-			if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2347
-				return $res;
2348
-			}
2349
-		}
2350
-	}
2351
-
2352
-	return '';
2303
+    // si on demande un truc du genre spip_mots
2304
+    // avec aussi spip_mots_liens dans les jointures dispo
2305
+    // et qu'on est la
2306
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2307
+    if ($checkarrivee
2308
+        and is_string($checkarrivee)
2309
+        and $a = table_objet($checkarrivee)
2310
+        and in_array($a . '_liens', $joints)
2311
+    ) {
2312
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2313
+            return $res;
2314
+        }
2315
+    }
2316
+    foreach ($joints as $joint) {
2317
+        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2318
+            // alias de table dans le from
2319
+            $t = array_search($arrivee[0], $boucle->from);
2320
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2321
+            $cols = $arrivee[2];
2322
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2323
+            if (count($cols) > 2) {
2324
+                array_pop($cols);
2325
+            }
2326
+            if ($t) {
2327
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2328
+                $joindre = false;
2329
+                foreach ($cols as $col) {
2330
+                    $c = '/\b' . $t . ".$col" . '\b/';
2331
+                    if (trouver_champ($c, $boucle->where)) {
2332
+                        $joindre = true;
2333
+                    } else {
2334
+                        // mais ca peut etre dans le FIELD pour le Having
2335
+                        $c = "/FIELD.$t" . ".$col,/";
2336
+                        if (trouver_champ($c, $boucle->select)) {
2337
+                            $joindre = true;
2338
+                        }
2339
+                    }
2340
+                }
2341
+                if (!$joindre) {
2342
+                    return $t;
2343
+                }
2344
+            }
2345
+            array_pop($arrivee);
2346
+            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2347
+                return $res;
2348
+            }
2349
+        }
2350
+    }
2351
+
2352
+    return '';
2353 2353
 
2354 2354
 }
2355 2355
 
@@ -2376,29 +2376,29 @@  discard block
 block discarded – undo
2376 2376
  *     Alias de la table de jointure (Lx)
2377 2377
  */
2378 2378
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2379
-	$primary_arrivee = id_table_objet($checkarrivee);
2380
-
2381
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2382
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2383
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2384
-
2385
-	if (!$intermediaire or !$arrivee) {
2386
-		return '';
2387
-	}
2388
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2389
-	array_pop($arrivee); // enlever la cle en 3eme argument
2390
-
2391
-	$res = fabrique_jointures($boucle,
2392
-		array(
2393
-			array(
2394
-				$boucle->id_table,
2395
-				$intermediaire,
2396
-				array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2397
-			),
2398
-			array(reset($intermediaire), $arrivee, $primary_arrivee)
2399
-		), $cond, $desc, $boucle->id_table, array($col));
2400
-
2401
-	return $res;
2379
+    $primary_arrivee = id_table_objet($checkarrivee);
2380
+
2381
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2382
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2383
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2384
+
2385
+    if (!$intermediaire or !$arrivee) {
2386
+        return '';
2387
+    }
2388
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2389
+    array_pop($arrivee); // enlever la cle en 3eme argument
2390
+
2391
+    $res = fabrique_jointures($boucle,
2392
+        array(
2393
+            array(
2394
+                $boucle->id_table,
2395
+                $intermediaire,
2396
+                array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2397
+            ),
2398
+            array(reset($intermediaire), $arrivee, $primary_arrivee)
2399
+        ), $cond, $desc, $boucle->id_table, array($col));
2400
+
2401
+    return $res;
2402 2402
 }
2403 2403
 
2404 2404
 
@@ -2415,17 +2415,17 @@  discard block
 block discarded – undo
2415 2415
  *     false sinon.
2416 2416
  **/
2417 2417
 function trouver_champ($champ, $where) {
2418
-	if (!is_array($where)) {
2419
-		return preg_match($champ, $where);
2420
-	} else {
2421
-		foreach ($where as $clause) {
2422
-			if (trouver_champ($champ, $clause)) {
2423
-				return true;
2424
-			}
2425
-		}
2426
-
2427
-		return false;
2428
-	}
2418
+    if (!is_array($where)) {
2419
+        return preg_match($champ, $where);
2420
+    } else {
2421
+        foreach ($where as $clause) {
2422
+            if (trouver_champ($champ, $clause)) {
2423
+                return true;
2424
+            }
2425
+        }
2426
+
2427
+        return false;
2428
+    }
2429 2429
 }
2430 2430
 
2431 2431
 
@@ -2451,128 +2451,128 @@  discard block
 block discarded – undo
2451 2451
  *     - string $args_sql  Suite des arguments du critère. ?
2452 2452
  **/
2453 2453
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2454
-	// cas d'une valeur comparee a elle-meme ou son referent
2455
-	if (count($crit->param) == 0) {
2456
-		$op = '=';
2457
-		$col = $val = $crit->op;
2458
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2459
-			$val = $r[2];
2460
-		}
2461
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2462
-		if ($val == 'lang') {
2463
-			$val = array(kwote('$GLOBALS[\'spip_lang\']'));
2464
-		} else {
2465
-			$defaut = null;
2466
-			if ($val == 'id_parent') {
2467
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2468
-				// de la boucle superieure.... faudrait verifier qu'il existe
2469
-				// pour eviter l'erreur SQL
2470
-				$val = $boucles[$idb]->primary;
2471
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2472
-				$defaut = "@\$Pile[0]['id_parent']";
2473
-			} elseif ($val == 'id_enfant') {
2474
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2475
-				// de la boucle superieure
2476
-				$val = 'id_parent';
2477
-			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2478
-				// un critere conditionnel sur date est traite a part
2479
-				// car la date est mise d'office par SPIP,
2480
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2481
-			}
2482
-
2483
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2484
-			$val = array(kwote($val));
2485
-		}
2486
-	} else {
2487
-		// comparaison explicite
2488
-		// le phraseur impose que le premier param soit du texte
2489
-		$params = $crit->param;
2490
-		$op = $crit->op;
2491
-		if ($op == '==') {
2492
-			$op = 'REGEXP';
2493
-		}
2494
-		$col = array_shift($params);
2495
-		$col = $col[0]->texte;
2496
-
2497
-		$val = array();
2498
-		$parent = $boucles[$idb]->id_parent;
2499
-
2500
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2501
-		// celui ne sachant pas ce qu'est un critere infixe
2502
-		// et a fortiori son 2e operande qu'entoure " ou '
2503
-		if (count($params) == 1
2504
-			and count($params[0]) == 3
2505
-			and $params[0][0]->type == 'texte'
2506
-			and $params[0][2]->type == 'texte'
2507
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2508
-			and (($p == "'") or ($p == '"'))
2509
-			and $params[0][1]->type == 'champ'
2510
-		) {
2511
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2512
-		} else {
2513
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2514
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2515
-				if (strcasecmp($op, 'IN') == 0) {
2516
-					$val[] = $a;
2517
-				} else {
2518
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2519
-				} // toujours quoter en char ici
2520
-			}
2521
-		}
2522
-	}
2523
-
2524
-	$fct = $args_sql = '';
2525
-	// fonction SQL ?
2526
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2527
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2528
-		$fct = $m[1];
2529
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2530
-		$col = $a[1];
2531
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2532
-			$col = $m[1];
2533
-			$args_sql = $m[2];
2534
-		}
2535
-		$args_sql .= $a[2];
2536
-	}
2537
-
2538
-	return array($fct, $col, $op, $val, $args_sql);
2454
+    // cas d'une valeur comparee a elle-meme ou son referent
2455
+    if (count($crit->param) == 0) {
2456
+        $op = '=';
2457
+        $col = $val = $crit->op;
2458
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2459
+            $val = $r[2];
2460
+        }
2461
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2462
+        if ($val == 'lang') {
2463
+            $val = array(kwote('$GLOBALS[\'spip_lang\']'));
2464
+        } else {
2465
+            $defaut = null;
2466
+            if ($val == 'id_parent') {
2467
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2468
+                // de la boucle superieure.... faudrait verifier qu'il existe
2469
+                // pour eviter l'erreur SQL
2470
+                $val = $boucles[$idb]->primary;
2471
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2472
+                $defaut = "@\$Pile[0]['id_parent']";
2473
+            } elseif ($val == 'id_enfant') {
2474
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2475
+                // de la boucle superieure
2476
+                $val = 'id_parent';
2477
+            } elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2478
+                // un critere conditionnel sur date est traite a part
2479
+                // car la date est mise d'office par SPIP,
2480
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2481
+            }
2482
+
2483
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2484
+            $val = array(kwote($val));
2485
+        }
2486
+    } else {
2487
+        // comparaison explicite
2488
+        // le phraseur impose que le premier param soit du texte
2489
+        $params = $crit->param;
2490
+        $op = $crit->op;
2491
+        if ($op == '==') {
2492
+            $op = 'REGEXP';
2493
+        }
2494
+        $col = array_shift($params);
2495
+        $col = $col[0]->texte;
2496
+
2497
+        $val = array();
2498
+        $parent = $boucles[$idb]->id_parent;
2499
+
2500
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2501
+        // celui ne sachant pas ce qu'est un critere infixe
2502
+        // et a fortiori son 2e operande qu'entoure " ou '
2503
+        if (count($params) == 1
2504
+            and count($params[0]) == 3
2505
+            and $params[0][0]->type == 'texte'
2506
+            and $params[0][2]->type == 'texte'
2507
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2508
+            and (($p == "'") or ($p == '"'))
2509
+            and $params[0][1]->type == 'champ'
2510
+        ) {
2511
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2512
+        } else {
2513
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2514
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2515
+                if (strcasecmp($op, 'IN') == 0) {
2516
+                    $val[] = $a;
2517
+                } else {
2518
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2519
+                } // toujours quoter en char ici
2520
+            }
2521
+        }
2522
+    }
2523
+
2524
+    $fct = $args_sql = '';
2525
+    // fonction SQL ?
2526
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2527
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2528
+        $fct = $m[1];
2529
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2530
+        $col = $a[1];
2531
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2532
+            $col = $m[1];
2533
+            $args_sql = $m[2];
2534
+        }
2535
+        $args_sql .= $a[2];
2536
+    }
2537
+
2538
+    return array($fct, $col, $op, $val, $args_sql);
2539 2539
 }
2540 2540
 
2541 2541
 // compatibilite ancienne version
2542 2542
 
2543 2543
 // https://code.spip.net/@calculer_vieux_in
2544 2544
 function calculer_vieux_in($params) {
2545
-	$deb = $params[0][0];
2546
-	$k = count($params) - 1;
2547
-	$last = $params[$k];
2548
-	$j = count($last) - 1;
2549
-	$last = $last[$j];
2550
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2551
-
2552
-	if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2553
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2554
-	) {
2555
-		return $params;
2556
-	}
2557
-	$params[0][0]->texte = substr($deb->texte, 1);
2558
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2559
-	$last = $params[$k][$j];
2560
-	$n = strlen($last->texte);
2561
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2562
-	$newp = array();
2563
-	foreach ($params as $v) {
2564
-		if ($v[0]->type != 'texte') {
2565
-			$newp[] = $v;
2566
-		} else {
2567
-			foreach (explode(',', $v[0]->texte) as $x) {
2568
-				$t = new Texte;
2569
-				$t->texte = $x;
2570
-				$newp[] = array($t);
2571
-			}
2572
-		}
2573
-	}
2574
-
2575
-	return $newp;
2545
+    $deb = $params[0][0];
2546
+    $k = count($params) - 1;
2547
+    $last = $params[$k];
2548
+    $j = count($last) - 1;
2549
+    $last = $last[$j];
2550
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2551
+
2552
+    if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2553
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2554
+    ) {
2555
+        return $params;
2556
+    }
2557
+    $params[0][0]->texte = substr($deb->texte, 1);
2558
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2559
+    $last = $params[$k][$j];
2560
+    $n = strlen($last->texte);
2561
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2562
+    $newp = array();
2563
+    foreach ($params as $v) {
2564
+        if ($v[0]->type != 'texte') {
2565
+            $newp[] = $v;
2566
+        } else {
2567
+            foreach (explode(',', $v[0]->texte) as $x) {
2568
+                $t = new Texte;
2569
+                $t->texte = $x;
2570
+                $newp[] = array($t);
2571
+            }
2572
+        }
2573
+    }
2574
+
2575
+    return $newp;
2576 2576
 }
2577 2577
 
2578 2578
 /**
@@ -2591,89 +2591,89 @@  discard block
 block discarded – undo
2591 2591
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2592 2592
  **/
2593 2593
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2594
-	if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
2595
-		return '';
2596
-	}
2597
-
2598
-	$boucle = $boucles[$idb];
2599
-	$table = $boucle->show;
2600
-
2601
-	// si c'est une colonne de la table, ne rien faire
2602
-	if (isset($table['field'][$col])) {
2603
-		return '';
2604
-	}
2605
-
2606
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2607
-		return '';
2608
-	}
2609
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2610
-
2611
-	$col = $regs[1];
2612
-	if (isset($regs[3]) and $suite = $regs[3]) {
2613
-		# Recherche de l'existence du champ date_xxxx,
2614
-		# si oui choisir ce champ, sinon choisir xxxx
2615
-
2616
-		if (isset($table['field']["date$suite"])) {
2617
-			$date_orig = 'date' . $suite;
2618
-		} else {
2619
-			$date_orig = substr($suite, 1);
2620
-		}
2621
-		$pred = $date_orig;
2622
-	} else {
2623
-		if (isset($regs[2]) and $rel = $regs[2]) {
2624
-			$pred = 'date';
2625
-		}
2626
-	}
2627
-
2628
-	$date_compare = "\"' . normaliser_date(" .
2629
-		calculer_argument_precedent($idb, $pred, $boucles) .
2630
-		") . '\"";
2631
-
2632
-	$col_vraie = $date_orig;
2633
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2634
-
2635
-	switch ($col) {
2636
-		case 'date':
2637
-			$col = $date_orig;
2638
-			break;
2639
-		case 'jour':
2640
-			$col = "DAYOFMONTH($date_orig)";
2641
-			break;
2642
-		case 'mois':
2643
-			$col = "MONTH($date_orig)";
2644
-			break;
2645
-		case 'annee':
2646
-			$col = "YEAR($date_orig)";
2647
-			break;
2648
-		case 'heure':
2649
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2650
-			break;
2651
-		case 'age':
2652
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2653
-			$col_vraie = "";// comparer a un int (par defaut)
2654
-			break;
2655
-		case 'age_relatif':
2656
-			$col = calculer_param_date($date_compare, $date_orig);
2657
-			$col_vraie = "";// comparer a un int (par defaut)
2658
-			break;
2659
-		case 'jour_relatif':
2660
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2661
-			$col_vraie = "";// comparer a un int (par defaut)
2662
-			break;
2663
-		case 'mois_relatif':
2664
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2665
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2666
-				")-YEAR(" . $date_orig . "))";
2667
-			$col_vraie = "";// comparer a un int (par defaut)
2668
-			break;
2669
-		case 'annee_relatif':
2670
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2671
-				$date_orig . ")";
2672
-			$col_vraie = "";// comparer a un int (par defaut)
2673
-			break;
2674
-	}
2675
-
2676
-	return array($col, $col_vraie);
2594
+    if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,", $col, $regs)) {
2595
+        return '';
2596
+    }
2597
+
2598
+    $boucle = $boucles[$idb];
2599
+    $table = $boucle->show;
2600
+
2601
+    // si c'est une colonne de la table, ne rien faire
2602
+    if (isset($table['field'][$col])) {
2603
+        return '';
2604
+    }
2605
+
2606
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2607
+        return '';
2608
+    }
2609
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2610
+
2611
+    $col = $regs[1];
2612
+    if (isset($regs[3]) and $suite = $regs[3]) {
2613
+        # Recherche de l'existence du champ date_xxxx,
2614
+        # si oui choisir ce champ, sinon choisir xxxx
2615
+
2616
+        if (isset($table['field']["date$suite"])) {
2617
+            $date_orig = 'date' . $suite;
2618
+        } else {
2619
+            $date_orig = substr($suite, 1);
2620
+        }
2621
+        $pred = $date_orig;
2622
+    } else {
2623
+        if (isset($regs[2]) and $rel = $regs[2]) {
2624
+            $pred = 'date';
2625
+        }
2626
+    }
2627
+
2628
+    $date_compare = "\"' . normaliser_date(" .
2629
+        calculer_argument_precedent($idb, $pred, $boucles) .
2630
+        ") . '\"";
2631
+
2632
+    $col_vraie = $date_orig;
2633
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2634
+
2635
+    switch ($col) {
2636
+        case 'date':
2637
+            $col = $date_orig;
2638
+            break;
2639
+        case 'jour':
2640
+            $col = "DAYOFMONTH($date_orig)";
2641
+            break;
2642
+        case 'mois':
2643
+            $col = "MONTH($date_orig)";
2644
+            break;
2645
+        case 'annee':
2646
+            $col = "YEAR($date_orig)";
2647
+            break;
2648
+        case 'heure':
2649
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2650
+            break;
2651
+        case 'age':
2652
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2653
+            $col_vraie = "";// comparer a un int (par defaut)
2654
+            break;
2655
+        case 'age_relatif':
2656
+            $col = calculer_param_date($date_compare, $date_orig);
2657
+            $col_vraie = "";// comparer a un int (par defaut)
2658
+            break;
2659
+        case 'jour_relatif':
2660
+            $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2661
+            $col_vraie = "";// comparer a un int (par defaut)
2662
+            break;
2663
+        case 'mois_relatif':
2664
+            $col = "MONTH(" . $date_compare . ")-MONTH(" .
2665
+                $date_orig . ")+12*(YEAR(" . $date_compare .
2666
+                ")-YEAR(" . $date_orig . "))";
2667
+            $col_vraie = "";// comparer a un int (par defaut)
2668
+            break;
2669
+        case 'annee_relatif':
2670
+            $col = "YEAR(" . $date_compare . ")-YEAR(" .
2671
+                $date_orig . ")";
2672
+            $col_vraie = "";// comparer a un int (par defaut)
2673
+            break;
2674
+    }
2675
+
2676
+    return array($col, $col_vraie);
2677 2677
 }
2678 2678
 
2679 2679
 /**
@@ -2692,16 +2692,16 @@  discard block
 block discarded – undo
2692 2692
  *     de colonne SQL et une date.
2693 2693
  **/
2694 2694
 function calculer_param_date($date_compare, $date_orig) {
2695
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2696
-		$init = "'\" . (\$x = $r[1]) . \"'";
2697
-		$date_compare = '\'$x\'';
2698
-	} else {
2699
-		$init = $date_compare;
2700
-	}
2701
-
2702
-	return
2703
-		// optimisation : mais prevoir le support SQLite avant
2704
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2695
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2696
+        $init = "'\" . (\$x = $r[1]) . \"'";
2697
+        $date_compare = '\'$x\'';
2698
+    } else {
2699
+        $init = $date_compare;
2700
+    }
2701
+
2702
+    return
2703
+        // optimisation : mais prevoir le support SQLite avant
2704
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2705 2705
 }
2706 2706
 
2707 2707
 /**
@@ -2719,18 +2719,18 @@  discard block
 block discarded – undo
2719 2719
  * @param Critere $crit Paramètres du critère dans cette boucle
2720 2720
  */
2721 2721
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2722
-	$boucle = &$boucles[$idb];
2722
+    $boucle = &$boucles[$idb];
2723 2723
 
2724
-	$args = array();
2725
-	foreach ($crit->param as &$param) {
2726
-		array_push($args,
2727
-			calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2728
-	}
2724
+    $args = array();
2725
+    foreach ($crit->param as &$param) {
2726
+        array_push($args,
2727
+            calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent));
2728
+    }
2729 2729
 
2730
-	$boucle->hash .= '
2730
+    $boucle->hash .= '
2731 2731
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2732 2732
 
2733
-	$boucle->hash .= '
2733
+    $boucle->hash .= '
2734 2734
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2735 2735
 }
2736 2736
 
@@ -2747,8 +2747,8 @@  discard block
 block discarded – undo
2747 2747
  * @param Critere $crit Paramètres du critère dans cette boucle
2748 2748
  */
2749 2749
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2750
-	$boucle = &$boucles[$idb];
2751
-	$boucle->hash .= '
2750
+    $boucle = &$boucles[$idb];
2751
+    $boucle->hash .= '
2752 2752
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2753 2753
 	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2754 2754
 }
@@ -2768,8 +2768,8 @@  discard block
 block discarded – undo
2768 2768
  * @param Critere $crit Paramètres du critère dans cette boucle
2769 2769
  */
2770 2770
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2771
-	$boucle = &$boucles[$idb];
2772
-	$boucle->hash .= '
2771
+    $boucle = &$boucles[$idb];
2772
+    $boucle->hash .= '
2773 2773
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2774 2774
 }
2775 2775
 
@@ -2785,12 +2785,12 @@  discard block
 block discarded – undo
2785 2785
  * @param Critere $crit Paramètres du critère dans cette boucle
2786 2786
  */
2787 2787
 function critere_php_args_dist($idb, &$boucles, $crit) {
2788
-	$boucle = &$boucles[$idb];
2789
-	$boucle->hash .= '$command[\'args\']=array();';
2790
-	foreach ($crit->param as $param) {
2791
-		$boucle->hash .= '
2788
+    $boucle = &$boucles[$idb];
2789
+    $boucle->hash .= '$command[\'args\']=array();';
2790
+    foreach ($crit->param as $param) {
2791
+        $boucle->hash .= '
2792 2792
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2793
-	}
2793
+    }
2794 2794
 }
2795 2795
 
2796 2796
 /**
@@ -2807,12 +2807,12 @@  discard block
 block discarded – undo
2807 2807
  * @param Critere $crit Paramètres du critère dans cette boucle
2808 2808
  */
2809 2809
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2810
-	$boucle = &$boucles[$idb];
2811
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2812
-	foreach ($crit->param as $param) {
2813
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2814
-				$boucles[$idb]->id_parent) . ";\n";
2815
-	}
2810
+    $boucle = &$boucles[$idb];
2811
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2812
+    foreach ($crit->param as $param) {
2813
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, $idb, $boucles,
2814
+                $boucles[$idb]->id_parent) . ";\n";
2815
+    }
2816 2816
 }
2817 2817
 
2818 2818
 /**
@@ -2837,12 +2837,12 @@  discard block
 block discarded – undo
2837 2837
  * @param Critere $crit Paramètres du critère dans cette boucle
2838 2838
  */
2839 2839
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2840
-	$boucle = &$boucles[$idb];
2841
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2842
-	foreach ($crit->param as $param) {
2843
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2844
-				$boucles[$idb]->id_parent) . ";\n";
2845
-	}
2840
+    $boucle = &$boucles[$idb];
2841
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2842
+    foreach ($crit->param as $param) {
2843
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, $idb, $boucles,
2844
+                $boucles[$idb]->id_parent) . ";\n";
2845
+    }
2846 2846
 }
2847 2847
 
2848 2848
 /**
@@ -2857,11 +2857,11 @@  discard block
 block discarded – undo
2857 2857
  * @param Critere $crit Paramètres du critère dans cette boucle
2858 2858
  */
2859 2859
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2860
-	$boucle = &$boucles[$idb];
2861
-	foreach ($crit->param as $param) {
2862
-		$boucle->hash .= '
2860
+    $boucle = &$boucles[$idb];
2861
+    foreach ($crit->param as $param) {
2862
+        $boucle->hash .= '
2863 2863
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2864
-	}
2864
+    }
2865 2865
 }
2866 2866
 
2867 2867
 
@@ -2893,20 +2893,20 @@  discard block
 block discarded – undo
2893 2893
  * @param Critere $crit Paramètres du critère dans cette boucle
2894 2894
  */
2895 2895
 function critere_si_dist($idb, &$boucles, $crit) {
2896
-	$boucle = &$boucles[$idb];
2897
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2898
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2899
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2900
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2901
-	if ($crit->param) {
2902
-		foreach ($crit->param as $param) {
2903
-			$boucle->hash .= "\t\$command['si'][] = "
2904
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2905
-		}
2906
-		// interdire {si 0} aussi !
2907
-	} else {
2908
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2909
-	}
2896
+    $boucle = &$boucles[$idb];
2897
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2898
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2899
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2900
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2901
+    if ($crit->param) {
2902
+        foreach ($crit->param as $param) {
2903
+            $boucle->hash .= "\t\$command['si'][] = "
2904
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2905
+        }
2906
+        // interdire {si 0} aussi !
2907
+    } else {
2908
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2909
+    }
2910 2910
 }
2911 2911
 
2912 2912
 /**
@@ -2922,8 +2922,8 @@  discard block
 block discarded – undo
2922 2922
  * @param Critere $crit Paramètres du critère dans cette boucle
2923 2923
  */
2924 2924
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2925
-	$boucle = &$boucles[$idb];
2926
-	$boucle->hash .= '
2925
+    $boucle = &$boucles[$idb];
2926
+    $boucle->hash .= '
2927 2927
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ');
2928 2928
 	$command[\'sourcemode\'] = \'table\';';
2929 2929
 }
@@ -2944,29 +2944,29 @@  discard block
 block discarded – undo
2944 2944
  */
2945 2945
 function critere_noeud_dist($idb, &$boucles, $crit) {
2946 2946
 
2947
-	$not = $crit->not;
2948
-	$boucle = &$boucles[$idb];
2949
-	$primary = $boucle->primary;
2947
+    $not = $crit->not;
2948
+    $boucle = &$boucles[$idb];
2949
+    $primary = $boucle->primary;
2950 2950
 
2951
-	if (!$primary or strpos($primary, ',')) {
2952
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2951
+    if (!$primary or strpos($primary, ',')) {
2952
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2953 2953
 
2954
-		return;
2955
-	}
2956
-	$table = $boucle->type_requete;
2957
-	$table_sql = table_objet_sql(objet_type($table));
2954
+        return;
2955
+    }
2956
+    $table = $boucle->type_requete;
2957
+    $table_sql = table_objet_sql(objet_type($table));
2958 2958
 
2959
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2960
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2961
-		'id_parent';
2959
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2960
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2961
+        'id_parent';
2962 2962
 
2963
-	$in = "IN";
2964
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2965
-	if ($not) {
2966
-		$where = array("'NOT'", $where);
2967
-	}
2963
+    $in = "IN";
2964
+    $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2965
+    if ($not) {
2966
+        $where = array("'NOT'", $where);
2967
+    }
2968 2968
 
2969
-	$boucle->where[] = $where;
2969
+    $boucle->where[] = $where;
2970 2970
 }
2971 2971
 
2972 2972
 /**
@@ -2982,8 +2982,8 @@  discard block
 block discarded – undo
2982 2982
  * @param Critere $crit Paramètres du critère dans cette boucle
2983 2983
  */
2984 2984
 function critere_feuille_dist($idb, &$boucles, $crit) {
2985
-	$not = $crit->not;
2986
-	$crit->not = $not ? false : true;
2987
-	critere_noeud_dist($idb, $boucles, $crit);
2988
-	$crit->not = $not;
2985
+    $not = $crit->not;
2986
+    $crit->not = $not ? false : true;
2987
+    critere_noeud_dist($idb, $boucles, $crit);
2988
+    $crit->not = $not;
2989 2989
 }
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 1 patch
Indentation   +902 added lines, -902 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
 
@@ -34,53 +34,53 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 *
53
-	 * @var array
54
-	 */
55
-	public $descr = array();
56
-
57
-	/**
58
-	 * Identifiant de la boucle
59
-	 *
60
-	 * @var string
61
-	 */
62
-	public $id_boucle = '';
63
-
64
-	/**
65
-	 * Numéro de ligne dans le code source du squelette
66
-	 *
67
-	 * @var int
68
-	 */
69
-	public $ligne = 0;
70
-
71
-	/**
72
-	 * Langue d'exécution
73
-	 *
74
-	 * @var string
75
-	 */
76
-	public $lang = '';
77
-
78
-	/**
79
-	 * Résultat de la compilation: toujours une expression PHP
80
-	 *
81
-	 * @var string
82
-	 */
83
-	public $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     *
53
+     * @var array
54
+     */
55
+    public $descr = array();
56
+
57
+    /**
58
+     * Identifiant de la boucle
59
+     *
60
+     * @var string
61
+     */
62
+    public $id_boucle = '';
63
+
64
+    /**
65
+     * Numéro de ligne dans le code source du squelette
66
+     *
67
+     * @var int
68
+     */
69
+    public $ligne = 0;
70
+
71
+    /**
72
+     * Langue d'exécution
73
+     *
74
+     * @var string
75
+     */
76
+    public $lang = '';
77
+
78
+    /**
79
+     * Résultat de la compilation: toujours une expression PHP
80
+     *
81
+     * @var string
82
+     */
83
+    public $code = '';
84 84
 }
85 85
 
86 86
 
@@ -90,44 +90,44 @@  discard block
 block discarded – undo
90 90
  * @package SPIP\Core\Compilateur\AST
91 91
  **/
92 92
 class Texte {
93
-	/**
94
-	 * Type de noeud
95
-	 *
96
-	 * @var string
97
-	 */
98
-	public $type = 'texte';
99
-
100
-	/**
101
-	 * Le texte
102
-	 *
103
-	 * @var string
104
-	 */
105
-	public $texte;
106
-
107
-	/**
108
-	 * Contenu avant le texte.
109
-	 *
110
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
111
-	 *
112
-	 * @var string|array
113
-	 */
114
-	public $avant = "";
115
-
116
-	/**
117
-	 * Contenu après le texte.
118
-	 *
119
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
120
-	 *
121
-	 * @var string|array
122
-	 */
123
-	public $apres = "";
124
-
125
-	/**
126
-	 * Numéro de ligne dans le code source du squelette
127
-	 *
128
-	 * @var int
129
-	 */
130
-	public $ligne = 0;
93
+    /**
94
+     * Type de noeud
95
+     *
96
+     * @var string
97
+     */
98
+    public $type = 'texte';
99
+
100
+    /**
101
+     * Le texte
102
+     *
103
+     * @var string
104
+     */
105
+    public $texte;
106
+
107
+    /**
108
+     * Contenu avant le texte.
109
+     *
110
+     * Vide ou apostrophe simple ou double si le texte en était entouré
111
+     *
112
+     * @var string|array
113
+     */
114
+    public $avant = "";
115
+
116
+    /**
117
+     * Contenu après le texte.
118
+     *
119
+     * Vide ou apostrophe simple ou double si le texte en était entouré
120
+     *
121
+     * @var string|array
122
+     */
123
+    public $apres = "";
124
+
125
+    /**
126
+     * Numéro de ligne dans le code source du squelette
127
+     *
128
+     * @var int
129
+     */
130
+    public $ligne = 0;
131 131
 }
132 132
 
133 133
 /**
@@ -136,50 +136,50 @@  discard block
 block discarded – undo
136 136
  * @package SPIP\Core\Compilateur\AST
137 137
  **/
138 138
 class Inclure {
139
-	/**
140
-	 * Type de noeud
141
-	 *
142
-	 * @var string
143
-	 */
144
-	public $type = 'include';
145
-
146
-	/**
147
-	 * Nom d'un fichier inclu
148
-	 *
149
-	 * - Objet Texte si inclusion d'un autre squelette
150
-	 * - chaîne si inclusion d'un fichier PHP directement
151
-	 *
152
-	 * @var string|Texte
153
-	 */
154
-	public $texte;
155
-
156
-	/**
157
-	 * Inutilisé, propriété générique de l'AST
158
-	 *
159
-	 * @var string|array
160
-	 */
161
-	public $avant = '';
162
-
163
-	/**
164
-	 * Inutilisé, propriété générique de l'AST
165
-	 *
166
-	 * @var string|array
167
-	 */
168
-	public $apres = '';
169
-
170
-	/**
171
-	 * Numéro de ligne dans le code source du squelette
172
-	 *
173
-	 * @var int
174
-	 */
175
-	public $ligne = 0;
176
-
177
-	/**
178
-	 * Valeurs des paramètres
179
-	 *
180
-	 * @var array
181
-	 */
182
-	public $param = array();
139
+    /**
140
+     * Type de noeud
141
+     *
142
+     * @var string
143
+     */
144
+    public $type = 'include';
145
+
146
+    /**
147
+     * Nom d'un fichier inclu
148
+     *
149
+     * - Objet Texte si inclusion d'un autre squelette
150
+     * - chaîne si inclusion d'un fichier PHP directement
151
+     *
152
+     * @var string|Texte
153
+     */
154
+    public $texte;
155
+
156
+    /**
157
+     * Inutilisé, propriété générique de l'AST
158
+     *
159
+     * @var string|array
160
+     */
161
+    public $avant = '';
162
+
163
+    /**
164
+     * Inutilisé, propriété générique de l'AST
165
+     *
166
+     * @var string|array
167
+     */
168
+    public $apres = '';
169
+
170
+    /**
171
+     * Numéro de ligne dans le code source du squelette
172
+     *
173
+     * @var int
174
+     */
175
+    public $ligne = 0;
176
+
177
+    /**
178
+     * Valeurs des paramètres
179
+     *
180
+     * @var array
181
+     */
182
+    public $param = array();
183 183
 }
184 184
 
185 185
 
@@ -189,376 +189,376 @@  discard block
 block discarded – undo
189 189
  * @package SPIP\Core\Compilateur\AST
190 190
  **/
191 191
 class Boucle {
192
-	/**
193
-	 * Type de noeud
194
-	 *
195
-	 * @var string
196
-	 */
197
-	public $type = 'boucle';
198
-
199
-	/**
200
-	 * Identifiant de la boucle
201
-	 *
202
-	 * @var string
203
-	 */
204
-	public $id_boucle;
205
-
206
-	/**
207
-	 * Identifiant de la boucle parente
208
-	 *
209
-	 * @var string
210
-	 */
211
-	public $id_parent = '';
212
-
213
-	/**
214
-	 * Partie avant toujours affichee
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $preaff = '';
219
-
220
-	/**
221
-	 * Partie optionnelle avant
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $avant = '';
226
-
227
-	/**
228
-	 * Pour chaque élément
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $milieu = '';
233
-
234
-	/**
235
-	 * Partie optionnelle après
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $apres = '';
240
-
241
-	/**
242
-	 * Partie alternative, si pas de résultat dans la boucle
243
-	 *
244
-	 * @var string|array
245
-	 */
246
-	public $altern = '';
247
-
248
-	/**
249
-	 * Partie apres toujours affichee
250
-	 *
251
-	 * @var string|array
252
-	 */
253
-	public $postaff = '';
254
-
255
-
256
-	/**
257
-	 * La boucle doit-elle sélectionner la langue ?
258
-	 *
259
-	 * @var string|null
260
-	 */
261
-	public $lang_select;
262
-
263
-	/**
264
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
265
-	 *
266
-	 * @var string|null
267
-	 */
268
-	public $type_requete;
269
-
270
-	/**
271
-	 * La table est elle optionnelle ?
272
-	 *
273
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
-	 *
275
-	 * @var bool
276
-	 */
277
-	public $table_optionnelle = false;
278
-
279
-	/**
280
-	 * Nom du fichier de connexion
281
-	 *
282
-	 * @var string
283
-	 */
284
-	public $sql_serveur = '';
285
-
286
-	/**
287
-	 * Paramètres de la boucle
288
-	 *
289
-	 * Description des paramètres passés à la boucle, qui servent ensuite
290
-	 * au calcul des critères
291
-	 *
292
-	 * @var array
293
-	 */
294
-	public $param = array();
295
-
296
-	/**
297
-	 * Critères de la boucle
298
-	 *
299
-	 * @var Critere[]
300
-	 */
301
-	public $criteres = array();
302
-
303
-	/**
304
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
305
-	 *
306
-	 * @var string[]
307
-	 */
308
-	public $separateur = array();
309
-
310
-	/**
311
-	 * Liste des jointures possibles avec cette table
312
-	 *
313
-	 * Les jointures par défaut de la table sont complétées en priorité
314
-	 * des jointures déclarées explicitement sur la boucle
315
-	 *
316
-	 * @see base_trouver_table_dist()
317
-	 * @var array
318
-	 */
319
-	public $jointures = array();
320
-
321
-	/**
322
-	 * Jointures explicites avec cette table
323
-	 *
324
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
325
-	 * normales possibles pour retrouver les colonnes demandées extérieures
326
-	 * à la boucle.
327
-	 *
328
-	 * @var string|bool
329
-	 */
330
-	public $jointures_explicites = false;
331
-
332
-	/**
333
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
-	 *
335
-	 * @var string|null
336
-	 */
337
-	public $doublons;
338
-
339
-	/**
340
-	 * Code PHP ajouté au début de chaque itération de boucle.
341
-	 *
342
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
-	 *
344
-	 * @var string
345
-	 */
346
-	public $partie = "";
347
-
348
-	/**
349
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
350
-	 * ou de soustractions d'éléments à faire
351
-	 *
352
-	 * Dans les critères limitant le nombre d'éléments affichés
353
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
-	 *
355
-	 * @var string
356
-	 */
357
-	public $total_parties = "";
358
-
359
-	/**
360
-	 * Code PHP ajouté avant l'itération de boucle.
361
-	 *
362
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
-	 * pour initialiser les variables de début et de fin d'itération.
364
-	 *
365
-	 * @var string
366
-	 */
367
-	public $mode_partie = '';
368
-
369
-	/**
370
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
-	 *
372
-	 * Si une boucle est appelée de manière récursive quelque part par
373
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
-	 * de l'appelant (rec)
376
-	 *
377
-	 * @var string
378
-	 */
379
-	public $externe = '';
380
-
381
-	// champs pour la construction de la requete SQL
382
-
383
-	/**
384
-	 * Liste des champs à récupérer par la boucle
385
-	 *
386
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
-	 *
388
-	 * @var string[]
389
-	 */
390
-	public $select = array();
391
-
392
-	/**
393
-	 * Liste des alias / tables SQL utilisées dans la boucle
394
-	 *
395
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
-	 *
398
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
-	 *
400
-	 * @var string[]
401
-	 */
402
-	public $from = array();
403
-
404
-	/**
405
-	 * Liste des alias / type de jointures utilisées dans la boucle
406
-	 *
407
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
-	 *
410
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
-	 *
413
-	 * @var string[]
414
-	 */
415
-	public $from_type = array();
416
-
417
-	/**
418
-	 * Liste des conditions WHERE de la boucle
419
-	 *
420
-	 * Permet de restreindre les éléments retournés par une boucle
421
-	 * en fonctions des conditions transmises dans ce tableau.
422
-	 *
423
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
-	 *
425
-	 * Les éléments du premier niveau sont reliés par des AND, donc
426
-	 * chaque élément ajouté directement au where par
427
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
-	 * est une condition AND en plus.
429
-	 *
430
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
-	 * $expr = array(operateur, val1, val2)
433
-	 *
434
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
-	 * à réaliser tel que :
436
-	 *
437
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
-	 *    suivant cet ordre : "val1 operateur val2".
440
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
-	 * - "'AND'", "'OR'", "'NOT'" :
442
-	 *    dans ce cas val1 et val2 sont également des expressions
443
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
-	 *    Exemples :
445
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
-	 *
448
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
-	 *
452
-	 * @var array
453
-	 */
454
-	public $where = array();
455
-
456
-	public $join = array();
457
-	public $having = array();
458
-	public $limit;
459
-	public $group = array();
460
-	public $order = array();
461
-	public $default_order = array();
462
-	public $date = 'date';
463
-	public $hash = "";
464
-	public $in = "";
465
-	public $sous_requete = false;
466
-
467
-	/**
468
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
-	 *
470
-	 * Il sert à insérer le code calculant une hierarchie
471
-	 *
472
-	 * @var string
473
-	 */
474
-	public $hierarchie = '';
475
-
476
-	// champs pour la construction du corps PHP
477
-
478
-	/**
479
-	 * Description des sources de données de la boucle
480
-	 *
481
-	 * Description des données de la boucle issu de trouver_table
482
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
-	 *
484
-	 * @see base_trouver_table_dist()
485
-	 * @var array
486
-	 */
487
-	public $show = array();
488
-
489
-	/**
490
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $id_table;
495
-
496
-	/**
497
-	 * Nom de la clé primaire de la table SQL principale de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $primary;
502
-
503
-	/**
504
-	 * Code PHP compilé de la boucle
505
-	 *
506
-	 * @var string
507
-	 */
508
-	public $return;
509
-
510
-	public $numrows = false;
511
-	public $cptrows = false;
512
-
513
-	/**
514
-	 * Description du squelette
515
-	 *
516
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
-	 *
518
-	 * Peut contenir les index :
519
-	 *
520
-	 * - nom : Nom du fichier de cache
521
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
-	 * - sourcefile : Chemin du squelette
523
-	 * - squelette : Code du squelette
524
-	 * - id_mere : Identifiant de la boucle parente
525
-	 * - documents : Pour embed et img dans les textes
526
-	 * - session : Pour un cache sessionné par auteur
527
-	 * - niv : Niveau de tabulation
528
-	 *
529
-	 * @var array
530
-	 */
531
-	public $descr = array();
532
-
533
-	/**
534
-	 * Numéro de ligne dans le code source du squelette
535
-	 *
536
-	 * @var int
537
-	 */
538
-	public $ligne = 0;
539
-
540
-
541
-	public $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
-
543
-	/**
544
-	 * Type d'itérateur utilisé pour cette boucle
545
-	 *
546
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
-	 * - 'DATA' pour l'itérateur DATA, ...
548
-	 *
549
-	 * @var string
550
-	 */
551
-	public $iterateur = ''; // type d'iterateur
552
-
553
-	/**
554
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
-	 */
556
-	public $debug = [];
557
-
558
-	// obsoletes, conserves provisoirement pour compatibilite
559
-	public $tout = false;
560
-	public $plat = false;
561
-	public $lien = false;
192
+    /**
193
+     * Type de noeud
194
+     *
195
+     * @var string
196
+     */
197
+    public $type = 'boucle';
198
+
199
+    /**
200
+     * Identifiant de la boucle
201
+     *
202
+     * @var string
203
+     */
204
+    public $id_boucle;
205
+
206
+    /**
207
+     * Identifiant de la boucle parente
208
+     *
209
+     * @var string
210
+     */
211
+    public $id_parent = '';
212
+
213
+    /**
214
+     * Partie avant toujours affichee
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $preaff = '';
219
+
220
+    /**
221
+     * Partie optionnelle avant
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $avant = '';
226
+
227
+    /**
228
+     * Pour chaque élément
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $milieu = '';
233
+
234
+    /**
235
+     * Partie optionnelle après
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $apres = '';
240
+
241
+    /**
242
+     * Partie alternative, si pas de résultat dans la boucle
243
+     *
244
+     * @var string|array
245
+     */
246
+    public $altern = '';
247
+
248
+    /**
249
+     * Partie apres toujours affichee
250
+     *
251
+     * @var string|array
252
+     */
253
+    public $postaff = '';
254
+
255
+
256
+    /**
257
+     * La boucle doit-elle sélectionner la langue ?
258
+     *
259
+     * @var string|null
260
+     */
261
+    public $lang_select;
262
+
263
+    /**
264
+     * Alias de table d'application de la requête ou nom complet de la table SQL
265
+     *
266
+     * @var string|null
267
+     */
268
+    public $type_requete;
269
+
270
+    /**
271
+     * La table est elle optionnelle ?
272
+     *
273
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
274
+     *
275
+     * @var bool
276
+     */
277
+    public $table_optionnelle = false;
278
+
279
+    /**
280
+     * Nom du fichier de connexion
281
+     *
282
+     * @var string
283
+     */
284
+    public $sql_serveur = '';
285
+
286
+    /**
287
+     * Paramètres de la boucle
288
+     *
289
+     * Description des paramètres passés à la boucle, qui servent ensuite
290
+     * au calcul des critères
291
+     *
292
+     * @var array
293
+     */
294
+    public $param = array();
295
+
296
+    /**
297
+     * Critères de la boucle
298
+     *
299
+     * @var Critere[]
300
+     */
301
+    public $criteres = array();
302
+
303
+    /**
304
+     * Textes insérés entre 2 éléments de boucle (critère inter)
305
+     *
306
+     * @var string[]
307
+     */
308
+    public $separateur = array();
309
+
310
+    /**
311
+     * Liste des jointures possibles avec cette table
312
+     *
313
+     * Les jointures par défaut de la table sont complétées en priorité
314
+     * des jointures déclarées explicitement sur la boucle
315
+     *
316
+     * @see base_trouver_table_dist()
317
+     * @var array
318
+     */
319
+    public $jointures = array();
320
+
321
+    /**
322
+     * Jointures explicites avec cette table
323
+     *
324
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
325
+     * normales possibles pour retrouver les colonnes demandées extérieures
326
+     * à la boucle.
327
+     *
328
+     * @var string|bool
329
+     */
330
+    public $jointures_explicites = false;
331
+
332
+    /**
333
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
334
+     *
335
+     * @var string|null
336
+     */
337
+    public $doublons;
338
+
339
+    /**
340
+     * Code PHP ajouté au début de chaque itération de boucle.
341
+     *
342
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
343
+     *
344
+     * @var string
345
+     */
346
+    public $partie = "";
347
+
348
+    /**
349
+     * Nombre de divisions de la boucle, d'éléments à afficher,
350
+     * ou de soustractions d'éléments à faire
351
+     *
352
+     * Dans les critères limitant le nombre d'éléments affichés
353
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
354
+     *
355
+     * @var string
356
+     */
357
+    public $total_parties = "";
358
+
359
+    /**
360
+     * Code PHP ajouté avant l'itération de boucle.
361
+     *
362
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
363
+     * pour initialiser les variables de début et de fin d'itération.
364
+     *
365
+     * @var string
366
+     */
367
+    public $mode_partie = '';
368
+
369
+    /**
370
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
371
+     *
372
+     * Si une boucle est appelée de manière récursive quelque part par
373
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
374
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
375
+     * de l'appelant (rec)
376
+     *
377
+     * @var string
378
+     */
379
+    public $externe = '';
380
+
381
+    // champs pour la construction de la requete SQL
382
+
383
+    /**
384
+     * Liste des champs à récupérer par la boucle
385
+     *
386
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
387
+     *
388
+     * @var string[]
389
+     */
390
+    public $select = array();
391
+
392
+    /**
393
+     * Liste des alias / tables SQL utilisées dans la boucle
394
+     *
395
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
396
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
397
+     *
398
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
399
+     *
400
+     * @var string[]
401
+     */
402
+    public $from = array();
403
+
404
+    /**
405
+     * Liste des alias / type de jointures utilisées dans la boucle
406
+     *
407
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
408
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
409
+     *
410
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
411
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
412
+     *
413
+     * @var string[]
414
+     */
415
+    public $from_type = array();
416
+
417
+    /**
418
+     * Liste des conditions WHERE de la boucle
419
+     *
420
+     * Permet de restreindre les éléments retournés par une boucle
421
+     * en fonctions des conditions transmises dans ce tableau.
422
+     *
423
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
424
+     *
425
+     * Les éléments du premier niveau sont reliés par des AND, donc
426
+     * chaque élément ajouté directement au where par
427
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
428
+     * est une condition AND en plus.
429
+     *
430
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
431
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
432
+     * $expr = array(operateur, val1, val2)
433
+     *
434
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
435
+     * à réaliser tel que :
436
+     *
437
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
438
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
439
+     *    suivant cet ordre : "val1 operateur val2".
440
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
441
+     * - "'AND'", "'OR'", "'NOT'" :
442
+     *    dans ce cas val1 et val2 sont également des expressions
443
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
444
+     *    Exemples :
445
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
446
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
447
+     *
448
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
449
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
450
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
451
+     *
452
+     * @var array
453
+     */
454
+    public $where = array();
455
+
456
+    public $join = array();
457
+    public $having = array();
458
+    public $limit;
459
+    public $group = array();
460
+    public $order = array();
461
+    public $default_order = array();
462
+    public $date = 'date';
463
+    public $hash = "";
464
+    public $in = "";
465
+    public $sous_requete = false;
466
+
467
+    /**
468
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
469
+     *
470
+     * Il sert à insérer le code calculant une hierarchie
471
+     *
472
+     * @var string
473
+     */
474
+    public $hierarchie = '';
475
+
476
+    // champs pour la construction du corps PHP
477
+
478
+    /**
479
+     * Description des sources de données de la boucle
480
+     *
481
+     * Description des données de la boucle issu de trouver_table
482
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
483
+     *
484
+     * @see base_trouver_table_dist()
485
+     * @var array
486
+     */
487
+    public $show = array();
488
+
489
+    /**
490
+     * Nom de la table SQL principale de la boucle, sans son préfixe
491
+     *
492
+     * @var string
493
+     */
494
+    public $id_table;
495
+
496
+    /**
497
+     * Nom de la clé primaire de la table SQL principale de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $primary;
502
+
503
+    /**
504
+     * Code PHP compilé de la boucle
505
+     *
506
+     * @var string
507
+     */
508
+    public $return;
509
+
510
+    public $numrows = false;
511
+    public $cptrows = false;
512
+
513
+    /**
514
+     * Description du squelette
515
+     *
516
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
517
+     *
518
+     * Peut contenir les index :
519
+     *
520
+     * - nom : Nom du fichier de cache
521
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
522
+     * - sourcefile : Chemin du squelette
523
+     * - squelette : Code du squelette
524
+     * - id_mere : Identifiant de la boucle parente
525
+     * - documents : Pour embed et img dans les textes
526
+     * - session : Pour un cache sessionné par auteur
527
+     * - niv : Niveau de tabulation
528
+     *
529
+     * @var array
530
+     */
531
+    public $descr = array();
532
+
533
+    /**
534
+     * Numéro de ligne dans le code source du squelette
535
+     *
536
+     * @var int
537
+     */
538
+    public $ligne = 0;
539
+
540
+
541
+    public $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
542
+
543
+    /**
544
+     * Type d'itérateur utilisé pour cette boucle
545
+     *
546
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
547
+     * - 'DATA' pour l'itérateur DATA, ...
548
+     *
549
+     * @var string
550
+     */
551
+    public $iterateur = ''; // type d'iterateur
552
+
553
+    /**
554
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
555
+     */
556
+    public $debug = [];
557
+
558
+    // obsoletes, conserves provisoirement pour compatibilite
559
+    public $tout = false;
560
+    public $plat = false;
561
+    public $lien = false;
562 562
 }
563 563
 
564 564
 /**
@@ -569,56 +569,56 @@  discard block
 block discarded – undo
569 569
  * @package SPIP\Core\Compilateur\AST
570 570
  **/
571 571
 class Critere {
572
-	/**
573
-	 * Type de noeud
574
-	 *
575
-	 * @var string
576
-	 */
577
-	public $type = 'critere';
578
-
579
-	/**
580
-	 * Opérateur (>, <, >=, IN, ...)
581
-	 *
582
-	 * @var null|string
583
-	 */
584
-	public $op;
585
-
586
-	/**
587
-	 * Présence d'une négation (truc !op valeur)
588
-	 *
589
-	 * @var null|string
590
-	 */
591
-	public $not;
592
-
593
-	/**
594
-	 * Présence d'une exclusion (!truc op valeur)
595
-	 *
596
-	 * @var null|string
597
-	 */
598
-	public $exclus;
599
-
600
-	/**
601
-	 * Présence d'une condition dans le critère (truc ?)
602
-	 *
603
-	 * @var bool
604
-	 */
605
-	public $cond = false;
606
-
607
-	/**
608
-	 * Paramètres du critère
609
-	 * - $param[0] : élément avant l'opérateur
610
-	 * - $param[1..n] : éléments après l'opérateur
611
-	 *
612
-	 * @var array
613
-	 */
614
-	public $param = array();
615
-
616
-	/**
617
-	 * Numéro de ligne dans le code source du squelette
618
-	 *
619
-	 * @var int
620
-	 */
621
-	public $ligne = 0;
572
+    /**
573
+     * Type de noeud
574
+     *
575
+     * @var string
576
+     */
577
+    public $type = 'critere';
578
+
579
+    /**
580
+     * Opérateur (>, <, >=, IN, ...)
581
+     *
582
+     * @var null|string
583
+     */
584
+    public $op;
585
+
586
+    /**
587
+     * Présence d'une négation (truc !op valeur)
588
+     *
589
+     * @var null|string
590
+     */
591
+    public $not;
592
+
593
+    /**
594
+     * Présence d'une exclusion (!truc op valeur)
595
+     *
596
+     * @var null|string
597
+     */
598
+    public $exclus;
599
+
600
+    /**
601
+     * Présence d'une condition dans le critère (truc ?)
602
+     *
603
+     * @var bool
604
+     */
605
+    public $cond = false;
606
+
607
+    /**
608
+     * Paramètres du critère
609
+     * - $param[0] : élément avant l'opérateur
610
+     * - $param[1..n] : éléments après l'opérateur
611
+     *
612
+     * @var array
613
+     */
614
+    public $param = array();
615
+
616
+    /**
617
+     * Numéro de ligne dans le code source du squelette
618
+     *
619
+     * @var int
620
+     */
621
+    public $ligne = 0;
622 622
 }
623 623
 
624 624
 /**
@@ -627,139 +627,139 @@  discard block
 block discarded – undo
627 627
  * @package SPIP\Core\Compilateur\AST
628 628
  **/
629 629
 class Champ {
630
-	/**
631
-	 * Type de noeud
632
-	 *
633
-	 * @var string
634
-	 */
635
-	public $type = 'champ';
636
-
637
-	/**
638
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
639
-	 *
640
-	 * @var string|null
641
-	 */
642
-	public $nom_champ;
643
-
644
-	/**
645
-	 * Identifiant de la boucle parente si explicité
646
-	 *
647
-	 * @var string|null
648
-	 */
649
-	public $nom_boucle = '';
650
-
651
-	/**
652
-	 * Partie optionnelle avant
653
-	 *
654
-	 * @var null|string|array
655
-	 */
656
-	public $avant;
657
-
658
-	/**
659
-	 * Partie optionnelle après
660
-	 *
661
-	 * @var null|string|array
662
-	 */
663
-	public $apres;
664
-
665
-	/**
666
-	 * Étoiles : annuler des automatismes
667
-	 *
668
-	 * - '*' annule les filtres automatiques
669
-	 * - '**' annule en plus les protections de scripts
670
-	 *
671
-	 * @var null|string
672
-	 */
673
-	public $etoile;
674
-
675
-	/**
676
-	 * Arguments et filtres explicites sur la balise
677
-	 *
678
-	 * - $param[0] contient les arguments de la balise
679
-	 * - $param[1..n] contient les filtres à appliquer à la balise
680
-	 *
681
-	 * @var array
682
-	 */
683
-	public $param = array();
684
-
685
-	/**
686
-	 * Source des filtres  (compatibilité) (?)
687
-	 *
688
-	 * @var array|null
689
-	 */
690
-	public $fonctions = array();
691
-
692
-	/**
693
-	 * Identifiant de la boucle
694
-	 *
695
-	 * @var string
696
-	 */
697
-	public $id_boucle = '';
698
-
699
-	/**
700
-	 * AST du squelette, liste de toutes les boucles
701
-	 *
702
-	 * @var Boucles[]
703
-	 */
704
-	public $boucles;
705
-
706
-	/**
707
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
708
-	 *
709
-	 * @var string|null
710
-	 */
711
-	public $type_requete;
712
-
713
-	/**
714
-	 * Résultat de la compilation: toujours une expression PHP
715
-	 *
716
-	 * @var string
717
-	 */
718
-	public $code = '';
719
-
720
-	/**
721
-	 * Interdire les scripts
722
-	 *
723
-	 * false si on est sûr de cette balise
724
-	 *
725
-	 * @see interdire_scripts()
726
-	 * @var bool
727
-	 */
728
-	public $interdire_scripts = true;
729
-
730
-	/**
731
-	 * Description du squelette
732
-	 *
733
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
734
-	 *
735
-	 * Peut contenir les index :
736
-	 *
737
-	 * - nom : Nom du fichier de cache
738
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
739
-	 * - sourcefile : Chemin du squelette
740
-	 * - squelette : Code du squelette
741
-	 * - id_mere : Identifiant de la boucle parente
742
-	 * - documents : Pour embed et img dans les textes
743
-	 * - session : Pour un cache sessionné par auteur
744
-	 * - niv : Niveau de tabulation
745
-	 *
746
-	 * @var array
747
-	 */
748
-	public $descr = array();
749
-
750
-	/**
751
-	 * Numéro de ligne dans le code source du squelette
752
-	 *
753
-	 * @var int
754
-	 */
755
-	public $ligne = 0;
756
-
757
-	/**
758
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
759
-	 *
760
-	 * @var bool
761
-	 */
762
-	public $balise_calculee = false;
630
+    /**
631
+     * Type de noeud
632
+     *
633
+     * @var string
634
+     */
635
+    public $type = 'champ';
636
+
637
+    /**
638
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
639
+     *
640
+     * @var string|null
641
+     */
642
+    public $nom_champ;
643
+
644
+    /**
645
+     * Identifiant de la boucle parente si explicité
646
+     *
647
+     * @var string|null
648
+     */
649
+    public $nom_boucle = '';
650
+
651
+    /**
652
+     * Partie optionnelle avant
653
+     *
654
+     * @var null|string|array
655
+     */
656
+    public $avant;
657
+
658
+    /**
659
+     * Partie optionnelle après
660
+     *
661
+     * @var null|string|array
662
+     */
663
+    public $apres;
664
+
665
+    /**
666
+     * Étoiles : annuler des automatismes
667
+     *
668
+     * - '*' annule les filtres automatiques
669
+     * - '**' annule en plus les protections de scripts
670
+     *
671
+     * @var null|string
672
+     */
673
+    public $etoile;
674
+
675
+    /**
676
+     * Arguments et filtres explicites sur la balise
677
+     *
678
+     * - $param[0] contient les arguments de la balise
679
+     * - $param[1..n] contient les filtres à appliquer à la balise
680
+     *
681
+     * @var array
682
+     */
683
+    public $param = array();
684
+
685
+    /**
686
+     * Source des filtres  (compatibilité) (?)
687
+     *
688
+     * @var array|null
689
+     */
690
+    public $fonctions = array();
691
+
692
+    /**
693
+     * Identifiant de la boucle
694
+     *
695
+     * @var string
696
+     */
697
+    public $id_boucle = '';
698
+
699
+    /**
700
+     * AST du squelette, liste de toutes les boucles
701
+     *
702
+     * @var Boucles[]
703
+     */
704
+    public $boucles;
705
+
706
+    /**
707
+     * Alias de table d'application de la requête ou nom complet de la table SQL
708
+     *
709
+     * @var string|null
710
+     */
711
+    public $type_requete;
712
+
713
+    /**
714
+     * Résultat de la compilation: toujours une expression PHP
715
+     *
716
+     * @var string
717
+     */
718
+    public $code = '';
719
+
720
+    /**
721
+     * Interdire les scripts
722
+     *
723
+     * false si on est sûr de cette balise
724
+     *
725
+     * @see interdire_scripts()
726
+     * @var bool
727
+     */
728
+    public $interdire_scripts = true;
729
+
730
+    /**
731
+     * Description du squelette
732
+     *
733
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
734
+     *
735
+     * Peut contenir les index :
736
+     *
737
+     * - nom : Nom du fichier de cache
738
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
739
+     * - sourcefile : Chemin du squelette
740
+     * - squelette : Code du squelette
741
+     * - id_mere : Identifiant de la boucle parente
742
+     * - documents : Pour embed et img dans les textes
743
+     * - session : Pour un cache sessionné par auteur
744
+     * - niv : Niveau de tabulation
745
+     *
746
+     * @var array
747
+     */
748
+    public $descr = array();
749
+
750
+    /**
751
+     * Numéro de ligne dans le code source du squelette
752
+     *
753
+     * @var int
754
+     */
755
+    public $ligne = 0;
756
+
757
+    /**
758
+     * Drapeau pour reperer les balises calculées par une fonction explicite
759
+     *
760
+     * @var bool
761
+     */
762
+    public $balise_calculee = false;
763 763
 }
764 764
 
765 765
 
@@ -767,123 +767,123 @@  discard block
 block discarded – undo
767 767
  * Description d'une chaîne de langue
768 768
  **/
769 769
 class Idiome {
770
-	/**
771
-	 * Type de noeud
772
-	 *
773
-	 * @var string
774
-	 */
775
-	public $type = 'idiome';
776
-
777
-	/**
778
-	 * Clé de traduction demandée. Exemple 'item_oui'
779
-	 *
780
-	 * @var string
781
-	 */
782
-	public $nom_champ = "";
783
-
784
-	/**
785
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
786
-	 *
787
-	 * @var string
788
-	 */
789
-	public $module = "";
790
-
791
-	/**
792
-	 * Arguments à passer à la chaîne
793
-	 *
794
-	 * @var array
795
-	 */
796
-	public $arg = array();
797
-
798
-	/**
799
-	 * Filtres à appliquer au résultat
800
-	 *
801
-	 * @var array
802
-	 */
803
-	public $param = array();
804
-
805
-	/**
806
-	 * Source des filtres  (compatibilité) (?)
807
-	 *
808
-	 * @var array|null
809
-	 */
810
-	public $fonctions = array();
811
-
812
-	/**
813
-	 * Inutilisé, propriété générique de l'AST
814
-	 *
815
-	 * @var string|array
816
-	 */
817
-	public $avant = '';
818
-
819
-	/**
820
-	 * Inutilisé, propriété générique de l'AST
821
-	 *
822
-	 * @var string|array
823
-	 */
824
-	public $apres = '';
825
-
826
-	/**
827
-	 * Identifiant de la boucle
828
-	 *
829
-	 * @var string
830
-	 */
831
-	public $id_boucle = '';
832
-
833
-	/**
834
-	 * AST du squelette, liste de toutes les boucles
835
-	 *
836
-	 * @var Boucles[]
837
-	 */
838
-	public $boucles;
839
-
840
-	/**
841
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
842
-	 *
843
-	 * @var string|null
844
-	 */
845
-	public $type_requete;
846
-
847
-	/**
848
-	 * Résultat de la compilation: toujours une expression PHP
849
-	 *
850
-	 * @var string
851
-	 */
852
-	public $code = '';
853
-
854
-	/**
855
-	 * Interdire les scripts
856
-	 *
857
-	 * @see interdire_scripts()
858
-	 * @var bool
859
-	 */
860
-	public $interdire_scripts = false;
861
-
862
-	/**
863
-	 * Description du squelette
864
-	 *
865
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
866
-	 *
867
-	 * Peut contenir les index :
868
-	 * - nom : Nom du fichier de cache
869
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
870
-	 * - sourcefile : Chemin du squelette
871
-	 * - squelette : Code du squelette
872
-	 * - id_mere : Identifiant de la boucle parente
873
-	 * - documents : Pour embed et img dans les textes
874
-	 * - session : Pour un cache sessionné par auteur
875
-	 * - niv : Niveau de tabulation
876
-	 *
877
-	 * @var array
878
-	 */
879
-	public $descr = array();
880
-
881
-	/**
882
-	 * Numéro de ligne dans le code source du squelette
883
-	 *
884
-	 * @var int
885
-	 */
886
-	public $ligne = 0;
770
+    /**
771
+     * Type de noeud
772
+     *
773
+     * @var string
774
+     */
775
+    public $type = 'idiome';
776
+
777
+    /**
778
+     * Clé de traduction demandée. Exemple 'item_oui'
779
+     *
780
+     * @var string
781
+     */
782
+    public $nom_champ = "";
783
+
784
+    /**
785
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
786
+     *
787
+     * @var string
788
+     */
789
+    public $module = "";
790
+
791
+    /**
792
+     * Arguments à passer à la chaîne
793
+     *
794
+     * @var array
795
+     */
796
+    public $arg = array();
797
+
798
+    /**
799
+     * Filtres à appliquer au résultat
800
+     *
801
+     * @var array
802
+     */
803
+    public $param = array();
804
+
805
+    /**
806
+     * Source des filtres  (compatibilité) (?)
807
+     *
808
+     * @var array|null
809
+     */
810
+    public $fonctions = array();
811
+
812
+    /**
813
+     * Inutilisé, propriété générique de l'AST
814
+     *
815
+     * @var string|array
816
+     */
817
+    public $avant = '';
818
+
819
+    /**
820
+     * Inutilisé, propriété générique de l'AST
821
+     *
822
+     * @var string|array
823
+     */
824
+    public $apres = '';
825
+
826
+    /**
827
+     * Identifiant de la boucle
828
+     *
829
+     * @var string
830
+     */
831
+    public $id_boucle = '';
832
+
833
+    /**
834
+     * AST du squelette, liste de toutes les boucles
835
+     *
836
+     * @var Boucles[]
837
+     */
838
+    public $boucles;
839
+
840
+    /**
841
+     * Alias de table d'application de la requête ou nom complet de la table SQL
842
+     *
843
+     * @var string|null
844
+     */
845
+    public $type_requete;
846
+
847
+    /**
848
+     * Résultat de la compilation: toujours une expression PHP
849
+     *
850
+     * @var string
851
+     */
852
+    public $code = '';
853
+
854
+    /**
855
+     * Interdire les scripts
856
+     *
857
+     * @see interdire_scripts()
858
+     * @var bool
859
+     */
860
+    public $interdire_scripts = false;
861
+
862
+    /**
863
+     * Description du squelette
864
+     *
865
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
866
+     *
867
+     * Peut contenir les index :
868
+     * - nom : Nom du fichier de cache
869
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
870
+     * - sourcefile : Chemin du squelette
871
+     * - squelette : Code du squelette
872
+     * - id_mere : Identifiant de la boucle parente
873
+     * - documents : Pour embed et img dans les textes
874
+     * - session : Pour un cache sessionné par auteur
875
+     * - niv : Niveau de tabulation
876
+     *
877
+     * @var array
878
+     */
879
+    public $descr = array();
880
+
881
+    /**
882
+     * Numéro de ligne dans le code source du squelette
883
+     *
884
+     * @var int
885
+     */
886
+    public $ligne = 0;
887 887
 }
888 888
 
889 889
 /**
@@ -892,28 +892,28 @@  discard block
 block discarded – undo
892 892
  * @package SPIP\Core\Compilateur\AST
893 893
  **/
894 894
 class Polyglotte {
895
-	/**
896
-	 * Type de noeud
897
-	 *
898
-	 * @var string
899
-	 */
900
-	public $type = 'polyglotte';
901
-
902
-	/**
903
-	 * Tableau des traductions possibles classées par langue
904
-	 *
905
-	 * Tableau code de langue => texte
906
-	 *
907
-	 * @var array
908
-	 */
909
-	public $traductions = array();
910
-
911
-	/**
912
-	 * Numéro de ligne dans le code source du squelette
913
-	 *
914
-	 * @var int
915
-	 */
916
-	public $ligne = 0;
895
+    /**
896
+     * Type de noeud
897
+     *
898
+     * @var string
899
+     */
900
+    public $type = 'polyglotte';
901
+
902
+    /**
903
+     * Tableau des traductions possibles classées par langue
904
+     *
905
+     * Tableau code de langue => texte
906
+     *
907
+     * @var array
908
+     */
909
+    public $traductions = array();
910
+
911
+    /**
912
+     * Numéro de ligne dans le code source du squelette
913
+     *
914
+     * @var int
915
+     */
916
+    public $ligne = 0;
917 917
 }
918 918
 
919 919
 
@@ -938,86 +938,86 @@  discard block
 block discarded – undo
938 938
  */
939 939
 function declarer_interfaces() {
940 940
 
941
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
942
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
943
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
944
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
945
-
946
-	// definition des statuts de publication
947
-	$GLOBALS['table_statut'] = array();
948
-
949
-	//
950
-	// tableau des tables de jointures
951
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
952
-	$GLOBALS['tables_jointures'] = array();
953
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
954
-
955
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
956
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = array('spip_rubriques', 'profondeur');
957
-
958
-
959
-	if (!defined('_TRAITEMENT_TYPO')) {
960
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
961
-	}
962
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
963
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
964
-	}
965
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
966
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s), "TYPO", $connect, $Pile[0])');
967
-	}
968
-	$GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
969
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
970
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
971
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
972
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
973
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
974
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
975
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
976
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
977
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
978
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
979
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
980
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
981
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
982
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
983
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
984
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
985
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
986
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
987
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
988
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
990
-
991
-	// valeur par defaut pour les balises non listees ci-dessus
992
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
993
-	// toujours securiser les DATA
994
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
995
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
996
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
997
-
998
-
999
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1000
-	$interfaces = pipeline('declarer_tables_interfaces',
1001
-		array(
1002
-			'table_des_tables' => $GLOBALS['table_des_tables'],
1003
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1004
-			'table_date' => $GLOBALS['table_date'],
1005
-			'table_titre' => $GLOBALS['table_titre'],
1006
-			'tables_jointures' => $GLOBALS['tables_jointures'],
1007
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1008
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
1009
-			'table_statut' => $GLOBALS['table_statut'],
1010
-		));
1011
-	if ($interfaces) {
1012
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1013
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1014
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1015
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1016
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1017
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1018
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1019
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1020
-	}
941
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
942
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
943
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
944
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
945
+
946
+    // definition des statuts de publication
947
+    $GLOBALS['table_statut'] = array();
948
+
949
+    //
950
+    // tableau des tables de jointures
951
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
952
+    $GLOBALS['tables_jointures'] = array();
953
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
954
+
955
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
956
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = array('spip_rubriques', 'profondeur');
957
+
958
+
959
+    if (!defined('_TRAITEMENT_TYPO')) {
960
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
961
+    }
962
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
963
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
964
+    }
965
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
966
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s), "TYPO", $connect, $Pile[0])');
967
+    }
968
+    $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
969
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
970
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
971
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
972
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
973
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
974
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
975
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
976
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
977
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
978
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
979
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
980
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
981
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
982
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
983
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
984
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
985
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
986
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
987
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
988
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
989
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
990
+
991
+    // valeur par defaut pour les balises non listees ci-dessus
992
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
993
+    // toujours securiser les DATA
994
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
995
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
996
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
997
+
998
+
999
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
1000
+    $interfaces = pipeline('declarer_tables_interfaces',
1001
+        array(
1002
+            'table_des_tables' => $GLOBALS['table_des_tables'],
1003
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
1004
+            'table_date' => $GLOBALS['table_date'],
1005
+            'table_titre' => $GLOBALS['table_titre'],
1006
+            'tables_jointures' => $GLOBALS['tables_jointures'],
1007
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
1008
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
1009
+            'table_statut' => $GLOBALS['table_statut'],
1010
+        ));
1011
+    if ($interfaces) {
1012
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1013
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1014
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1015
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1016
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1017
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1018
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1019
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1020
+    }
1021 1021
 }
1022 1022
 
1023 1023
 declarer_interfaces();
Please login to merge, or discard this patch.