Completed
Push — master ( e2d4e4...a37dbc )
by cam
08:09
created
ecrire/public/criteres.php 2 patches
Indentation   +1662 added lines, -1662 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -43,14 +43,14 @@  discard block
 block discarded – undo
43 43
  **/
44 44
 function critere_racine_dist($idb, &$boucles, $crit) {
45 45
 
46
-	$not = $crit->not;
47
-	$boucle = &$boucles[$idb];
48
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
46
+    $not = $crit->not;
47
+    $boucle = &$boucles[$idb];
48
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
+        'id_parent';
51 51
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
52
+    $c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
53
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 54
 }
55 55
 
56 56
 
@@ -67,15 +67,15 @@  discard block
 block discarded – undo
67 67
  * @return void
68 68
  **/
69 69
 function critere_exclus_dist($idb, &$boucles, $crit) {
70
-	$not = $crit->not;
71
-	$boucle = &$boucles[$idb];
72
-	$id = $boucle->primary;
73
-
74
-	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
-	}
77
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
70
+    $not = $crit->not;
71
+    $boucle = &$boucles[$idb];
72
+    $id = $boucle->primary;
73
+
74
+    if ($not or !$id) {
75
+        return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
76
+    }
77
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
+    $boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
79 79
 }
80 80
 
81 81
 
@@ -95,73 +95,73 @@  discard block
 block discarded – undo
95 95
  * @return void
96 96
  **/
97 97
 function critere_doublons_dist($idb, &$boucles, $crit) {
98
-	$boucle = &$boucles[$idb];
99
-	$primary = $boucle->primary;
100
-
101
-	// la table nécessite une clé primaire, non composée
102
-	if (!$primary or strpos($primary, ',')) {
103
-		return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
-	}
105
-
106
-	$not = ($crit->not ? '' : 'NOT');
107
-
108
-	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
110
-
111
-	// compléter le nom avec un nom précisé {doublons nom}
112
-	// on obtient $nom = "'article' . 'nom'"
113
-	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
115
-	}
116
-
117
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
-
121
-	// on crée un sql_in avec la clé primaire de la table
122
-	// et la collection des doublons déjà emmagasinés dans le tableau
123
-	// $doublons et son index, ici $nom
124
-
125
-	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
128
-	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
-
131
-	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
133
-
134
-	// nom du doublon "('article' . 'nom')]"
135
-	$fin_doub = "($nom)]";
136
-
137
-	// si on trouve un autre critère doublon,
138
-	// on fusionne pour avoir un seul IN, et on s'en va !
139
-	foreach ($boucle->where as $k => $w) {
140
-		if (strpos($w[0], $debut_doub) === 0) {
141
-			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
-			// fusionner l'initialisation (du hash) pour faire plus joli
144
-			$x = strpos($boucle->hash, $init_comment);
145
-			$len = strlen($init_comment);
146
-			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
-
149
-			return;
150
-		}
151
-	}
152
-
153
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
-
156
-	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
158
-
159
-
160
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
161
-	# mais elle fait planter une boucle a 2 critere doublons:
162
-	# {!doublons A}{doublons B}
163
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
-	#	if ($crit->not) $boucle->doublons = "";
98
+    $boucle = &$boucles[$idb];
99
+    $primary = $boucle->primary;
100
+
101
+    // la table nécessite une clé primaire, non composée
102
+    if (!$primary or strpos($primary, ',')) {
103
+        return (array('zbug_doublon_sur_table_sans_cle_primaire'));
104
+    }
105
+
106
+    $not = ($crit->not ? '' : 'NOT');
107
+
108
+    // le doublon s'applique sur un type de boucle (article)
109
+    $nom = "'" . $boucle->type_requete . "'";
110
+
111
+    // compléter le nom avec un nom précisé {doublons nom}
112
+    // on obtient $nom = "'article' . 'nom'"
113
+    if (isset($crit->param[0])) {
114
+        $nom .= "." . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
115
+    }
116
+
117
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
118
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
119
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
120
+
121
+    // on crée un sql_in avec la clé primaire de la table
122
+    // et la collection des doublons déjà emmagasinés dans le tableau
123
+    // $doublons et son index, ici $nom
124
+
125
+    // debut du code "sql_in('articles.id_article', "
126
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
127
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
128
+    // Attention : boucle->doublons désigne une variable qu'on affecte
129
+    $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
130
+
131
+    // le debut complet du code des doublons
132
+    $debut_doub = $debut_in . $debut_doub;
133
+
134
+    // nom du doublon "('article' . 'nom')]"
135
+    $fin_doub = "($nom)]";
136
+
137
+    // si on trouve un autre critère doublon,
138
+    // on fusionne pour avoir un seul IN, et on s'en va !
139
+    foreach ($boucle->where as $k => $w) {
140
+        if (strpos($w[0], $debut_doub) === 0) {
141
+            // fusionner le sql_in (du where)
142
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
143
+            // fusionner l'initialisation (du hash) pour faire plus joli
144
+            $x = strpos($boucle->hash, $init_comment);
145
+            $len = strlen($init_comment);
146
+            $boucle->hash =
147
+                substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
148
+
149
+            return;
150
+        }
151
+    }
152
+
153
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
+    $boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
155
+
156
+    // déclarer le doublon s'il n'existe pas encore
157
+    $boucle->hash .= $init_comment . $init_code;
158
+
159
+
160
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
161
+    # mais elle fait planter une boucle a 2 critere doublons:
162
+    # {!doublons A}{doublons B}
163
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
164
+    #	if ($crit->not) $boucle->doublons = "";
165 165
 }
166 166
 
167 167
 
@@ -182,14 +182,14 @@  discard block
 block discarded – undo
182 182
  * @return void
183 183
  **/
184 184
 function critere_lang_select_dist($idb, &$boucles, $crit) {
185
-	if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
-		$param = 'oui';
187
-	}
188
-	if ($crit->not) {
189
-		$param = ($param == 'oui') ? 'non' : 'oui';
190
-	}
191
-	$boucle = &$boucles[$idb];
192
-	$boucle->lang_select = $param;
185
+    if (!isset($crit->param[1][0]) or !($param = $crit->param[1][0]->texte)) {
186
+        $param = 'oui';
187
+    }
188
+    if ($crit->not) {
189
+        $param = ($param == 'oui') ? 'non' : 'oui';
190
+    }
191
+    $boucle = &$boucles[$idb];
192
+    $boucle->lang_select = $param;
193 193
 }
194 194
 
195 195
 
@@ -211,18 +211,18 @@  discard block
 block discarded – undo
211 211
  * @return void
212 212
  **/
213 213
 function critere_debut_dist($idb, &$boucles, $crit) {
214
-	list($un, $deux) = $crit->param;
215
-	$un = $un[0]->texte;
216
-	$deux = $deux[0]->texte;
217
-	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
222
-			'"';
223
-	} else {
224
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
-	}
214
+    list($un, $deux) = $crit->param;
215
+    $un = $un[0]->texte;
216
+    $deux = $deux[0]->texte;
217
+    if ($deux) {
218
+        $boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
+            $un .
220
+            '"]) . ",' .
221
+            $deux .
222
+            '"';
223
+    } else {
224
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
225
+    }
226 226
 }
227 227
 
228 228
 
@@ -256,57 +256,57 @@  discard block
 block discarded – undo
256 256
  **/
257 257
 function critere_pagination_dist($idb, &$boucles, $crit) {
258 258
 
259
-	$boucle = &$boucles[$idb];
260
-	// definition de la taille de la page
261
-	$pas = !isset($crit->param[0][0]) ? "''"
262
-		: calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
263
-
264
-	if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
266
-	} else {
267
-		$r = intval($r[2]);
268
-		$pas = strval($r ? $r : 10);
269
-	}
270
-
271
-	// Calcul du nommage de la pagination si il existe.
272
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
274
-	$type = "'$idb'";
275
-	// Calcul d'un nommage spécifique de la pagination si précisé.
276
-	// Syntaxe {pagination 20, nom}
277
-	if (isset($crit->param[0][1])) {
278
-		$type = calculer_liste(array($crit->param[0][1]), array(), $boucles, $boucle->id_parent);
279
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
-	elseif (isset($crit->param[1][0])) {
281
-		$type = calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
282
-	}
283
-
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
-	$boucle->modificateur['debut_nom'] = $type;
286
-	$partie =
287
-		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
-		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
292
-		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
294
-
295
-	$boucle->hash .= '
259
+    $boucle = &$boucles[$idb];
260
+    // definition de la taille de la page
261
+    $pas = !isset($crit->param[0][0]) ? "''"
262
+        : calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
263
+
264
+    if (!preg_match(_CODE_QUOTE, $pas, $r)) {
265
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
266
+    } else {
267
+        $r = intval($r[2]);
268
+        $pas = strval($r ? $r : 10);
269
+    }
270
+
271
+    // Calcul du nommage de la pagination si il existe.
272
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
273
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
274
+    $type = "'$idb'";
275
+    // Calcul d'un nommage spécifique de la pagination si précisé.
276
+    // Syntaxe {pagination 20, nom}
277
+    if (isset($crit->param[0][1])) {
278
+        $type = calculer_liste(array($crit->param[0][1]), array(), $boucles, $boucle->id_parent);
279
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
280
+    elseif (isset($crit->param[1][0])) {
281
+        $type = calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
282
+    }
283
+
284
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
285
+    $boucle->modificateur['debut_nom'] = $type;
286
+    $partie =
287
+        // tester si le numero de page demande est de la forme '@yyy'
288
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
289
+        . "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
+        . "\t\t" . '$iter->seek(0);' . "\n"
292
+        . "\t}\n"
293
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
294
+
295
+    $boucle->hash .= '
296 296
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
297 297
 
298
-	$boucle->total_parties = $pas;
299
-	calculer_parties($boucles, $idb, $partie, 'p+');
300
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
-	// sauf si pas de primaire, ou si primaire composee
302
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
304
-	if ($boucle->primary
305
-		and !preg_match('/[,\s]/', $boucle->primary)
306
-		and !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
298
+    $boucle->total_parties = $pas;
299
+    calculer_parties($boucles, $idb, $partie, 'p+');
300
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301
+    // sauf si pas de primaire, ou si primaire composee
302
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
303
+    $t = $boucle->id_table . '.' . $boucle->primary;
304
+    if ($boucle->primary
305
+        and !preg_match('/[,\s]/', $boucle->primary)
306
+        and !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
333
+    if (!$boucle->primary or strpos($boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		array(
397
-			"'OR'",
398
-			array(
399
-				"'AND'",
400
-				array("'='", "'$table.id_trad'", 0),
401
-				array("'='", "'$table.$prim'", $dprim)
402
-			),
403
-			array(
404
-				"'AND'",
405
-				array("'>'", "'$table.id_trad'", 0),
406
-				array("'='", "'$table.id_trad'", $arg)
407
-			)
408
-		);
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        array(
397
+            "'OR'",
398
+            array(
399
+                "'AND'",
400
+                array("'='", "'$table.id_trad'", 0),
401
+                array("'='", "'$table.$prim'", $dprim)
402
+            ),
403
+            array(
404
+                "'AND'",
405
+                array("'>'", "'$table.id_trad'", 0),
406
+                array("'='", "'$table.id_trad'", $arg)
407
+            )
408
+        );
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		array(
432
-			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
-			array("'='", "'$table.id_trad'", "'0'")
435
-		);
436
-	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        array(
432
+            "'OR'",
433
+            array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
434
+            array("'='", "'$table.id_trad'", "'0'")
435
+        );
436
+    $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,20 +450,20 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
+        'id_parent';
458
+    $mparent = $boucle->id_table . '.' . $id_parent;
459 459
 
460
-	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
-		$boucle->where[] = array("'='", "'$mparent'", $arg);
460
+    if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461
+        $boucle->where[] = array("'='", "'$mparent'", $arg);
462 462
 
463
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
-	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
-	}
463
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464
+    else {
465
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
466
+    }
467 467
 }
468 468
 
469 469
 
@@ -494,37 +494,37 @@  discard block
 block discarded – undo
494 494
  **/
495 495
 function critere_branche_dist($idb, &$boucles, $crit) {
496 496
 
497
-	$not = $crit->not;
498
-	$boucle = &$boucles[$idb];
499
-	// prendre en priorite un identifiant en parametre {branche XX}
500
-	if (isset($crit->param[0])) {
501
-		$arg = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
502
-		// sinon on le prend chez une boucle parente
503
-	} else {
504
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
-	}
506
-
507
-	//Trouver une jointure
508
-	$champ = "id_rubrique";
509
-	$desc = $boucle->show;
510
-	//Seulement si necessaire
511
-	if (!array_key_exists($champ, $desc['field'])) {
512
-		$cle = trouver_jointure_champ($champ, $boucle);
513
-		$trouver_table = charger_fonction("trouver_table", "base");
514
-		$desc = $trouver_table($boucle->from[$cle]);
515
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
-			$decompose = decompose_champ_id_objet($champ);
517
-			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
-		}
520
-	} else {
521
-		$cle = $boucle->id_table;
522
-	}
523
-
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
497
+    $not = $crit->not;
498
+    $boucle = &$boucles[$idb];
499
+    // prendre en priorite un identifiant en parametre {branche XX}
500
+    if (isset($crit->param[0])) {
501
+        $arg = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
502
+        // sinon on le prend chez une boucle parente
503
+    } else {
504
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
505
+    }
506
+
507
+    //Trouver une jointure
508
+    $champ = "id_rubrique";
509
+    $desc = $boucle->show;
510
+    //Seulement si necessaire
511
+    if (!array_key_exists($champ, $desc['field'])) {
512
+        $cle = trouver_jointure_champ($champ, $boucle);
513
+        $trouver_table = charger_fonction("trouver_table", "base");
514
+        $desc = $trouver_table($boucle->from[$cle]);
515
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516
+            $decompose = decompose_champ_id_objet($champ);
517
+            $champ = array_shift($decompose);
518
+            $boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
519
+        }
520
+    } else {
521
+        $cle = $boucle->id_table;
522
+    }
523
+
524
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
+        . ($not ? ", 'NOT'" : '') . ")";
526
+    $boucle->where[] = !$crit->cond ? $c :
527
+        ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
528 528
 }
529 529
 
530 530
 /**
@@ -540,22 +540,22 @@  discard block
 block discarded – undo
540 540
  **/
541 541
 function critere_logo_dist($idb, &$boucles, $crit) {
542 542
 
543
-	$not = $crit->not;
544
-	$boucle = &$boucles[$idb];
543
+    $not = $crit->not;
544
+    $boucle = &$boucles[$idb];
545 545
 
546
-	$c = "sql_in('" .
547
-		$boucle->id_table . '.' . $boucle->primary
548
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '')";
546
+    $c = "sql_in('" .
547
+        $boucle->id_table . '.' . $boucle->primary
548
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '')";
549 549
 
550
-	if ($crit->cond) {
551
-		$c = "($arg ? $c : 1)";
552
-	}
550
+    if ($crit->cond) {
551
+        $c = "($arg ? $c : 1)";
552
+    }
553 553
 
554
-	if ($not) {
555
-		$boucle->where[] = array("'NOT'", $c);
556
-	} else {
557
-		$boucle->where[] = $c;
558
-	}
554
+    if ($not) {
555
+        $boucle->where[] = array("'NOT'", $c);
556
+    } else {
557
+        $boucle->where[] = $c;
558
+    }
559 559
 }
560 560
 
561 561
 
@@ -577,31 +577,31 @@  discard block
 block discarded – undo
577 577
  * @return void
578 578
  **/
579 579
 function critere_fusion_dist($idb, &$boucles, $crit) {
580
-	if ($t = isset($crit->param[0])) {
581
-		$t = $crit->param[0];
582
-		if ($t[0]->type == 'texte') {
583
-			$t = $t[0]->texte;
584
-			if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
585
-				$t = table_objet_sql($r[1]);
586
-				$t = array_search($t, $boucles[$idb]->from);
587
-				if ($t) {
588
-					$t .= '.' . $r[2];
589
-				}
590
-			}
591
-		} else {
592
-			$t = '".'
593
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
594
-				. '."';
595
-		}
596
-	}
597
-	if ($t) {
598
-		$boucles[$idb]->group[] = $t;
599
-		if (!in_array($t, $boucles[$idb]->select)) {
600
-			$boucles[$idb]->select[] = $t;
601
-		}
602
-	} else {
603
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
604
-	}
580
+    if ($t = isset($crit->param[0])) {
581
+        $t = $crit->param[0];
582
+        if ($t[0]->type == 'texte') {
583
+            $t = $t[0]->texte;
584
+            if (preg_match("/^(.*)\.(.*)$/", $t, $r)) {
585
+                $t = table_objet_sql($r[1]);
586
+                $t = array_search($t, $boucles[$idb]->from);
587
+                if ($t) {
588
+                    $t .= '.' . $r[2];
589
+                }
590
+            }
591
+        } else {
592
+            $t = '".'
593
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
594
+                . '."';
595
+        }
596
+    }
597
+    if ($t) {
598
+        $boucles[$idb]->group[] = $t;
599
+        if (!in_array($t, $boucles[$idb]->select)) {
600
+            $boucles[$idb]->select[] = $t;
601
+        }
602
+    } else {
603
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
604
+    }
605 605
 }
606 606
 
607 607
 /**
@@ -638,45 +638,45 @@  discard block
 block discarded – undo
638 638
  * @param Critere $crit Paramètres du critère dans cette boucle
639 639
  */
640 640
 function critere_collecte_dist($idb, &$boucles, $crit) {
641
-	if (isset($crit->param[0])) {
642
-		$_coll = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
643
-		$boucle = $boucles[$idb];
644
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
645
-		$n = count($boucle->order);
646
-		if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
647
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
648
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
649
-			if (
650
-				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
651
-				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
652
-			) {
653
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
654
-			} else {
655
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
656
-			}
657
-		}
658
-	} else {
659
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
660
-	}
641
+    if (isset($crit->param[0])) {
642
+        $_coll = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
643
+        $boucle = $boucles[$idb];
644
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
645
+        $n = count($boucle->order);
646
+        if ($n && (strpos($boucle->order[$n - 1], 'COLLATE') === false)) {
647
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
648
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
649
+            if (
650
+                (false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
651
+                OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
652
+            ) {
653
+                $boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
654
+            } else {
655
+                $boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
656
+            }
657
+        }
658
+    } else {
659
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
660
+    }
661 661
 }
662 662
 
663 663
 // http://code.spip.net/@calculer_critere_arg_dynamique
664 664
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
665
-	$boucle = $boucles[$idb];
666
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
667
-	$var = '$champs_' . $idb;
668
-	$desc = (strpos($boucle->in, "static $var =") !== false);
669
-	if (!$desc) {
670
-		$desc = $boucle->show['field'];
671
-		$desc = implode(',', array_map('_q', array_keys($desc)));
672
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
673
-	}
674
-	if ($desc) {
675
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
676
-	}
677
-	$arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
678
-
679
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
665
+    $boucle = $boucles[$idb];
666
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
667
+    $var = '$champs_' . $idb;
668
+    $desc = (strpos($boucle->in, "static $var =") !== false);
669
+    if (!$desc) {
670
+        $desc = $boucle->show['field'];
671
+        $desc = implode(',', array_map('_q', array_keys($desc)));
672
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
673
+    }
674
+    if ($desc) {
675
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
676
+    }
677
+    $arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
678
+
679
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
680 680
 }
681 681
 
682 682
 /**
@@ -715,7 +715,7 @@  discard block
 block discarded – undo
715 715
  * @param Critere $crit Paramètres du critère dans cette boucle
716 716
  */
717 717
 function critere_par_dist($idb, &$boucles, $crit) {
718
-	return critere_parinverse($idb, $boucles, $crit);
718
+    return critere_parinverse($idb, $boucles, $crit);
719 719
 }
720 720
 
721 721
 /**
@@ -737,93 +737,93 @@  discard block
 block discarded – undo
737 737
  * @param Critere $crit Paramètres du critère dans cette boucle
738 738
  */
739 739
 function critere_parinverse($idb, &$boucles, $crit) {
740
-	$boucle = &$boucles[$idb];
741
-
742
-	$sens = $collecte = '';
743
-	if ($crit->not) {
744
-		$sens = " . ' DESC'";
745
-	}
746
-	if (isset($boucle->modificateur['collate'])) {
747
-		$collecte = ' . ' . $boucle->modificateur['collate'];
748
-	}
749
-
750
-	// Pour chaque paramètre du critère
751
-	foreach ($crit->param as $tri) {
752
-		$order = $fct = '';
753
-		// tris specifiés dynamiquement {par #ENV{tri}}
754
-		if ($tri[0]->type != 'texte') {
755
-			// calculer le order dynamique qui verifie les champs
756
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
757
-			// ajouter 'hasard' comme possibilité de tri dynamique
758
-			calculer_critere_par_hasard($idb, $boucles, $crit);
759
-		}
760
-		// tris textuels {par titre}
761
-		else {
762
-			$par = array_shift($tri);
763
-			$par = $par->texte;
764
-
765
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
766
-			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
767
-				$expression = trim($m[1]);
768
-				$champ = trim($m[2]);
769
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
770
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
771
-				} else {
772
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
773
-				}
774
-
775
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
776
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
777
-				// {par FONCTION(champ)}
778
-				if (count($match) > 2) {
779
-					$par = substr($match[2], 1, -1);
780
-					$fct = $match[1];
781
-				}
782
-				// quelques cas spécifiques {par hasard}, {par date}
783
-				if ($par == 'hasard') {
784
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
785
-				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
786
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
787
-				} else {
788
-					// cas général {par champ}, {par table.champ}, ...
789
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
790
-				}
791
-			}
792
-
793
-			// on ne sait pas traiter…
794
-			else {
795
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
796
-			}
797
-
798
-			// En cas d'erreur de squelette retournée par une fonction
799
-			if (is_array($order)) {
800
-				return $order;
801
-			}
802
-		}
803
-
804
-		if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
805
-			$t = $m[1];
806
-			if (strpos($t, '.') and !in_array($t, $boucle->select)) {
807
-				$boucle->select[] = $t;
808
-			}
809
-		} else {
810
-			$sens = '';
811
-		}
812
-
813
-		if ($fct) {
814
-			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
815
-				$order = "'$fct(" . $r[1] . ")'";
816
-			} else {
817
-				$order = "'$fct(' . $order . ')'";
818
-			}
819
-		}
820
-		$t = $order . $collecte . $sens;
821
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
822
-			$t = $r[1] . $r[2];
823
-		}
824
-
825
-		$boucle->order[] = $t;
826
-	}
740
+    $boucle = &$boucles[$idb];
741
+
742
+    $sens = $collecte = '';
743
+    if ($crit->not) {
744
+        $sens = " . ' DESC'";
745
+    }
746
+    if (isset($boucle->modificateur['collate'])) {
747
+        $collecte = ' . ' . $boucle->modificateur['collate'];
748
+    }
749
+
750
+    // Pour chaque paramètre du critère
751
+    foreach ($crit->param as $tri) {
752
+        $order = $fct = '';
753
+        // tris specifiés dynamiquement {par #ENV{tri}}
754
+        if ($tri[0]->type != 'texte') {
755
+            // calculer le order dynamique qui verifie les champs
756
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
757
+            // ajouter 'hasard' comme possibilité de tri dynamique
758
+            calculer_critere_par_hasard($idb, $boucles, $crit);
759
+        }
760
+        // tris textuels {par titre}
761
+        else {
762
+            $par = array_shift($tri);
763
+            $par = $par->texte;
764
+
765
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
766
+            if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
767
+                $expression = trim($m[1]);
768
+                $champ = trim($m[2]);
769
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
770
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
771
+                } else {
772
+                    return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
773
+                }
774
+
775
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
776
+            } elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
777
+                // {par FONCTION(champ)}
778
+                if (count($match) > 2) {
779
+                    $par = substr($match[2], 1, -1);
780
+                    $fct = $match[1];
781
+                }
782
+                // quelques cas spécifiques {par hasard}, {par date}
783
+                if ($par == 'hasard') {
784
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
785
+                } elseif ($par == 'date' and !empty($boucle->show['date'])) {
786
+                    $order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
787
+                } else {
788
+                    // cas général {par champ}, {par table.champ}, ...
789
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
790
+                }
791
+            }
792
+
793
+            // on ne sait pas traiter…
794
+            else {
795
+                return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
796
+            }
797
+
798
+            // En cas d'erreur de squelette retournée par une fonction
799
+            if (is_array($order)) {
800
+                return $order;
801
+            }
802
+        }
803
+
804
+        if (preg_match('/^\'([^"]*)\'$/', $order, $m)) {
805
+            $t = $m[1];
806
+            if (strpos($t, '.') and !in_array($t, $boucle->select)) {
807
+                $boucle->select[] = $t;
808
+            }
809
+        } else {
810
+            $sens = '';
811
+        }
812
+
813
+        if ($fct) {
814
+            if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
815
+                $order = "'$fct(" . $r[1] . ")'";
816
+            } else {
817
+                $order = "'$fct(' . $order . ')'";
818
+            }
819
+        }
820
+        $t = $order . $collecte . $sens;
821
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
822
+            $t = $r[1] . $r[2];
823
+        }
824
+
825
+        $boucle->order[] = $t;
826
+    }
827 827
 }
828 828
 
829 829
 /**
@@ -837,13 +837,13 @@  discard block
 block discarded – undo
837 837
  * @return string Clause pour le Order by
838 838
  */
839 839
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
840
-	$boucle = &$boucles[$idb];
841
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
842
-	$parha = "rand() AS hasard";
843
-	if (!in_array($parha, $boucle->select)) {
844
-		$boucle->select[] = $parha;
845
-	}
846
-	return "'hasard'";
840
+    $boucle = &$boucles[$idb];
841
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
842
+    $parha = "rand() AS hasard";
843
+    if (!in_array($parha, $boucle->select)) {
844
+        $boucle->select[] = $parha;
845
+    }
846
+    return "'hasard'";
847 847
 }
848 848
 
849 849
 /**
@@ -867,20 +867,20 @@  discard block
 block discarded – undo
867 867
  * @return string Clause pour le Order by
868 868
  */
869 869
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
870
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
871
-	if (is_array($_champ)) {
872
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
873
-	}
874
-	$boucle = &$boucles[$idb];
875
-	$texte = '0+' . $_champ;
876
-	$suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
877
-	if ($suite !== "''") {
878
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
879
-	}
880
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
881
-	$boucle->select[] = $texte . " AS $as";
882
-	$order = "'$as'";
883
-	return $order;
870
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
871
+    if (is_array($_champ)) {
872
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
873
+    }
874
+    $boucle = &$boucles[$idb];
875
+    $texte = '0+' . $_champ;
876
+    $suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
877
+    if ($suite !== "''") {
878
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
879
+    }
880
+    $as = 'num' . ($boucle->order ? count($boucle->order) : "");
881
+    $boucle->select[] = $texte . " AS $as";
882
+    $order = "'$as'";
883
+    return $order;
884 884
 }
885 885
 
886 886
 /**
@@ -901,20 +901,20 @@  discard block
 block discarded – undo
901 901
  * @return string Clause pour le Order by
902 902
  */
903 903
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
904
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
905
-	if (is_array($_champ)) {
906
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
907
-	}
908
-	$boucle = &$boucles[$idb];
909
-	$texte = '0+' . $_champ;
910
-	$suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
911
-	if ($suite !== "''") {
912
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
913
-	}
914
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
915
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
916
-	$order = "'$as'";
917
-	return $order;
904
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
905
+    if (is_array($_champ)) {
906
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
907
+    }
908
+    $boucle = &$boucles[$idb];
909
+    $texte = '0+' . $_champ;
910
+    $suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
911
+    if ($suite !== "''") {
912
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
913
+    }
914
+    $as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
915
+    $boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
916
+    $order = "'$as'";
917
+    return $order;
918 918
 }
919 919
 
920 920
 
@@ -934,14 +934,14 @@  discard block
 block discarded – undo
934 934
  * @return string Clause pour le Order by
935 935
  */
936 936
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
937
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
938
-	if (is_array($_champ)) {
939
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
940
-	}
941
-	$boucle = &$boucles[$idb];
942
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
943
-	$order = "'multi'";
944
-	return $order;
937
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
938
+    if (is_array($_champ)) {
939
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
940
+    }
941
+    $boucle = &$boucles[$idb];
942
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
943
+    $order = "'multi'";
944
+    return $order;
945 945
 }
946 946
 
947 947
 /**
@@ -960,56 +960,56 @@  discard block
 block discarded – undo
960 960
  * @return array|string
961 961
  */
962 962
 function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
963
-	$boucle = &$boucles[$idb];
964
-	$desc = $boucle->show;
965
-
966
-	// le champ existe dans la table, pas de souci (le plus commun)
967
-	if (isset($desc['field'][$par])) {
968
-		$par = $boucle->id_table . "." . $par;
969
-	}
970
-	// le champ est peut être une jointure
971
-	else {
972
-		$table = $table_alias = false; // toutes les tables de jointure possibles
973
-		$champ = $par;
974
-
975
-		// le champ demandé est une exception de jointure {par titre_mot}
976
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
977
-			list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
978
-		} // la table de jointure est explicitement indiquée {par truc.muche}
979
-		elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
980
-			list(, $table, $champ) = $r;
981
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
982
-			$table = table_objet_sql($table);
983
-		}
984
-
985
-		// Si on connait la table d'arrivée, on la demande donc explicitement
986
-		// Sinon on cherche le champ dans les tables possibles de jointures
987
-		// Si la table est déjà dans le from, on la réutilise.
988
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
989
-			$par = $infos['alias'] . "." . $champ;
990
-		} elseif (
991
-			$boucle->jointures_explicites
992
-			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
993
-		) {
994
-			$par = $alias . "." . $champ;
995
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
996
-			$par = $alias . "." . $champ;
997
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
998
-		} elseif (
999
-			$table_alias
1000
-			and isset($boucle->from[$table_alias])
1001
-			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1002
-		) {
1003
-			$par = $infos['alias'] . "." . $champ;
1004
-		} elseif ($table) {
1005
-			// On avait table + champ, mais on ne les a pas trouvés
1006
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1007
-		} else {
1008
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1009
-		}
1010
-	}
1011
-
1012
-	return $raw ? $par : "'$par'";
963
+    $boucle = &$boucles[$idb];
964
+    $desc = $boucle->show;
965
+
966
+    // le champ existe dans la table, pas de souci (le plus commun)
967
+    if (isset($desc['field'][$par])) {
968
+        $par = $boucle->id_table . "." . $par;
969
+    }
970
+    // le champ est peut être une jointure
971
+    else {
972
+        $table = $table_alias = false; // toutes les tables de jointure possibles
973
+        $champ = $par;
974
+
975
+        // le champ demandé est une exception de jointure {par titre_mot}
976
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
977
+            list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par];
978
+        } // la table de jointure est explicitement indiquée {par truc.muche}
979
+        elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) {
980
+            list(, $table, $champ) = $r;
981
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
982
+            $table = table_objet_sql($table);
983
+        }
984
+
985
+        // Si on connait la table d'arrivée, on la demande donc explicitement
986
+        // Sinon on cherche le champ dans les tables possibles de jointures
987
+        // Si la table est déjà dans le from, on la réutilise.
988
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
989
+            $par = $infos['alias'] . "." . $champ;
990
+        } elseif (
991
+            $boucle->jointures_explicites
992
+            and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
993
+        ) {
994
+            $par = $alias . "." . $champ;
995
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
996
+            $par = $alias . "." . $champ;
997
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
998
+        } elseif (
999
+            $table_alias
1000
+            and isset($boucle->from[$table_alias])
1001
+            and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1002
+        ) {
1003
+            $par = $infos['alias'] . "." . $champ;
1004
+        } elseif ($table) {
1005
+            // On avait table + champ, mais on ne les a pas trouvés
1006
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1007
+        } else {
1008
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1009
+        }
1010
+    }
1011
+
1012
+    return $raw ? $par : "'$par'";
1013 1013
 }
1014 1014
 
1015 1015
 /**
@@ -1023,11 +1023,11 @@  discard block
 block discarded – undo
1023 1023
  * @return string Champ pour le compilateur si trouvé, tel que "'alias.champ'", sinon vide.
1024 1024
  */
1025 1025
 function critere_par_joint($table, $champ, &$boucle) {
1026
-	$t = array_search($table, $boucle->from);
1027
-	if (!$t) {
1028
-		$t = trouver_jointure_champ($champ, $boucle);
1029
-	}
1030
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1026
+    $t = array_search($table, $boucle->from);
1027
+    if (!$t) {
1028
+        $t = trouver_jointure_champ($champ, $boucle);
1029
+    }
1030
+    return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1031 1031
 }
1032 1032
 
1033 1033
 /**
@@ -1052,143 +1052,143 @@  discard block
 block discarded – undo
1052 1052
  */
1053 1053
 function critere_inverse_dist($idb, &$boucles, $crit) {
1054 1054
 
1055
-	$boucle = &$boucles[$idb];
1056
-	// Classement par ordre inverse
1057
-	if ($crit->not) {
1058
-		critere_parinverse($idb, $boucles, $crit);
1059
-	} else {
1060
-		$order = "' DESC'";
1061
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1062
-		if (isset($crit->param[0])) {
1063
-			$critere = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
1064
-			$order = "(($critere)?' DESC':'')";
1065
-		}
1066
-
1067
-		$n = count($boucle->order);
1068
-		if (!$n) {
1069
-			if (isset($boucle->default_order[0])) {
1070
-				$boucle->default_order[0] .= ' . " DESC"';
1071
-			} else {
1072
-				$boucle->default_order[] = ' DESC';
1073
-			}
1074
-		} else {
1075
-			$t = $boucle->order[$n - 1] . " . $order";
1076
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1077
-				$t = $r[1] . $r[2];
1078
-			}
1079
-			$boucle->order[$n - 1] = $t;
1080
-		}
1081
-	}
1055
+    $boucle = &$boucles[$idb];
1056
+    // Classement par ordre inverse
1057
+    if ($crit->not) {
1058
+        critere_parinverse($idb, $boucles, $crit);
1059
+    } else {
1060
+        $order = "' DESC'";
1061
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1062
+        if (isset($crit->param[0])) {
1063
+            $critere = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
1064
+            $order = "(($critere)?' DESC':'')";
1065
+        }
1066
+
1067
+        $n = count($boucle->order);
1068
+        if (!$n) {
1069
+            if (isset($boucle->default_order[0])) {
1070
+                $boucle->default_order[0] .= ' . " DESC"';
1071
+            } else {
1072
+                $boucle->default_order[] = ' DESC';
1073
+            }
1074
+        } else {
1075
+            $t = $boucle->order[$n - 1] . " . $order";
1076
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1077
+                $t = $r[1] . $r[2];
1078
+            }
1079
+            $boucle->order[$n - 1] = $t;
1080
+        }
1081
+    }
1082 1082
 }
1083 1083
 
1084 1084
 // http://code.spip.net/@critere_agenda_dist
1085 1085
 function critere_agenda_dist($idb, &$boucles, $crit) {
1086
-	$params = $crit->param;
1087
-
1088
-	if (count($params) < 1) {
1089
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1090
-	}
1091
-
1092
-	$boucle = &$boucles[$idb];
1093
-	$parent = $boucle->id_parent;
1094
-	$fields = $boucle->show['field'];
1095
-
1096
-	$date = array_shift($params);
1097
-	$type = array_shift($params);
1098
-
1099
-	// la valeur $type doit etre connue a la compilation
1100
-	// donc etre forcement reduite a un litteral unique dans le source
1101
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1102
-
1103
-	// La valeur date doit designer un champ de la table SQL.
1104
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1105
-	// sinon synthetiser le test de verif pour execution ulterieure
1106
-	// On prendra arbitrairement le premier champ si test negatif.
1107
-	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1108
-		$date = $date[0]->texte;
1109
-		if (!isset($fields[$date])) {
1110
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1111
-		}
1112
-	} else {
1113
-		$a = calculer_liste($date, array(), $boucles, $parent);
1114
-		$noms = array_keys($fields);
1115
-		$defaut = $noms[0];
1116
-		$noms = join(" ", $noms);
1117
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1118
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1119
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1120
-	}
1121
-	$annee = $params ? array_shift($params) : "";
1122
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1123
-		calculer_liste($annee, array(), $boucles, $parent) .
1124
-		') ? $x : date("Y"))';
1125
-
1126
-	$mois = $params ? array_shift($params) : "";
1127
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1128
-		calculer_liste($mois, array(), $boucles, $parent) .
1129
-		') ? $x : date("m"))';
1130
-
1131
-	$jour = $params ? array_shift($params) : "";
1132
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1133
-		calculer_liste($jour, array(), $boucles, $parent) .
1134
-		') ? $x : date("d"))';
1135
-
1136
-	$annee2 = $params ? array_shift($params) : "";
1137
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1138
-		calculer_liste($annee2, array(), $boucles, $parent) .
1139
-		') ? $x : date("Y"))';
1140
-
1141
-	$mois2 = $params ? array_shift($params) : "";
1142
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1143
-		calculer_liste($mois2, array(), $boucles, $parent) .
1144
-		') ? $x : date("m"))';
1145
-
1146
-	$jour2 = $params ? array_shift($params) : "";
1147
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1148
-		calculer_liste($jour2, array(), $boucles, $parent) .
1149
-		') ? $x : date("d"))';
1150
-
1151
-	$date = $boucle->id_table . ".$date";
1152
-
1153
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1154
-	if ($type == 'jour') {
1155
-		$boucle->where[] = array(
1156
-			"'='",
1157
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1158
-			("sql_quote($annee . $mois . $jour$quote_end)")
1159
-		);
1160
-	} elseif ($type == 'mois') {
1161
-		$boucle->where[] = array(
1162
-			"'='",
1163
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1164
-			("sql_quote($annee . $mois$quote_end)")
1165
-		);
1166
-	} elseif ($type == 'semaine') {
1167
-		$boucle->where[] = array(
1168
-			"'AND'",
1169
-			array(
1170
-				"'>='",
1171
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1172
-				("date_debut_semaine($annee, $mois, $jour)")
1173
-			),
1174
-			array(
1175
-				"'<='",
1176
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1177
-				("date_fin_semaine($annee, $mois, $jour)")
1178
-			)
1179
-		);
1180
-	} elseif (count($crit->param) > 2) {
1181
-		$boucle->where[] = array(
1182
-			"'AND'",
1183
-			array(
1184
-				"'>='",
1185
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1186
-				("sql_quote($annee . $mois . $jour$quote_end)")
1187
-			),
1188
-			array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1189
-		);
1190
-	}
1191
-	// sinon on prend tout
1086
+    $params = $crit->param;
1087
+
1088
+    if (count($params) < 1) {
1089
+        return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1090
+    }
1091
+
1092
+    $boucle = &$boucles[$idb];
1093
+    $parent = $boucle->id_parent;
1094
+    $fields = $boucle->show['field'];
1095
+
1096
+    $date = array_shift($params);
1097
+    $type = array_shift($params);
1098
+
1099
+    // la valeur $type doit etre connue a la compilation
1100
+    // donc etre forcement reduite a un litteral unique dans le source
1101
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1102
+
1103
+    // La valeur date doit designer un champ de la table SQL.
1104
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1105
+    // sinon synthetiser le test de verif pour execution ulterieure
1106
+    // On prendra arbitrairement le premier champ si test negatif.
1107
+    if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1108
+        $date = $date[0]->texte;
1109
+        if (!isset($fields[$date])) {
1110
+            return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1111
+        }
1112
+    } else {
1113
+        $a = calculer_liste($date, array(), $boucles, $parent);
1114
+        $noms = array_keys($fields);
1115
+        $defaut = $noms[0];
1116
+        $noms = join(" ", $noms);
1117
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1118
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1119
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1120
+    }
1121
+    $annee = $params ? array_shift($params) : "";
1122
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1123
+        calculer_liste($annee, array(), $boucles, $parent) .
1124
+        ') ? $x : date("Y"))';
1125
+
1126
+    $mois = $params ? array_shift($params) : "";
1127
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1128
+        calculer_liste($mois, array(), $boucles, $parent) .
1129
+        ') ? $x : date("m"))';
1130
+
1131
+    $jour = $params ? array_shift($params) : "";
1132
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1133
+        calculer_liste($jour, array(), $boucles, $parent) .
1134
+        ') ? $x : date("d"))';
1135
+
1136
+    $annee2 = $params ? array_shift($params) : "";
1137
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1138
+        calculer_liste($annee2, array(), $boucles, $parent) .
1139
+        ') ? $x : date("Y"))';
1140
+
1141
+    $mois2 = $params ? array_shift($params) : "";
1142
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1143
+        calculer_liste($mois2, array(), $boucles, $parent) .
1144
+        ') ? $x : date("m"))';
1145
+
1146
+    $jour2 = $params ? array_shift($params) : "";
1147
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1148
+        calculer_liste($jour2, array(), $boucles, $parent) .
1149
+        ') ? $x : date("d"))';
1150
+
1151
+    $date = $boucle->id_table . ".$date";
1152
+
1153
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1154
+    if ($type == 'jour') {
1155
+        $boucle->where[] = array(
1156
+            "'='",
1157
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1158
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1159
+        );
1160
+    } elseif ($type == 'mois') {
1161
+        $boucle->where[] = array(
1162
+            "'='",
1163
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1164
+            ("sql_quote($annee . $mois$quote_end)")
1165
+        );
1166
+    } elseif ($type == 'semaine') {
1167
+        $boucle->where[] = array(
1168
+            "'AND'",
1169
+            array(
1170
+                "'>='",
1171
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1172
+                ("date_debut_semaine($annee, $mois, $jour)")
1173
+            ),
1174
+            array(
1175
+                "'<='",
1176
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1177
+                ("date_fin_semaine($annee, $mois, $jour)")
1178
+            )
1179
+        );
1180
+    } elseif (count($crit->param) > 2) {
1181
+        $boucle->where[] = array(
1182
+            "'AND'",
1183
+            array(
1184
+                "'>='",
1185
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1186
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1187
+            ),
1188
+            array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))
1189
+        );
1190
+    }
1191
+    // sinon on prend tout
1192 1192
 }
1193 1193
 
1194 1194
 
@@ -1213,33 +1213,33 @@  discard block
 block discarded – undo
1213 1213
  * @return void
1214 1214
  **/
1215 1215
 function calculer_critere_parties($idb, &$boucles, $crit) {
1216
-	$boucle = &$boucles[$idb];
1217
-	$a1 = $crit->param[0];
1218
-	$a2 = $crit->param[1];
1219
-	$op = $crit->op;
1220
-
1221
-	list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1222
-	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1223
-
1224
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1225
-		$boucle->limit = $a11 . ',' . $a21;
1226
-	} else {
1227
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1228
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1229
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1230
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1231
-		$mode = (($op == '/') ? '/' :
1232
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1233
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1234
-		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1235
-			$boucle->limit =
1236
-				(is_numeric($a11) ? "'$a11'" : $a11)
1237
-				. ".','."
1238
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1239
-		} else {
1240
-			calculer_parties($boucles, $idb, $partie, $mode);
1241
-		}
1242
-	}
1216
+    $boucle = &$boucles[$idb];
1217
+    $a1 = $crit->param[0];
1218
+    $a2 = $crit->param[1];
1219
+    $op = $crit->op;
1220
+
1221
+    list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1);
1222
+    list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1223
+
1224
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1225
+        $boucle->limit = $a11 . ',' . $a21;
1226
+    } else {
1227
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1228
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1229
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1230
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1231
+        $mode = (($op == '/') ? '/' :
1232
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1233
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1234
+        if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1235
+            $boucle->limit =
1236
+                (is_numeric($a11) ? "'$a11'" : $a11)
1237
+                . ".','."
1238
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1239
+        } else {
1240
+            calculer_parties($boucles, $idb, $partie, $mode);
1241
+        }
1242
+    }
1243 1243
 }
1244 1244
 
1245 1245
 /**
@@ -1267,63 +1267,63 @@  discard block
 block discarded – undo
1267 1267
  * @return void
1268 1268
  **/
1269 1269
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1270
-	$total_parties = $boucles[$id_boucle]->total_parties;
1271
-
1272
-	preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1273
-	list(, $op1, $op2) = array_pad($regs, 3, null);
1274
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1275
-	// {1/3}
1276
-	if ($op1 == '/') {
1277
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1278
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1279
-			"($total_parties ? $total_parties : 1)";
1280
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1281
-		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1282
-	} else {
1283
-		// cas {n-1,x}
1284
-		if ($op1 == '-') {
1285
-			$debut = "$nombre_boucle - $debut;";
1286
-		}
1287
-
1288
-		// cas {x,n-1}
1289
-		if ($op2 == '-') {
1290
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1291
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1292
-					($total_parties . ' - 1'));
1293
-		} else {
1294
-			// {x,1} ou {pagination}
1295
-			$fin = '$debut_boucle'
1296
-				. (is_numeric($total_parties) ?
1297
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1298
-					('+' . $total_parties . ' - 1'));
1299
-		}
1300
-
1301
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1302
-		if ($op1 == 'p') {
1303
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1304
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1305
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1306
-		}
1307
-	}
1308
-
1309
-	// Notes :
1310
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1311
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1312
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1313
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1314
-
1315
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1316
-		. '$debut_boucle = ' . $debut . ";\n	"
1317
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1318
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1319
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1320
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1321
-		. "\n\tif (\$debut_boucle>0"
1322
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1323
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1324
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1325
-
1326
-	$boucles[$id_boucle]->partie = "
1270
+    $total_parties = $boucles[$id_boucle]->total_parties;
1271
+
1272
+    preg_match(",([+-/p])([+-/])?,", $mode, $regs);
1273
+    list(, $op1, $op2) = array_pad($regs, 3, null);
1274
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1275
+    // {1/3}
1276
+    if ($op1 == '/') {
1277
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1278
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1279
+            "($total_parties ? $total_parties : 1)";
1280
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1281
+        $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1282
+    } else {
1283
+        // cas {n-1,x}
1284
+        if ($op1 == '-') {
1285
+            $debut = "$nombre_boucle - $debut;";
1286
+        }
1287
+
1288
+        // cas {x,n-1}
1289
+        if ($op2 == '-') {
1290
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1291
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1292
+                    ($total_parties . ' - 1'));
1293
+        } else {
1294
+            // {x,1} ou {pagination}
1295
+            $fin = '$debut_boucle'
1296
+                . (is_numeric($total_parties) ?
1297
+                    (($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1298
+                    ('+' . $total_parties . ' - 1'));
1299
+        }
1300
+
1301
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1302
+        if ($op1 == 'p') {
1303
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1304
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1305
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1306
+        }
1307
+    }
1308
+
1309
+    // Notes :
1310
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1311
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1312
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1313
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1314
+
1315
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1316
+        . '$debut_boucle = ' . $debut . ";\n	"
1317
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1318
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1319
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1320
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1321
+        . "\n\tif (\$debut_boucle>0"
1322
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1323
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1324
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1325
+
1326
+    $boucles[$id_boucle]->partie = "
1327 1327
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1328 1328
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1329 1329
 }
@@ -1340,26 +1340,26 @@  discard block
 block discarded – undo
1340 1340
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1341 1341
  **/
1342 1342
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1343
-	if ($param[0]->type != 'texte') {
1344
-		$a1 = calculer_liste(array($param[0]), array('id_mere' => $idb), $boucles, $boucles[$idb]->id_parent);
1345
-		if (isset($param[1]->texte)) {
1346
-			preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1347
-
1348
-			return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1349
-		} else {
1350
-			return array("intval($a1)", 0);
1351
-		}
1352
-	} else {
1353
-		preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1354
-		$a1 = $m[1];
1355
-		if (empty($m[3])) {
1356
-			return array($a1, 0);
1357
-		} elseif (!empty($m[4])) {
1358
-			return array($a1, $m[4]);
1359
-		} else {
1360
-			return array($a1, calculer_liste(array($param[1]), array(), $boucles, $boucles[$idb]->id_parent));
1361
-		}
1362
-	}
1343
+    if ($param[0]->type != 'texte') {
1344
+        $a1 = calculer_liste(array($param[0]), array('id_mere' => $idb), $boucles, $boucles[$idb]->id_parent);
1345
+        if (isset($param[1]->texte)) {
1346
+            preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m);
1347
+
1348
+            return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0));
1349
+        } else {
1350
+            return array("intval($a1)", 0);
1351
+        }
1352
+    } else {
1353
+        preg_match(',^ *(([0-9]+)|n) *(- *([0-9]+)? *)?$,', $param[0]->texte, $m);
1354
+        $a1 = $m[1];
1355
+        if (empty($m[3])) {
1356
+            return array($a1, 0);
1357
+        } elseif (!empty($m[4])) {
1358
+            return array($a1, $m[4]);
1359
+        } else {
1360
+            return array($a1, calculer_liste(array($param[1]), array(), $boucles, $boucles[$idb]->id_parent));
1361
+        }
1362
+    }
1363 1363
 }
1364 1364
 
1365 1365
 
@@ -1386,47 +1386,47 @@  discard block
 block discarded – undo
1386 1386
  *     array : Erreur sur un des critères
1387 1387
  **/
1388 1388
 function calculer_criteres($idb, &$boucles) {
1389
-	$msg = '';
1390
-	$boucle = $boucles[$idb];
1391
-	$table = strtoupper($boucle->type_requete);
1392
-	$serveur = strtolower($boucle->sql_serveur);
1393
-
1394
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1395
-	// s'il y avait une erreur de syntaxe, propager cette info
1396
-	if (!is_array($boucle->criteres)) {
1397
-		return array();
1398
-	}
1399
-
1400
-	foreach ($boucle->criteres as $crit) {
1401
-		$critere = $crit->op;
1402
-		// critere personnalise ?
1403
-		if (
1404
-			(!$serveur or
1405
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1406
-					and (!function_exists($f = $f . "_dist"))
1407
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1408
-					and (!function_exists($f = $f . "_dist"))
1409
-				)
1410
-			)
1411
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1412
-			and (!function_exists($f = $f . "_dist"))
1413
-			and (!function_exists($f = "critere_" . $critere))
1414
-			and (!function_exists($f = $f . "_dist"))
1415
-		) {
1416
-			// fonction critere standard
1417
-			$f = $defaut;
1418
-		}
1419
-		// compile le critere
1420
-		$res = $f($idb, $boucles, $crit);
1421
-
1422
-		// Gestion centralisee des erreurs pour pouvoir propager
1423
-		if (is_array($res)) {
1424
-			$msg = $res;
1425
-			erreur_squelette($msg, $boucle);
1426
-		}
1427
-	}
1428
-
1429
-	return $msg;
1389
+    $msg = '';
1390
+    $boucle = $boucles[$idb];
1391
+    $table = strtoupper($boucle->type_requete);
1392
+    $serveur = strtolower($boucle->sql_serveur);
1393
+
1394
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1395
+    // s'il y avait une erreur de syntaxe, propager cette info
1396
+    if (!is_array($boucle->criteres)) {
1397
+        return array();
1398
+    }
1399
+
1400
+    foreach ($boucle->criteres as $crit) {
1401
+        $critere = $crit->op;
1402
+        // critere personnalise ?
1403
+        if (
1404
+            (!$serveur or
1405
+                ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1406
+                    and (!function_exists($f = $f . "_dist"))
1407
+                    and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1408
+                    and (!function_exists($f = $f . "_dist"))
1409
+                )
1410
+            )
1411
+            and (!function_exists($f = "critere_" . $table . "_" . $critere))
1412
+            and (!function_exists($f = $f . "_dist"))
1413
+            and (!function_exists($f = "critere_" . $critere))
1414
+            and (!function_exists($f = $f . "_dist"))
1415
+        ) {
1416
+            // fonction critere standard
1417
+            $f = $defaut;
1418
+        }
1419
+        // compile le critere
1420
+        $res = $f($idb, $boucles, $crit);
1421
+
1422
+        // Gestion centralisee des erreurs pour pouvoir propager
1423
+        if (is_array($res)) {
1424
+            $msg = $res;
1425
+            erreur_squelette($msg, $boucle);
1426
+        }
1427
+    }
1428
+
1429
+    return $msg;
1430 1430
 }
1431 1431
 
1432 1432
 /**
@@ -1443,11 +1443,11 @@  discard block
 block discarded – undo
1443 1443
  * @return string         Code compilé rééchappé
1444 1444
  */
1445 1445
 function kwote($lisp, $serveur = '', $type = '') {
1446
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1447
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1448
-	} else {
1449
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1450
-	}
1446
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1447
+        return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1448
+    } else {
1449
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1450
+    }
1451 1451
 }
1452 1452
 
1453 1453
 
@@ -1466,85 +1466,85 @@  discard block
 block discarded – undo
1466 1466
  * @return void
1467 1467
  **/
1468 1468
 function critere_IN_dist($idb, &$boucles, $crit) {
1469
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1470
-	if (!$r) {
1471
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1472
-	}
1473
-	list($arg, $op, $val, $col, $where_complement) = $r;
1474
-
1475
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1476
-
1477
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1478
-	$where = $in;
1479
-	if ($crit->cond) {
1480
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1481
-		$where = array("'?'", $pred, $where, "''");
1482
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1483
-		{
1484
-			$where_complement = array("'?'", $pred, $where_complement, "''");
1485
-		}
1486
-	}
1487
-	if ($crit->exclus) {
1488
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1489
-			$where = array("'NOT'", $where);
1490
-		} else
1491
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1492
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1493
-		{
1494
-			$where = array(
1495
-				"'NOT'",
1496
-				array(
1497
-					"'IN'",
1498
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1499
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1500
-				)
1501
-			);
1502
-		}
1503
-	}
1504
-
1505
-	$boucles[$idb]->where[] = $where;
1506
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1507
-	{
1508
-		$boucles[$idb]->where[] = $where_complement;
1509
-	}
1469
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1470
+    if (!$r) {
1471
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1472
+    }
1473
+    list($arg, $op, $val, $col, $where_complement) = $r;
1474
+
1475
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1476
+
1477
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1478
+    $where = $in;
1479
+    if ($crit->cond) {
1480
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1481
+        $where = array("'?'", $pred, $where, "''");
1482
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1483
+        {
1484
+            $where_complement = array("'?'", $pred, $where_complement, "''");
1485
+        }
1486
+    }
1487
+    if ($crit->exclus) {
1488
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1489
+            $where = array("'NOT'", $where);
1490
+        } else
1491
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1492
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1493
+        {
1494
+            $where = array(
1495
+                "'NOT'",
1496
+                array(
1497
+                    "'IN'",
1498
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1499
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1500
+                )
1501
+            );
1502
+        }
1503
+    }
1504
+
1505
+    $boucles[$idb]->where[] = $where;
1506
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1507
+    {
1508
+        $boucles[$idb]->where[] = $where_complement;
1509
+    }
1510 1510
 }
1511 1511
 
1512 1512
 // http://code.spip.net/@critere_IN_cas
1513 1513
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1514
-	static $num = array();
1515
-	$descr = $boucles[$idb]->descr;
1516
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1517
-
1518
-	$var = '$in' . $cpt++;
1519
-	$x = "\n\t$var = array();";
1520
-	foreach ($val as $k => $v) {
1521
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1522
-			// optimiser le traitement des constantes
1523
-			if (is_numeric($r[2])) {
1524
-				$x .= "\n\t$var" . "[]= $r[2];";
1525
-			} else {
1526
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1527
-			}
1528
-		} else {
1529
-			// Pour permettre de passer des tableaux de valeurs
1530
-			// on repere l'utilisation brute de #ENV**{X},
1531
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1532
-			// et on deballe mais en rajoutant l'anti XSS
1533
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1534
-		}
1535
-	}
1536
-
1537
-	$boucles[$idb]->in .= $x;
1538
-
1539
-	// inserer le tri par defaut selon les ordres du IN ...
1540
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1541
-	// et que l'on limite donc strictement aux cas necessaires :
1542
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1543
-	if (!$crit2) {
1544
-		$boucles[$idb]->default_order[] = "((!sql_quote($var) OR sql_quote($var)===\"''\") ? 0 : ('FIELD($arg,' . sql_quote($var) . ')'))";
1545
-	}
1546
-
1547
-	return "sql_in('$arg',sql_quote($var)" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1514
+    static $num = array();
1515
+    $descr = $boucles[$idb]->descr;
1516
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1517
+
1518
+    $var = '$in' . $cpt++;
1519
+    $x = "\n\t$var = array();";
1520
+    foreach ($val as $k => $v) {
1521
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1522
+            // optimiser le traitement des constantes
1523
+            if (is_numeric($r[2])) {
1524
+                $x .= "\n\t$var" . "[]= $r[2];";
1525
+            } else {
1526
+                $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1527
+            }
1528
+        } else {
1529
+            // Pour permettre de passer des tableaux de valeurs
1530
+            // on repere l'utilisation brute de #ENV**{X},
1531
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1532
+            // et on deballe mais en rajoutant l'anti XSS
1533
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1534
+        }
1535
+    }
1536
+
1537
+    $boucles[$idb]->in .= $x;
1538
+
1539
+    // inserer le tri par defaut selon les ordres du IN ...
1540
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1541
+    // et que l'on limite donc strictement aux cas necessaires :
1542
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1543
+    if (!$crit2) {
1544
+        $boucles[$idb]->default_order[] = "((!sql_quote($var) OR sql_quote($var)===\"''\") ? 0 : ('FIELD($arg,' . sql_quote($var) . ')'))";
1545
+    }
1546
+
1547
+    return "sql_in('$arg',sql_quote($var)" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1548 1548
 }
1549 1549
 
1550 1550
 /**
@@ -1560,22 +1560,22 @@  discard block
 block discarded – undo
1560 1560
  * @return void
1561 1561
  */
1562 1562
 function critere_where_dist($idb, &$boucles, $crit) {
1563
-	$boucle = &$boucles[$idb];
1564
-	if (isset($crit->param[0])) {
1565
-		$_where = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
1566
-	} else {
1567
-		$_where = '@$Pile[0]["where"]';
1568
-	}
1569
-
1570
-	if ($crit->cond) {
1571
-		$_where = "(($_where) ? ($_where) : '')";
1572
-	}
1573
-
1574
-	if ($crit->not) {
1575
-		$_where = "array('NOT',$_where)";
1576
-	}
1577
-
1578
-	$boucle->where[] = $_where;
1563
+    $boucle = &$boucles[$idb];
1564
+    if (isset($crit->param[0])) {
1565
+        $_where = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent);
1566
+    } else {
1567
+        $_where = '@$Pile[0]["where"]';
1568
+    }
1569
+
1570
+    if ($crit->cond) {
1571
+        $_where = "(($_where) ? ($_where) : '')";
1572
+    }
1573
+
1574
+    if ($crit->not) {
1575
+        $_where = "array('NOT',$_where)";
1576
+    }
1577
+
1578
+    $boucle->where[] = $_where;
1579 1579
 }
1580 1580
 
1581 1581
 /**
@@ -1603,26 +1603,26 @@  discard block
 block discarded – undo
1603 1603
  * @return void
1604 1604
  */
1605 1605
 function critere_id__dist($idb, &$boucles, $crit) {
1606
-	/** @var Boucle $boucle */
1607
-	$boucle = $boucles[$idb];
1608
-
1609
-	$champs = lister_champs_selection_conditionnelle(
1610
-		$boucle->show['table'],
1611
-		$boucle->show,
1612
-		$boucle->sql_serveur
1613
-	);
1614
-
1615
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1616
-	$boucle->modificateur['id_'] = $champs;
1617
-
1618
-	// créer un critère {id_xxx?} de chaque champ retenu
1619
-	foreach ($champs as $champ) {
1620
-		$critere_id_table = new Critere;
1621
-		$critere_id_table->op = $champ;
1622
-		$critere_id_table->cond = '?';
1623
-		$critere_id_table->ligne = $crit->ligne;
1624
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1625
-	}
1606
+    /** @var Boucle $boucle */
1607
+    $boucle = $boucles[$idb];
1608
+
1609
+    $champs = lister_champs_selection_conditionnelle(
1610
+        $boucle->show['table'],
1611
+        $boucle->show,
1612
+        $boucle->sql_serveur
1613
+    );
1614
+
1615
+    $boucle->debug[] = "id_ : " . implode(', ', $champs);
1616
+    $boucle->modificateur['id_'] = $champs;
1617
+
1618
+    // créer un critère {id_xxx?} de chaque champ retenu
1619
+    foreach ($champs as $champ) {
1620
+        $critere_id_table = new Critere;
1621
+        $critere_id_table->op = $champ;
1622
+        $critere_id_table->cond = '?';
1623
+        $critere_id_table->ligne = $crit->ligne;
1624
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1625
+    }
1626 1626
 }
1627 1627
 
1628 1628
 /**
@@ -1642,67 +1642,67 @@  discard block
 block discarded – undo
1642 1642
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1643 1643
  */
1644 1644
 function lister_champs_selection_conditionnelle($table, $desc = null, $serveur = '') {
1645
-	// calculer la description de la table
1646
-	if (!is_array($desc)) {
1647
-		$desc = description_table($table, $serveur);
1648
-	}
1649
-	if (!$desc) {
1650
-		return [];
1651
-	}
1652
-
1653
-	// Les champs id_xx de la table demandée
1654
-	$champs = array_filter(
1655
-		array_keys($desc['field']),
1656
-		function($champ){
1657
-			return
1658
-				strpos($champ, 'id_') === 0
1659
-				or (in_array($champ, array('objet')));
1660
-		}
1661
-	);
1662
-
1663
-	// On ne fera pas mieux pour les tables d’un autre serveur
1664
-	if ($serveur) {
1665
-		return $champs;
1666
-	}
1667
-
1668
-	$primary = false;
1669
-	$associable = false;
1670
-	include_spip('action/editer_liens');
1671
-
1672
-	if (isset($desc['type'])) {
1673
-		$primary = id_table_objet($desc['type']);
1674
-		$associable = objet_associable($desc['type']);
1675
-	}
1676
-	if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1677
-		$associable = true;
1678
-	}
1679
-
1680
-	// liste de toutes les tables principales, sauf la notre
1681
-	$tables = lister_tables_objets_sql();
1682
-	unset($tables[$table]);
1683
-
1684
-	foreach ($tables as $_table => $_desc) {
1685
-		if (
1686
-			$associable
1687
-			or ($primary and in_array($primary, array_keys($_desc['field'])))
1688
-			or objet_associable($_desc['type'])
1689
-		) {
1690
-			$champs[] = id_table_objet($_table);
1691
-		}
1692
-	}
1693
-	$champs = array_unique($champs);
1694
-	$champs = pipeline(
1695
-		'lister_champs_selection_conditionnelle',
1696
-		array(
1697
-			'args' => array(
1698
-				'table' => $table,
1699
-				'id_table_objet' => $primary,
1700
-				'associable' => $associable,
1701
-			),
1702
-			'data' => $champs,
1703
-		)
1704
-	);
1705
-	return $champs;
1645
+    // calculer la description de la table
1646
+    if (!is_array($desc)) {
1647
+        $desc = description_table($table, $serveur);
1648
+    }
1649
+    if (!$desc) {
1650
+        return [];
1651
+    }
1652
+
1653
+    // Les champs id_xx de la table demandée
1654
+    $champs = array_filter(
1655
+        array_keys($desc['field']),
1656
+        function($champ){
1657
+            return
1658
+                strpos($champ, 'id_') === 0
1659
+                or (in_array($champ, array('objet')));
1660
+        }
1661
+    );
1662
+
1663
+    // On ne fera pas mieux pour les tables d’un autre serveur
1664
+    if ($serveur) {
1665
+        return $champs;
1666
+    }
1667
+
1668
+    $primary = false;
1669
+    $associable = false;
1670
+    include_spip('action/editer_liens');
1671
+
1672
+    if (isset($desc['type'])) {
1673
+        $primary = id_table_objet($desc['type']);
1674
+        $associable = objet_associable($desc['type']);
1675
+    }
1676
+    if (isset($desc['field']['id_objet']) and isset($desc['field']['objet'])) {
1677
+        $associable = true;
1678
+    }
1679
+
1680
+    // liste de toutes les tables principales, sauf la notre
1681
+    $tables = lister_tables_objets_sql();
1682
+    unset($tables[$table]);
1683
+
1684
+    foreach ($tables as $_table => $_desc) {
1685
+        if (
1686
+            $associable
1687
+            or ($primary and in_array($primary, array_keys($_desc['field'])))
1688
+            or objet_associable($_desc['type'])
1689
+        ) {
1690
+            $champs[] = id_table_objet($_table);
1691
+        }
1692
+    }
1693
+    $champs = array_unique($champs);
1694
+    $champs = pipeline(
1695
+        'lister_champs_selection_conditionnelle',
1696
+        array(
1697
+            'args' => array(
1698
+                'table' => $table,
1699
+                'id_table_objet' => $primary,
1700
+                'associable' => $associable,
1701
+            ),
1702
+            'data' => $champs,
1703
+        )
1704
+    );
1705
+    return $champs;
1706 1706
 }
1707 1707
 
1708 1708
 /**
@@ -1757,27 +1757,27 @@  discard block
 block discarded – undo
1757 1757
  * @return void
1758 1758
  */
1759 1759
 function critere_tri_dist($idb, &$boucles, $crit) {
1760
-	$boucle = &$boucles[$idb];
1761
-
1762
-	// definition du champ par defaut
1763
-	$_champ_defaut = !isset($crit->param[0][0]) ? "''"
1764
-		: calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
1765
-	$_sens_defaut = !isset($crit->param[1][0]) ? "1"
1766
-		: calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
1767
-	$_variable = !isset($crit->param[2][0]) ? "'$idb'"
1768
-		: calculer_liste(array($crit->param[2][0]), array(), $boucles, $boucle->id_parent);
1769
-
1770
-	$_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):'')";
1771
-
1772
-	$_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1773
-	$_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)";
1774
-
1775
-	$boucle->modificateur['tri_champ'] = $_tri;
1776
-	$boucle->modificateur['tri_sens'] = $_sens;
1777
-	$boucle->modificateur['tri_nom'] = $_variable;
1778
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1779
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1780
-	$boucle->hash .= "
1760
+    $boucle = &$boucles[$idb];
1761
+
1762
+    // definition du champ par defaut
1763
+    $_champ_defaut = !isset($crit->param[0][0]) ? "''"
1764
+        : calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent);
1765
+    $_sens_defaut = !isset($crit->param[1][0]) ? "1"
1766
+        : calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
1767
+    $_variable = !isset($crit->param[2][0]) ? "'$idb'"
1768
+        : calculer_liste(array($crit->param[2][0]), array(), $boucles, $boucle->id_parent);
1769
+
1770
+    $_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):'')";
1771
+
1772
+    $_sens_defaut = "(is_array(\$s=$_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1773
+    $_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)";
1774
+
1775
+    $boucle->modificateur['tri_champ'] = $_tri;
1776
+    $boucle->modificateur['tri_sens'] = $_sens;
1777
+    $boucle->modificateur['tri_nom'] = $_variable;
1778
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1779
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1780
+    $boucle->hash .= "
1781 1781
 	\$senstri = '';
1782 1782
 	\$tri = $_tri;
1783 1783
 	if (\$tri){
@@ -1785,8 +1785,8 @@  discard block
 block discarded – undo
1785 1785
 		\$senstri = (\$senstri<0)?' DESC':'';
1786 1786
 	};
1787 1787
 	";
1788
-	$boucle->select[] = "\".tri_champ_select(\$tri).\"";
1789
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1788
+    $boucle->select[] = "\".tri_champ_select(\$tri).\"";
1789
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from']).\$senstri";
1790 1790
 }
1791 1791
 
1792 1792
 # Criteres de comparaison
@@ -1803,20 +1803,20 @@  discard block
 block discarded – undo
1803 1803
  * @return void
1804 1804
  **/
1805 1805
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1806
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1807
-	if (($crit->op == ",") or ($crit->op == '/')) {
1808
-		return calculer_critere_parties($idb, $boucles, $crit);
1809
-	}
1810
-
1811
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1812
-	if (!$r) {
1813
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1814
-		#	if (!$crit->cond) {
1815
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1816
-		#	}
1817
-	} else {
1818
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1819
-	}
1806
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1807
+    if (($crit->op == ",") or ($crit->op == '/')) {
1808
+        return calculer_critere_parties($idb, $boucles, $crit);
1809
+    }
1810
+
1811
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1812
+    if (!$r) {
1813
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1814
+        #	if (!$crit->cond) {
1815
+        return (array('zbug_critere_inconnu', array('critere' => $crit->op)));
1816
+        #	}
1817
+    } else {
1818
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1819
+    }
1820 1820
 }
1821 1821
 
1822 1822
 
@@ -1836,63 +1836,63 @@  discard block
 block discarded – undo
1836 1836
  * @return void
1837 1837
  **/
1838 1838
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1839
-	list($arg, $op, $val, $col, $where_complement) = $args;
1840
-
1841
-	$where = array("'$op'", "'$arg'", $val[0]);
1842
-
1843
-	// inserer la negation (cf !...)
1844
-
1845
-	if ($crit->not) {
1846
-		$where = array("'NOT'", $where);
1847
-	}
1848
-	if ($crit->exclus) {
1849
-		if (!preg_match(",^L[0-9]+[.],", $arg)) {
1850
-			$where = array("'NOT'", $where);
1851
-		} else
1852
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1853
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1854
-		{
1855
-			$where = array(
1856
-				"'NOT'",
1857
-				array(
1858
-					"'IN'",
1859
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1860
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1861
-				)
1862
-			);
1863
-		}
1864
-	}
1865
-
1866
-	// inserer la condition (cf {lang?})
1867
-	// traiter a part la date, elle est mise d'office par SPIP,
1868
-	if ($crit->cond) {
1869
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1870
-		if ($col == "date" or $col == "date_redac") {
1871
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1872
-				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1873
-			}
1874
-		}
1875
-
1876
-		if ($op == '=' and !$crit->not) {
1877
-			$where = array(
1878
-				"'?'",
1879
-				"(is_array($pred))",
1880
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1881
-				$where
1882
-			);
1883
-		}
1884
-		$where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1885
-		if ($where_complement) // condition annexe du type "AND (objet='article')"
1886
-		{
1887
-			$where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1888
-		}
1889
-	}
1890
-
1891
-	$boucles[$idb]->where[] = $where;
1892
-	if ($where_complement) // condition annexe du type "AND (objet='article')"
1893
-	{
1894
-		$boucles[$idb]->where[] = $where_complement;
1895
-	}
1839
+    list($arg, $op, $val, $col, $where_complement) = $args;
1840
+
1841
+    $where = array("'$op'", "'$arg'", $val[0]);
1842
+
1843
+    // inserer la negation (cf !...)
1844
+
1845
+    if ($crit->not) {
1846
+        $where = array("'NOT'", $where);
1847
+    }
1848
+    if ($crit->exclus) {
1849
+        if (!preg_match(",^L[0-9]+[.],", $arg)) {
1850
+            $where = array("'NOT'", $where);
1851
+        } else
1852
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1853
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1854
+        {
1855
+            $where = array(
1856
+                "'NOT'",
1857
+                array(
1858
+                    "'IN'",
1859
+                    "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1860
+                    array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1861
+                )
1862
+            );
1863
+        }
1864
+    }
1865
+
1866
+    // inserer la condition (cf {lang?})
1867
+    // traiter a part la date, elle est mise d'office par SPIP,
1868
+    if ($crit->cond) {
1869
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1870
+        if ($col == "date" or $col == "date_redac") {
1871
+            if ($pred == "\$Pile[0]['" . $col . "']") {
1872
+                $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1873
+            }
1874
+        }
1875
+
1876
+        if ($op == '=' and !$crit->not) {
1877
+            $where = array(
1878
+                "'?'",
1879
+                "(is_array($pred))",
1880
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col),
1881
+                $where
1882
+            );
1883
+        }
1884
+        $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where);
1885
+        if ($where_complement) // condition annexe du type "AND (objet='article')"
1886
+        {
1887
+            $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement);
1888
+        }
1889
+    }
1890
+
1891
+    $boucles[$idb]->where[] = $where;
1892
+    if ($where_complement) // condition annexe du type "AND (objet='article')"
1893
+    {
1894
+        $boucles[$idb]->where[] = $where_complement;
1895
+    }
1896 1896
 }
1897 1897
 
1898 1898
 
@@ -1933,167 +1933,167 @@  discard block
 block discarded – undo
1933 1933
  **/
1934 1934
 function calculer_critere_infixe($idb, &$boucles, $crit) {
1935 1935
 
1936
-	$boucle = &$boucles[$idb];
1937
-	$type = $boucle->type_requete;
1938
-	$table = $boucle->id_table;
1939
-	$desc = $boucle->show;
1940
-	$col_vraie = null;
1941
-
1942
-	list($fct, $col, $op, $val, $args_sql) =
1943
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
1944
-
1945
-	$col_alias = $col;
1946
-	$where_complement = false;
1947
-
1948
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
1949
-	if ($col == 'id_enfant') {
1950
-		$col = $boucle->primary;
1951
-	}
1952
-
1953
-	// Cas particulier : id_parent => verifier les exceptions de tables
1954
-	if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
1955
-		or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
1956
-	) {
1957
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
1958
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
1959
-	else {
1960
-		if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
1961
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
1962
-		}
1963
-
1964
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
1965
-		// sauf si exception declaree : sauter cette etape
1966
-		else {
1967
-			if (
1968
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
1969
-				and !isset($GLOBALS['exceptions_des_jointures'][$col])
1970
-				and count(trouver_champs_decomposes($col, $desc)) > 1
1971
-			) {
1972
-				$e = decompose_champ_id_objet($col);
1973
-				$col = array_shift($e);
1974
-				$where_complement = primary_doublee($e, $table);
1975
-			} // Cas particulier : expressions de date
1976
-			else {
1977
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
1978
-					list($col, $col_vraie) = $c;
1979
-					$table = '';
1980
-				} // table explicitée {mots.titre}
1981
-				else {
1982
-					if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
1983
-						list(, $table, $col) = $r;
1984
-						$col_alias = $col;
1985
-
1986
-						$trouver_table = charger_fonction('trouver_table', 'base');
1987
-						if ($desc = $trouver_table($table, $boucle->sql_serveur)
1988
-							and isset($desc['field'][$col])
1989
-							and $cle = array_search($desc['table'], $boucle->from)
1990
-						) {
1991
-							$table = $cle;
1992
-						} else {
1993
-							$table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
1994
-						}
1995
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
1996
-						if (!$table) {
1997
-							return '';
1998
-						}
1999
-					}
2000
-					// si le champ n'est pas trouvé dans la table,
2001
-					// on cherche si une jointure peut l'obtenir
2002
-					elseif (@!array_key_exists($col, $desc['field'])) {
2003
-						// Champ joker * des iterateurs DATA qui accepte tout
2004
-						if (@array_key_exists('*', $desc['field'])) {
2005
-							$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
2006
-						}
2007
-						else {
2008
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2009
-							if (!$r) {
2010
-								return '';
2011
-							}
2012
-							list($col, $col_alias, $table, $where_complement, $desc) = $r;
2013
-						}
2014
-					}
2015
-				}
2016
-			}
2017
-		}
2018
-	}
2019
-
2020
-	$col_vraie = ($col_vraie ? $col_vraie : $col);
2021
-	// Dans tous les cas,
2022
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2023
-	// et passer dans sql_quote avec le type si connu
2024
-	// et int sinon si la valeur est numerique
2025
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2026
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2027
-	if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2028
-		$type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2029
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2030
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2031
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2032
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2033
-		}
2034
-		// sinon expliciter les
2035
-		// sql_quote(truc) en sql_quote(truc,'',type)
2036
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2037
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2038
-		// sans toucher aux
2039
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2040
-		// sql_quote(truc,'','varchar')
2041
-		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2042
-			// si pas deja un type
2043
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2044
-		) {
2045
-			$r = $r[1]
2046
-				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2047
-				. ",'" . addslashes($type_cast_quote) . "'";
2048
-			$val[0] = "sql_quote($r)";
2049
-		}
2050
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2051
-		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2052
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2053
-		}
2054
-	}
2055
-
2056
-	if(strpos($val[0], '@@defaultcast@@') !== false
2057
-	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2058
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2059
-	}
2060
-
2061
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2062
-	// leurs requetes par defaut, notamment le champ statut
2063
-	// Ne pas confondre champs de la table principale et des jointures
2064
-	if ($table === $boucle->id_table) {
2065
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2066
-		if ($col_alias != $col_vraie) {
2067
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2068
-		}
2069
-	}
2070
-
2071
-	// ajout pour le cas special d'une condition sur le champ statut:
2072
-	// il faut alors interdire a la fonction de boucle
2073
-	// de mettre ses propres criteres de statut
2074
-	// http://www.spip.net/@statut (a documenter)
2075
-	// garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2076
-	if ($col == 'statut') {
2077
-		$boucles[$idb]->statut = true;
2078
-	}
2079
-
2080
-	// inserer le nom de la table SQL devant le nom du champ
2081
-	if ($table) {
2082
-		if ($col[0] == "`") {
2083
-			$arg = "$table." . substr($col, 1, -1);
2084
-		} else {
2085
-			$arg = "$table.$col";
2086
-		}
2087
-	} else {
2088
-		$arg = $col;
2089
-	}
2090
-
2091
-	// inserer la fonction SQL
2092
-	if ($fct) {
2093
-		$arg = "$fct($arg$args_sql)";
2094
-	}
2095
-
2096
-	return array($arg, $op, $val, $col_alias, $where_complement);
1936
+    $boucle = &$boucles[$idb];
1937
+    $type = $boucle->type_requete;
1938
+    $table = $boucle->id_table;
1939
+    $desc = $boucle->show;
1940
+    $col_vraie = null;
1941
+
1942
+    list($fct, $col, $op, $val, $args_sql) =
1943
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
1944
+
1945
+    $col_alias = $col;
1946
+    $where_complement = false;
1947
+
1948
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
1949
+    if ($col == 'id_enfant') {
1950
+        $col = $boucle->primary;
1951
+    }
1952
+
1953
+    // Cas particulier : id_parent => verifier les exceptions de tables
1954
+    if ((in_array($col, array('id_parent', 'id_secteur')) and isset($GLOBALS['exceptions_des_tables'][$table][$col]))
1955
+        or (isset($GLOBALS['exceptions_des_tables'][$table][$col]) and is_string($GLOBALS['exceptions_des_tables'][$table][$col]))
1956
+    ) {
1957
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
1958
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
1959
+    else {
1960
+        if (($col == 'id_secteur') and ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) {
1961
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
1962
+        }
1963
+
1964
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
1965
+        // sauf si exception declaree : sauter cette etape
1966
+        else {
1967
+            if (
1968
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
1969
+                and !isset($GLOBALS['exceptions_des_jointures'][$col])
1970
+                and count(trouver_champs_decomposes($col, $desc)) > 1
1971
+            ) {
1972
+                $e = decompose_champ_id_objet($col);
1973
+                $col = array_shift($e);
1974
+                $where_complement = primary_doublee($e, $table);
1975
+            } // Cas particulier : expressions de date
1976
+            else {
1977
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
1978
+                    list($col, $col_vraie) = $c;
1979
+                    $table = '';
1980
+                } // table explicitée {mots.titre}
1981
+                else {
1982
+                    if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
1983
+                        list(, $table, $col) = $r;
1984
+                        $col_alias = $col;
1985
+
1986
+                        $trouver_table = charger_fonction('trouver_table', 'base');
1987
+                        if ($desc = $trouver_table($table, $boucle->sql_serveur)
1988
+                            and isset($desc['field'][$col])
1989
+                            and $cle = array_search($desc['table'], $boucle->from)
1990
+                        ) {
1991
+                            $table = $cle;
1992
+                        } else {
1993
+                            $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond or $op != '='));
1994
+                        }
1995
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
1996
+                        if (!$table) {
1997
+                            return '';
1998
+                        }
1999
+                    }
2000
+                    // si le champ n'est pas trouvé dans la table,
2001
+                    // on cherche si une jointure peut l'obtenir
2002
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2003
+                        // Champ joker * des iterateurs DATA qui accepte tout
2004
+                        if (@array_key_exists('*', $desc['field'])) {
2005
+                            $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
2006
+                        }
2007
+                        else {
2008
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2009
+                            if (!$r) {
2010
+                                return '';
2011
+                            }
2012
+                            list($col, $col_alias, $table, $where_complement, $desc) = $r;
2013
+                        }
2014
+                    }
2015
+                }
2016
+            }
2017
+        }
2018
+    }
2019
+
2020
+    $col_vraie = ($col_vraie ? $col_vraie : $col);
2021
+    // Dans tous les cas,
2022
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2023
+    // et passer dans sql_quote avec le type si connu
2024
+    // et int sinon si la valeur est numerique
2025
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2026
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2027
+    if ($op == '=' or in_array($op, $GLOBALS['table_criteres_infixes'])) {
2028
+        $type_cast_quote = (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL');
2029
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2030
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2031
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2032
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2033
+        }
2034
+        // sinon expliciter les
2035
+        // sql_quote(truc) en sql_quote(truc,'',type)
2036
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2037
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2038
+        // sans toucher aux
2039
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2040
+        // sql_quote(truc,'','varchar')
2041
+        elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2042
+            // si pas deja un type
2043
+            and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2044
+        ) {
2045
+            $r = $r[1]
2046
+                . ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2047
+                . ",'" . addslashes($type_cast_quote) . "'";
2048
+            $val[0] = "sql_quote($r)";
2049
+        }
2050
+        elseif(strpos($val[0], '@@defaultcast@@') !== false
2051
+          and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2052
+            $val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2053
+        }
2054
+    }
2055
+
2056
+    if(strpos($val[0], '@@defaultcast@@') !== false
2057
+      and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2058
+        $val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2059
+    }
2060
+
2061
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2062
+    // leurs requetes par defaut, notamment le champ statut
2063
+    // Ne pas confondre champs de la table principale et des jointures
2064
+    if ($table === $boucle->id_table) {
2065
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2066
+        if ($col_alias != $col_vraie) {
2067
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2068
+        }
2069
+    }
2070
+
2071
+    // ajout pour le cas special d'une condition sur le champ statut:
2072
+    // il faut alors interdire a la fonction de boucle
2073
+    // de mettre ses propres criteres de statut
2074
+    // http://www.spip.net/@statut (a documenter)
2075
+    // garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente
2076
+    if ($col == 'statut') {
2077
+        $boucles[$idb]->statut = true;
2078
+    }
2079
+
2080
+    // inserer le nom de la table SQL devant le nom du champ
2081
+    if ($table) {
2082
+        if ($col[0] == "`") {
2083
+            $arg = "$table." . substr($col, 1, -1);
2084
+        } else {
2085
+            $arg = "$table.$col";
2086
+        }
2087
+    } else {
2088
+        $arg = $col;
2089
+    }
2090
+
2091
+    // inserer la fonction SQL
2092
+    if ($fct) {
2093
+        $arg = "$fct($arg$args_sql)";
2094
+    }
2095
+
2096
+    return array($arg, $op, $val, $col_alias, $where_complement);
2097 2097
 }
2098 2098
 
2099 2099
 
@@ -2122,77 +2122,77 @@  discard block
 block discarded – undo
2122 2122
  **/
2123 2123
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2124 2124
 
2125
-	$where = '';
2126
-
2127
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2128
-	// gestion par les plugins des jointures tordues
2129
-	// pas automatiques mais necessaires
2130
-	$table_sql = table_objet_sql($table);
2131
-	if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2132
-		and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2133
-		and
2134
-		(
2135
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2136
-			or
2137
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2138
-		)
2139
-	) {
2140
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2141
-		$index = isset($t[$col])
2142
-			? $t[$col] : (isset($t['']) ? $t[''] : array());
2143
-
2144
-		if (count($index) == 3) {
2145
-			list($t, $col, $calculer_critere_externe) = $index;
2146
-		} elseif (count($index) == 2) {
2147
-			list($t, $col) = $t[$col];
2148
-		} elseif (count($index) == 1) {
2149
-			list($calculer_critere_externe) = $index;
2150
-			$t = $table;
2151
-		} else {
2152
-			$t = '';
2153
-		} // jointure non declaree. La trouver.
2154
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2155
-		list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2156
-	} else {
2157
-		$t = '';
2158
-	} // jointure non declaree. La trouver.
2159
-
2160
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2161
-
2162
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2163
-	// permet de forcer une table de lien quand il y a ambiguite
2164
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2165
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2166
-	$table = "";
2167
-	if ($boucle->jointures_explicites) {
2168
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2169
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2170
-	}
2171
-
2172
-	// et sinon on cherche parmi toutes les jointures declarees
2173
-	if (!$table) {
2174
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2175
-	}
2176
-
2177
-	if (!$table) {
2178
-		return '';
2179
-	}
2180
-
2181
-	// il ne reste plus qu'a trouver le champ dans les from
2182
-	list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2183
-
2184
-	if (count($cle) > 1 or reset($cle) !== $col) {
2185
-		$col_alias = $col; // id_article devient juste le nom d'origine
2186
-		if (count($cle) > 1 and reset($cle) == 'id_objet') {
2187
-			$e = decompose_champ_id_objet($col);
2188
-			$col = array_shift($e);
2189
-			$where = primary_doublee($e, $table);
2190
-		} else {
2191
-			$col = reset($cle);
2192
-		}
2193
-	}
2194
-
2195
-	return array($col, $col_alias, $table, $where, $desc);
2125
+    $where = '';
2126
+
2127
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2128
+    // gestion par les plugins des jointures tordues
2129
+    // pas automatiques mais necessaires
2130
+    $table_sql = table_objet_sql($table);
2131
+    if (isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2132
+        and is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2133
+        and
2134
+        (
2135
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2136
+            or
2137
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2138
+        )
2139
+    ) {
2140
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2141
+        $index = isset($t[$col])
2142
+            ? $t[$col] : (isset($t['']) ? $t[''] : array());
2143
+
2144
+        if (count($index) == 3) {
2145
+            list($t, $col, $calculer_critere_externe) = $index;
2146
+        } elseif (count($index) == 2) {
2147
+            list($t, $col) = $t[$col];
2148
+        } elseif (count($index) == 1) {
2149
+            list($calculer_critere_externe) = $index;
2150
+            $t = $table;
2151
+        } else {
2152
+            $t = '';
2153
+        } // jointure non declaree. La trouver.
2154
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2155
+        list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col];
2156
+    } else {
2157
+        $t = '';
2158
+    } // jointure non declaree. La trouver.
2159
+
2160
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2161
+
2162
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2163
+    // permet de forcer une table de lien quand il y a ambiguite
2164
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2165
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2166
+    $table = "";
2167
+    if ($boucle->jointures_explicites) {
2168
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2169
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond or $op != '='), $t);
2170
+    }
2171
+
2172
+    // et sinon on cherche parmi toutes les jointures declarees
2173
+    if (!$table) {
2174
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond or $op != '='), $t);
2175
+    }
2176
+
2177
+    if (!$table) {
2178
+        return '';
2179
+    }
2180
+
2181
+    // il ne reste plus qu'a trouver le champ dans les from
2182
+    list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle);
2183
+
2184
+    if (count($cle) > 1 or reset($cle) !== $col) {
2185
+        $col_alias = $col; // id_article devient juste le nom d'origine
2186
+        if (count($cle) > 1 and reset($cle) == 'id_objet') {
2187
+            $e = decompose_champ_id_objet($col);
2188
+            $col = array_shift($e);
2189
+            $where = primary_doublee($e, $table);
2190
+        } else {
2191
+            $col = reset($cle);
2192
+        }
2193
+    }
2194
+
2195
+    return array($col, $col_alias, $table, $where, $desc);
2196 2196
 }
2197 2197
 
2198 2198
 
@@ -2213,10 +2213,10 @@  discard block
 block discarded – undo
2213 2213
  *     - valeur
2214 2214
  **/
2215 2215
 function primary_doublee($decompose, $table) {
2216
-	$e1 = reset($decompose);
2217
-	$e2 = "sql_quote('" . end($decompose) . "')";
2216
+    $e1 = reset($decompose);
2217
+    $e2 = "sql_quote('" . end($decompose) . "')";
2218 2218
 
2219
-	return array("'='", "'$table." . $e1 . "'", $e2);
2219
+    return array("'='", "'$table." . $e1 . "'", $e2);
2220 2220
 }
2221 2221
 
2222 2222
 /**
@@ -2247,56 +2247,56 @@  discard block
 block discarded – undo
2247 2247
  *     Vide sinon.
2248 2248
  */
2249 2249
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2250
-	// si on demande un truc du genre spip_mots
2251
-	// avec aussi spip_mots_liens dans les jointures dispo
2252
-	// et qu'on est la
2253
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2254
-	if ($checkarrivee
2255
-		and is_string($checkarrivee)
2256
-		and $a = table_objet($checkarrivee)
2257
-		and in_array($a . '_liens', $joints)
2258
-	) {
2259
-		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2260
-			return $res;
2261
-		}
2262
-	}
2263
-	foreach ($joints as $joint) {
2264
-		if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2265
-			// alias de table dans le from
2266
-			$t = array_search($arrivee[0], $boucle->from);
2267
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2268
-			$cols = $arrivee[2];
2269
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2270
-			if (count($cols) > 2) {
2271
-				array_pop($cols);
2272
-			}
2273
-			if ($t) {
2274
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2275
-				$joindre = false;
2276
-				foreach ($cols as $col) {
2277
-					$c = '/\b' . $t . ".$col" . '\b/';
2278
-					if (trouver_champ($c, $boucle->where)) {
2279
-						$joindre = true;
2280
-					} else {
2281
-						// mais ca peut etre dans le FIELD pour le Having
2282
-						$c = "/FIELD.$t" . ".$col,/";
2283
-						if (trouver_champ($c, $boucle->select)) {
2284
-							$joindre = true;
2285
-						}
2286
-					}
2287
-				}
2288
-				if (!$joindre) {
2289
-					return $t;
2290
-				}
2291
-			}
2292
-			array_pop($arrivee);
2293
-			if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2294
-				return $res;
2295
-			}
2296
-		}
2297
-	}
2298
-
2299
-	return '';
2250
+    // si on demande un truc du genre spip_mots
2251
+    // avec aussi spip_mots_liens dans les jointures dispo
2252
+    // et qu'on est la
2253
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2254
+    if ($checkarrivee
2255
+        and is_string($checkarrivee)
2256
+        and $a = table_objet($checkarrivee)
2257
+        and in_array($a . '_liens', $joints)
2258
+    ) {
2259
+        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2260
+            return $res;
2261
+        }
2262
+    }
2263
+    foreach ($joints as $joint) {
2264
+        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
2265
+            // alias de table dans le from
2266
+            $t = array_search($arrivee[0], $boucle->from);
2267
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2268
+            $cols = $arrivee[2];
2269
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2270
+            if (count($cols) > 2) {
2271
+                array_pop($cols);
2272
+            }
2273
+            if ($t) {
2274
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2275
+                $joindre = false;
2276
+                foreach ($cols as $col) {
2277
+                    $c = '/\b' . $t . ".$col" . '\b/';
2278
+                    if (trouver_champ($c, $boucle->where)) {
2279
+                        $joindre = true;
2280
+                    } else {
2281
+                        // mais ca peut etre dans le FIELD pour le Having
2282
+                        $c = "/FIELD.$t" . ".$col,/";
2283
+                        if (trouver_champ($c, $boucle->select)) {
2284
+                            $joindre = true;
2285
+                        }
2286
+                    }
2287
+                }
2288
+                if (!$joindre) {
2289
+                    return $t;
2290
+                }
2291
+            }
2292
+            array_pop($arrivee);
2293
+            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
2294
+                return $res;
2295
+            }
2296
+        }
2297
+    }
2298
+
2299
+    return '';
2300 2300
 
2301 2301
 }
2302 2302
 
@@ -2323,29 +2323,29 @@  discard block
 block discarded – undo
2323 2323
  *     Alias de la table de jointure (Lx)
2324 2324
  */
2325 2325
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2326
-	$primary_arrivee = id_table_objet($checkarrivee);
2327
-
2328
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2329
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2330
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2331
-
2332
-	if (!$intermediaire or !$arrivee) {
2333
-		return '';
2334
-	}
2335
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2336
-	array_pop($arrivee); // enlever la cle en 3eme argument
2337
-
2338
-	$res = fabrique_jointures($boucle,
2339
-		array(
2340
-			array(
2341
-				$boucle->id_table,
2342
-				$intermediaire,
2343
-				array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2344
-			),
2345
-			array(reset($intermediaire), $arrivee, $primary_arrivee)
2346
-		), $cond, $desc, $boucle->id_table, array($col));
2347
-
2348
-	return $res;
2326
+    $primary_arrivee = id_table_objet($checkarrivee);
2327
+
2328
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2329
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2330
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2331
+
2332
+    if (!$intermediaire or !$arrivee) {
2333
+        return '';
2334
+    }
2335
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2336
+    array_pop($arrivee); // enlever la cle en 3eme argument
2337
+
2338
+    $res = fabrique_jointures($boucle,
2339
+        array(
2340
+            array(
2341
+                $boucle->id_table,
2342
+                $intermediaire,
2343
+                array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])
2344
+            ),
2345
+            array(reset($intermediaire), $arrivee, $primary_arrivee)
2346
+        ), $cond, $desc, $boucle->id_table, array($col));
2347
+
2348
+    return $res;
2349 2349
 }
2350 2350
 
2351 2351
 
@@ -2362,17 +2362,17 @@  discard block
 block discarded – undo
2362 2362
  *     false sinon.
2363 2363
  **/
2364 2364
 function trouver_champ($champ, $where) {
2365
-	if (!is_array($where)) {
2366
-		return preg_match($champ, $where);
2367
-	} else {
2368
-		foreach ($where as $clause) {
2369
-			if (trouver_champ($champ, $clause)) {
2370
-				return true;
2371
-			}
2372
-		}
2373
-
2374
-		return false;
2375
-	}
2365
+    if (!is_array($where)) {
2366
+        return preg_match($champ, $where);
2367
+    } else {
2368
+        foreach ($where as $clause) {
2369
+            if (trouver_champ($champ, $clause)) {
2370
+                return true;
2371
+            }
2372
+        }
2373
+
2374
+        return false;
2375
+    }
2376 2376
 }
2377 2377
 
2378 2378
 
@@ -2398,129 +2398,129 @@  discard block
 block discarded – undo
2398 2398
  *     - string $args_sql  Suite des arguments du critère. ?
2399 2399
  **/
2400 2400
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2401
-	// cas d'une valeur comparee a elle-meme ou son referent
2402
-	if (count($crit->param) == 0) {
2403
-		$op = '=';
2404
-		$col = $val = $crit->op;
2405
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2406
-			$val = $r[2];
2407
-		}
2408
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2409
-		if ($val == 'lang') {
2410
-			$val = array(kwote('$GLOBALS[\'spip_lang\']'));
2411
-		} else {
2412
-			$defaut = null;
2413
-			if ($val == 'id_parent') {
2414
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2415
-				// de la boucle superieure.... faudrait verifier qu'il existe
2416
-				// pour eviter l'erreur SQL
2417
-				$val = $boucles[$idb]->primary;
2418
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2419
-				$defaut = "@\$Pile[0]['id_parent']";
2420
-			} elseif ($val == 'id_enfant') {
2421
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2422
-				// de la boucle superieure
2423
-				$val = 'id_parent';
2424
-			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2425
-				// un critere conditionnel sur date est traite a part
2426
-				// car la date est mise d'office par SPIP,
2427
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2428
-			}
2429
-
2430
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2431
-			$val = array(kwote($val));
2432
-		}
2433
-	} else {
2434
-		// comparaison explicite
2435
-		// le phraseur impose que le premier param soit du texte
2436
-		$params = $crit->param;
2437
-		$op = $crit->op;
2438
-		if ($op == '==') {
2439
-			$op = 'REGEXP';
2440
-		}
2441
-		$col = array_shift($params);
2442
-		$col = $col[0]->texte;
2443
-
2444
-		$val = array();
2445
-		$desc = array('id_mere' => $idb);
2446
-		$parent = $boucles[$idb]->id_parent;
2447
-
2448
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2449
-		// celui ne sachant pas ce qu'est un critere infixe
2450
-		// et a fortiori son 2e operande qu'entoure " ou '
2451
-		if (count($params) == 1
2452
-			and count($params[0]) == 3
2453
-			and $params[0][0]->type == 'texte'
2454
-			and $params[0][2]->type == 'texte'
2455
-			and ($p = $params[0][0]->texte) == $params[0][2]->texte
2456
-			and (($p == "'") or ($p == '"'))
2457
-			and $params[0][1]->type == 'champ'
2458
-		) {
2459
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2460
-		} else {
2461
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2462
-				$a = calculer_liste($p, $desc, $boucles, $parent);
2463
-				if (strcasecmp($op, 'IN') == 0) {
2464
-					$val[] = $a;
2465
-				} else {
2466
-					$val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2467
-				} // toujours quoter en char ici
2468
-			}
2469
-		}
2470
-	}
2471
-
2472
-	$fct = $args_sql = '';
2473
-	// fonction SQL ?
2474
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2475
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2476
-		$fct = $m[1];
2477
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2478
-		$col = $a[1];
2479
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2480
-			$col = $m[1];
2481
-			$args_sql = $m[2];
2482
-		}
2483
-		$args_sql .= $a[2];
2484
-	}
2485
-
2486
-	return array($fct, $col, $op, $val, $args_sql);
2401
+    // cas d'une valeur comparee a elle-meme ou son referent
2402
+    if (count($crit->param) == 0) {
2403
+        $op = '=';
2404
+        $col = $val = $crit->op;
2405
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2406
+            $val = $r[2];
2407
+        }
2408
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2409
+        if ($val == 'lang') {
2410
+            $val = array(kwote('$GLOBALS[\'spip_lang\']'));
2411
+        } else {
2412
+            $defaut = null;
2413
+            if ($val == 'id_parent') {
2414
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2415
+                // de la boucle superieure.... faudrait verifier qu'il existe
2416
+                // pour eviter l'erreur SQL
2417
+                $val = $boucles[$idb]->primary;
2418
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2419
+                $defaut = "@\$Pile[0]['id_parent']";
2420
+            } elseif ($val == 'id_enfant') {
2421
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2422
+                // de la boucle superieure
2423
+                $val = 'id_parent';
2424
+            } elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2425
+                // un critere conditionnel sur date est traite a part
2426
+                // car la date est mise d'office par SPIP,
2427
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2428
+            }
2429
+
2430
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2431
+            $val = array(kwote($val));
2432
+        }
2433
+    } else {
2434
+        // comparaison explicite
2435
+        // le phraseur impose que le premier param soit du texte
2436
+        $params = $crit->param;
2437
+        $op = $crit->op;
2438
+        if ($op == '==') {
2439
+            $op = 'REGEXP';
2440
+        }
2441
+        $col = array_shift($params);
2442
+        $col = $col[0]->texte;
2443
+
2444
+        $val = array();
2445
+        $desc = array('id_mere' => $idb);
2446
+        $parent = $boucles[$idb]->id_parent;
2447
+
2448
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2449
+        // celui ne sachant pas ce qu'est un critere infixe
2450
+        // et a fortiori son 2e operande qu'entoure " ou '
2451
+        if (count($params) == 1
2452
+            and count($params[0]) == 3
2453
+            and $params[0][0]->type == 'texte'
2454
+            and $params[0][2]->type == 'texte'
2455
+            and ($p = $params[0][0]->texte) == $params[0][2]->texte
2456
+            and (($p == "'") or ($p == '"'))
2457
+            and $params[0][1]->type == 'champ'
2458
+        ) {
2459
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2460
+        } else {
2461
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2462
+                $a = calculer_liste($p, $desc, $boucles, $parent);
2463
+                if (strcasecmp($op, 'IN') == 0) {
2464
+                    $val[] = $a;
2465
+                } else {
2466
+                    $val[] = kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2467
+                } // toujours quoter en char ici
2468
+            }
2469
+        }
2470
+    }
2471
+
2472
+    $fct = $args_sql = '';
2473
+    // fonction SQL ?
2474
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2475
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2476
+        $fct = $m[1];
2477
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2478
+        $col = $a[1];
2479
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2480
+            $col = $m[1];
2481
+            $args_sql = $m[2];
2482
+        }
2483
+        $args_sql .= $a[2];
2484
+    }
2485
+
2486
+    return array($fct, $col, $op, $val, $args_sql);
2487 2487
 }
2488 2488
 
2489 2489
 // compatibilite ancienne version
2490 2490
 
2491 2491
 // http://code.spip.net/@calculer_vieux_in
2492 2492
 function calculer_vieux_in($params) {
2493
-	$deb = $params[0][0];
2494
-	$k = count($params) - 1;
2495
-	$last = $params[$k];
2496
-	$j = count($last) - 1;
2497
-	$last = $last[$j];
2498
-	$n = isset($last->texte) ? strlen($last->texte) : 0;
2499
-
2500
-	if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2501
-		&& (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2502
-	) {
2503
-		return $params;
2504
-	}
2505
-	$params[0][0]->texte = substr($deb->texte, 1);
2506
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2507
-	$last = $params[$k][$j];
2508
-	$n = strlen($last->texte);
2509
-	$params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2510
-	$newp = array();
2511
-	foreach ($params as $v) {
2512
-		if ($v[0]->type != 'texte') {
2513
-			$newp[] = $v;
2514
-		} else {
2515
-			foreach (explode(',', $v[0]->texte) as $x) {
2516
-				$t = new Texte;
2517
-				$t->texte = $x;
2518
-				$newp[] = array($t);
2519
-			}
2520
-		}
2521
-	}
2522
-
2523
-	return $newp;
2493
+    $deb = $params[0][0];
2494
+    $k = count($params) - 1;
2495
+    $last = $params[$k];
2496
+    $j = count($last) - 1;
2497
+    $last = $last[$j];
2498
+    $n = isset($last->texte) ? strlen($last->texte) : 0;
2499
+
2500
+    if (!((isset($deb->texte[0]) and $deb->texte[0] == '(')
2501
+        && (isset($last->texte[$n - 1]) and $last->texte[$n - 1] == ')'))
2502
+    ) {
2503
+        return $params;
2504
+    }
2505
+    $params[0][0]->texte = substr($deb->texte, 1);
2506
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2507
+    $last = $params[$k][$j];
2508
+    $n = strlen($last->texte);
2509
+    $params[$k][$j]->texte = substr($last->texte, 0, $n - 1);
2510
+    $newp = array();
2511
+    foreach ($params as $v) {
2512
+        if ($v[0]->type != 'texte') {
2513
+            $newp[] = $v;
2514
+        } else {
2515
+            foreach (explode(',', $v[0]->texte) as $x) {
2516
+                $t = new Texte;
2517
+                $t->texte = $x;
2518
+                $newp[] = array($t);
2519
+            }
2520
+        }
2521
+    }
2522
+
2523
+    return $newp;
2524 2524
 }
2525 2525
 
2526 2526
 /**
@@ -2539,89 +2539,89 @@  discard block
 block discarded – undo
2539 2539
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2540 2540
  **/
2541 2541
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2542
-	if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
2543
-		return '';
2544
-	}
2545
-
2546
-	$boucle = $boucles[$idb];
2547
-	$table = $boucle->show;
2548
-
2549
-	// si c'est une colonne de la table, ne rien faire
2550
-	if (isset($table['field'][$col])) {
2551
-		return '';
2552
-	}
2553
-
2554
-	if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2555
-		return '';
2556
-	}
2557
-	$pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2558
-
2559
-	$col = $regs[1];
2560
-	if (isset($regs[3]) and $suite = $regs[3]) {
2561
-		# Recherche de l'existence du champ date_xxxx,
2562
-		# si oui choisir ce champ, sinon choisir xxxx
2563
-
2564
-		if (isset($table['field']["date$suite"])) {
2565
-			$date_orig = 'date' . $suite;
2566
-		} else {
2567
-			$date_orig = substr($suite, 1);
2568
-		}
2569
-		$pred = $date_orig;
2570
-	} else {
2571
-		if (isset($regs[2]) and $rel = $regs[2]) {
2572
-			$pred = 'date';
2573
-		}
2574
-	}
2575
-
2576
-	$date_compare = "\"' . normaliser_date(" .
2577
-		calculer_argument_precedent($idb, $pred, $boucles) .
2578
-		") . '\"";
2579
-
2580
-	$col_vraie = $date_orig;
2581
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2582
-
2583
-	switch ($col) {
2584
-		case 'date':
2585
-			$col = $date_orig;
2586
-			break;
2587
-		case 'jour':
2588
-			$col = "DAYOFMONTH($date_orig)";
2589
-			break;
2590
-		case 'mois':
2591
-			$col = "MONTH($date_orig)";
2592
-			break;
2593
-		case 'annee':
2594
-			$col = "YEAR($date_orig)";
2595
-			break;
2596
-		case 'heure':
2597
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2598
-			break;
2599
-		case 'age':
2600
-			$col = calculer_param_date("NOW()", $date_orig);
2601
-			$col_vraie = "";// comparer a un int (par defaut)
2602
-			break;
2603
-		case 'age_relatif':
2604
-			$col = calculer_param_date($date_compare, $date_orig);
2605
-			$col_vraie = "";// comparer a un int (par defaut)
2606
-			break;
2607
-		case 'jour_relatif':
2608
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2609
-			$col_vraie = "";// comparer a un int (par defaut)
2610
-			break;
2611
-		case 'mois_relatif':
2612
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2613
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2614
-				")-YEAR(" . $date_orig . "))";
2615
-			$col_vraie = "";// comparer a un int (par defaut)
2616
-			break;
2617
-		case 'annee_relatif':
2618
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2619
-				$date_orig . ")";
2620
-			$col_vraie = "";// comparer a un int (par defaut)
2621
-			break;
2622
-	}
2623
-
2624
-	return array($col, $col_vraie);
2542
+    if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) {
2543
+        return '';
2544
+    }
2545
+
2546
+    $boucle = $boucles[$idb];
2547
+    $table = $boucle->show;
2548
+
2549
+    // si c'est une colonne de la table, ne rien faire
2550
+    if (isset($table['field'][$col])) {
2551
+        return '';
2552
+    }
2553
+
2554
+    if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2555
+        return '';
2556
+    }
2557
+    $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date'];
2558
+
2559
+    $col = $regs[1];
2560
+    if (isset($regs[3]) and $suite = $regs[3]) {
2561
+        # Recherche de l'existence du champ date_xxxx,
2562
+        # si oui choisir ce champ, sinon choisir xxxx
2563
+
2564
+        if (isset($table['field']["date$suite"])) {
2565
+            $date_orig = 'date' . $suite;
2566
+        } else {
2567
+            $date_orig = substr($suite, 1);
2568
+        }
2569
+        $pred = $date_orig;
2570
+    } else {
2571
+        if (isset($regs[2]) and $rel = $regs[2]) {
2572
+            $pred = 'date';
2573
+        }
2574
+    }
2575
+
2576
+    $date_compare = "\"' . normaliser_date(" .
2577
+        calculer_argument_precedent($idb, $pred, $boucles) .
2578
+        ") . '\"";
2579
+
2580
+    $col_vraie = $date_orig;
2581
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2582
+
2583
+    switch ($col) {
2584
+        case 'date':
2585
+            $col = $date_orig;
2586
+            break;
2587
+        case 'jour':
2588
+            $col = "DAYOFMONTH($date_orig)";
2589
+            break;
2590
+        case 'mois':
2591
+            $col = "MONTH($date_orig)";
2592
+            break;
2593
+        case 'annee':
2594
+            $col = "YEAR($date_orig)";
2595
+            break;
2596
+        case 'heure':
2597
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2598
+            break;
2599
+        case 'age':
2600
+            $col = calculer_param_date("NOW()", $date_orig);
2601
+            $col_vraie = "";// comparer a un int (par defaut)
2602
+            break;
2603
+        case 'age_relatif':
2604
+            $col = calculer_param_date($date_compare, $date_orig);
2605
+            $col_vraie = "";// comparer a un int (par defaut)
2606
+            break;
2607
+        case 'jour_relatif':
2608
+            $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2609
+            $col_vraie = "";// comparer a un int (par defaut)
2610
+            break;
2611
+        case 'mois_relatif':
2612
+            $col = "MONTH(" . $date_compare . ")-MONTH(" .
2613
+                $date_orig . ")+12*(YEAR(" . $date_compare .
2614
+                ")-YEAR(" . $date_orig . "))";
2615
+            $col_vraie = "";// comparer a un int (par defaut)
2616
+            break;
2617
+        case 'annee_relatif':
2618
+            $col = "YEAR(" . $date_compare . ")-YEAR(" .
2619
+                $date_orig . ")";
2620
+            $col_vraie = "";// comparer a un int (par defaut)
2621
+            break;
2622
+    }
2623
+
2624
+    return array($col, $col_vraie);
2625 2625
 }
2626 2626
 
2627 2627
 /**
@@ -2640,16 +2640,16 @@  discard block
 block discarded – undo
2640 2640
  *     de colonne SQL et une date.
2641 2641
  **/
2642 2642
 function calculer_param_date($date_compare, $date_orig) {
2643
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2644
-		$init = "'\" . (\$x = $r[1]) . \"'";
2645
-		$date_compare = '\'$x\'';
2646
-	} else {
2647
-		$init = $date_compare;
2648
-	}
2649
-
2650
-	return
2651
-		// optimisation : mais prevoir le support SQLite avant
2652
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2643
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2644
+        $init = "'\" . (\$x = $r[1]) . \"'";
2645
+        $date_compare = '\'$x\'';
2646
+    } else {
2647
+        $init = $date_compare;
2648
+    }
2649
+
2650
+    return
2651
+        // optimisation : mais prevoir le support SQLite avant
2652
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2653 2653
 }
2654 2654
 
2655 2655
 /**
@@ -2667,18 +2667,18 @@  discard block
 block discarded – undo
2667 2667
  * @param Critere $crit Paramètres du critère dans cette boucle
2668 2668
  */
2669 2669
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2670
-	$boucle = &$boucles[$idb];
2670
+    $boucle = &$boucles[$idb];
2671 2671
 
2672
-	$args = array();
2673
-	foreach ($crit->param as &$param) {
2674
-		array_push($args,
2675
-			calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent));
2676
-	}
2672
+    $args = array();
2673
+    foreach ($crit->param as &$param) {
2674
+        array_push($args,
2675
+            calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent));
2676
+    }
2677 2677
 
2678
-	$boucle->hash .= '
2678
+    $boucle->hash .= '
2679 2679
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2680 2680
 
2681
-	$boucle->hash .= '
2681
+    $boucle->hash .= '
2682 2682
 	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2683 2683
 }
2684 2684
 
@@ -2695,8 +2695,8 @@  discard block
 block discarded – undo
2695 2695
  * @param Critere $crit Paramètres du critère dans cette boucle
2696 2696
  */
2697 2697
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2698
-	$boucle = &$boucles[$idb];
2699
-	$boucle->hash .= '
2698
+    $boucle = &$boucles[$idb];
2699
+    $boucle->hash .= '
2700 2700
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ');
2701 2701
 	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent) . ';';
2702 2702
 }
@@ -2716,8 +2716,8 @@  discard block
 block discarded – undo
2716 2716
  * @param Critere $crit Paramètres du critère dans cette boucle
2717 2717
  */
2718 2718
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2719
-	$boucle = &$boucles[$idb];
2720
-	$boucle->hash .= '
2719
+    $boucle = &$boucles[$idb];
2720
+    $boucle->hash .= '
2721 2721
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ';';
2722 2722
 }
2723 2723
 
@@ -2733,12 +2733,12 @@  discard block
 block discarded – undo
2733 2733
  * @param Critere $crit Paramètres du critère dans cette boucle
2734 2734
  */
2735 2735
 function critere_php_args_dist($idb, &$boucles, $crit) {
2736
-	$boucle = &$boucles[$idb];
2737
-	$boucle->hash .= '$command[\'args\']=array();';
2738
-	foreach ($crit->param as $param) {
2739
-		$boucle->hash .= '
2736
+    $boucle = &$boucles[$idb];
2737
+    $boucle->hash .= '$command[\'args\']=array();';
2738
+    foreach ($crit->param as $param) {
2739
+        $boucle->hash .= '
2740 2740
 			$command[\'args\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';';
2741
-	}
2741
+    }
2742 2742
 }
2743 2743
 
2744 2744
 /**
@@ -2755,12 +2755,12 @@  discard block
 block discarded – undo
2755 2755
  * @param Critere $crit Paramètres du critère dans cette boucle
2756 2756
  */
2757 2757
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2758
-	$boucle = &$boucles[$idb];
2759
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2760
-	foreach ($crit->param as $param) {
2761
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, array(), $boucles,
2762
-				$boucles[$idb]->id_parent) . ";\n";
2763
-	}
2758
+    $boucle = &$boucles[$idb];
2759
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2760
+    foreach ($crit->param as $param) {
2761
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, array(), $boucles,
2762
+                $boucles[$idb]->id_parent) . ";\n";
2763
+    }
2764 2764
 }
2765 2765
 
2766 2766
 /**
@@ -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_DATA_enum_dist($idb, &$boucles, $crit) {
2788
-	$boucle = &$boucles[$idb];
2789
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2790
-	foreach ($crit->param as $param) {
2791
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, array(), $boucles,
2792
-				$boucles[$idb]->id_parent) . ";\n";
2793
-	}
2788
+    $boucle = &$boucles[$idb];
2789
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2790
+    foreach ($crit->param as $param) {
2791
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, array(), $boucles,
2792
+                $boucles[$idb]->id_parent) . ";\n";
2793
+    }
2794 2794
 }
2795 2795
 
2796 2796
 /**
@@ -2805,11 +2805,11 @@  discard block
 block discarded – undo
2805 2805
  * @param Critere $crit Paramètres du critère dans cette boucle
2806 2806
  */
2807 2807
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2808
-	$boucle = &$boucles[$idb];
2809
-	foreach ($crit->param as $param) {
2810
-		$boucle->hash .= '
2808
+    $boucle = &$boucles[$idb];
2809
+    foreach ($crit->param as $param) {
2810
+        $boucle->hash .= '
2811 2811
 			$command[\'datapath\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';';
2812
-	}
2812
+    }
2813 2813
 }
2814 2814
 
2815 2815
 
@@ -2841,20 +2841,20 @@  discard block
 block discarded – undo
2841 2841
  * @param Critere $crit Paramètres du critère dans cette boucle
2842 2842
  */
2843 2843
 function critere_si_dist($idb, &$boucles, $crit) {
2844
-	$boucle = &$boucles[$idb];
2845
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2846
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2847
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2848
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2849
-	if ($crit->param) {
2850
-		foreach ($crit->param as $param) {
2851
-			$boucle->hash .= "\t\$command['si'][] = "
2852
-				. calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n";
2853
-		}
2854
-		// interdire {si 0} aussi !
2855
-	} else {
2856
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2857
-	}
2844
+    $boucle = &$boucles[$idb];
2845
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2846
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2847
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2848
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2849
+    if ($crit->param) {
2850
+        foreach ($crit->param as $param) {
2851
+            $boucle->hash .= "\t\$command['si'][] = "
2852
+                . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n";
2853
+        }
2854
+        // interdire {si 0} aussi !
2855
+    } else {
2856
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2857
+    }
2858 2858
 }
2859 2859
 
2860 2860
 /**
@@ -2870,8 +2870,8 @@  discard block
 block discarded – undo
2870 2870
  * @param Critere $crit Paramètres du critère dans cette boucle
2871 2871
  */
2872 2872
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2873
-	$boucle = &$boucles[$idb];
2874
-	$boucle->hash .= '
2873
+    $boucle = &$boucles[$idb];
2874
+    $boucle->hash .= '
2875 2875
 	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ');
2876 2876
 	$command[\'sourcemode\'] = \'table\';';
2877 2877
 }
@@ -2892,29 +2892,29 @@  discard block
 block discarded – undo
2892 2892
  */
2893 2893
 function critere_noeud_dist($idb, &$boucles, $crit) {
2894 2894
 
2895
-	$not = $crit->not;
2896
-	$boucle = &$boucles[$idb];
2897
-	$primary = $boucle->primary;
2895
+    $not = $crit->not;
2896
+    $boucle = &$boucles[$idb];
2897
+    $primary = $boucle->primary;
2898 2898
 
2899
-	if (!$primary or strpos($primary, ',')) {
2900
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2899
+    if (!$primary or strpos($primary, ',')) {
2900
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2901 2901
 
2902
-		return;
2903
-	}
2904
-	$table = $boucle->type_requete;
2905
-	$table_sql = table_objet_sql(objet_type($table));
2902
+        return;
2903
+    }
2904
+    $table = $boucle->type_requete;
2905
+    $table_sql = table_objet_sql(objet_type($table));
2906 2906
 
2907
-	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2908
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2909
-		'id_parent';
2907
+    $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2908
+        $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2909
+        'id_parent';
2910 2910
 
2911
-	$in = "IN";
2912
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2913
-	if ($not) {
2914
-		$where = array("'NOT'", $where);
2915
-	}
2911
+    $in = "IN";
2912
+    $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2913
+    if ($not) {
2914
+        $where = array("'NOT'", $where);
2915
+    }
2916 2916
 
2917
-	$boucle->where[] = $where;
2917
+    $boucle->where[] = $where;
2918 2918
 }
2919 2919
 
2920 2920
 /**
@@ -2930,8 +2930,8 @@  discard block
 block discarded – undo
2930 2930
  * @param Critere $crit Paramètres du critère dans cette boucle
2931 2931
  */
2932 2932
 function critere_feuille_dist($idb, &$boucles, $crit) {
2933
-	$not = $crit->not;
2934
-	$crit->not = $not ? false : true;
2935
-	critere_noeud_dist($idb, $boucles, $crit);
2936
-	$crit->not = $not;
2933
+    $not = $crit->not;
2934
+    $crit->not = $not ? false : true;
2935
+    critere_noeud_dist($idb, $boucles, $crit);
2936
+    $crit->not = $not;
2937 2937
 }
Please login to merge, or discard this patch.
Spacing   +177 added lines, -185 removed lines patch added patch discarded remove patch
@@ -46,10 +46,9 @@  discard block
 block discarded – undo
46 46
 	$not = $crit->not;
47 47
 	$boucle = &$boucles[$idb];
48 48
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
49
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
50
-		'id_parent';
49
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
51 50
 
52
-	$c = array("'='", "'$boucle->id_table." . "$id_parent'", 0);
51
+	$c = array("'='", "'$boucle->id_table."."$id_parent'", 0);
53 52
 	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
54 53
 }
55 54
 
@@ -72,10 +71,10 @@  discard block
 block discarded – undo
72 71
 	$id = $boucle->primary;
73 72
 
74 73
 	if ($not or !$id) {
75
-		return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op)));
74
+		return (array('zbug_critere_inconnu', array('critere' => $not.$crit->op)));
76 75
 	}
77 76
 	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
78
-	$boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg);
77
+	$boucle->where[] = array("'!='", "'$boucle->id_table."."$id'", $arg);
79 78
 }
80 79
 
81 80
 
@@ -106,12 +105,12 @@  discard block
 block discarded – undo
106 105
 	$not = ($crit->not ? '' : 'NOT');
107 106
 
108 107
 	// le doublon s'applique sur un type de boucle (article)
109
-	$nom = "'" . $boucle->type_requete . "'";
108
+	$nom = "'".$boucle->type_requete."'";
110 109
 
111 110
 	// compléter le nom avec un nom précisé {doublons nom}
112 111
 	// on obtient $nom = "'article' . 'nom'"
113 112
 	if (isset($crit->param[0])) {
114
-		$nom .= "." . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
113
+		$nom .= ".".calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
115 114
 	}
116 115
 
117 116
 	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
@@ -123,13 +122,13 @@  discard block
 block discarded – undo
123 122
 	// $doublons et son index, ici $nom
124 123
 
125 124
 	// debut du code "sql_in('articles.id_article', "
126
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
125
+	$debut_in = "sql_in('".$boucle->id_table.'.'.$primary."', ";
127 126
 	// lecture des données du doublon "$doublons[$doublon_index[] = "
128 127
 	// Attention : boucle->doublons désigne une variable qu'on affecte
129
-	$debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= "));
128
+	$debut_doub = '$doublons['.(!$not ? '' : ($boucle->doublons."[]= "));
130 129
 
131 130
 	// le debut complet du code des doublons
132
-	$debut_doub = $debut_in . $debut_doub;
131
+	$debut_doub = $debut_in.$debut_doub;
133 132
 
134 133
 	// nom du doublon "('article' . 'nom')]"
135 134
 	$fin_doub = "($nom)]";
@@ -139,22 +138,22 @@  discard block
 block discarded – undo
139 138
 	foreach ($boucle->where as $k => $w) {
140 139
 		if (strpos($w[0], $debut_doub) === 0) {
141 140
 			// fusionner le sql_in (du where)
142
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in));
141
+			$boucle->where[$k][0] = $debut_doub.$fin_doub.' . '.substr($w[0], strlen($debut_in));
143 142
 			// fusionner l'initialisation (du hash) pour faire plus joli
144 143
 			$x = strpos($boucle->hash, $init_comment);
145 144
 			$len = strlen($init_comment);
146 145
 			$boucle->hash =
147
-				substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len);
146
+				substr($boucle->hash, 0, $x + $len).$init_code.substr($boucle->hash, $x + $len);
148 147
 
149 148
 			return;
150 149
 		}
151 150
 	}
152 151
 
153 152
 	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
154
-	$boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')");
153
+	$boucle->where[] = array($debut_doub.$fin_doub.", '".$not."')");
155 154
 
156 155
 	// déclarer le doublon s'il n'existe pas encore
157
-	$boucle->hash .= $init_comment . $init_code;
156
+	$boucle->hash .= $init_comment.$init_code;
158 157
 
159 158
 
160 159
 	# la ligne suivante avait l'intention d'eviter une collecte deja faite
@@ -215,10 +214,10 @@  discard block
 block discarded – undo
215 214
 	$un = $un[0]->texte;
216 215
 	$deux = $deux[0]->texte;
217 216
 	if ($deux) {
218
-		$boucles[$idb]->limit = 'intval($Pile[0]["debut' .
219
-			$un .
220
-			'"]) . ",' .
221
-			$deux .
217
+		$boucles[$idb]->limit = 'intval($Pile[0]["debut'.
218
+			$un.
219
+			'"]) . ",'.
220
+			$deux.
222 221
 			'"';
223 222
 	} else {
224 223
 		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
@@ -281,26 +280,26 @@  discard block
 block discarded – undo
281 280
 		$type = calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent);
282 281
 	}
283 282
 
284
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1));
283
+	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut".substr($type, 1));
285 284
 	$boucle->modificateur['debut_nom'] = $type;
286 285
 	$partie =
287 286
 		// tester si le numero de page demande est de la forme '@yyy'
288
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
287
+		'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n"
289 288
 		. "\tif(substr(\$debut_boucle,0,1)=='@'){\n"
290
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
291
-		. "\t\t" . '$iter->seek(0);' . "\n"
289
+		. "\t\t".'$debut_boucle = $Pile[0]['.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$iter);'."\n"
290
+		. "\t\t".'$iter->seek(0);'."\n"
292 291
 		. "\t}\n"
293
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
292
+		. "\t".'$debut_boucle = intval($debut_boucle)';
294 293
 
295 294
 	$boucle->hash .= '
296
-	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
295
+	$command[\'pagination\'] = array((isset($Pile[0][' . $debut.']) ? $Pile[0]['.$debut.'] : null), '.$pas.');';
297 296
 
298 297
 	$boucle->total_parties = $pas;
299 298
 	calculer_parties($boucles, $idb, $partie, 'p+');
300 299
 	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
301 300
 	// sauf si pas de primaire, ou si primaire composee
302 301
 	// dans ce cas, on ne sait pas gerer une pagination indirecte
303
-	$t = $boucle->id_table . '.' . $boucle->primary;
302
+	$t = $boucle->id_table.'.'.$boucle->primary;
304 303
 	if ($boucle->primary
305 304
 		and !preg_match('/[,\s]/', $boucle->primary)
306 305
 		and !in_array($t, $boucle->select)
@@ -346,24 +345,24 @@  discard block
 block discarded – undo
346 345
 	$boucle->hash .= '
347 346
 	// RECHERCHE'
348 347
 		. ($crit->cond ? '
349
-	if (!strlen(' . $quoi . ')){
348
+	if (!strlen(' . $quoi.')){
350 349
 		list($rech_select, $rech_where) = array("0 as points","");
351
-	} else' : '') . '
350
+	} else' : '').'
352 351
 	{
353 352
 		$prepare_recherche = charger_fonction(\'prepare_recherche\', \'inc\');
354
-		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi . ', "' . $boucle->id_table . '", "' . $crit->cond . '","' . $boucle->sql_serveur . '",' . $_modificateur . ',"' . $boucle->primary . '");
353
+		list($rech_select, $rech_where) = $prepare_recherche(' . $quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'","'.$boucle->sql_serveur.'",'.$_modificateur.',"'.$boucle->primary.'");
355 354
 	}
356 355
 	';
357 356
 
358 357
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
358
+	$t = $boucle->id_table.'.'.$boucle->primary;
360 359
 	if (!in_array($t, $boucles[$idb]->select)) {
361 360
 		$boucle->select[] = $t;
362 361
 	} # pour postgres, neuneu ici
363 362
 	// jointure uniquement sur le serveur principal
364 363
 	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365 364
 	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'");
365
+		$boucle->join['resultats'] = array("'".$boucle->id_table."'", "'id'", "'".$boucle->primary."'");
367 366
 		$boucle->from['resultats'] = 'spip_resultats';
368 367
 	}
369 368
 	$boucle->select[] = '$rech_select';
@@ -430,7 +429,7 @@  discard block
 block discarded – undo
430 429
 	$c =
431 430
 		array(
432 431
 			"'OR'",
433
-			array("'='", "'$table." . "id_trad'", "'$table.$prim'"),
432
+			array("'='", "'$table."."id_trad'", "'$table.$prim'"),
434 433
 			array("'='", "'$table.id_trad'", "'0'")
435 434
 		);
436 435
 	$boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c);
@@ -453,16 +452,15 @@  discard block
 block discarded – undo
453 452
 	$boucle = &$boucles[$idb];
454 453
 	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455 454
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
456
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
457
-		'id_parent';
458
-	$mparent = $boucle->id_table . '.' . $id_parent;
455
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
456
+	$mparent = $boucle->id_table.'.'.$id_parent;
459 457
 
460 458
 	if ($boucle->type_requete == 'rubriques' or isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
461 459
 		$boucle->where[] = array("'='", "'$mparent'", $arg);
462 460
 
463 461
 	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
464 462
 	else {
465
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete)));
463
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op.' '.$boucle->type_requete)));
466 464
 	}
467 465
 }
468 466
 
@@ -515,16 +513,15 @@  discard block
 block discarded – undo
515 513
 		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
516 514
 			$decompose = decompose_champ_id_objet($champ);
517 515
 			$champ = array_shift($decompose);
518
-			$boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"');
516
+			$boucle->where[] = array("'='", _q($cle.".".reset($decompose)), '"'.sql_quote(end($decompose)).'"');
519 517
 		}
520 518
 	} else {
521 519
 		$cle = $boucle->id_table;
522 520
 	}
523 521
 
524
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
525
-		. ($not ? ", 'NOT'" : '') . ")";
526
-	$boucle->where[] = !$crit->cond ? $c :
527
-		("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')');
522
+	$c = "sql_in('$cle".".$champ', calcul_branche_in($arg)"
523
+		. ($not ? ", 'NOT'" : '').")";
524
+	$boucle->where[] = !$crit->cond ? $c : ("($arg ? $c : ".($not ? "'0=1'" : "'1=1'").')');
528 525
 }
529 526
 
530 527
 /**
@@ -543,9 +540,9 @@  discard block
 block discarded – undo
543 540
 	$not = $crit->not;
544 541
 	$boucle = &$boucles[$idb];
545 542
 
546
-	$c = "sql_in('" .
547
-		$boucle->id_table . '.' . $boucle->primary
548
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '')";
543
+	$c = "sql_in('".
544
+		$boucle->id_table.'.'.$boucle->primary
545
+		. "', lister_objets_avec_logos('".$boucle->primary."'), '')";
549 546
 
550 547
 	if ($crit->cond) {
551 548
 		$c = "($arg ? $c : 1)";
@@ -585,7 +582,7 @@  discard block
 block discarded – undo
585 582
 				$t = table_objet_sql($r[1]);
586 583
 				$t = array_search($t, $boucles[$idb]->from);
587 584
 				if ($t) {
588
-					$t .= '.' . $r[2];
585
+					$t .= '.'.$r[2];
589 586
 				}
590 587
 			}
591 588
 		} else {
@@ -600,7 +597,7 @@  discard block
 block discarded – undo
600 597
 			$boucles[$idb]->select[] = $t;
601 598
 		}
602 599
 	} else {
603
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?')));
600
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op.' ?')));
604 601
 	}
605 602
 }
606 603
 
@@ -650,26 +647,26 @@  discard block
 block discarded – undo
650 647
 				(false !== $i = strpos($boucle->order[$n - 1], 'ASC'))
651 648
 				OR (false !== $i = strpos($boucle->order[$n - 1], 'DESC'))
652 649
 			) {
653
-				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
650
+				$boucle->order[$n - 1] = substr_replace($boucle->order[$n - 1], "' . ".$boucle->modificateur['collate']." . ' ", $i, 0);
654 651
 			} else {
655
-				$boucle->order[$n - 1] .= " . " . $boucle->modificateur['collate'];
652
+				$boucle->order[$n - 1] .= " . ".$boucle->modificateur['collate'];
656 653
 			}
657 654
 		}
658 655
 	} else {
659
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order))));
656
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ".count($boucles[$idb]->order))));
660 657
 	}
661 658
 }
662 659
 
663 660
 // http://code.spip.net/@calculer_critere_arg_dynamique
664 661
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
665 662
 	$boucle = $boucles[$idb];
666
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
667
-	$var = '$champs_' . $idb;
663
+	$alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')';
664
+	$var = '$champs_'.$idb;
668 665
 	$desc = (strpos($boucle->in, "static $var =") !== false);
669 666
 	if (!$desc) {
670 667
 		$desc = $boucle->show['field'];
671 668
 		$desc = implode(',', array_map('_q', array_keys($desc)));
672
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");";
669
+		$boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.");";
673 670
 	}
674 671
 	if ($desc) {
675 672
 		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
@@ -744,7 +741,7 @@  discard block
 block discarded – undo
744 741
 		$sens = " . ' DESC'";
745 742
 	}
746 743
 	if (isset($boucle->modificateur['collate'])) {
747
-		$collecte = ' . ' . $boucle->modificateur['collate'];
744
+		$collecte = ' . '.$boucle->modificateur['collate'];
748 745
 	}
749 746
 
750 747
 	// Pour chaque paramètre du critère
@@ -766,14 +763,14 @@  discard block
 block discarded – undo
766 763
 			if (preg_match(",^(\w+)[\s]+(.*)$,", $par, $m)) {
767 764
 				$expression = trim($m[1]);
768 765
 				$champ = trim($m[2]);
769
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
766
+				if (function_exists($f = 'calculer_critere_par_expression_'.$expression)) {
770 767
 					$order = $f($idb, $boucles, $crit, $tri, $champ);
771 768
 				} else {
772
-					return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
769
+					return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
773 770
 				}
774 771
 
775 772
 			// tris de la forme {par champ} ou {par FONCTION(champ)}
776
-			} elseif (preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) {
773
+			} elseif (preg_match(",^".CHAMP_SQL_PLUS_FONC.'$,is', $par, $match)) {
777 774
 				// {par FONCTION(champ)}
778 775
 				if (count($match) > 2) {
779 776
 					$par = substr($match[2], 1, -1);
@@ -783,7 +780,7 @@  discard block
 block discarded – undo
783 780
 				if ($par == 'hasard') {
784 781
 					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
785 782
 				} elseif ($par == 'date' and !empty($boucle->show['date'])) {
786
-					$order = "'" . $boucle->id_table . "." . $boucle->show['date'] . "'";
783
+					$order = "'".$boucle->id_table.".".$boucle->show['date']."'";
787 784
 				} else {
788 785
 					// cas général {par champ}, {par table.champ}, ...
789 786
 					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
@@ -792,7 +789,7 @@  discard block
 block discarded – undo
792 789
 
793 790
 			// on ne sait pas traiter…
794 791
 			else {
795
-				return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
792
+				return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
796 793
 			}
797 794
 
798 795
 			// En cas d'erreur de squelette retournée par une fonction
@@ -812,14 +809,14 @@  discard block
 block discarded – undo
812 809
 
813 810
 		if ($fct) {
814 811
 			if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) {
815
-				$order = "'$fct(" . $r[1] . ")'";
812
+				$order = "'$fct(".$r[1].")'";
816 813
 			} else {
817 814
 				$order = "'$fct(' . $order . ')'";
818 815
 			}
819 816
 		}
820
-		$t = $order . $collecte . $sens;
817
+		$t = $order.$collecte.$sens;
821 818
 		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
822
-			$t = $r[1] . $r[2];
819
+			$t = $r[1].$r[2];
823 820
 		}
824 821
 
825 822
 		$boucle->order[] = $t;
@@ -869,16 +866,16 @@  discard block
 block discarded – undo
869 866
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
870 867
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
871 868
 	if (is_array($_champ)) {
872
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " num $champ"));
869
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." num $champ"));
873 870
 	}
874 871
 	$boucle = &$boucles[$idb];
875
-	$texte = '0+' . $_champ;
872
+	$texte = '0+'.$_champ;
876 873
 	$suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
877 874
 	if ($suite !== "''") {
878
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
875
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
879 876
 	}
880
-	$as = 'num' . ($boucle->order ? count($boucle->order) : "");
881
-	$boucle->select[] = $texte . " AS $as";
877
+	$as = 'num'.($boucle->order ? count($boucle->order) : "");
878
+	$boucle->select[] = $texte." AS $as";
882 879
 	$order = "'$as'";
883 880
 	return $order;
884 881
 }
@@ -903,16 +900,16 @@  discard block
 block discarded – undo
903 900
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
904 901
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
905 902
 	if (is_array($_champ)) {
906
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " sinum $champ"));
903
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." sinum $champ"));
907 904
 	}
908 905
 	$boucle = &$boucles[$idb];
909
-	$texte = '0+' . $_champ;
906
+	$texte = '0+'.$_champ;
910 907
 	$suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent);
911 908
 	if ($suite !== "''") {
912
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \"";
909
+		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \"";
913 910
 	}
914
-	$as = 'sinum' . ($boucle->order ? count($boucle->order) : "");
915
-	$boucle->select[] = 'CASE (' . $texte . ') WHEN 0 THEN 1 ELSE 0 END AS ' . $as;
911
+	$as = 'sinum'.($boucle->order ? count($boucle->order) : "");
912
+	$boucle->select[] = 'CASE ('.$texte.') WHEN 0 THEN 1 ELSE 0 END AS '.$as;
916 913
 	$order = "'$as'";
917 914
 	return $order;
918 915
 }
@@ -936,10 +933,10 @@  discard block
 block discarded – undo
936 933
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
937 934
 	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
938 935
 	if (is_array($_champ)) {
939
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " multi $champ"));
936
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." multi $champ"));
940 937
 	}
941 938
 	$boucle = &$boucles[$idb];
942
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
939
+	$boucle->select[] = "\".sql_multi('".$_champ."', \$GLOBALS['spip_lang']).\"";
943 940
 	$order = "'multi'";
944 941
 	return $order;
945 942
 }
@@ -959,13 +956,13 @@  discard block
 block discarded – undo
959 956
  * @param bool $raw Retourne le champ pour le compilateur ("'alias.champ'") ou brut ('alias.champ')
960 957
  * @return array|string
961 958
  */
962
-function calculer_critere_par_champ($idb, &$boucles, $crit,  $par, $raw = false) {
959
+function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
963 960
 	$boucle = &$boucles[$idb];
964 961
 	$desc = $boucle->show;
965 962
 
966 963
 	// le champ existe dans la table, pas de souci (le plus commun)
967 964
 	if (isset($desc['field'][$par])) {
968
-		$par = $boucle->id_table . "." . $par;
965
+		$par = $boucle->id_table.".".$par;
969 966
 	}
970 967
 	// le champ est peut être une jointure
971 968
 	else {
@@ -986,24 +983,24 @@  discard block
 block discarded – undo
986 983
 		// Sinon on cherche le champ dans les tables possibles de jointures
987 984
 		// Si la table est déjà dans le from, on la réutilise.
988 985
 		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
989
-			$par = $infos['alias'] . "." . $champ;
986
+			$par = $infos['alias'].".".$champ;
990 987
 		} elseif (
991 988
 			$boucle->jointures_explicites
992 989
 			and $alias = trouver_jointure_champ($champ, $boucle, explode(' ', $boucle->jointures_explicites), false, $table)
993 990
 		) {
994
-			$par = $alias . "." . $champ;
991
+			$par = $alias.".".$champ;
995 992
 		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
996
-			$par = $alias . "." . $champ;
993
+			$par = $alias.".".$champ;
997 994
 		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
998 995
 		} elseif (
999 996
 			$table_alias
1000 997
 			and isset($boucle->from[$table_alias])
1001 998
 			and $infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias])
1002 999
 		) {
1003
-			$par = $infos['alias'] . "." . $champ;
1000
+			$par = $infos['alias'].".".$champ;
1004 1001
 		} elseif ($table) {
1005 1002
 			// On avait table + champ, mais on ne les a pas trouvés
1006
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"));
1003
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." $par"));
1007 1004
 		} else {
1008 1005
 			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1009 1006
 		}
@@ -1027,7 +1024,7 @@  discard block
 block discarded – undo
1027 1024
 	if (!$t) {
1028 1025
 		$t = trouver_jointure_champ($champ, $boucle);
1029 1026
 	}
1030
-	return !$t ? '' : ("'" . $t . '.' . $champ . "'");
1027
+	return !$t ? '' : ("'".$t.'.'.$champ."'");
1031 1028
 }
1032 1029
 
1033 1030
 /**
@@ -1072,9 +1069,9 @@  discard block
 block discarded – undo
1072 1069
 				$boucle->default_order[] = ' DESC';
1073 1070
 			}
1074 1071
 		} else {
1075
-			$t = $boucle->order[$n - 1] . " . $order";
1072
+			$t = $boucle->order[$n - 1]." . $order";
1076 1073
 			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1077
-				$t = $r[1] . $r[2];
1074
+				$t = $r[1].$r[2];
1078 1075
 			}
1079 1076
 			$boucle->order[$n - 1] = $t;
1080 1077
 		}
@@ -1086,7 +1083,7 @@  discard block
 block discarded – undo
1086 1083
 	$params = $crit->param;
1087 1084
 
1088 1085
 	if (count($params) < 1) {
1089
-		return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"));
1086
+		return array('zbug_critere_inconnu', array('critere' => $crit->op." ?"));
1090 1087
 	}
1091 1088
 
1092 1089
 	$boucle = &$boucles[$idb];
@@ -1107,7 +1104,7 @@  discard block
 block discarded – undo
1107 1104
 	if ((count($date) == 1) and ($date[0]->type == 'texte')) {
1108 1105
 		$date = $date[0]->texte;
1109 1106
 		if (!isset($fields[$date])) {
1110
-			return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date));
1107
+			return array('zbug_critere_inconnu', array('critere' => $crit->op." ".$date));
1111 1108
 		}
1112 1109
 	} else {
1113 1110
 		$a = calculer_liste($date, array(), $boucles, $parent);
@@ -1119,38 +1116,38 @@  discard block
 block discarded – undo
1119 1116
 		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1120 1117
 	}
1121 1118
 	$annee = $params ? array_shift($params) : "";
1122
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1123
-		calculer_liste($annee, array(), $boucles, $parent) .
1119
+	$annee = "\n".'sprintf("%04d", ($x = '.
1120
+		calculer_liste($annee, array(), $boucles, $parent).
1124 1121
 		') ? $x : date("Y"))';
1125 1122
 
1126 1123
 	$mois = $params ? array_shift($params) : "";
1127
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1128
-		calculer_liste($mois, array(), $boucles, $parent) .
1124
+	$mois = "\n".'sprintf("%02d", ($x = '.
1125
+		calculer_liste($mois, array(), $boucles, $parent).
1129 1126
 		') ? $x : date("m"))';
1130 1127
 
1131 1128
 	$jour = $params ? array_shift($params) : "";
1132
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1133
-		calculer_liste($jour, array(), $boucles, $parent) .
1129
+	$jour = "\n".'sprintf("%02d", ($x = '.
1130
+		calculer_liste($jour, array(), $boucles, $parent).
1134 1131
 		') ? $x : date("d"))';
1135 1132
 
1136 1133
 	$annee2 = $params ? array_shift($params) : "";
1137
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1138
-		calculer_liste($annee2, array(), $boucles, $parent) .
1134
+	$annee2 = "\n".'sprintf("%04d", ($x = '.
1135
+		calculer_liste($annee2, array(), $boucles, $parent).
1139 1136
 		') ? $x : date("Y"))';
1140 1137
 
1141 1138
 	$mois2 = $params ? array_shift($params) : "";
1142
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1143
-		calculer_liste($mois2, array(), $boucles, $parent) .
1139
+	$mois2 = "\n".'sprintf("%02d", ($x = '.
1140
+		calculer_liste($mois2, array(), $boucles, $parent).
1144 1141
 		') ? $x : date("m"))';
1145 1142
 
1146 1143
 	$jour2 = $params ? array_shift($params) : "";
1147
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1148
-		calculer_liste($jour2, array(), $boucles, $parent) .
1144
+	$jour2 = "\n".'sprintf("%02d", ($x = '.
1145
+		calculer_liste($jour2, array(), $boucles, $parent).
1149 1146
 		') ? $x : date("d"))';
1150 1147
 
1151
-	$date = $boucle->id_table . ".$date";
1148
+	$date = $boucle->id_table.".$date";
1152 1149
 
1153
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1150
+	$quote_end = ",'".$boucle->sql_serveur."','text'";
1154 1151
 	if ($type == 'jour') {
1155 1152
 		$boucle->where[] = array(
1156 1153
 			"'='",
@@ -1222,14 +1219,13 @@  discard block
 block discarded – undo
1222 1219
 	list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2);
1223 1220
 
1224 1221
 	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1225
-		$boucle->limit = $a11 . ',' . $a21;
1222
+		$boucle->limit = $a11.','.$a21;
1226 1223
 	} else {
1227 1224
 		// 3 dans {1/3}, {2,3} ou {1,n-3}
1228 1225
 		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1229 1226
 		// 2 dans {2/3}, {2,5}, {n-2,1}
1230 1227
 		$partie = ($a11 != 'n') ? $a11 : $a12;
1231
-		$mode = (($op == '/') ? '/' :
1232
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1228
+		$mode = (($op == '/') ? '/' : (($a11 == 'n') ? '-' : '+').(($a21 == 'n') ? '-' : '+'));
1233 1229
 		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1234 1230
 		if ($a11 !== 'n' and $a21 !== 'n' and $mode == "++" and $op == ',') {
1235 1231
 			$boucle->limit =
@@ -1275,8 +1271,7 @@  discard block
 block discarded – undo
1275 1271
 	// {1/3}
1276 1272
 	if ($op1 == '/') {
1277 1273
 		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1278
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1279
-			"($total_parties ? $total_parties : 1)";
1274
+		$totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)";
1280 1275
 		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1281 1276
 		$debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);";
1282 1277
 	} else {
@@ -1287,15 +1282,13 @@  discard block
 block discarded – undo
1287 1282
 
1288 1283
 		// cas {x,n-1}
1289 1284
 		if ($op2 == '-') {
1290
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1291
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1292
-					($total_parties . ' - 1'));
1285
+			$fin = '$debut_boucle + '.$nombre_boucle.' - '
1286
+				. (is_numeric($total_parties) ? ($total_parties + 1) : ($total_parties.' - 1'));
1293 1287
 		} else {
1294 1288
 			// {x,1} ou {pagination}
1295 1289
 			$fin = '$debut_boucle'
1296 1290
 				. (is_numeric($total_parties) ?
1297
-					(($total_parties == 1) ? "" : (' + ' . ($total_parties - 1))) :
1298
-					('+' . $total_parties . ' - 1'));
1291
+					(($total_parties == 1) ? "" : (' + '.($total_parties - 1))) : ('+'.$total_parties.' - 1'));
1299 1292
 		}
1300 1293
 
1301 1294
 		// {pagination}, gerer le debut_xx=-1 pour tout voir
@@ -1313,11 +1306,11 @@  discard block
 block discarded – undo
1313 1306
 	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1314 1307
 
1315 1308
 	$boucles[$id_boucle]->mode_partie = "\n\t"
1316
-		. '$debut_boucle = ' . $debut . ";\n	"
1309
+		. '$debut_boucle = '.$debut.";\n	"
1317 1310
 		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1318
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1319
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1320
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1311
+		. '$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n	"
1312
+		. '$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1313
+		. '$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1321 1314
 		. "\n\tif (\$debut_boucle>0"
1322 1315
 		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1323 1316
 		. " AND \$iter->seek(\$debut_boucle,'continue'))"
@@ -1402,16 +1395,16 @@  discard block
 block discarded – undo
1402 1395
 		// critere personnalise ?
1403 1396
 		if (
1404 1397
 			(!$serveur or
1405
-				((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere))
1406
-					and (!function_exists($f = $f . "_dist"))
1407
-					and (!function_exists($f = "critere_" . $serveur . "_" . $critere))
1408
-					and (!function_exists($f = $f . "_dist"))
1398
+				((!function_exists($f = "critere_".$serveur."_".$table."_".$critere))
1399
+					and (!function_exists($f = $f."_dist"))
1400
+					and (!function_exists($f = "critere_".$serveur."_".$critere))
1401
+					and (!function_exists($f = $f."_dist"))
1409 1402
 				)
1410 1403
 			)
1411
-			and (!function_exists($f = "critere_" . $table . "_" . $critere))
1412
-			and (!function_exists($f = $f . "_dist"))
1413
-			and (!function_exists($f = "critere_" . $critere))
1414
-			and (!function_exists($f = $f . "_dist"))
1404
+			and (!function_exists($f = "critere_".$table."_".$critere))
1405
+			and (!function_exists($f = $f."_dist"))
1406
+			and (!function_exists($f = "critere_".$critere))
1407
+			and (!function_exists($f = $f."_dist"))
1415 1408
 		) {
1416 1409
 			// fonction critere standard
1417 1410
 			$f = $defaut;
@@ -1444,9 +1437,9 @@  discard block
 block discarded – undo
1444 1437
  */
1445 1438
 function kwote($lisp, $serveur = '', $type = '') {
1446 1439
 	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1447
-		return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\"";
1440
+		return $r[1]."\"".sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type)."\"";
1448 1441
 	} else {
1449
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1442
+		return "sql_quote($lisp, '$serveur', '".str_replace("'", "\\'", $type)."')";
1450 1443
 	}
1451 1444
 }
1452 1445
 
@@ -1468,7 +1461,7 @@  discard block
 block discarded – undo
1468 1461
 function critere_IN_dist($idb, &$boucles, $crit) {
1469 1462
 	$r = calculer_critere_infixe($idb, $boucles, $crit);
1470 1463
 	if (!$r) {
1471
-		return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")));
1464
+		return (array('zbug_critere_inconnu', array('critere' => $crit->op." ?")));
1472 1465
 	}
1473 1466
 	list($arg, $op, $val, $col, $where_complement) = $r;
1474 1467
 
@@ -1495,8 +1488,8 @@  discard block
 block discarded – undo
1495 1488
 				"'NOT'",
1496 1489
 				array(
1497 1490
 					"'IN'",
1498
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1499
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1491
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1492
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1500 1493
 				)
1501 1494
 			);
1502 1495
 		}
@@ -1515,22 +1508,22 @@  discard block
 block discarded – undo
1515 1508
 	$descr = $boucles[$idb]->descr;
1516 1509
 	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1517 1510
 
1518
-	$var = '$in' . $cpt++;
1511
+	$var = '$in'.$cpt++;
1519 1512
 	$x = "\n\t$var = array();";
1520 1513
 	foreach ($val as $k => $v) {
1521 1514
 		if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) {
1522 1515
 			// optimiser le traitement des constantes
1523 1516
 			if (is_numeric($r[2])) {
1524
-				$x .= "\n\t$var" . "[]= $r[2];";
1517
+				$x .= "\n\t$var"."[]= $r[2];";
1525 1518
 			} else {
1526
-				$x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";";
1519
+				$x .= "\n\t$var"."[]= ".sql_quote($r[2]).";";
1527 1520
 			}
1528 1521
 		} else {
1529 1522
 			// Pour permettre de passer des tableaux de valeurs
1530 1523
 			// on repere l'utilisation brute de #ENV**{X},
1531 1524
 			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1532 1525
 			// et on deballe mais en rajoutant l'anti XSS
1533
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1526
+			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);";
1534 1527
 		}
1535 1528
 	}
1536 1529
 
@@ -1544,7 +1537,7 @@  discard block
 block discarded – undo
1544 1537
 		$boucles[$idb]->default_order[] = "((!sql_quote($var) OR sql_quote($var)===\"''\") ? 0 : ('FIELD($arg,' . sql_quote($var) . ')'))";
1545 1538
 	}
1546 1539
 
1547
-	return "sql_in('$arg',sql_quote($var)" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")";
1540
+	return "sql_in('$arg',sql_quote($var)".($crit2 == 'NOT' ? ",'NOT'" : "").")";
1548 1541
 }
1549 1542
 
1550 1543
 /**
@@ -1612,7 +1605,7 @@  discard block
 block discarded – undo
1612 1605
 		$boucle->sql_serveur
1613 1606
 	);
1614 1607
 
1615
-	$boucle->debug[] = "id_ : " . implode(', ', $champs);
1608
+	$boucle->debug[] = "id_ : ".implode(', ', $champs);
1616 1609
 	$boucle->modificateur['id_'] = $champs;
1617 1610
 
1618 1611
 	// créer un critère {id_xxx?} de chaque champ retenu
@@ -1653,7 +1646,7 @@  discard block
 block discarded – undo
1653 1646
 	// Les champs id_xx de la table demandée
1654 1647
 	$champs = array_filter(
1655 1648
 		array_keys($desc['field']),
1656
-		function($champ){
1649
+		function($champ) {
1657 1650
 			return
1658 1651
 				strpos($champ, 'id_') === 0
1659 1652
 				or (in_array($champ, array('objet')));
@@ -1856,8 +1849,8 @@  discard block
 block discarded – undo
1856 1849
 				"'NOT'",
1857 1850
 				array(
1858 1851
 					"'IN'",
1859
-					"'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'",
1860
-					array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where)
1852
+					"'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'",
1853
+					array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where)
1861 1854
 				)
1862 1855
 			);
1863 1856
 		}
@@ -1868,7 +1861,7 @@  discard block
 block discarded – undo
1868 1861
 	if ($crit->cond) {
1869 1862
 		$pred = calculer_argument_precedent($idb, $col, $boucles);
1870 1863
 		if ($col == "date" or $col == "date_redac") {
1871
-			if ($pred == "\$Pile[0]['" . $col . "']") {
1864
+			if ($pred == "\$Pile[0]['".$col."']") {
1872 1865
 				$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
1873 1866
 			}
1874 1867
 		}
@@ -2029,7 +2022,7 @@  discard block
 block discarded – undo
2029 2022
 		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2030 2023
 		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2031 2024
 		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) {
2032
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2025
+			$val[0] = $r[1].'"'.sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote).'"';
2033 2026
 		}
2034 2027
 		// sinon expliciter les
2035 2028
 		// sql_quote(truc) en sql_quote(truc,'',type)
@@ -2040,22 +2033,22 @@  discard block
 block discarded – undo
2040 2033
 		// sql_quote(truc,'','varchar')
2041 2034
 		elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r)
2042 2035
 			// si pas deja un type
2043
-			and (!isset($r[3]) or !$r[3] or !trim($r[3],", '"))
2036
+			and (!isset($r[3]) or !$r[3] or !trim($r[3], ", '"))
2044 2037
 		) {
2045 2038
 			$r = $r[1]
2046 2039
 				. ((isset($r[2]) and $r[2]) ? $r[2] : ",''")
2047
-				. ",'" . addslashes($type_cast_quote) . "'";
2040
+				. ",'".addslashes($type_cast_quote)."'";
2048 2041
 			$val[0] = "sql_quote($r)";
2049 2042
 		}
2050
-		elseif(strpos($val[0], '@@defaultcast@@') !== false
2043
+		elseif (strpos($val[0], '@@defaultcast@@') !== false
2051 2044
 		  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2052
-			$val[0] = substr($val[0], 0, -strlen($r[0])) . "'" . addslashes($type_cast_quote) . "')";
2045
+			$val[0] = substr($val[0], 0, -strlen($r[0]))."'".addslashes($type_cast_quote)."')";
2053 2046
 		}
2054 2047
 	}
2055 2048
 
2056
-	if(strpos($val[0], '@@defaultcast@@') !== false
2049
+	if (strpos($val[0], '@@defaultcast@@') !== false
2057 2050
 	  and preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", $val[0], $r)) {
2058
-		$val[0] = substr($val[0], 0, -strlen($r[0])) . "'char')";
2051
+		$val[0] = substr($val[0], 0, -strlen($r[0]))."'char')";
2059 2052
 	}
2060 2053
 
2061 2054
 	// Indicateur pour permettre aux fonctionx boucle_X de modifier
@@ -2080,7 +2073,7 @@  discard block
 block discarded – undo
2080 2073
 	// inserer le nom de la table SQL devant le nom du champ
2081 2074
 	if ($table) {
2082 2075
 		if ($col[0] == "`") {
2083
-			$arg = "$table." . substr($col, 1, -1);
2076
+			$arg = "$table.".substr($col, 1, -1);
2084 2077
 		} else {
2085 2078
 			$arg = "$table.$col";
2086 2079
 		}
@@ -2214,9 +2207,9 @@  discard block
 block discarded – undo
2214 2207
  **/
2215 2208
 function primary_doublee($decompose, $table) {
2216 2209
 	$e1 = reset($decompose);
2217
-	$e2 = "sql_quote('" . end($decompose) . "')";
2210
+	$e2 = "sql_quote('".end($decompose)."')";
2218 2211
 
2219
-	return array("'='", "'$table." . $e1 . "'", $e2);
2212
+	return array("'='", "'$table.".$e1."'", $e2);
2220 2213
 }
2221 2214
 
2222 2215
 /**
@@ -2254,7 +2247,7 @@  discard block
 block discarded – undo
2254 2247
 	if ($checkarrivee
2255 2248
 		and is_string($checkarrivee)
2256 2249
 		and $a = table_objet($checkarrivee)
2257
-		and in_array($a . '_liens', $joints)
2250
+		and in_array($a.'_liens', $joints)
2258 2251
 	) {
2259 2252
 		if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
2260 2253
 			return $res;
@@ -2274,12 +2267,12 @@  discard block
 block discarded – undo
2274 2267
 				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2275 2268
 				$joindre = false;
2276 2269
 				foreach ($cols as $col) {
2277
-					$c = '/\b' . $t . ".$col" . '\b/';
2270
+					$c = '/\b'.$t.".$col".'\b/';
2278 2271
 					if (trouver_champ($c, $boucle->where)) {
2279 2272
 						$joindre = true;
2280 2273
 					} else {
2281 2274
 						// mais ca peut etre dans le FIELD pour le Having
2282
-						$c = "/FIELD.$t" . ".$col,/";
2275
+						$c = "/FIELD.$t".".$col,/";
2283 2276
 						if (trouver_champ($c, $boucle->select)) {
2284 2277
 							$joindre = true;
2285 2278
 						}
@@ -2326,7 +2319,7 @@  discard block
 block discarded – undo
2326 2319
 	$primary_arrivee = id_table_objet($checkarrivee);
2327 2320
 
2328 2321
 	// [FIXME] $checkarrivee peut-il arriver avec false ????
2329
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
2322
+	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee."_liens");
2330 2323
 	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2331 2324
 
2332 2325
 	if (!$intermediaire or !$arrivee) {
@@ -2424,7 +2417,7 @@  discard block
 block discarded – undo
2424 2417
 			} elseif ($crit->cond and ($col == "date" or $col == "date_redac")) {
2425 2418
 				// un critere conditionnel sur date est traite a part
2426 2419
 				// car la date est mise d'office par SPIP,
2427
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2420
+				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])";
2428 2421
 			}
2429 2422
 
2430 2423
 			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
@@ -2456,7 +2449,7 @@  discard block
 block discarded – undo
2456 2449
 			and (($p == "'") or ($p == '"'))
2457 2450
 			and $params[0][1]->type == 'champ'
2458 2451
 		) {
2459
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2452
+			$val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p";
2460 2453
 		} else {
2461 2454
 			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2462 2455
 				$a = calculer_liste($p, $desc, $boucles, $parent);
@@ -2472,7 +2465,7 @@  discard block
 block discarded – undo
2472 2465
 	$fct = $args_sql = '';
2473 2466
 	// fonction SQL ?
2474 2467
 	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2475
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
2468
+	if (preg_match('/^(.*)'.SQL_ARGS.'$/', $col, $m)) {
2476 2469
 		$fct = $m[1];
2477 2470
 		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2478 2471
 		$col = $a[1];
@@ -2562,7 +2555,7 @@  discard block
 block discarded – undo
2562 2555
 		# si oui choisir ce champ, sinon choisir xxxx
2563 2556
 
2564 2557
 		if (isset($table['field']["date$suite"])) {
2565
-			$date_orig = 'date' . $suite;
2558
+			$date_orig = 'date'.$suite;
2566 2559
 		} else {
2567 2560
 			$date_orig = substr($suite, 1);
2568 2561
 		}
@@ -2573,12 +2566,12 @@  discard block
 block discarded – undo
2573 2566
 		}
2574 2567
 	}
2575 2568
 
2576
-	$date_compare = "\"' . normaliser_date(" .
2577
-		calculer_argument_precedent($idb, $pred, $boucles) .
2569
+	$date_compare = "\"' . normaliser_date(".
2570
+		calculer_argument_precedent($idb, $pred, $boucles).
2578 2571
 		") . '\"";
2579 2572
 
2580 2573
 	$col_vraie = $date_orig;
2581
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2574
+	$date_orig = $boucle->id_table.'.'.$date_orig;
2582 2575
 
2583 2576
 	switch ($col) {
2584 2577
 		case 'date':
@@ -2598,26 +2591,26 @@  discard block
 block discarded – undo
2598 2591
 			break;
2599 2592
 		case 'age':
2600 2593
 			$col = calculer_param_date("NOW()", $date_orig);
2601
-			$col_vraie = "";// comparer a un int (par defaut)
2594
+			$col_vraie = ""; // comparer a un int (par defaut)
2602 2595
 			break;
2603 2596
 		case 'age_relatif':
2604 2597
 			$col = calculer_param_date($date_compare, $date_orig);
2605
-			$col_vraie = "";// comparer a un int (par defaut)
2598
+			$col_vraie = ""; // comparer a un int (par defaut)
2606 2599
 			break;
2607 2600
 		case 'jour_relatif':
2608
-			$col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))";
2609
-			$col_vraie = "";// comparer a un int (par defaut)
2601
+			$col = "(TO_DAYS(".$date_compare.")-TO_DAYS(".$date_orig."))";
2602
+			$col_vraie = ""; // comparer a un int (par defaut)
2610 2603
 			break;
2611 2604
 		case 'mois_relatif':
2612
-			$col = "MONTH(" . $date_compare . ")-MONTH(" .
2613
-				$date_orig . ")+12*(YEAR(" . $date_compare .
2614
-				")-YEAR(" . $date_orig . "))";
2615
-			$col_vraie = "";// comparer a un int (par defaut)
2605
+			$col = "MONTH(".$date_compare.")-MONTH(".
2606
+				$date_orig.")+12*(YEAR(".$date_compare.
2607
+				")-YEAR(".$date_orig."))";
2608
+			$col_vraie = ""; // comparer a un int (par defaut)
2616 2609
 			break;
2617 2610
 		case 'annee_relatif':
2618
-			$col = "YEAR(" . $date_compare . ")-YEAR(" .
2619
-				$date_orig . ")";
2620
-			$col_vraie = "";// comparer a un int (par defaut)
2611
+			$col = "YEAR(".$date_compare.")-YEAR(".
2612
+				$date_orig.")";
2613
+			$col_vraie = ""; // comparer a un int (par defaut)
2621 2614
 			break;
2622 2615
 	}
2623 2616
 
@@ -2676,10 +2669,10 @@  discard block
 block discarded – undo
2676 2669
 	}
2677 2670
 
2678 2671
 	$boucle->hash .= '
2679
-	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2672
+	$command[\'sourcemode\'] = ' . array_shift($args).";\n";
2680 2673
 
2681 2674
 	$boucle->hash .= '
2682
-	$command[\'source\'] = array(' . join(', ', $args) . ");\n";
2675
+	$command[\'source\'] = array(' . join(', ', $args).");\n";
2683 2676
 }
2684 2677
 
2685 2678
 
@@ -2697,8 +2690,8 @@  discard block
 block discarded – undo
2697 2690
 function critere_DATA_datasource_dist($idb, &$boucles, $crit) {
2698 2691
 	$boucle = &$boucles[$idb];
2699 2692
 	$boucle->hash .= '
2700
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ');
2701
-	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent) . ';';
2693
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).');
2694
+	$command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent).';';
2702 2695
 }
2703 2696
 
2704 2697
 
@@ -2718,7 +2711,7 @@  discard block
 block discarded – undo
2718 2711
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2719 2712
 	$boucle = &$boucles[$idb];
2720 2713
 	$boucle->hash .= '
2721
-	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ';';
2714
+	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).';';
2722 2715
 }
2723 2716
 
2724 2717
 
@@ -2737,7 +2730,7 @@  discard block
 block discarded – undo
2737 2730
 	$boucle->hash .= '$command[\'args\']=array();';
2738 2731
 	foreach ($crit->param as $param) {
2739 2732
 		$boucle->hash .= '
2740
-			$command[\'args\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';';
2733
+			$command[\'args\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).';';
2741 2734
 	}
2742 2735
 }
2743 2736
 
@@ -2756,10 +2749,10 @@  discard block
 block discarded – undo
2756 2749
  */
2757 2750
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2758 2751
 	$boucle = &$boucles[$idb];
2759
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2752
+	$boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n";
2760 2753
 	foreach ($crit->param as $param) {
2761
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, array(), $boucles,
2762
-				$boucles[$idb]->id_parent) . ";\n";
2754
+		$boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste($param, array(), $boucles,
2755
+				$boucles[$idb]->id_parent).";\n";
2763 2756
 	}
2764 2757
 }
2765 2758
 
@@ -2786,10 +2779,10 @@  discard block
 block discarded – undo
2786 2779
  */
2787 2780
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2788 2781
 	$boucle = &$boucles[$idb];
2789
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2782
+	$boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n";
2790 2783
 	foreach ($crit->param as $param) {
2791
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, array(), $boucles,
2792
-				$boucles[$idb]->id_parent) . ";\n";
2784
+		$boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste($param, array(), $boucles,
2785
+				$boucles[$idb]->id_parent).";\n";
2793 2786
 	}
2794 2787
 }
2795 2788
 
@@ -2808,7 +2801,7 @@  discard block
 block discarded – undo
2808 2801
 	$boucle = &$boucles[$idb];
2809 2802
 	foreach ($crit->param as $param) {
2810 2803
 		$boucle->hash .= '
2811
-			$command[\'datapath\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';';
2804
+			$command[\'datapath\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).';';
2812 2805
 	}
2813 2806
 }
2814 2807
 
@@ -2849,7 +2842,7 @@  discard block
 block discarded – undo
2849 2842
 	if ($crit->param) {
2850 2843
 		foreach ($crit->param as $param) {
2851 2844
 			$boucle->hash .= "\t\$command['si'][] = "
2852
-				. calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n";
2845
+				. calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).";\n";
2853 2846
 		}
2854 2847
 		// interdire {si 0} aussi !
2855 2848
 	} else {
@@ -2872,7 +2865,7 @@  discard block
 block discarded – undo
2872 2865
 function critere_POUR_tableau_dist($idb, &$boucles, $crit) {
2873 2866
 	$boucle = &$boucles[$idb];
2874 2867
 	$boucle->hash .= '
2875
-	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ');
2868
+	$command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).');
2876 2869
 	$command[\'sourcemode\'] = \'table\';';
2877 2870
 }
2878 2871
 
@@ -2905,11 +2898,10 @@  discard block
 block discarded – undo
2905 2898
 	$table_sql = table_objet_sql(objet_type($table));
2906 2899
 
2907 2900
 	$id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ?
2908
-		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] :
2909
-		'id_parent';
2901
+		$GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent';
2910 2902
 
2911 2903
 	$in = "IN";
2912
-	$where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2904
+	$where = array("'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'");
2913 2905
 	if ($not) {
2914 2906
 		$where = array("'NOT'", $where);
2915 2907
 	}
Please login to merge, or discard this patch.
ecrire/public/interfaces.php 1 patch
Indentation   +889 added lines, -889 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,369 +189,369 @@  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 optionnelle avant
215
-	 *
216
-	 * @var string|array
217
-	 */
218
-	public $avant = '';
219
-
220
-	/**
221
-	 * Pour chaque élément
222
-	 *
223
-	 * @var string|array
224
-	 */
225
-	public $milieu = '';
226
-
227
-	/**
228
-	 * Partie optionnelle après
229
-	 *
230
-	 * @var string|array
231
-	 */
232
-	public $apres = '';
233
-
234
-	/**
235
-	 * Partie alternative, si pas de résultat dans la boucle
236
-	 *
237
-	 * @var string|array
238
-	 */
239
-	public $altern = '';
240
-
241
-	/**
242
-	 * La boucle doit-elle sélectionner la langue ?
243
-	 *
244
-	 * @var string|null
245
-	 */
246
-	public $lang_select;
247
-
248
-	/**
249
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
250
-	 *
251
-	 * @var string|null
252
-	 */
253
-	public $type_requete;
254
-
255
-	/**
256
-	 * La table est elle optionnelle ?
257
-	 *
258
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
259
-	 *
260
-	 * @var bool
261
-	 */
262
-	public $table_optionnelle = false;
263
-
264
-	/**
265
-	 * Nom du fichier de connexion
266
-	 *
267
-	 * @var string
268
-	 */
269
-	public $sql_serveur = '';
270
-
271
-	/**
272
-	 * Paramètres de la boucle
273
-	 *
274
-	 * Description des paramètres passés à la boucle, qui servent ensuite
275
-	 * au calcul des critères
276
-	 *
277
-	 * @var array
278
-	 */
279
-	public $param = array();
280
-
281
-	/**
282
-	 * Critères de la boucle
283
-	 *
284
-	 * @var Critere[]
285
-	 */
286
-	public $criteres = array();
287
-
288
-	/**
289
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
290
-	 *
291
-	 * @var string[]
292
-	 */
293
-	public $separateur = array();
294
-
295
-	/**
296
-	 * Liste des jointures possibles avec cette table
297
-	 *
298
-	 * Les jointures par défaut de la table sont complétées en priorité
299
-	 * des jointures déclarées explicitement sur la boucle
300
-	 *
301
-	 * @see base_trouver_table_dist()
302
-	 * @var array
303
-	 */
304
-	public $jointures = array();
305
-
306
-	/**
307
-	 * Jointures explicites avec cette table
308
-	 *
309
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
310
-	 * normales possibles pour retrouver les colonnes demandées extérieures
311
-	 * à la boucle.
312
-	 *
313
-	 * @var string|bool
314
-	 */
315
-	public $jointures_explicites = false;
316
-
317
-	/**
318
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
319
-	 *
320
-	 * @var string|null
321
-	 */
322
-	public $doublons;
323
-
324
-	/**
325
-	 * Code PHP ajouté au début de chaque itération de boucle.
326
-	 *
327
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
328
-	 *
329
-	 * @var string
330
-	 */
331
-	public $partie = "";
332
-
333
-	/**
334
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
335
-	 * ou de soustractions d'éléments à faire
336
-	 *
337
-	 * Dans les critères limitant le nombre d'éléments affichés
338
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
339
-	 *
340
-	 * @var string
341
-	 */
342
-	public $total_parties = "";
343
-
344
-	/**
345
-	 * Code PHP ajouté avant l'itération de boucle.
346
-	 *
347
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
348
-	 * pour initialiser les variables de début et de fin d'itération.
349
-	 *
350
-	 * @var string
351
-	 */
352
-	public $mode_partie = '';
353
-
354
-	/**
355
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
356
-	 *
357
-	 * Si une boucle est appelée de manière récursive quelque part par
358
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
359
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
360
-	 * de l'appelant (rec)
361
-	 *
362
-	 * @var string
363
-	 */
364
-	public $externe = '';
365
-
366
-	// champs pour la construction de la requete SQL
367
-
368
-	/**
369
-	 * Liste des champs à récupérer par la boucle
370
-	 *
371
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
372
-	 *
373
-	 * @var string[]
374
-	 */
375
-	public $select = array();
376
-
377
-	/**
378
-	 * Liste des alias / tables SQL utilisées dans la boucle
379
-	 *
380
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
381
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
382
-	 *
383
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
384
-	 *
385
-	 * @var string[]
386
-	 */
387
-	public $from = array();
388
-
389
-	/**
390
-	 * Liste des alias / type de jointures utilisées dans la boucle
391
-	 *
392
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
393
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
394
-	 *
395
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
396
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
397
-	 *
398
-	 * @var string[]
399
-	 */
400
-	public $from_type = array();
401
-
402
-	/**
403
-	 * Liste des conditions WHERE de la boucle
404
-	 *
405
-	 * Permet de restreindre les éléments retournés par une boucle
406
-	 * en fonctions des conditions transmises dans ce tableau.
407
-	 *
408
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
409
-	 *
410
-	 * Les éléments du premier niveau sont reliés par des AND, donc
411
-	 * chaque élément ajouté directement au where par
412
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
413
-	 * est une condition AND en plus.
414
-	 *
415
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
416
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
417
-	 * $expr = array(operateur, val1, val2)
418
-	 *
419
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
420
-	 * à réaliser tel que :
421
-	 *
422
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
423
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
424
-	 *    suivant cet ordre : "val1 operateur val2".
425
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
426
-	 * - "'AND'", "'OR'", "'NOT'" :
427
-	 *    dans ce cas val1 et val2 sont également des expressions
428
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
429
-	 *    Exemples :
430
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
431
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
432
-	 *
433
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
434
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
435
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
436
-	 *
437
-	 * @var array
438
-	 */
439
-	public $where = array();
440
-
441
-	public $join = array();
442
-	public $having = array();
443
-	public $limit;
444
-	public $group = array();
445
-	public $order = array();
446
-	public $default_order = array();
447
-	public $date = 'date';
448
-	public $hash = "";
449
-	public $in = "";
450
-	public $sous_requete = false;
451
-
452
-	/**
453
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
454
-	 *
455
-	 * Il sert à insérer le code calculant une hierarchie
456
-	 *
457
-	 * @var string
458
-	 */
459
-	public $hierarchie = '';
460
-
461
-	/**
462
-	 * Indique la présence d'un critère sur le statut
463
-	 *
464
-	 * @deprecated Remplacé par $boucle->modificateur['criteres']['statut']
465
-	 * @var bool
466
-	 */
467
-	public $statut = false;
468
-
469
-	// champs pour la construction du corps PHP
470
-
471
-	/**
472
-	 * Description des sources de données de la boucle
473
-	 *
474
-	 * Description des données de la boucle issu de trouver_table
475
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
476
-	 *
477
-	 * @see base_trouver_table_dist()
478
-	 * @var array
479
-	 */
480
-	public $show = array();
481
-
482
-	/**
483
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
484
-	 *
485
-	 * @var string
486
-	 */
487
-	public $id_table;
488
-
489
-	/**
490
-	 * Nom de la clé primaire de la table SQL principale de la boucle
491
-	 *
492
-	 * @var string
493
-	 */
494
-	public $primary;
495
-
496
-	/**
497
-	 * Code PHP compilé de la boucle
498
-	 *
499
-	 * @var string
500
-	 */
501
-	public $return;
502
-
503
-	public $numrows = false;
504
-	public $cptrows = false;
505
-
506
-	/**
507
-	 * Description du squelette
508
-	 *
509
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
510
-	 *
511
-	 * Peut contenir les index :
512
-	 *
513
-	 * - nom : Nom du fichier de cache
514
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
515
-	 * - sourcefile : Chemin du squelette
516
-	 * - squelette : Code du squelette
517
-	 * - id_mere : Identifiant de la boucle parente
518
-	 * - documents : Pour embed et img dans les textes
519
-	 * - session : Pour un cache sessionné par auteur
520
-	 * - niv : Niveau de tabulation
521
-	 *
522
-	 * @var array
523
-	 */
524
-	public $descr = array();
525
-
526
-	/**
527
-	 * Numéro de ligne dans le code source du squelette
528
-	 *
529
-	 * @var int
530
-	 */
531
-	public $ligne = 0;
532
-
533
-
534
-	public $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
535
-
536
-	/**
537
-	 * Type d'itérateur utilisé pour cette boucle
538
-	 *
539
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
540
-	 * - 'DATA' pour l'itérateur DATA, ...
541
-	 *
542
-	 * @var string
543
-	 */
544
-	public $iterateur = ''; // type d'iterateur
545
-
546
-	/**
547
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
548
-	 */
549
-	public $debug = [];
550
-
551
-	// obsoletes, conserves provisoirement pour compatibilite
552
-	public $tout = false;
553
-	public $plat = false;
554
-	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 optionnelle avant
215
+     *
216
+     * @var string|array
217
+     */
218
+    public $avant = '';
219
+
220
+    /**
221
+     * Pour chaque élément
222
+     *
223
+     * @var string|array
224
+     */
225
+    public $milieu = '';
226
+
227
+    /**
228
+     * Partie optionnelle après
229
+     *
230
+     * @var string|array
231
+     */
232
+    public $apres = '';
233
+
234
+    /**
235
+     * Partie alternative, si pas de résultat dans la boucle
236
+     *
237
+     * @var string|array
238
+     */
239
+    public $altern = '';
240
+
241
+    /**
242
+     * La boucle doit-elle sélectionner la langue ?
243
+     *
244
+     * @var string|null
245
+     */
246
+    public $lang_select;
247
+
248
+    /**
249
+     * Alias de table d'application de la requête ou nom complet de la table SQL
250
+     *
251
+     * @var string|null
252
+     */
253
+    public $type_requete;
254
+
255
+    /**
256
+     * La table est elle optionnelle ?
257
+     *
258
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
259
+     *
260
+     * @var bool
261
+     */
262
+    public $table_optionnelle = false;
263
+
264
+    /**
265
+     * Nom du fichier de connexion
266
+     *
267
+     * @var string
268
+     */
269
+    public $sql_serveur = '';
270
+
271
+    /**
272
+     * Paramètres de la boucle
273
+     *
274
+     * Description des paramètres passés à la boucle, qui servent ensuite
275
+     * au calcul des critères
276
+     *
277
+     * @var array
278
+     */
279
+    public $param = array();
280
+
281
+    /**
282
+     * Critères de la boucle
283
+     *
284
+     * @var Critere[]
285
+     */
286
+    public $criteres = array();
287
+
288
+    /**
289
+     * Textes insérés entre 2 éléments de boucle (critère inter)
290
+     *
291
+     * @var string[]
292
+     */
293
+    public $separateur = array();
294
+
295
+    /**
296
+     * Liste des jointures possibles avec cette table
297
+     *
298
+     * Les jointures par défaut de la table sont complétées en priorité
299
+     * des jointures déclarées explicitement sur la boucle
300
+     *
301
+     * @see base_trouver_table_dist()
302
+     * @var array
303
+     */
304
+    public $jointures = array();
305
+
306
+    /**
307
+     * Jointures explicites avec cette table
308
+     *
309
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
310
+     * normales possibles pour retrouver les colonnes demandées extérieures
311
+     * à la boucle.
312
+     *
313
+     * @var string|bool
314
+     */
315
+    public $jointures_explicites = false;
316
+
317
+    /**
318
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
319
+     *
320
+     * @var string|null
321
+     */
322
+    public $doublons;
323
+
324
+    /**
325
+     * Code PHP ajouté au début de chaque itération de boucle.
326
+     *
327
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
328
+     *
329
+     * @var string
330
+     */
331
+    public $partie = "";
332
+
333
+    /**
334
+     * Nombre de divisions de la boucle, d'éléments à afficher,
335
+     * ou de soustractions d'éléments à faire
336
+     *
337
+     * Dans les critères limitant le nombre d'éléments affichés
338
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
339
+     *
340
+     * @var string
341
+     */
342
+    public $total_parties = "";
343
+
344
+    /**
345
+     * Code PHP ajouté avant l'itération de boucle.
346
+     *
347
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
348
+     * pour initialiser les variables de début et de fin d'itération.
349
+     *
350
+     * @var string
351
+     */
352
+    public $mode_partie = '';
353
+
354
+    /**
355
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
356
+     *
357
+     * Si une boucle est appelée de manière récursive quelque part par
358
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
359
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
360
+     * de l'appelant (rec)
361
+     *
362
+     * @var string
363
+     */
364
+    public $externe = '';
365
+
366
+    // champs pour la construction de la requete SQL
367
+
368
+    /**
369
+     * Liste des champs à récupérer par la boucle
370
+     *
371
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
372
+     *
373
+     * @var string[]
374
+     */
375
+    public $select = array();
376
+
377
+    /**
378
+     * Liste des alias / tables SQL utilisées dans la boucle
379
+     *
380
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
381
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
382
+     *
383
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
384
+     *
385
+     * @var string[]
386
+     */
387
+    public $from = array();
388
+
389
+    /**
390
+     * Liste des alias / type de jointures utilisées dans la boucle
391
+     *
392
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
393
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
394
+     *
395
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
396
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
397
+     *
398
+     * @var string[]
399
+     */
400
+    public $from_type = array();
401
+
402
+    /**
403
+     * Liste des conditions WHERE de la boucle
404
+     *
405
+     * Permet de restreindre les éléments retournés par une boucle
406
+     * en fonctions des conditions transmises dans ce tableau.
407
+     *
408
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
409
+     *
410
+     * Les éléments du premier niveau sont reliés par des AND, donc
411
+     * chaque élément ajouté directement au where par
412
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
413
+     * est une condition AND en plus.
414
+     *
415
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
416
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
417
+     * $expr = array(operateur, val1, val2)
418
+     *
419
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
420
+     * à réaliser tel que :
421
+     *
422
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
423
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
424
+     *    suivant cet ordre : "val1 operateur val2".
425
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
426
+     * - "'AND'", "'OR'", "'NOT'" :
427
+     *    dans ce cas val1 et val2 sont également des expressions
428
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
429
+     *    Exemples :
430
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
431
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
432
+     *
433
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
434
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
435
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
436
+     *
437
+     * @var array
438
+     */
439
+    public $where = array();
440
+
441
+    public $join = array();
442
+    public $having = array();
443
+    public $limit;
444
+    public $group = array();
445
+    public $order = array();
446
+    public $default_order = array();
447
+    public $date = 'date';
448
+    public $hash = "";
449
+    public $in = "";
450
+    public $sous_requete = false;
451
+
452
+    /**
453
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
454
+     *
455
+     * Il sert à insérer le code calculant une hierarchie
456
+     *
457
+     * @var string
458
+     */
459
+    public $hierarchie = '';
460
+
461
+    /**
462
+     * Indique la présence d'un critère sur le statut
463
+     *
464
+     * @deprecated Remplacé par $boucle->modificateur['criteres']['statut']
465
+     * @var bool
466
+     */
467
+    public $statut = false;
468
+
469
+    // champs pour la construction du corps PHP
470
+
471
+    /**
472
+     * Description des sources de données de la boucle
473
+     *
474
+     * Description des données de la boucle issu de trouver_table
475
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
476
+     *
477
+     * @see base_trouver_table_dist()
478
+     * @var array
479
+     */
480
+    public $show = array();
481
+
482
+    /**
483
+     * Nom de la table SQL principale de la boucle, sans son préfixe
484
+     *
485
+     * @var string
486
+     */
487
+    public $id_table;
488
+
489
+    /**
490
+     * Nom de la clé primaire de la table SQL principale de la boucle
491
+     *
492
+     * @var string
493
+     */
494
+    public $primary;
495
+
496
+    /**
497
+     * Code PHP compilé de la boucle
498
+     *
499
+     * @var string
500
+     */
501
+    public $return;
502
+
503
+    public $numrows = false;
504
+    public $cptrows = false;
505
+
506
+    /**
507
+     * Description du squelette
508
+     *
509
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
510
+     *
511
+     * Peut contenir les index :
512
+     *
513
+     * - nom : Nom du fichier de cache
514
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
515
+     * - sourcefile : Chemin du squelette
516
+     * - squelette : Code du squelette
517
+     * - id_mere : Identifiant de la boucle parente
518
+     * - documents : Pour embed et img dans les textes
519
+     * - session : Pour un cache sessionné par auteur
520
+     * - niv : Niveau de tabulation
521
+     *
522
+     * @var array
523
+     */
524
+    public $descr = array();
525
+
526
+    /**
527
+     * Numéro de ligne dans le code source du squelette
528
+     *
529
+     * @var int
530
+     */
531
+    public $ligne = 0;
532
+
533
+
534
+    public $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
535
+
536
+    /**
537
+     * Type d'itérateur utilisé pour cette boucle
538
+     *
539
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
540
+     * - 'DATA' pour l'itérateur DATA, ...
541
+     *
542
+     * @var string
543
+     */
544
+    public $iterateur = ''; // type d'iterateur
545
+
546
+    /**
547
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
548
+     */
549
+    public $debug = [];
550
+
551
+    // obsoletes, conserves provisoirement pour compatibilite
552
+    public $tout = false;
553
+    public $plat = false;
554
+    public $lien = false;
555 555
 }
556 556
 
557 557
 /**
@@ -562,56 +562,56 @@  discard block
 block discarded – undo
562 562
  * @package SPIP\Core\Compilateur\AST
563 563
  **/
564 564
 class Critere {
565
-	/**
566
-	 * Type de noeud
567
-	 *
568
-	 * @var string
569
-	 */
570
-	public $type = 'critere';
571
-
572
-	/**
573
-	 * Opérateur (>, <, >=, IN, ...)
574
-	 *
575
-	 * @var null|string
576
-	 */
577
-	public $op;
578
-
579
-	/**
580
-	 * Présence d'une négation (truc !op valeur)
581
-	 *
582
-	 * @var null|string
583
-	 */
584
-	public $not;
585
-
586
-	/**
587
-	 * Présence d'une exclusion (!truc op valeur)
588
-	 *
589
-	 * @var null|string
590
-	 */
591
-	public $exclus;
592
-
593
-	/**
594
-	 * Présence d'une condition dans le critère (truc ?)
595
-	 *
596
-	 * @var bool
597
-	 */
598
-	public $cond = false;
599
-
600
-	/**
601
-	 * Paramètres du critère
602
-	 * - $param[0] : élément avant l'opérateur
603
-	 * - $param[1..n] : éléments après l'opérateur
604
-	 *
605
-	 * @var array
606
-	 */
607
-	public $param = array();
608
-
609
-	/**
610
-	 * Numéro de ligne dans le code source du squelette
611
-	 *
612
-	 * @var int
613
-	 */
614
-	public $ligne = 0;
565
+    /**
566
+     * Type de noeud
567
+     *
568
+     * @var string
569
+     */
570
+    public $type = 'critere';
571
+
572
+    /**
573
+     * Opérateur (>, <, >=, IN, ...)
574
+     *
575
+     * @var null|string
576
+     */
577
+    public $op;
578
+
579
+    /**
580
+     * Présence d'une négation (truc !op valeur)
581
+     *
582
+     * @var null|string
583
+     */
584
+    public $not;
585
+
586
+    /**
587
+     * Présence d'une exclusion (!truc op valeur)
588
+     *
589
+     * @var null|string
590
+     */
591
+    public $exclus;
592
+
593
+    /**
594
+     * Présence d'une condition dans le critère (truc ?)
595
+     *
596
+     * @var bool
597
+     */
598
+    public $cond = false;
599
+
600
+    /**
601
+     * Paramètres du critère
602
+     * - $param[0] : élément avant l'opérateur
603
+     * - $param[1..n] : éléments après l'opérateur
604
+     *
605
+     * @var array
606
+     */
607
+    public $param = array();
608
+
609
+    /**
610
+     * Numéro de ligne dans le code source du squelette
611
+     *
612
+     * @var int
613
+     */
614
+    public $ligne = 0;
615 615
 }
616 616
 
617 617
 /**
@@ -620,139 +620,139 @@  discard block
 block discarded – undo
620 620
  * @package SPIP\Core\Compilateur\AST
621 621
  **/
622 622
 class Champ {
623
-	/**
624
-	 * Type de noeud
625
-	 *
626
-	 * @var string
627
-	 */
628
-	public $type = 'champ';
629
-
630
-	/**
631
-	 * Nom du champ demandé. Exemple 'ID_ARTICLE'
632
-	 *
633
-	 * @var string|null
634
-	 */
635
-	public $nom_champ;
636
-
637
-	/**
638
-	 * Identifiant de la boucle parente si explicité
639
-	 *
640
-	 * @var string|null
641
-	 */
642
-	public $nom_boucle = '';
643
-
644
-	/**
645
-	 * Partie optionnelle avant
646
-	 *
647
-	 * @var null|string|array
648
-	 */
649
-	public $avant;
650
-
651
-	/**
652
-	 * Partie optionnelle après
653
-	 *
654
-	 * @var null|string|array
655
-	 */
656
-	public $apres;
657
-
658
-	/**
659
-	 * Étoiles : annuler des automatismes
660
-	 *
661
-	 * - '*' annule les filtres automatiques
662
-	 * - '**' annule en plus les protections de scripts
663
-	 *
664
-	 * @var null|string
665
-	 */
666
-	public $etoile;
667
-
668
-	/**
669
-	 * Arguments et filtres explicites sur la balise
670
-	 *
671
-	 * - $param[0] contient les arguments de la balise
672
-	 * - $param[1..n] contient les filtres à appliquer à la balise
673
-	 *
674
-	 * @var array
675
-	 */
676
-	public $param = array();
677
-
678
-	/**
679
-	 * Source des filtres  (compatibilité) (?)
680
-	 *
681
-	 * @var array|null
682
-	 */
683
-	public $fonctions = array();
684
-
685
-	/**
686
-	 * Identifiant de la boucle
687
-	 *
688
-	 * @var string
689
-	 */
690
-	public $id_boucle = '';
691
-
692
-	/**
693
-	 * AST du squelette, liste de toutes les boucles
694
-	 *
695
-	 * @var Boucles[]
696
-	 */
697
-	public $boucles;
698
-
699
-	/**
700
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
701
-	 *
702
-	 * @var string|null
703
-	 */
704
-	public $type_requete;
705
-
706
-	/**
707
-	 * Résultat de la compilation: toujours une expression PHP
708
-	 *
709
-	 * @var string
710
-	 */
711
-	public $code = '';
712
-
713
-	/**
714
-	 * Interdire les scripts
715
-	 *
716
-	 * false si on est sûr de cette balise
717
-	 *
718
-	 * @see interdire_scripts()
719
-	 * @var bool
720
-	 */
721
-	public $interdire_scripts = true;
722
-
723
-	/**
724
-	 * Description du squelette
725
-	 *
726
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
727
-	 *
728
-	 * Peut contenir les index :
729
-	 *
730
-	 * - nom : Nom du fichier de cache
731
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
732
-	 * - sourcefile : Chemin du squelette
733
-	 * - squelette : Code du squelette
734
-	 * - id_mere : Identifiant de la boucle parente
735
-	 * - documents : Pour embed et img dans les textes
736
-	 * - session : Pour un cache sessionné par auteur
737
-	 * - niv : Niveau de tabulation
738
-	 *
739
-	 * @var array
740
-	 */
741
-	public $descr = array();
742
-
743
-	/**
744
-	 * Numéro de ligne dans le code source du squelette
745
-	 *
746
-	 * @var int
747
-	 */
748
-	public $ligne = 0;
749
-
750
-	/**
751
-	 * Drapeau pour reperer les balises calculées par une fonction explicite
752
-	 *
753
-	 * @var bool
754
-	 */
755
-	public $balise_calculee = false;
623
+    /**
624
+     * Type de noeud
625
+     *
626
+     * @var string
627
+     */
628
+    public $type = 'champ';
629
+
630
+    /**
631
+     * Nom du champ demandé. Exemple 'ID_ARTICLE'
632
+     *
633
+     * @var string|null
634
+     */
635
+    public $nom_champ;
636
+
637
+    /**
638
+     * Identifiant de la boucle parente si explicité
639
+     *
640
+     * @var string|null
641
+     */
642
+    public $nom_boucle = '';
643
+
644
+    /**
645
+     * Partie optionnelle avant
646
+     *
647
+     * @var null|string|array
648
+     */
649
+    public $avant;
650
+
651
+    /**
652
+     * Partie optionnelle après
653
+     *
654
+     * @var null|string|array
655
+     */
656
+    public $apres;
657
+
658
+    /**
659
+     * Étoiles : annuler des automatismes
660
+     *
661
+     * - '*' annule les filtres automatiques
662
+     * - '**' annule en plus les protections de scripts
663
+     *
664
+     * @var null|string
665
+     */
666
+    public $etoile;
667
+
668
+    /**
669
+     * Arguments et filtres explicites sur la balise
670
+     *
671
+     * - $param[0] contient les arguments de la balise
672
+     * - $param[1..n] contient les filtres à appliquer à la balise
673
+     *
674
+     * @var array
675
+     */
676
+    public $param = array();
677
+
678
+    /**
679
+     * Source des filtres  (compatibilité) (?)
680
+     *
681
+     * @var array|null
682
+     */
683
+    public $fonctions = array();
684
+
685
+    /**
686
+     * Identifiant de la boucle
687
+     *
688
+     * @var string
689
+     */
690
+    public $id_boucle = '';
691
+
692
+    /**
693
+     * AST du squelette, liste de toutes les boucles
694
+     *
695
+     * @var Boucles[]
696
+     */
697
+    public $boucles;
698
+
699
+    /**
700
+     * Alias de table d'application de la requête ou nom complet de la table SQL
701
+     *
702
+     * @var string|null
703
+     */
704
+    public $type_requete;
705
+
706
+    /**
707
+     * Résultat de la compilation: toujours une expression PHP
708
+     *
709
+     * @var string
710
+     */
711
+    public $code = '';
712
+
713
+    /**
714
+     * Interdire les scripts
715
+     *
716
+     * false si on est sûr de cette balise
717
+     *
718
+     * @see interdire_scripts()
719
+     * @var bool
720
+     */
721
+    public $interdire_scripts = true;
722
+
723
+    /**
724
+     * Description du squelette
725
+     *
726
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
727
+     *
728
+     * Peut contenir les index :
729
+     *
730
+     * - nom : Nom du fichier de cache
731
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
732
+     * - sourcefile : Chemin du squelette
733
+     * - squelette : Code du squelette
734
+     * - id_mere : Identifiant de la boucle parente
735
+     * - documents : Pour embed et img dans les textes
736
+     * - session : Pour un cache sessionné par auteur
737
+     * - niv : Niveau de tabulation
738
+     *
739
+     * @var array
740
+     */
741
+    public $descr = array();
742
+
743
+    /**
744
+     * Numéro de ligne dans le code source du squelette
745
+     *
746
+     * @var int
747
+     */
748
+    public $ligne = 0;
749
+
750
+    /**
751
+     * Drapeau pour reperer les balises calculées par une fonction explicite
752
+     *
753
+     * @var bool
754
+     */
755
+    public $balise_calculee = false;
756 756
 }
757 757
 
758 758
 
@@ -760,123 +760,123 @@  discard block
 block discarded – undo
760 760
  * Description d'une chaîne de langue
761 761
  **/
762 762
 class Idiome {
763
-	/**
764
-	 * Type de noeud
765
-	 *
766
-	 * @var string
767
-	 */
768
-	public $type = 'idiome';
769
-
770
-	/**
771
-	 * Clé de traduction demandée. Exemple 'item_oui'
772
-	 *
773
-	 * @var string
774
-	 */
775
-	public $nom_champ = "";
776
-
777
-	/**
778
-	 * Module de langue où chercher la clé de traduction. Exemple 'medias'
779
-	 *
780
-	 * @var string
781
-	 */
782
-	public $module = "";
783
-
784
-	/**
785
-	 * Arguments à passer à la chaîne
786
-	 *
787
-	 * @var array
788
-	 */
789
-	public $arg = array();
790
-
791
-	/**
792
-	 * Filtres à appliquer au résultat
793
-	 *
794
-	 * @var array
795
-	 */
796
-	public $param = array();
797
-
798
-	/**
799
-	 * Source des filtres  (compatibilité) (?)
800
-	 *
801
-	 * @var array|null
802
-	 */
803
-	public $fonctions = array();
804
-
805
-	/**
806
-	 * Inutilisé, propriété générique de l'AST
807
-	 *
808
-	 * @var string|array
809
-	 */
810
-	public $avant = '';
811
-
812
-	/**
813
-	 * Inutilisé, propriété générique de l'AST
814
-	 *
815
-	 * @var string|array
816
-	 */
817
-	public $apres = '';
818
-
819
-	/**
820
-	 * Identifiant de la boucle
821
-	 *
822
-	 * @var string
823
-	 */
824
-	public $id_boucle = '';
825
-
826
-	/**
827
-	 * AST du squelette, liste de toutes les boucles
828
-	 *
829
-	 * @var Boucles[]
830
-	 */
831
-	public $boucles;
832
-
833
-	/**
834
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
835
-	 *
836
-	 * @var string|null
837
-	 */
838
-	public $type_requete;
839
-
840
-	/**
841
-	 * Résultat de la compilation: toujours une expression PHP
842
-	 *
843
-	 * @var string
844
-	 */
845
-	public $code = '';
846
-
847
-	/**
848
-	 * Interdire les scripts
849
-	 *
850
-	 * @see interdire_scripts()
851
-	 * @var bool
852
-	 */
853
-	public $interdire_scripts = false;
854
-
855
-	/**
856
-	 * Description du squelette
857
-	 *
858
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
859
-	 *
860
-	 * Peut contenir les index :
861
-	 * - nom : Nom du fichier de cache
862
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
863
-	 * - sourcefile : Chemin du squelette
864
-	 * - squelette : Code du squelette
865
-	 * - id_mere : Identifiant de la boucle parente
866
-	 * - documents : Pour embed et img dans les textes
867
-	 * - session : Pour un cache sessionné par auteur
868
-	 * - niv : Niveau de tabulation
869
-	 *
870
-	 * @var array
871
-	 */
872
-	public $descr = array();
873
-
874
-	/**
875
-	 * Numéro de ligne dans le code source du squelette
876
-	 *
877
-	 * @var int
878
-	 */
879
-	public $ligne = 0;
763
+    /**
764
+     * Type de noeud
765
+     *
766
+     * @var string
767
+     */
768
+    public $type = 'idiome';
769
+
770
+    /**
771
+     * Clé de traduction demandée. Exemple 'item_oui'
772
+     *
773
+     * @var string
774
+     */
775
+    public $nom_champ = "";
776
+
777
+    /**
778
+     * Module de langue où chercher la clé de traduction. Exemple 'medias'
779
+     *
780
+     * @var string
781
+     */
782
+    public $module = "";
783
+
784
+    /**
785
+     * Arguments à passer à la chaîne
786
+     *
787
+     * @var array
788
+     */
789
+    public $arg = array();
790
+
791
+    /**
792
+     * Filtres à appliquer au résultat
793
+     *
794
+     * @var array
795
+     */
796
+    public $param = array();
797
+
798
+    /**
799
+     * Source des filtres  (compatibilité) (?)
800
+     *
801
+     * @var array|null
802
+     */
803
+    public $fonctions = array();
804
+
805
+    /**
806
+     * Inutilisé, propriété générique de l'AST
807
+     *
808
+     * @var string|array
809
+     */
810
+    public $avant = '';
811
+
812
+    /**
813
+     * Inutilisé, propriété générique de l'AST
814
+     *
815
+     * @var string|array
816
+     */
817
+    public $apres = '';
818
+
819
+    /**
820
+     * Identifiant de la boucle
821
+     *
822
+     * @var string
823
+     */
824
+    public $id_boucle = '';
825
+
826
+    /**
827
+     * AST du squelette, liste de toutes les boucles
828
+     *
829
+     * @var Boucles[]
830
+     */
831
+    public $boucles;
832
+
833
+    /**
834
+     * Alias de table d'application de la requête ou nom complet de la table SQL
835
+     *
836
+     * @var string|null
837
+     */
838
+    public $type_requete;
839
+
840
+    /**
841
+     * Résultat de la compilation: toujours une expression PHP
842
+     *
843
+     * @var string
844
+     */
845
+    public $code = '';
846
+
847
+    /**
848
+     * Interdire les scripts
849
+     *
850
+     * @see interdire_scripts()
851
+     * @var bool
852
+     */
853
+    public $interdire_scripts = false;
854
+
855
+    /**
856
+     * Description du squelette
857
+     *
858
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
859
+     *
860
+     * Peut contenir les index :
861
+     * - nom : Nom du fichier de cache
862
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
863
+     * - sourcefile : Chemin du squelette
864
+     * - squelette : Code du squelette
865
+     * - id_mere : Identifiant de la boucle parente
866
+     * - documents : Pour embed et img dans les textes
867
+     * - session : Pour un cache sessionné par auteur
868
+     * - niv : Niveau de tabulation
869
+     *
870
+     * @var array
871
+     */
872
+    public $descr = array();
873
+
874
+    /**
875
+     * Numéro de ligne dans le code source du squelette
876
+     *
877
+     * @var int
878
+     */
879
+    public $ligne = 0;
880 880
 }
881 881
 
882 882
 /**
@@ -885,28 +885,28 @@  discard block
 block discarded – undo
885 885
  * @package SPIP\Core\Compilateur\AST
886 886
  **/
887 887
 class Polyglotte {
888
-	/**
889
-	 * Type de noeud
890
-	 *
891
-	 * @var string
892
-	 */
893
-	public $type = 'polyglotte';
894
-
895
-	/**
896
-	 * Tableau des traductions possibles classées par langue
897
-	 *
898
-	 * Tableau code de langue => texte
899
-	 *
900
-	 * @var array
901
-	 */
902
-	public $traductions = array();
903
-
904
-	/**
905
-	 * Numéro de ligne dans le code source du squelette
906
-	 *
907
-	 * @var int
908
-	 */
909
-	public $ligne = 0;
888
+    /**
889
+     * Type de noeud
890
+     *
891
+     * @var string
892
+     */
893
+    public $type = 'polyglotte';
894
+
895
+    /**
896
+     * Tableau des traductions possibles classées par langue
897
+     *
898
+     * Tableau code de langue => texte
899
+     *
900
+     * @var array
901
+     */
902
+    public $traductions = array();
903
+
904
+    /**
905
+     * Numéro de ligne dans le code source du squelette
906
+     *
907
+     * @var int
908
+     */
909
+    public $ligne = 0;
910 910
 }
911 911
 
912 912
 
@@ -931,80 +931,80 @@  discard block
 block discarded – undo
931 931
  */
932 932
 function declarer_interfaces() {
933 933
 
934
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
935
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
936
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
937
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
938
-
939
-	// definition des statuts de publication
940
-	$GLOBALS['table_statut'] = array();
941
-
942
-	//
943
-	// tableau des tables de jointures
944
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
945
-	$GLOBALS['tables_jointures'] = array();
946
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
947
-
948
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
949
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = array('spip_rubriques', 'profondeur');
950
-
951
-	define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
952
-	define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
953
-	define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s), "TYPO", $connect, $Pile[0])');
954
-
955
-	$GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
956
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
957
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
958
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
959
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
960
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
961
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
962
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
963
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
964
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
965
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
966
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
967
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
968
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
969
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
970
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
971
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
972
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
973
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
974
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
975
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
976
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
977
-
978
-	// valeur par defaut pour les balises non listees ci-dessus
979
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
980
-	// toujours securiser les DATA
981
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
982
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
983
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
984
-
985
-
986
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
987
-	$interfaces = pipeline('declarer_tables_interfaces',
988
-		array(
989
-			'table_des_tables' => $GLOBALS['table_des_tables'],
990
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
991
-			'table_date' => $GLOBALS['table_date'],
992
-			'table_titre' => $GLOBALS['table_titre'],
993
-			'tables_jointures' => $GLOBALS['tables_jointures'],
994
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
995
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
996
-			'table_statut' => $GLOBALS['table_statut'],
997
-		));
998
-	if ($interfaces) {
999
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1000
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1001
-		$GLOBALS['table_date'] = $interfaces['table_date'];
1002
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
1003
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1004
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1005
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1006
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
1007
-	}
934
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
935
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
936
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
937
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
938
+
939
+    // definition des statuts de publication
940
+    $GLOBALS['table_statut'] = array();
941
+
942
+    //
943
+    // tableau des tables de jointures
944
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
945
+    $GLOBALS['tables_jointures'] = array();
946
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
947
+
948
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
949
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = array('spip_rubriques', 'profondeur');
950
+
951
+    define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
952
+    define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
953
+    define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s), "TYPO", $connect, $Pile[0])');
954
+
955
+    $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS;
956
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
957
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
958
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
959
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
960
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
961
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
962
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
963
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
964
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
965
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
966
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
967
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
968
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
969
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
970
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
971
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
972
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
973
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
974
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
975
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
976
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
977
+
978
+    // valeur par defaut pour les balises non listees ci-dessus
979
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
980
+    // toujours securiser les DATA
981
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
982
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
983
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
984
+
985
+
986
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
987
+    $interfaces = pipeline('declarer_tables_interfaces',
988
+        array(
989
+            'table_des_tables' => $GLOBALS['table_des_tables'],
990
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
991
+            'table_date' => $GLOBALS['table_date'],
992
+            'table_titre' => $GLOBALS['table_titre'],
993
+            'tables_jointures' => $GLOBALS['tables_jointures'],
994
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
995
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
996
+            'table_statut' => $GLOBALS['table_statut'],
997
+        ));
998
+    if ($interfaces) {
999
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
1000
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
1001
+        $GLOBALS['table_date'] = $interfaces['table_date'];
1002
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
1003
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
1004
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
1005
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
1006
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
1007
+    }
1008 1008
 }
1009 1009
 
1010 1010
 declarer_interfaces();
Please login to merge, or discard this patch.
ecrire/public/compiler.php 2 patches
Indentation   +1119 added lines, -1119 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /** Repérer un code ne calculant rien, meme avec commentaire */
@@ -60,91 +60,91 @@  discard block
 block discarded – undo
60 60
 
61 61
 // http://code.spip.net/@argumenter_inclure
62 62
 function argumenter_inclure(
63
-	$params,
64
-	$rejet_filtres,
65
-	$p,
66
-	&$boucles,
67
-	$id_boucle,
68
-	$echap = true,
69
-	$lang = '',
70
-	$fond1 = false
63
+    $params,
64
+    $rejet_filtres,
65
+    $p,
66
+    &$boucles,
67
+    $id_boucle,
68
+    $echap = true,
69
+    $lang = '',
70
+    $fond1 = false
71 71
 ) {
72
-	$l = array();
73
-	$erreur_p_i_i = '';
74
-	if (!is_array($params)) {
75
-		return $l;
76
-	}
77
-	foreach ($params as $k => $couple) {
78
-		// la liste d'arguments d'inclusion peut se terminer par un filtre
79
-		$filtre = array_shift($couple);
80
-		if ($filtre) {
81
-			break;
82
-		}
83
-		foreach ($couple as $n => $val) {
84
-			$var = $val[0];
85
-			if ($var->type != 'texte') {
86
-				if ($n or $k or $fond1) {
87
-					$erreur_p_i_i = array(
88
-						'zbug_parametres_inclus_incorrects',
89
-						array('param' => $var->nom_champ)
90
-					);
91
-					erreur_squelette($erreur_p_i_i, $p);
92
-					break;
93
-				} else {
94
-					$l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
95
-				}
96
-			} else {
97
-				preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98
-				$m = array_pad($m, 3, null);
99
-				$var = $m[1];
100
-				$auto = false;;
101
-				if ($m[2]) {
102
-					$v = $m[3];
103
-					if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
104
-						$v = $m[1];
105
-					}
106
-					$val[0] = new Texte;
107
-					$val[0]->texte = $v;
108
-				} elseif ($k or $n or $fond1) {
109
-					$auto = true;
110
-				} else {
111
-					$var = 1;
112
-				}
113
-
114
-				if ($var == 'lang') {
115
-					$lang = !$auto
116
-						? calculer_liste($val, $p->descr, $boucles, $id_boucle)
117
-						: '$GLOBALS["spip_lang"]';
118
-				} else {
119
-					$val = $auto
120
-						? index_pile($id_boucle, $var, $boucles)
121
-						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
122
-					if ($var !== 1) {
123
-						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
-							. $val . ($echap ? ") . '" : " ");
125
-					} else {
126
-						$val = $echap ? "'.$val.'" : $val;
127
-					}
128
-					$l[$var] = $val;
129
-				}
130
-			}
131
-		}
132
-	}
133
-	if ($erreur_p_i_i) {
134
-		return false;
135
-	}
136
-	// Cas particulier de la langue : si {lang=xx} est definie, on
137
-	// la passe, sinon on passe la langue courante au moment du calcul
138
-	// sauf si on n'en veut pas 
139
-	if ($lang === false) {
140
-		return $l;
141
-	}
142
-	if (!$lang) {
143
-		$lang = '$GLOBALS["spip_lang"]';
144
-	}
145
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
146
-
147
-	return $l;
72
+    $l = array();
73
+    $erreur_p_i_i = '';
74
+    if (!is_array($params)) {
75
+        return $l;
76
+    }
77
+    foreach ($params as $k => $couple) {
78
+        // la liste d'arguments d'inclusion peut se terminer par un filtre
79
+        $filtre = array_shift($couple);
80
+        if ($filtre) {
81
+            break;
82
+        }
83
+        foreach ($couple as $n => $val) {
84
+            $var = $val[0];
85
+            if ($var->type != 'texte') {
86
+                if ($n or $k or $fond1) {
87
+                    $erreur_p_i_i = array(
88
+                        'zbug_parametres_inclus_incorrects',
89
+                        array('param' => $var->nom_champ)
90
+                    );
91
+                    erreur_squelette($erreur_p_i_i, $p);
92
+                    break;
93
+                } else {
94
+                    $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
95
+                }
96
+            } else {
97
+                preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98
+                $m = array_pad($m, 3, null);
99
+                $var = $m[1];
100
+                $auto = false;;
101
+                if ($m[2]) {
102
+                    $v = $m[3];
103
+                    if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
104
+                        $v = $m[1];
105
+                    }
106
+                    $val[0] = new Texte;
107
+                    $val[0]->texte = $v;
108
+                } elseif ($k or $n or $fond1) {
109
+                    $auto = true;
110
+                } else {
111
+                    $var = 1;
112
+                }
113
+
114
+                if ($var == 'lang') {
115
+                    $lang = !$auto
116
+                        ? calculer_liste($val, $p->descr, $boucles, $id_boucle)
117
+                        : '$GLOBALS["spip_lang"]';
118
+                } else {
119
+                    $val = $auto
120
+                        ? index_pile($id_boucle, $var, $boucles)
121
+                        : calculer_liste($val, $p->descr, $boucles, $id_boucle);
122
+                    if ($var !== 1) {
123
+                        $val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
+                            . $val . ($echap ? ") . '" : " ");
125
+                    } else {
126
+                        $val = $echap ? "'.$val.'" : $val;
127
+                    }
128
+                    $l[$var] = $val;
129
+                }
130
+            }
131
+        }
132
+    }
133
+    if ($erreur_p_i_i) {
134
+        return false;
135
+    }
136
+    // Cas particulier de la langue : si {lang=xx} est definie, on
137
+    // la passe, sinon on passe la langue courante au moment du calcul
138
+    // sauf si on n'en veut pas 
139
+    if ($lang === false) {
140
+        return $l;
141
+    }
142
+    if (!$lang) {
143
+        $lang = '$GLOBALS["spip_lang"]';
144
+    }
145
+    $l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
146
+
147
+    return $l;
148 148
 }
149 149
 
150 150
 /**
@@ -168,71 +168,71 @@  discard block
 block discarded – undo
168 168
  **/
169 169
 function calculer_inclure($p, &$boucles, $id_boucle) {
170 170
 
171
-	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172
-	if (is_string($p->texte)) {
173
-		$fichier = $p->texte;
174
-		$code = "\"".str_replace('"','\"',$fichier)."\"";
175
-
176
-	} else {
177
-		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
178
-		if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
179
-			$fichier = $r[1];
180
-		} else {
181
-			$fichier = '';
182
-		}
183
-	}
184
-	if (!$code or $code === '""') {
185
-		$erreur_p_i_i = array(
186
-			'zbug_parametres_inclus_incorrects',
187
-			array('param' => $code)
188
-		);
189
-		erreur_squelette($erreur_p_i_i, $p);
190
-
191
-		return false;
192
-	}
193
-	$compil = texte_script(memoriser_contexte_compil($p));
194
-
195
-	if (is_array($_contexte)) {
196
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
197
-		if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
198
-			unset($_contexte['env']);
199
-		}
200
-
201
-		// noter les doublons dans l'appel a public.php
202
-		if (isset($_contexte['doublons'])) {
203
-			$_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
204
-		}
205
-
206
-		if ($ajax = isset($_contexte['ajax'])) {
207
-			$ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
208
-			unset($_contexte['ajax']);
209
-		}
210
-
211
-		$_contexte = join(",\n\t", $_contexte);
212
-	} else {
213
-		return false;
214
-	} // j'aurais voulu toucher le fond ...
215
-
216
-	$contexte = 'array(' . $_contexte . ')';
217
-
218
-	if ($env) {
219
-		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
220
-	}
221
-
222
-	// s'il y a une extension .php, ce n'est pas un squelette
223
-	if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
224
-		$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
225
-	} else {
226
-		$_options[] = "\"compil\"=>array($compil)";
227
-		if ($ajax) {
228
-			$_options[] = $ajax;
229
-		}
230
-		$code = " ' . argumenter_squelette($code) . '";
231
-		$code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
232
-				"_request(\"connect\")") . ';';
233
-	}
234
-
235
-	return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
171
+    $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172
+    if (is_string($p->texte)) {
173
+        $fichier = $p->texte;
174
+        $code = "\"".str_replace('"','\"',$fichier)."\"";
175
+
176
+    } else {
177
+        $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
178
+        if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
179
+            $fichier = $r[1];
180
+        } else {
181
+            $fichier = '';
182
+        }
183
+    }
184
+    if (!$code or $code === '""') {
185
+        $erreur_p_i_i = array(
186
+            'zbug_parametres_inclus_incorrects',
187
+            array('param' => $code)
188
+        );
189
+        erreur_squelette($erreur_p_i_i, $p);
190
+
191
+        return false;
192
+    }
193
+    $compil = texte_script(memoriser_contexte_compil($p));
194
+
195
+    if (is_array($_contexte)) {
196
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
197
+        if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
198
+            unset($_contexte['env']);
199
+        }
200
+
201
+        // noter les doublons dans l'appel a public.php
202
+        if (isset($_contexte['doublons'])) {
203
+            $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
204
+        }
205
+
206
+        if ($ajax = isset($_contexte['ajax'])) {
207
+            $ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
208
+            unset($_contexte['ajax']);
209
+        }
210
+
211
+        $_contexte = join(",\n\t", $_contexte);
212
+    } else {
213
+        return false;
214
+    } // j'aurais voulu toucher le fond ...
215
+
216
+    $contexte = 'array(' . $_contexte . ')';
217
+
218
+    if ($env) {
219
+        $contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
220
+    }
221
+
222
+    // s'il y a une extension .php, ce n'est pas un squelette
223
+    if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
224
+        $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
225
+    } else {
226
+        $_options[] = "\"compil\"=>array($compil)";
227
+        if ($ajax) {
228
+            $_options[] = $ajax;
229
+        }
230
+        $code = " ' . argumenter_squelette($code) . '";
231
+        $code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
232
+                "_request(\"connect\")") . ';';
233
+    }
234
+
235
+    return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
236 236
 }
237 237
 
238 238
 
@@ -250,7 +250,7 @@  discard block
 block discarded – undo
250 250
  *     true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
251 251
  */
252 252
 function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false) {
253
-	/*
253
+    /*
254 254
 	$show['statut'][] = array(
255 255
 		'champ'=>'statut',  // champ de la table sur lequel porte le filtrage par le statut
256 256
 		'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
@@ -274,71 +274,71 @@  discard block
 block discarded – undo
274 274
 	champstatut est alors le champ statut sur la tablen
275 275
 	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
276 276
 */
277
-	$id_table = $boucle->id_table;
278
-	$show = $boucle->show;
279
-	if (isset($show['statut']) and $show['statut']) {
280
-		foreach ($show['statut'] as $k => $s) {
281
-			// Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
282
-			$filtrer = true;
283
-			if (isset($s['exception'])) {
284
-				foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
285
-					if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
286
-						$filtrer = false;
287
-						break;
288
-					}
289
-				}
290
-			}
291
-
292
-			if ($filtrer) {
293
-				if (is_array($s['champ'])) {
294
-					$statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
295
-					$jointures = array();
296
-					// indiquer la description de chaque table dans le tableau de jointures,
297
-					// ce qui permet d'eviter certains GROUP BY inutiles.
298
-					$trouver_table = charger_fonction('trouver_table', 'base');
299
-					foreach ($s['champ'] as $j) {
300
-						$id = reset($j);
301
-						$def = $trouver_table($id);
302
-						$jointures[] = array('', array($id, $def), end($j));
303
-					}
304
-					$jointures[0][0] = $id_table;
305
-					if (!array_search($id, $boucle->from)) {
306
-						include_spip('public/jointures');
307
-						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
308
-					}
309
-					// trouver l'alias de la table d'arrivee qui porte le statut
310
-					$id = array_search($id, $boucle->from);
311
-				} else {
312
-					$id = $id_table;
313
-					$statut = preg_replace(',\W,', '', $s['champ']); // securite
314
-				}
315
-				$mstatut = $id . '.' . $statut;
316
-
317
-				$arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
318
-				include_spip('public/quete');
319
-				if (isset($s['post_date']) and $s['post_date']
320
-					and $GLOBALS['meta']["post_dates"] == 'non'
321
-				) {
322
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
323
-					array_unshift($boucle->where,
324
-						$echapper ?
325
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
326
-							:
327
-							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
328
-					);
329
-				}
330
-				array_unshift($boucle->where,
331
-					$echapper ?
332
-						"\nquete_condition_statut('$mstatut',"
333
-						. _q($s['previsu']) . ","
334
-						. _q($s['publie']) . ","
335
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
336
-						:
337
-						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
338
-				);
339
-			}
340
-		}
341
-	}
277
+    $id_table = $boucle->id_table;
278
+    $show = $boucle->show;
279
+    if (isset($show['statut']) and $show['statut']) {
280
+        foreach ($show['statut'] as $k => $s) {
281
+            // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
282
+            $filtrer = true;
283
+            if (isset($s['exception'])) {
284
+                foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
285
+                    if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
286
+                        $filtrer = false;
287
+                        break;
288
+                    }
289
+                }
290
+            }
291
+
292
+            if ($filtrer) {
293
+                if (is_array($s['champ'])) {
294
+                    $statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
295
+                    $jointures = array();
296
+                    // indiquer la description de chaque table dans le tableau de jointures,
297
+                    // ce qui permet d'eviter certains GROUP BY inutiles.
298
+                    $trouver_table = charger_fonction('trouver_table', 'base');
299
+                    foreach ($s['champ'] as $j) {
300
+                        $id = reset($j);
301
+                        $def = $trouver_table($id);
302
+                        $jointures[] = array('', array($id, $def), end($j));
303
+                    }
304
+                    $jointures[0][0] = $id_table;
305
+                    if (!array_search($id, $boucle->from)) {
306
+                        include_spip('public/jointures');
307
+                        fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
308
+                    }
309
+                    // trouver l'alias de la table d'arrivee qui porte le statut
310
+                    $id = array_search($id, $boucle->from);
311
+                } else {
312
+                    $id = $id_table;
313
+                    $statut = preg_replace(',\W,', '', $s['champ']); // securite
314
+                }
315
+                $mstatut = $id . '.' . $statut;
316
+
317
+                $arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
318
+                include_spip('public/quete');
319
+                if (isset($s['post_date']) and $s['post_date']
320
+                    and $GLOBALS['meta']["post_dates"] == 'non'
321
+                ) {
322
+                    $date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
323
+                    array_unshift($boucle->where,
324
+                        $echapper ?
325
+                            "\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
326
+                            :
327
+                            quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
328
+                    );
329
+                }
330
+                array_unshift($boucle->where,
331
+                    $echapper ?
332
+                        "\nquete_condition_statut('$mstatut',"
333
+                        . _q($s['previsu']) . ","
334
+                        . _q($s['publie']) . ","
335
+                        . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
336
+                        :
337
+                        quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
338
+                );
339
+            }
340
+        }
341
+    }
342 342
 }
343 343
 
344 344
 /**
@@ -357,23 +357,23 @@  discard block
 block discarded – undo
357 357
  */
358 358
 function calculer_boucle($id_boucle, &$boucles) {
359 359
 
360
-	$boucle = &$boucles[$id_boucle];
361
-	instituer_boucle($boucle);
362
-	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
363
-
364
-	// en mode debug memoriser les premiers passages dans la boucle,
365
-	// mais pas tous, sinon ca pete.
366
-	if (_request('var_mode_affiche') != 'resultat') {
367
-		$trace = '';
368
-	} else {
369
-		$trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
370
-		$trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['$trace'])<3)
360
+    $boucle = &$boucles[$id_boucle];
361
+    instituer_boucle($boucle);
362
+    $boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
363
+
364
+    // en mode debug memoriser les premiers passages dans la boucle,
365
+    // mais pas tous, sinon ca pete.
366
+    if (_request('var_mode_affiche') != 'resultat') {
367
+        $trace = '';
368
+    } else {
369
+        $trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
370
+        $trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['$trace'])<3)
371 371
 	    \$GLOBALS['debug_objets']['resultat']['$trace'][] = \$t0;";
372
-	}
372
+    }
373 373
 
374
-	return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
375
-		? calculer_boucle_rec($id_boucle, $boucles, $trace)
376
-		: calculer_boucle_nonrec($id_boucle, $boucles, $trace);
374
+    return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
375
+        ? calculer_boucle_rec($id_boucle, $boucles, $trace)
376
+        : calculer_boucle_nonrec($id_boucle, $boucles, $trace);
377 377
 }
378 378
 
379 379
 
@@ -396,15 +396,15 @@  discard block
 block discarded – undo
396 396
  *    Code PHP compilé de la boucle récursive
397 397
  **/
398 398
 function calculer_boucle_rec($id_boucle, &$boucles, $trace) {
399
-	$nom = $boucles[$id_boucle]->param[0];
400
-
401
-	return
402
-		// Numrows[$nom] peut ne pas être encore defini
403
-		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
404
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
405
-		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
406
-		. $trace
407
-		. "\n\treturn \$t0;";
399
+    $nom = $boucles[$id_boucle]->param[0];
400
+
401
+    return
402
+        // Numrows[$nom] peut ne pas être encore defini
403
+        "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
404
+        . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
405
+        . "\n\t\$Numrows['$nom'] = (\$save_numrows);"
406
+        . $trace
407
+        . "\n\treturn \$t0;";
408 408
 }
409 409
 
410 410
 /**
@@ -458,169 +458,169 @@  discard block
 block discarded – undo
458 458
  **/
459 459
 function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
460 460
 
461
-	$boucle = &$boucles[$id_boucle];
462
-	$return = $boucle->return;
463
-	$type_boucle = $boucle->type_requete;
464
-	$primary = $boucle->primary;
465
-	$constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
466
-	$flag_cpt = $boucle->mode_partie || $boucle->cptrows;
467
-	$corps = '';
468
-
469
-	// faudrait expanser le foreach a la compil, car y en a souvent qu'un 
470
-	// et puis faire un [] plutot qu'un "','."
471
-	if ($boucle->doublons) {
472
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
473
-			index_pile($id_boucle, $primary, $boucles)
474
-			. "; // doublons\n";
475
-	}
476
-
477
-	// La boucle doit-elle selectionner la langue ?
478
-	// - par defaut, les boucles suivantes le font
479
-	//    (sauf si forcer_lang==true ou si le titre contient <multi>).
480
-	// - a moins d'une demande explicite via {!lang_select}
481
-	if (!$constant && $boucle->lang_select != 'non' &&
482
-		(($boucle->lang_select == 'oui') ||
483
-			in_array($type_boucle, array(
484
-				'articles',
485
-				'rubriques',
486
-				'hierarchie',
487
-				'breves'
488
-			)))
489
-	) {
490
-		// Memoriser la langue avant la boucle et la restituer apres
491
-		// afin que le corps de boucle affecte la globale directement
492
-		$init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
493
-		$fin_lang = "lang_select();\n\t";
494
-		$fin_lang_select_public = "\n\t\tlang_select();";
495
-
496
-		$corps .=
497
-			"\n\t\tlang_select_public("
498
-			. index_pile($id_boucle, 'lang', $boucles)
499
-			. ", '" . $boucle->lang_select . "'"
500
-			. (in_array($type_boucle, array(
501
-				'articles',
502
-				'rubriques',
503
-				'hierarchie',
504
-				'breves'
505
-			)) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
506
-			. ');';
507
-	} else {
508
-		$init_lang = '';
509
-		$fin_lang = '';
510
-		$fin_lang_select_public = '';
511
-		// sortir les appels au traducteur (invariants de boucle)
512
-		if (strpos($return, '?php') === false
513
-			and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
514
-		) {
515
-			$i = 1;
516
-			foreach ($r[1] as $t) {
517
-				$init_lang .= "\n\t\$l$i = $t;";
518
-				$return = str_replace($t, "\$l$i", $return);
519
-				$i++;
520
-			}
521
-		}
522
-	}
523
-
524
-	// gestion optimale des separateurs et des boucles constantes
525
-	if (count($boucle->separateur)) {
526
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
527
-	}
528
-
529
-	$corps .=
530
-		((!$boucle->separateur) ?
531
-			(($constant && !$corps && !$flag_cpt) ? $return :
532
-				(($return === "''") ? '' :
533
-					("\n\t\t" . '$t0 .= ' . $return . ";"))) :
534
-			("\n\t\t\$t1 " .
535
-				((strpos($return, '$t1.') === 0) ?
536
-					(".=" . substr($return, 4)) :
537
-					('= ' . $return)) .
538
-				";\n\t\t" .
539
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
540
-
541
-	// Calculer les invalideurs si c'est une boucle non constante et si on
542
-	// souhaite invalider ces elements
543
-	if (!$constant and $primary) {
544
-		include_spip('inc/invalideur');
545
-		$corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
546
-	}
547
-
548
-	// gerer le compteur de boucle 
549
-	// avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
550
-
551
-	if ($boucle->partie or $boucle->cptrows) {
552
-		$corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
553
-			. $boucle->partie
554
-			. $corps;
555
-	}
556
-
557
-	// depiler la lang de la boucle si besoin
558
-	$corps .= $fin_lang_select_public;
559
-
560
-	// si le corps est une constante, ne pas appeler le serveur N fois!
561
-
562
-	if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
563
-		if (!isset($r[2]) or (!$r[2])) {
564
-			if (!$boucle->numrows) {
565
-				return "\n\t\$t0 = '';";
566
-			} else {
567
-				$corps = "";
568
-			}
569
-		} else {
570
-			$boucle->numrows = true;
571
-			$corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
572
-		}
573
-	} else {
574
-		$corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
575
-	}
576
-
577
-	$count = '';
578
-	if (!$boucle->select) {
579
-		if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
580
-			$count = '1';
581
-		} else {
582
-			$count = 'count(*)';
583
-		}
584
-		$boucles[$id_boucle]->select[] = $count;
585
-	}
586
-
587
-	if ($flag_cpt) {
588
-		$nums = "\n\t// COMPTEUR\n\t"
589
-			. "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
590
-	} else {
591
-		$nums = '';
592
-	}
593
-
594
-	if ($boucle->numrows or $boucle->mode_partie) {
595
-		$nums .= "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
596
-			. $boucle->mode_partie
597
-			. "\n\t";
598
-	}
599
-
600
-	// Ne calculer la requete que maintenant
601
-	// car ce qui precede appelle index_pile qui influe dessus
602
-
603
-	$init = (($init = $boucles[$id_boucle]->doublons)
604
-			? ("\n\t$init = array();") : '')
605
-		. calculer_requete_sql($boucles[$id_boucle]);
606
-
607
-	$contexte = memoriser_contexte_compil($boucle);
608
-
609
-	$a = sprintf(CODE_CORPS_BOUCLE,
610
-		$init,
611
-		$boucle->iterateur,
612
-		"\$command",
613
-		$contexte,
614
-		$nums,
615
-		$init_lang,
616
-		$corps,
617
-		$fin_lang,
618
-		$trace,
619
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
620
-	);
461
+    $boucle = &$boucles[$id_boucle];
462
+    $return = $boucle->return;
463
+    $type_boucle = $boucle->type_requete;
464
+    $primary = $boucle->primary;
465
+    $constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
466
+    $flag_cpt = $boucle->mode_partie || $boucle->cptrows;
467
+    $corps = '';
468
+
469
+    // faudrait expanser le foreach a la compil, car y en a souvent qu'un 
470
+    // et puis faire un [] plutot qu'un "','."
471
+    if ($boucle->doublons) {
472
+        $corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
473
+            index_pile($id_boucle, $primary, $boucles)
474
+            . "; // doublons\n";
475
+    }
476
+
477
+    // La boucle doit-elle selectionner la langue ?
478
+    // - par defaut, les boucles suivantes le font
479
+    //    (sauf si forcer_lang==true ou si le titre contient <multi>).
480
+    // - a moins d'une demande explicite via {!lang_select}
481
+    if (!$constant && $boucle->lang_select != 'non' &&
482
+        (($boucle->lang_select == 'oui') ||
483
+            in_array($type_boucle, array(
484
+                'articles',
485
+                'rubriques',
486
+                'hierarchie',
487
+                'breves'
488
+            )))
489
+    ) {
490
+        // Memoriser la langue avant la boucle et la restituer apres
491
+        // afin que le corps de boucle affecte la globale directement
492
+        $init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
493
+        $fin_lang = "lang_select();\n\t";
494
+        $fin_lang_select_public = "\n\t\tlang_select();";
495
+
496
+        $corps .=
497
+            "\n\t\tlang_select_public("
498
+            . index_pile($id_boucle, 'lang', $boucles)
499
+            . ", '" . $boucle->lang_select . "'"
500
+            . (in_array($type_boucle, array(
501
+                'articles',
502
+                'rubriques',
503
+                'hierarchie',
504
+                'breves'
505
+            )) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
506
+            . ');';
507
+    } else {
508
+        $init_lang = '';
509
+        $fin_lang = '';
510
+        $fin_lang_select_public = '';
511
+        // sortir les appels au traducteur (invariants de boucle)
512
+        if (strpos($return, '?php') === false
513
+            and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
514
+        ) {
515
+            $i = 1;
516
+            foreach ($r[1] as $t) {
517
+                $init_lang .= "\n\t\$l$i = $t;";
518
+                $return = str_replace($t, "\$l$i", $return);
519
+                $i++;
520
+            }
521
+        }
522
+    }
523
+
524
+    // gestion optimale des separateurs et des boucles constantes
525
+    if (count($boucle->separateur)) {
526
+        $code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
527
+    }
528
+
529
+    $corps .=
530
+        ((!$boucle->separateur) ?
531
+            (($constant && !$corps && !$flag_cpt) ? $return :
532
+                (($return === "''") ? '' :
533
+                    ("\n\t\t" . '$t0 .= ' . $return . ";"))) :
534
+            ("\n\t\t\$t1 " .
535
+                ((strpos($return, '$t1.') === 0) ?
536
+                    (".=" . substr($return, 4)) :
537
+                    ('= ' . $return)) .
538
+                ";\n\t\t" .
539
+                '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
540
+
541
+    // Calculer les invalideurs si c'est une boucle non constante et si on
542
+    // souhaite invalider ces elements
543
+    if (!$constant and $primary) {
544
+        include_spip('inc/invalideur');
545
+        $corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
546
+    }
547
+
548
+    // gerer le compteur de boucle 
549
+    // avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
550
+
551
+    if ($boucle->partie or $boucle->cptrows) {
552
+        $corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
553
+            . $boucle->partie
554
+            . $corps;
555
+    }
556
+
557
+    // depiler la lang de la boucle si besoin
558
+    $corps .= $fin_lang_select_public;
559
+
560
+    // si le corps est une constante, ne pas appeler le serveur N fois!
561
+
562
+    if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
563
+        if (!isset($r[2]) or (!$r[2])) {
564
+            if (!$boucle->numrows) {
565
+                return "\n\t\$t0 = '';";
566
+            } else {
567
+                $corps = "";
568
+            }
569
+        } else {
570
+            $boucle->numrows = true;
571
+            $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
572
+        }
573
+    } else {
574
+        $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
575
+    }
576
+
577
+    $count = '';
578
+    if (!$boucle->select) {
579
+        if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
580
+            $count = '1';
581
+        } else {
582
+            $count = 'count(*)';
583
+        }
584
+        $boucles[$id_boucle]->select[] = $count;
585
+    }
586
+
587
+    if ($flag_cpt) {
588
+        $nums = "\n\t// COMPTEUR\n\t"
589
+            . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
590
+    } else {
591
+        $nums = '';
592
+    }
593
+
594
+    if ($boucle->numrows or $boucle->mode_partie) {
595
+        $nums .= "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
596
+            . $boucle->mode_partie
597
+            . "\n\t";
598
+    }
599
+
600
+    // Ne calculer la requete que maintenant
601
+    // car ce qui precede appelle index_pile qui influe dessus
602
+
603
+    $init = (($init = $boucles[$id_boucle]->doublons)
604
+            ? ("\n\t$init = array();") : '')
605
+        . calculer_requete_sql($boucles[$id_boucle]);
606
+
607
+    $contexte = memoriser_contexte_compil($boucle);
608
+
609
+    $a = sprintf(CODE_CORPS_BOUCLE,
610
+        $init,
611
+        $boucle->iterateur,
612
+        "\$command",
613
+        $contexte,
614
+        $nums,
615
+        $init_lang,
616
+        $corps,
617
+        $fin_lang,
618
+        $trace,
619
+        'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
620
+    );
621 621
 
622 622
 #	var_dump($a);exit;
623
-	return $a;
623
+    return $a;
624 624
 }
625 625
 
626 626
 
@@ -636,43 +636,43 @@  discard block
 block discarded – undo
636 636
  *     Code PHP compilé définissant les informations de requête
637 637
  **/
638 638
 function calculer_requete_sql($boucle) {
639
-	$init = array();
640
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
641
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
642
-	# En absence de champ c'est un decompte :
643
-	$init[] = calculer_dec('from', calculer_from($boucle));
644
-	$init[] = calculer_dec('type', calculer_from_type($boucle));
645
-	$init[] = calculer_dec('groupby',
646
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
647
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
648
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
649
-	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
650
-	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
651
-	$init[] = calculer_dec('limit',
652
-		(strpos($boucle->limit, 'intval') === false ?
653
-			"'" . $boucle->limit . "'"
654
-			:
655
-			$boucle->limit));
656
-	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
657
-	$s = $d = "";
658
-	// l'index 0 de $i indique si l'affectation est statique (contenu)
659
-	// ou recalculée à chaque passage (vide)
660
-	foreach ($init as $i) {
661
-		if (reset($i)) {
662
-			$s .= "\n\t\t" . end($i);
663
-		} # statique
664
-		else {
665
-			$d .= "\n\t" . end($i);
666
-		} # dynamique
667
-	}
668
-
669
-	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
670
-	. $boucle->in
671
-	. $boucle->hash
672
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
673
-	. $s
674
-	. "\n\t}"
675
-	. $d;
639
+    $init = array();
640
+    $init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
641
+    $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
642
+    # En absence de champ c'est un decompte :
643
+    $init[] = calculer_dec('from', calculer_from($boucle));
644
+    $init[] = calculer_dec('type', calculer_from_type($boucle));
645
+    $init[] = calculer_dec('groupby',
646
+        'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
647
+    $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
648
+    $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
649
+    $init[] = calculer_dec('where', calculer_dump_array($boucle->where));
650
+    $init[] = calculer_dec('join', calculer_dump_join($boucle->join));
651
+    $init[] = calculer_dec('limit',
652
+        (strpos($boucle->limit, 'intval') === false ?
653
+            "'" . $boucle->limit . "'"
654
+            :
655
+            $boucle->limit));
656
+    $init[] = calculer_dec('having', calculer_dump_array($boucle->having));
657
+    $s = $d = "";
658
+    // l'index 0 de $i indique si l'affectation est statique (contenu)
659
+    // ou recalculée à chaque passage (vide)
660
+    foreach ($init as $i) {
661
+        if (reset($i)) {
662
+            $s .= "\n\t\t" . end($i);
663
+        } # statique
664
+        else {
665
+            $d .= "\n\t" . end($i);
666
+        } # dynamique
667
+    }
668
+
669
+    return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
670
+    . $boucle->in
671
+    . $boucle->hash
672
+    . "\n\t" . 'if (!isset($command[\'table\'])) {'
673
+    . $s
674
+    . "\n\t}"
675
+    . $d;
676 676
 }
677 677
 
678 678
 /**
@@ -690,13 +690,13 @@  discard block
 block discarded – undo
690 690
  *     qui peut être utilisé pour la production d'un tableau array()
691 691
  **/
692 692
 function memoriser_contexte_compil($p) {
693
-	return join(',', array(
694
-		_q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''),
695
-		_q(isset($p->descr['nom']) ? $p->descr['nom'] : ''),
696
-		_q(isset($p->id_boucle) ? $p->id_boucle : null),
697
-		intval($p->ligne),
698
-		'$GLOBALS[\'spip_lang\']'
699
-	));
693
+    return join(',', array(
694
+        _q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''),
695
+        _q(isset($p->descr['nom']) ? $p->descr['nom'] : ''),
696
+        _q(isset($p->id_boucle) ? $p->id_boucle : null),
697
+        intval($p->ligne),
698
+        '$GLOBALS[\'spip_lang\']'
699
+    ));
700 700
 }
701 701
 
702 702
 /**
@@ -714,19 +714,19 @@  discard block
 block discarded – undo
714 714
  *     Objet Contexte
715 715
  **/
716 716
 function reconstruire_contexte_compil($context_compil) {
717
-	if (!is_array($context_compil)) {
718
-		return $context_compil;
719
-	}
720
-	$p = new Contexte;
721
-	$p->descr = array(
722
-		'sourcefile' => $context_compil[0],
723
-		'nom' => $context_compil[1]
724
-	);
725
-	$p->id_boucle = $context_compil[2];
726
-	$p->ligne = $context_compil[3];
727
-	$p->lang = $context_compil[4];
728
-
729
-	return $p;
717
+    if (!is_array($context_compil)) {
718
+        return $context_compil;
719
+    }
720
+    $p = new Contexte;
721
+    $p->descr = array(
722
+        'sourcefile' => $context_compil[0],
723
+        'nom' => $context_compil[1]
724
+    );
725
+    $p->id_boucle = $context_compil[2];
726
+    $p->ligne = $context_compil[3];
727
+    $p->lang = $context_compil[4];
728
+
729
+    return $p;
730 730
 }
731 731
 
732 732
 /**
@@ -752,12 +752,12 @@  discard block
 block discarded – undo
752 752
  *    - index 1 : Code de l'affectation
753 753
  **/
754 754
 function calculer_dec($nom, $val) {
755
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
756
-	// si une variable apparait dans le calcul de la clause
757
-	// il faut la re-evaluer a chaque passage
758
-	if (
759
-		strpos($val, '$') !== false
760
-		/*
755
+    $static = 'if (!isset($command[\'' . $nom . '\'])) ';
756
+    // si une variable apparait dans le calcul de la clause
757
+    // il faut la re-evaluer a chaque passage
758
+    if (
759
+        strpos($val, '$') !== false
760
+        /*
761 761
 		OR strpos($val, 'sql_') !== false
762 762
 		OR (
763 763
 			$test = str_replace(array("array(",'\"',"\'"),array("","",""),$val) // supprimer les array( et les echappements de guillemets
@@ -765,11 +765,11 @@  discard block
 block discarded – undo
765 765
 			AND $test = preg_replace(",'[^']*',UimsS","",$test) // supprimer les chaines qui peuvent contenir des fonctions SQL qui ne genent pas
766 766
 			AND preg_match(",\w+\s*\(,UimsS",$test,$regs) // tester la presence de fonctions restantes
767 767
 		)*/
768
-	) {
769
-		$static = "";
770
-	}
768
+    ) {
769
+        $static = "";
770
+    }
771 771
 
772
-	return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
772
+    return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
773 773
 }
774 774
 
775 775
 /**
@@ -789,32 +789,32 @@  discard block
 block discarded – undo
789 789
  *     Expression PHP décrivant un texte ou un tableau
790 790
  **/
791 791
 function calculer_dump_array($a) {
792
-	if (!is_array($a)) {
793
-		return $a;
794
-	}
795
-	$res = "";
796
-	if ($a and $a[0] == "'?'") {
797
-		return ("(" . calculer_dump_array($a[1]) .
798
-			" ? " . calculer_dump_array($a[2]) .
799
-			" : " . calculer_dump_array($a[3]) .
800
-			")");
801
-	} else {
802
-		foreach ($a as $v) {
803
-			$res .= ", " . calculer_dump_array($v);
804
-		}
805
-
806
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
807
-	}
792
+    if (!is_array($a)) {
793
+        return $a;
794
+    }
795
+    $res = "";
796
+    if ($a and $a[0] == "'?'") {
797
+        return ("(" . calculer_dump_array($a[1]) .
798
+            " ? " . calculer_dump_array($a[2]) .
799
+            " : " . calculer_dump_array($a[3]) .
800
+            ")");
801
+    } else {
802
+        foreach ($a as $v) {
803
+            $res .= ", " . calculer_dump_array($v);
804
+        }
805
+
806
+        return "\n\t\t\tarray(" . substr($res, 2) . ')';
807
+    }
808 808
 }
809 809
 
810 810
 // http://code.spip.net/@calculer_dump_join
811 811
 function calculer_dump_join($a) {
812
-	$res = "";
813
-	foreach ($a as $k => $v) {
814
-		$res .= ", '$k' => array(" . implode(',', $v) . ")";
815
-	}
812
+    $res = "";
813
+    foreach ($a as $k => $v) {
814
+        $res .= ", '$k' => array(" . implode(',', $v) . ")";
815
+    }
816 816
 
817
-	return 'array(' . substr($res, 2) . ')';
817
+    return 'array(' . substr($res, 2) . ')';
818 818
 }
819 819
 
820 820
 /**
@@ -826,12 +826,12 @@  discard block
 block discarded – undo
826 826
  *     Code PHP construisant un tableau des alias et noms des tables du FROM
827 827
  **/
828 828
 function calculer_from(&$boucle) {
829
-	$res = "";
830
-	foreach ($boucle->from as $k => $v) {
831
-		$res .= ",'$k' => '$v'";
832
-	}
829
+    $res = "";
830
+    foreach ($boucle->from as $k => $v) {
831
+        $res .= ",'$k' => '$v'";
832
+    }
833 833
 
834
-	return 'array(' . substr($res, 1) . ')';
834
+    return 'array(' . substr($res, 1) . ')';
835 835
 }
836 836
 
837 837
 /**
@@ -844,30 +844,30 @@  discard block
 block discarded – undo
844 844
  *     Code PHP construisant un tableau des alias et type de jointure du FROM
845 845
  **/
846 846
 function calculer_from_type(&$boucle) {
847
-	$res = "";
848
-	foreach ($boucle->from_type as $k => $v) {
849
-		$res .= ",'$k' => '$v'";
850
-	}
847
+    $res = "";
848
+    foreach ($boucle->from_type as $k => $v) {
849
+        $res .= ",'$k' => '$v'";
850
+    }
851 851
 
852
-	return 'array(' . substr($res, 1) . ')';
852
+    return 'array(' . substr($res, 1) . ')';
853 853
 }
854 854
 
855 855
 // http://code.spip.net/@calculer_order
856 856
 function calculer_order(&$boucle) {
857
-	if (!$order = $boucle->order
858
-		and !$order = $boucle->default_order
859
-	) {
860
-		$order = array();
861
-	}
857
+    if (!$order = $boucle->order
858
+        and !$order = $boucle->default_order
859
+    ) {
860
+        $order = array();
861
+    }
862 862
 
863
-	/*if (isset($boucle->modificateur['collate'])){
863
+    /*if (isset($boucle->modificateur['collate'])){
864 864
 		$col = "." . $boucle->modificateur['collate'];
865 865
 		foreach($order as $k=>$o)
866 866
 			if (strpos($order[$k],'COLLATE')===false)
867 867
 				$order[$k].= $col;
868 868
 	}*/
869 869
 
870
-	return join(', ', $order);
870
+    return join(', ', $order);
871 871
 }
872 872
 
873 873
 // Production du code PHP a partir de la sequence livree par le phraseur
@@ -877,44 +877,44 @@  discard block
 block discarded – undo
877 877
 
878 878
 // http://code.spip.net/@calculer_liste
879 879
 function calculer_liste($tableau, $descr, &$boucles, $id_boucle = '') {
880
-	if (!$tableau) {
881
-		return "''";
882
-	}
883
-	if (!isset($descr['niv'])) {
884
-		$descr['niv'] = 0;
885
-	}
886
-	$codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
887
-	if ($codes === false) {
888
-		return false;
889
-	}
890
-	$n = count($codes);
891
-	if (!$n) {
892
-		return "''";
893
-	}
894
-	$tab = str_repeat("\t", $descr['niv']);
895
-	if (_request('var_mode_affiche') != 'validation') {
896
-		if ($n == 1) {
897
-			return $codes[0];
898
-		} else {
899
-			$res = '';
900
-			foreach ($codes as $code) {
901
-				if (!preg_match("/^'[^']*'$/", $code)
902
-					or substr($res, -1, 1) !== "'"
903
-				) {
904
-					$res .= " .\n$tab$code";
905
-				} else {
906
-					$res = substr($res, 0, -1) . substr($code, 1);
907
-				}
908
-			}
909
-
910
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
911
-		}
912
-	} else {
913
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
914
-
915
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
916
-			$codes) . ")))";
917
-	}
880
+    if (!$tableau) {
881
+        return "''";
882
+    }
883
+    if (!isset($descr['niv'])) {
884
+        $descr['niv'] = 0;
885
+    }
886
+    $codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
887
+    if ($codes === false) {
888
+        return false;
889
+    }
890
+    $n = count($codes);
891
+    if (!$n) {
892
+        return "''";
893
+    }
894
+    $tab = str_repeat("\t", $descr['niv']);
895
+    if (_request('var_mode_affiche') != 'validation') {
896
+        if ($n == 1) {
897
+            return $codes[0];
898
+        } else {
899
+            $res = '';
900
+            foreach ($codes as $code) {
901
+                if (!preg_match("/^'[^']*'$/", $code)
902
+                    or substr($res, -1, 1) !== "'"
903
+                ) {
904
+                    $res .= " .\n$tab$code";
905
+                } else {
906
+                    $res = substr($res, 0, -1) . substr($code, 1);
907
+                }
908
+            }
909
+
910
+            return '(' . substr($res, 2 + $descr['niv']) . ')';
911
+        }
912
+    } else {
913
+        $nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
914
+
915
+        return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
916
+            $codes) . ")))";
917
+    }
918 918
 }
919 919
 
920 920
 define('_REGEXP_COND_VIDE_NONVIDE', "/^[(](.*)[?]\s*''\s*:\s*('[^']+')\s*[)]$/");
@@ -924,186 +924,186 @@  discard block
 block discarded – undo
924 924
 // http://code.spip.net/@compile_cas
925 925
 function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
926 926
 
927
-	$codes = array();
928
-	// cas de la boucle recursive
929
-	if (is_array($id_boucle)) {
930
-		$id_boucle = $id_boucle[0];
931
-	}
932
-	$type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
933
-	$tab = str_repeat("\t", ++$descr['niv']);
934
-	$mode = _request('var_mode_affiche');
935
-	$err_e_c = '';
936
-	// chaque commentaire introduit dans le code doit commencer
937
-	// par un caractere distinguant le cas, pour exploitation par debug.
938
-	foreach ($tableau as $p) {
939
-
940
-		switch ($p->type) {
941
-			// texte seul
942
-			case 'texte':
943
-				$code = sandbox_composer_texte($p->texte, $p);
944
-				$commentaire = strlen($p->texte) . " signes";
945
-				$avant = '';
946
-				$apres = '';
947
-				$altern = "''";
948
-				break;
949
-
950
-			case 'polyglotte':
951
-				$code = "";
952
-				foreach ($p->traductions as $k => $v) {
953
-					$code .= ",'" .
954
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
955
-						"' => '" .
956
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
957
-						"'";
958
-				}
959
-				$code = "choisir_traduction(array(" .
960
-					substr($code, 1) .
961
-					"))";
962
-				$commentaire = '&';
963
-				$avant = '';
964
-				$apres = '';
965
-				$altern = "''";
966
-				break;
967
-
968
-			// inclure
969
-			case 'include':
970
-				$p->descr = $descr;
971
-				$code = calculer_inclure($p, $boucles, $id_boucle);
972
-				if ($code === false) {
973
-					$err_e_c = true;
974
-					$code = "''";
975
-				} else {
976
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
977
-					$avant = '';
978
-					$apres = '';
979
-					$altern = "''";
980
-				}
981
-				break;
982
-
983
-			// boucle
984
-			case TYPE_RECURSIF:
985
-				$nom = $p->id_boucle;
986
-				$newdescr = $descr;
987
-				$newdescr['id_mere'] = $nom;
988
-				$newdescr['niv']++;
989
-				$avant = calculer_liste($p->avant,
990
-					$newdescr, $boucles, $id_boucle);
991
-				$apres = calculer_liste($p->apres,
992
-					$newdescr, $boucles, $id_boucle);
993
-				$newdescr['niv']--;
994
-				$altern = calculer_liste($p->altern,
995
-					$newdescr, $boucles, $id_boucle);
996
-				if (($avant === false) or ($apres === false) or ($altern === false)) {
997
-					$err_e_c = true;
998
-					$code = "''";
999
-				} else {
1000
-					$code = 'BOUCLE' .
1001
-						str_replace("-", "_", $nom) . $descr['nom'] .
1002
-						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1003
-					$commentaire = "?$nom";
1004
-					if (!$boucles[$nom]->milieu
1005
-						and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1006
-					) {
1007
-						if ($altern != "''") {
1008
-							$code .= "\n. $altern";
1009
-						}
1010
-						if ($avant <> "''" or $apres <> "''") {
1011
-							spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1012
-						}
1013
-						$avant = $apres = $altern = "''";
1014
-					} else {
1015
-						if ($altern != "''") {
1016
-							$altern = "($altern)";
1017
-						}
1018
-					}
1019
-				}
1020
-				break;
1021
-
1022
-			case 'idiome':
1023
-				$l = array();
1024
-				$code = '';
1025
-				foreach ($p->arg as $k => $v) {
1026
-					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1027
-					if ($k) {
1028
-						$l[] = _q($k) . ' => ' . $_v;
1029
-					} else {
1030
-						$code = $_v;
1031
-					}
1032
-				}
1033
-				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1034
-				if ($p->module) {
1035
-					$m = $p->module . ':' . $p->nom_champ;
1036
-				} elseif ($p->nom_champ) {
1037
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1038
-				} else {
1039
-					$m = '';
1040
-				}
1041
-
1042
-				$code = (!$code ? "'$m'" :
1043
-						($m ? "'$m' . $code" :
1044
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1045
-					. (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1046
-				$code = "_T($code)";
1047
-				if ($p->param) {
1048
-					$p->id_boucle = $id_boucle;
1049
-					$p->boucles = &$boucles;
1050
-					$code = compose_filtres($p, $code);
1051
-				}
1052
-				$commentaire = ":";
1053
-				$avant = '';
1054
-				$apres = '';
1055
-				$altern = "''";
1056
-				break;
1057
-
1058
-			case 'champ':
1059
-
1060
-				// cette structure pourrait etre completee des le phrase' (a faire)
1061
-				$p->id_boucle = $id_boucle;
1062
-				$p->boucles = &$boucles;
1063
-				$p->descr = $descr;
1064
-				#$p->interdire_scripts = true;
1065
-				$p->type_requete = $type;
1066
-
1067
-				$code = calculer_champ($p);
1068
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1069
-				$avant = calculer_liste($p->avant,
1070
-					$descr, $boucles, $id_boucle);
1071
-				$apres = calculer_liste($p->apres,
1072
-					$descr, $boucles, $id_boucle);
1073
-				$altern = "''";
1074
-				// Si la valeur est destinee a une comparaison a ''
1075
-				// forcer la conversion en une chaine par strval
1076
-				// si ca peut etre autre chose qu'une chaine
1077
-				if (($avant != "''" or $apres != "''")
1078
-					and $code[0] != "'"
927
+    $codes = array();
928
+    // cas de la boucle recursive
929
+    if (is_array($id_boucle)) {
930
+        $id_boucle = $id_boucle[0];
931
+    }
932
+    $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
933
+    $tab = str_repeat("\t", ++$descr['niv']);
934
+    $mode = _request('var_mode_affiche');
935
+    $err_e_c = '';
936
+    // chaque commentaire introduit dans le code doit commencer
937
+    // par un caractere distinguant le cas, pour exploitation par debug.
938
+    foreach ($tableau as $p) {
939
+
940
+        switch ($p->type) {
941
+            // texte seul
942
+            case 'texte':
943
+                $code = sandbox_composer_texte($p->texte, $p);
944
+                $commentaire = strlen($p->texte) . " signes";
945
+                $avant = '';
946
+                $apres = '';
947
+                $altern = "''";
948
+                break;
949
+
950
+            case 'polyglotte':
951
+                $code = "";
952
+                foreach ($p->traductions as $k => $v) {
953
+                    $code .= ",'" .
954
+                        str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
955
+                        "' => '" .
956
+                        str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
957
+                        "'";
958
+                }
959
+                $code = "choisir_traduction(array(" .
960
+                    substr($code, 1) .
961
+                    "))";
962
+                $commentaire = '&';
963
+                $avant = '';
964
+                $apres = '';
965
+                $altern = "''";
966
+                break;
967
+
968
+            // inclure
969
+            case 'include':
970
+                $p->descr = $descr;
971
+                $code = calculer_inclure($p, $boucles, $id_boucle);
972
+                if ($code === false) {
973
+                    $err_e_c = true;
974
+                    $code = "''";
975
+                } else {
976
+                    $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
977
+                    $avant = '';
978
+                    $apres = '';
979
+                    $altern = "''";
980
+                }
981
+                break;
982
+
983
+            // boucle
984
+            case TYPE_RECURSIF:
985
+                $nom = $p->id_boucle;
986
+                $newdescr = $descr;
987
+                $newdescr['id_mere'] = $nom;
988
+                $newdescr['niv']++;
989
+                $avant = calculer_liste($p->avant,
990
+                    $newdescr, $boucles, $id_boucle);
991
+                $apres = calculer_liste($p->apres,
992
+                    $newdescr, $boucles, $id_boucle);
993
+                $newdescr['niv']--;
994
+                $altern = calculer_liste($p->altern,
995
+                    $newdescr, $boucles, $id_boucle);
996
+                if (($avant === false) or ($apres === false) or ($altern === false)) {
997
+                    $err_e_c = true;
998
+                    $code = "''";
999
+                } else {
1000
+                    $code = 'BOUCLE' .
1001
+                        str_replace("-", "_", $nom) . $descr['nom'] .
1002
+                        '($Cache, $Pile, $doublons, $Numrows, $SP)';
1003
+                    $commentaire = "?$nom";
1004
+                    if (!$boucles[$nom]->milieu
1005
+                        and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1006
+                    ) {
1007
+                        if ($altern != "''") {
1008
+                            $code .= "\n. $altern";
1009
+                        }
1010
+                        if ($avant <> "''" or $apres <> "''") {
1011
+                            spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1012
+                        }
1013
+                        $avant = $apres = $altern = "''";
1014
+                    } else {
1015
+                        if ($altern != "''") {
1016
+                            $altern = "($altern)";
1017
+                        }
1018
+                    }
1019
+                }
1020
+                break;
1021
+
1022
+            case 'idiome':
1023
+                $l = array();
1024
+                $code = '';
1025
+                foreach ($p->arg as $k => $v) {
1026
+                    $_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1027
+                    if ($k) {
1028
+                        $l[] = _q($k) . ' => ' . $_v;
1029
+                    } else {
1030
+                        $code = $_v;
1031
+                    }
1032
+                }
1033
+                // Si le module n'est pas fourni, l'expliciter sauf si calculé
1034
+                if ($p->module) {
1035
+                    $m = $p->module . ':' . $p->nom_champ;
1036
+                } elseif ($p->nom_champ) {
1037
+                    $m = MODULES_IDIOMES . ':' . $p->nom_champ;
1038
+                } else {
1039
+                    $m = '';
1040
+                }
1041
+
1042
+                $code = (!$code ? "'$m'" :
1043
+                        ($m ? "'$m' . $code" :
1044
+                            ("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1045
+                    . (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1046
+                $code = "_T($code)";
1047
+                if ($p->param) {
1048
+                    $p->id_boucle = $id_boucle;
1049
+                    $p->boucles = &$boucles;
1050
+                    $code = compose_filtres($p, $code);
1051
+                }
1052
+                $commentaire = ":";
1053
+                $avant = '';
1054
+                $apres = '';
1055
+                $altern = "''";
1056
+                break;
1057
+
1058
+            case 'champ':
1059
+
1060
+                // cette structure pourrait etre completee des le phrase' (a faire)
1061
+                $p->id_boucle = $id_boucle;
1062
+                $p->boucles = &$boucles;
1063
+                $p->descr = $descr;
1064
+                #$p->interdire_scripts = true;
1065
+                $p->type_requete = $type;
1066
+
1067
+                $code = calculer_champ($p);
1068
+                $commentaire = '#' . $p->nom_champ . $p->etoile;
1069
+                $avant = calculer_liste($p->avant,
1070
+                    $descr, $boucles, $id_boucle);
1071
+                $apres = calculer_liste($p->apres,
1072
+                    $descr, $boucles, $id_boucle);
1073
+                $altern = "''";
1074
+                // Si la valeur est destinee a une comparaison a ''
1075
+                // forcer la conversion en une chaine par strval
1076
+                // si ca peut etre autre chose qu'une chaine
1077
+                if (($avant != "''" or $apres != "''")
1078
+                    and $code[0] != "'"
1079 1079
 #			AND (strpos($code,'interdire_scripts') !== 0)
1080
-					and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1081
-					and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1082
-					and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1083
-				) {
1084
-					$code = "strval($code)";
1085
-				}
1086
-				break;
1087
-
1088
-			default:
1089
-				// Erreur de construction de l'arbre de syntaxe abstraite
1090
-				$code = "''";
1091
-				$p->descr = $descr;
1092
-				$err_e_c = _T('zbug_erreur_compilation');
1093
-				erreur_squelette($err_e_c, $p);
1094
-		} // switch
1095
-
1096
-		if ($code != "''") {
1097
-			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1098
-			$codes[] = (($mode == 'validation') ?
1099
-				"array($code, '$commentaire', " . $p->ligne . ")"
1100
-				: (($mode == 'code') ?
1101
-					"\n// $commentaire\n$code" :
1102
-					$code));
1103
-		}
1104
-	} // foreach
1105
-
1106
-	return $err_e_c ? false : $codes;
1080
+                    and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1081
+                    and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1082
+                    and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1083
+                ) {
1084
+                    $code = "strval($code)";
1085
+                }
1086
+                break;
1087
+
1088
+            default:
1089
+                // Erreur de construction de l'arbre de syntaxe abstraite
1090
+                $code = "''";
1091
+                $p->descr = $descr;
1092
+                $err_e_c = _T('zbug_erreur_compilation');
1093
+                erreur_squelette($err_e_c, $p);
1094
+        } // switch
1095
+
1096
+        if ($code != "''") {
1097
+            $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1098
+            $codes[] = (($mode == 'validation') ?
1099
+                "array($code, '$commentaire', " . $p->ligne . ")"
1100
+                : (($mode == 'code') ?
1101
+                    "\n// $commentaire\n$code" :
1102
+                    $code));
1103
+        }
1104
+    } // foreach
1105
+
1106
+    return $err_e_c ? false : $codes;
1107 1107
 }
1108 1108
 
1109 1109
 // production d'une expression conditionnelle ((v=EXP) ? (p . v .s) : a)
@@ -1112,56 +1112,56 @@  discard block
 block discarded – undo
1112 1112
 
1113 1113
 // http://code.spip.net/@compile_retour
1114 1114
 function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
1115
-	if ($avant == "''") {
1116
-		$avant = '';
1117
-	}
1118
-	if ($apres == "''") {
1119
-		$apres = '';
1120
-	}
1121
-	if (!$avant and !$apres and ($altern === "''")) {
1122
-		return $code;
1123
-	}
1124
-
1125
-	if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1126
-		$t = $code;
1127
-		$cond = '';
1128
-	} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1129
-		$t = $r[2];
1130
-		$cond = '!' . $r[1];
1131
-	} else {
1132
-		if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1133
-			$t = $r[2];
1134
-			$cond = $r[1];
1135
-		} else {
1136
-			$t = '$t' . $n;
1137
-			$cond = "($t = $code)!==''";
1138
-		}
1139
-	}
1140
-
1141
-	$res = (!$avant ? "" : "$avant . ") .
1142
-		$t .
1143
-		(!$apres ? "" : " . $apres");
1144
-
1145
-	if ($res !== $t) {
1146
-		$res = "($res)";
1147
-	}
1148
-
1149
-	return !$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)";
1115
+    if ($avant == "''") {
1116
+        $avant = '';
1117
+    }
1118
+    if ($apres == "''") {
1119
+        $apres = '';
1120
+    }
1121
+    if (!$avant and !$apres and ($altern === "''")) {
1122
+        return $code;
1123
+    }
1124
+
1125
+    if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1126
+        $t = $code;
1127
+        $cond = '';
1128
+    } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1129
+        $t = $r[2];
1130
+        $cond = '!' . $r[1];
1131
+    } else {
1132
+        if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1133
+            $t = $r[2];
1134
+            $cond = $r[1];
1135
+        } else {
1136
+            $t = '$t' . $n;
1137
+            $cond = "($t = $code)!==''";
1138
+        }
1139
+    }
1140
+
1141
+    $res = (!$avant ? "" : "$avant . ") .
1142
+        $t .
1143
+        (!$apres ? "" : " . $apres");
1144
+
1145
+    if ($res !== $t) {
1146
+        $res = "($res)";
1147
+    }
1148
+
1149
+    return !$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)";
1150 1150
 }
1151 1151
 
1152 1152
 
1153 1153
 function compile_inclure_doublons($lexemes) {
1154
-	foreach ($lexemes as $v) {
1155
-		if ($v->type === 'include' and $v->param) {
1156
-			foreach ($v->param as $r) {
1157
-				if (trim($r[0]) === 'doublons') {
1158
-					return true;
1159
-				}
1160
-			}
1161
-		}
1162
-	}
1163
-
1164
-	return false;
1154
+    foreach ($lexemes as $v) {
1155
+        if ($v->type === 'include' and $v->param) {
1156
+            foreach ($v->param as $r) {
1157
+                if (trim($r[0]) === 'doublons') {
1158
+                    return true;
1159
+                }
1160
+            }
1161
+        }
1162
+    }
1163
+
1164
+    return false;
1165 1165
 }
1166 1166
 
1167 1167
 // Prend en argument le texte d'un squelette, le nom de son fichier d'origine,
@@ -1181,346 +1181,346 @@  discard block
 block discarded – undo
1181 1181
 
1182 1182
 // http://code.spip.net/@public_compiler_dist
1183 1183
 function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = '') {
1184
-	// Pre-traitement : reperer le charset du squelette, et le convertir
1185
-	// Bonus : supprime le BOM
1186
-	include_spip('inc/charsets');
1187
-	$squelette = transcoder_page($squelette);
1188
-
1189
-	// rendre inertes les echappements de #[](){}<>
1190
-	$i = 0;
1191
-	while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1192
-		$i++;
1193
-	}
1194
-	$squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1195
-		function($a) use ($inerte) {
1196
-			return "$inerte-" . ord($a[1]) . '-';
1197
-		},
1198
-		$squelette,
1199
-		-1,
1200
-		$esc
1201
-	);
1202
-
1203
-	$descr = array(
1204
-		'nom' => $nom,
1205
-		'gram' => $gram,
1206
-		'sourcefile' => $sourcefile,
1207
-		'squelette' => $squelette
1208
-	);
1209
-
1210
-	// Phraser le squelette, selon sa grammaire
1211
-
1212
-	$boucles = array();
1213
-	$f = charger_fonction('phraser_' . $gram, 'public');
1214
-
1215
-	$squelette = $f($squelette, '', $boucles, $descr);
1216
-
1217
-	$boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1218
-
1219
-	// restituer les echappements
1220
-	if ($esc) {
1221
-		foreach ($boucles as $i => $boucle) {
1222
-			$boucles[$i]->return = preg_replace_callback(
1223
-				",$inerte-(\d+)-,",
1224
-				function($a) {
1225
-					return chr($a[1]);
1226
-				},
1227
-				$boucle->return
1228
-			);
1229
-			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1230
-				",$inerte-(\d+)-,",
1231
-				function($a) {
1232
-					return "\\\\" . chr($a[1]);
1233
-				},
1234
-				$boucle->descr['squelette']
1235
-			);
1236
-		}
1237
-	}
1238
-
1239
-	$debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1240
-	if ($debug) {
1241
-		include_spip('public/decompiler');
1242
-		foreach ($boucles as $id => $boucle) {
1243
-			if ($id) {
1244
-				$decomp = "\n/* BOUCLE " .
1245
-					$boucle->type_requete .
1246
-					" " .
1247
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1248
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1249
-					" */\n";
1250
-			} else {
1251
-				$decomp = ("\n/*\n" .
1252
-					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1253
-					. "\n*/");
1254
-			}
1255
-			$boucles[$id]->return = $decomp . $boucle->return;
1256
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1257
-		}
1258
-	}
1259
-
1260
-	return $boucles;
1184
+    // Pre-traitement : reperer le charset du squelette, et le convertir
1185
+    // Bonus : supprime le BOM
1186
+    include_spip('inc/charsets');
1187
+    $squelette = transcoder_page($squelette);
1188
+
1189
+    // rendre inertes les echappements de #[](){}<>
1190
+    $i = 0;
1191
+    while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1192
+        $i++;
1193
+    }
1194
+    $squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1195
+        function($a) use ($inerte) {
1196
+            return "$inerte-" . ord($a[1]) . '-';
1197
+        },
1198
+        $squelette,
1199
+        -1,
1200
+        $esc
1201
+    );
1202
+
1203
+    $descr = array(
1204
+        'nom' => $nom,
1205
+        'gram' => $gram,
1206
+        'sourcefile' => $sourcefile,
1207
+        'squelette' => $squelette
1208
+    );
1209
+
1210
+    // Phraser le squelette, selon sa grammaire
1211
+
1212
+    $boucles = array();
1213
+    $f = charger_fonction('phraser_' . $gram, 'public');
1214
+
1215
+    $squelette = $f($squelette, '', $boucles, $descr);
1216
+
1217
+    $boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1218
+
1219
+    // restituer les echappements
1220
+    if ($esc) {
1221
+        foreach ($boucles as $i => $boucle) {
1222
+            $boucles[$i]->return = preg_replace_callback(
1223
+                ",$inerte-(\d+)-,",
1224
+                function($a) {
1225
+                    return chr($a[1]);
1226
+                },
1227
+                $boucle->return
1228
+            );
1229
+            $boucles[$i]->descr['squelette'] = preg_replace_callback(
1230
+                ",$inerte-(\d+)-,",
1231
+                function($a) {
1232
+                    return "\\\\" . chr($a[1]);
1233
+                },
1234
+                $boucle->descr['squelette']
1235
+            );
1236
+        }
1237
+    }
1238
+
1239
+    $debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1240
+    if ($debug) {
1241
+        include_spip('public/decompiler');
1242
+        foreach ($boucles as $id => $boucle) {
1243
+            if ($id) {
1244
+                $decomp = "\n/* BOUCLE " .
1245
+                    $boucle->type_requete .
1246
+                    " " .
1247
+                    str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1248
+                    ($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1249
+                    " */\n";
1250
+            } else {
1251
+                $decomp = ("\n/*\n" .
1252
+                    str_replace('*/', '* /', public_decompiler($squelette, $gram))
1253
+                    . "\n*/");
1254
+            }
1255
+            $boucles[$id]->return = $decomp . $boucle->return;
1256
+            $GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1257
+        }
1258
+    }
1259
+
1260
+    return $boucles;
1261 1261
 }
1262 1262
 
1263 1263
 // Point d'entree pour arbre de syntaxe abstraite fourni en premier argument
1264 1264
 // Autres specifications comme ci-dessus
1265 1265
 
1266 1266
 function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = '') {
1267
-	static $trouver_table;
1268
-	spip_timer('calcul_skel');
1269
-
1270
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1271
-		$GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1272
-		$GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1273
-
1274
-		if (!isset($GLOBALS['debug_objets']['principal'])) {
1275
-			$GLOBALS['debug_objets']['principal'] = $nom;
1276
-		}
1277
-	}
1278
-	foreach ($boucles as $id => $boucle) {
1279
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1280
-	}
1281
-	$descr['documents'] = compile_inclure_doublons($squelette);
1282
-
1283
-	// Demander la description des tables une fois pour toutes
1284
-	if (!$trouver_table) {
1285
-		$trouver_table = charger_fonction('trouver_table', 'base');
1286
-	}
1287
-
1288
-	// reperer si les doublons sont demandes
1289
-	// pour un inclure ou une boucle document
1290
-	// c'est utile a la fonction champs_traitements
1291
-	foreach ($boucles as $id => $boucle) {
1292
-		if (!($type = $boucle->type_requete)) {
1293
-			continue;
1294
-		}
1295
-		if (!$descr['documents'] and (
1296
-				(($type == 'documents') and $boucle->doublons) or
1297
-				compile_inclure_doublons($boucle->avant) or
1298
-				compile_inclure_doublons($boucle->apres) or
1299
-				compile_inclure_doublons($boucle->milieu) or
1300
-				compile_inclure_doublons($boucle->altern))
1301
-		) {
1302
-			$descr['documents'] = true;
1303
-		}
1304
-		if ($type != TYPE_RECURSIF) {
1305
-			if (!$boucles[$id]->sql_serveur and $connect) {
1306
-				$boucles[$id]->sql_serveur = $connect;
1307
-			}
1308
-
1309
-			// chercher dans les iterateurs du repertoire iterateur/
1310
-			if ($g = charger_fonction(
1311
-				preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)
1312
-			) {
1313
-				$boucles[$id] = $g($boucle);
1314
-
1315
-				// sinon, en cas de requeteur d'un type predefini,
1316
-				// utiliser les informations donnees par le requeteur
1317
-				// cas "php:xx" et "data:xx".
1318
-			} else {
1319
-				if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1320
-					$requeteur($boucles, $boucle, $id);
1321
-
1322
-					// utiliser la description des champs transmis
1323
-				} else {
1324
-					$show = $trouver_table($type, $boucles[$id]->sql_serveur);
1325
-					// si la table n'existe pas avec le connecteur par defaut,
1326
-					// c'est peut etre une table qui necessite son connecteur dedie fourni
1327
-					// permet une ecriture allegee (GEO) -> (geo:GEO)
1328
-					if (!$show
1329
-						and $show = $trouver_table($type, strtolower($type))
1330
-					) {
1331
-						$boucles[$id]->sql_serveur = strtolower($type);
1332
-					}
1333
-					if ($show) {
1334
-						$boucles[$id]->show = $show;
1335
-						// recopie les infos les plus importantes
1336
-						$boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : '';
1337
-						$boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']);
1338
-						$boucles[$id]->from[$x] = $nom_table = $show['table'];
1339
-						$boucles[$id]->iterateur = 'SQL';
1340
-
1341
-						$boucles[$id]->descr = &$descr;
1342
-						if ((!$boucles[$id]->jointures)
1343
-							and is_array($show['tables_jointures'])
1344
-							and count($x = $show['tables_jointures'])
1345
-						) {
1346
-							$boucles[$id]->jointures = $x;
1347
-						}
1348
-						if ($boucles[$id]->jointures_explicites) {
1349
-							$jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites);
1350
-							while ($j = array_pop($jointures)) {
1351
-								array_unshift($boucles[$id]->jointures, $j);
1352
-							}
1353
-						}
1354
-					} else {
1355
-						// Pas une erreur si la table est optionnelle
1356
-						if ($boucles[$id]->table_optionnelle) {
1357
-							$boucles[$id]->type_requete = '';
1358
-						} else {
1359
-							$boucles[$id]->type_requete = false;
1360
-							$boucle = $boucles[$id];
1361
-							$x = (!$boucle->sql_serveur ? '' :
1362
-									($boucle->sql_serveur . ":")) .
1363
-								$type;
1364
-							$msg = array(
1365
-								'zbug_table_inconnue',
1366
-								array('table' => $x)
1367
-							);
1368
-							erreur_squelette($msg, $boucle);
1369
-						}
1370
-					}
1371
-				}
1372
-			}
1373
-		}
1374
-	}
1375
-
1376
-	// Commencer par reperer les boucles appelees explicitement 
1377
-	// car elles indexent les arguments de maniere derogatoire
1378
-	foreach ($boucles as $id => $boucle) {
1379
-		if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1380
-			$boucles[$id]->descr = &$descr;
1381
-			$rec = &$boucles[$boucle->param[0]];
1382
-			if (!$rec) {
1383
-				$msg = array(
1384
-					'zbug_boucle_recursive_undef',
1385
-					array('nom' => $boucle->param[0])
1386
-				);
1387
-				erreur_squelette($msg, $boucle);
1388
-				$boucles[$id]->type_requete = false;
1389
-			} else {
1390
-				$rec->externe = $id;
1391
-				$descr['id_mere'] = $id;
1392
-				$boucles[$id]->return =
1393
-					calculer_liste(array($rec),
1394
-						$descr,
1395
-						$boucles,
1396
-						$boucle->param);
1397
-			}
1398
-		}
1399
-	}
1400
-	foreach ($boucles as $id => $boucle) {
1401
-		$id = strval($id); // attention au type dans index_pile
1402
-		$type = $boucle->type_requete;
1403
-		if ($type and $type != TYPE_RECURSIF) {
1404
-			$res = '';
1405
-			if ($boucle->param) {
1406
-				// retourne un tableau en cas d'erreur
1407
-				$res = calculer_criteres($id, $boucles);
1408
-			}
1409
-			$descr['id_mere'] = $id;
1410
-			$boucles[$id]->return =
1411
-				calculer_liste($boucle->milieu,
1412
-					$descr,
1413
-					$boucles,
1414
-					$id);
1415
-			// Si les criteres se sont mal compiles
1416
-			// ne pas tenter d'assembler le code final
1417
-			// (mais compiler le corps pour detection d'erreurs)
1418
-			if (is_array($res)) {
1419
-				$boucles[$id]->type_requete = false;
1420
-			}
1421
-		}
1422
-	}
1423
-
1424
-	// idem pour la racine
1425
-	$descr['id_mere'] = '';
1426
-	$corps = calculer_liste($squelette, $descr, $boucles);
1427
-
1428
-
1429
-	// Calcul du corps de toutes les fonctions PHP,
1430
-	// en particulier les requetes SQL et TOTAL_BOUCLE
1431
-	// de'terminables seulement maintenant
1432
-
1433
-	foreach ($boucles as $id => $boucle) {
1434
-		$boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1435
-		if ($boucle->return === false) {
1436
-			$corps = false;
1437
-			continue;
1438
-		}
1439
-		// appeler la fonction de definition de la boucle
1440
-
1441
-		if ($req = $boucle->type_requete) {
1442
-			// boucle personnalisée ?
1443
-			$table = strtoupper($boucle->type_requete);
1444
-			$serveur = strtolower($boucle->sql_serveur);
1445
-			if (
1446
-				// fonction de boucle avec serveur & table
1447
-				(!$serveur or
1448
-					((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1449
-						and (!function_exists($f = $f . "_dist"))
1450
-					)
1451
-				)
1452
-				// fonction de boucle avec table
1453
-				and (!function_exists($f = "boucle_" . $table))
1454
-				and (!function_exists($f = $f . "_dist"))
1455
-			) {
1456
-				// fonction de boucle standard 
1457
-				if (!function_exists($f = 'boucle_DEFAUT')) {
1458
-					$f = 'boucle_DEFAUT_dist';
1459
-				}
1460
-			}
1461
-
1462
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1463
-				"static \$connect;\n\t" .
1464
-				"\$command['connect'] = \$connect = " .
1465
-				_q($boucle->sql_serveur) .
1466
-				";" .
1467
-				$f($id, $boucles);
1468
-		} else {
1469
-			$req = ("\n\treturn '';");
1470
-		}
1471
-
1472
-		$boucles[$id]->return =
1473
-			"\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1474
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1475
-			$req .
1476
-			"\n}\n";
1477
-	}
1478
-
1479
-	// Au final, si le corps ou un critere au moins s'est mal compile
1480
-	// retourner False, sinon inserer leur decompilation
1481
-	if (is_bool($corps)) {
1482
-		return false;
1483
-	}
1484
-
1485
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1267
+    static $trouver_table;
1268
+    spip_timer('calcul_skel');
1269
+
1270
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1271
+        $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1272
+        $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1273
+
1274
+        if (!isset($GLOBALS['debug_objets']['principal'])) {
1275
+            $GLOBALS['debug_objets']['principal'] = $nom;
1276
+        }
1277
+    }
1278
+    foreach ($boucles as $id => $boucle) {
1279
+        $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1280
+    }
1281
+    $descr['documents'] = compile_inclure_doublons($squelette);
1282
+
1283
+    // Demander la description des tables une fois pour toutes
1284
+    if (!$trouver_table) {
1285
+        $trouver_table = charger_fonction('trouver_table', 'base');
1286
+    }
1287
+
1288
+    // reperer si les doublons sont demandes
1289
+    // pour un inclure ou une boucle document
1290
+    // c'est utile a la fonction champs_traitements
1291
+    foreach ($boucles as $id => $boucle) {
1292
+        if (!($type = $boucle->type_requete)) {
1293
+            continue;
1294
+        }
1295
+        if (!$descr['documents'] and (
1296
+                (($type == 'documents') and $boucle->doublons) or
1297
+                compile_inclure_doublons($boucle->avant) or
1298
+                compile_inclure_doublons($boucle->apres) or
1299
+                compile_inclure_doublons($boucle->milieu) or
1300
+                compile_inclure_doublons($boucle->altern))
1301
+        ) {
1302
+            $descr['documents'] = true;
1303
+        }
1304
+        if ($type != TYPE_RECURSIF) {
1305
+            if (!$boucles[$id]->sql_serveur and $connect) {
1306
+                $boucles[$id]->sql_serveur = $connect;
1307
+            }
1308
+
1309
+            // chercher dans les iterateurs du repertoire iterateur/
1310
+            if ($g = charger_fonction(
1311
+                preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)
1312
+            ) {
1313
+                $boucles[$id] = $g($boucle);
1314
+
1315
+                // sinon, en cas de requeteur d'un type predefini,
1316
+                // utiliser les informations donnees par le requeteur
1317
+                // cas "php:xx" et "data:xx".
1318
+            } else {
1319
+                if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1320
+                    $requeteur($boucles, $boucle, $id);
1321
+
1322
+                    // utiliser la description des champs transmis
1323
+                } else {
1324
+                    $show = $trouver_table($type, $boucles[$id]->sql_serveur);
1325
+                    // si la table n'existe pas avec le connecteur par defaut,
1326
+                    // c'est peut etre une table qui necessite son connecteur dedie fourni
1327
+                    // permet une ecriture allegee (GEO) -> (geo:GEO)
1328
+                    if (!$show
1329
+                        and $show = $trouver_table($type, strtolower($type))
1330
+                    ) {
1331
+                        $boucles[$id]->sql_serveur = strtolower($type);
1332
+                    }
1333
+                    if ($show) {
1334
+                        $boucles[$id]->show = $show;
1335
+                        // recopie les infos les plus importantes
1336
+                        $boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : '';
1337
+                        $boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']);
1338
+                        $boucles[$id]->from[$x] = $nom_table = $show['table'];
1339
+                        $boucles[$id]->iterateur = 'SQL';
1340
+
1341
+                        $boucles[$id]->descr = &$descr;
1342
+                        if ((!$boucles[$id]->jointures)
1343
+                            and is_array($show['tables_jointures'])
1344
+                            and count($x = $show['tables_jointures'])
1345
+                        ) {
1346
+                            $boucles[$id]->jointures = $x;
1347
+                        }
1348
+                        if ($boucles[$id]->jointures_explicites) {
1349
+                            $jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites);
1350
+                            while ($j = array_pop($jointures)) {
1351
+                                array_unshift($boucles[$id]->jointures, $j);
1352
+                            }
1353
+                        }
1354
+                    } else {
1355
+                        // Pas une erreur si la table est optionnelle
1356
+                        if ($boucles[$id]->table_optionnelle) {
1357
+                            $boucles[$id]->type_requete = '';
1358
+                        } else {
1359
+                            $boucles[$id]->type_requete = false;
1360
+                            $boucle = $boucles[$id];
1361
+                            $x = (!$boucle->sql_serveur ? '' :
1362
+                                    ($boucle->sql_serveur . ":")) .
1363
+                                $type;
1364
+                            $msg = array(
1365
+                                'zbug_table_inconnue',
1366
+                                array('table' => $x)
1367
+                            );
1368
+                            erreur_squelette($msg, $boucle);
1369
+                        }
1370
+                    }
1371
+                }
1372
+            }
1373
+        }
1374
+    }
1375
+
1376
+    // Commencer par reperer les boucles appelees explicitement 
1377
+    // car elles indexent les arguments de maniere derogatoire
1378
+    foreach ($boucles as $id => $boucle) {
1379
+        if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1380
+            $boucles[$id]->descr = &$descr;
1381
+            $rec = &$boucles[$boucle->param[0]];
1382
+            if (!$rec) {
1383
+                $msg = array(
1384
+                    'zbug_boucle_recursive_undef',
1385
+                    array('nom' => $boucle->param[0])
1386
+                );
1387
+                erreur_squelette($msg, $boucle);
1388
+                $boucles[$id]->type_requete = false;
1389
+            } else {
1390
+                $rec->externe = $id;
1391
+                $descr['id_mere'] = $id;
1392
+                $boucles[$id]->return =
1393
+                    calculer_liste(array($rec),
1394
+                        $descr,
1395
+                        $boucles,
1396
+                        $boucle->param);
1397
+            }
1398
+        }
1399
+    }
1400
+    foreach ($boucles as $id => $boucle) {
1401
+        $id = strval($id); // attention au type dans index_pile
1402
+        $type = $boucle->type_requete;
1403
+        if ($type and $type != TYPE_RECURSIF) {
1404
+            $res = '';
1405
+            if ($boucle->param) {
1406
+                // retourne un tableau en cas d'erreur
1407
+                $res = calculer_criteres($id, $boucles);
1408
+            }
1409
+            $descr['id_mere'] = $id;
1410
+            $boucles[$id]->return =
1411
+                calculer_liste($boucle->milieu,
1412
+                    $descr,
1413
+                    $boucles,
1414
+                    $id);
1415
+            // Si les criteres se sont mal compiles
1416
+            // ne pas tenter d'assembler le code final
1417
+            // (mais compiler le corps pour detection d'erreurs)
1418
+            if (is_array($res)) {
1419
+                $boucles[$id]->type_requete = false;
1420
+            }
1421
+        }
1422
+    }
1423
+
1424
+    // idem pour la racine
1425
+    $descr['id_mere'] = '';
1426
+    $corps = calculer_liste($squelette, $descr, $boucles);
1427
+
1428
+
1429
+    // Calcul du corps de toutes les fonctions PHP,
1430
+    // en particulier les requetes SQL et TOTAL_BOUCLE
1431
+    // de'terminables seulement maintenant
1432
+
1433
+    foreach ($boucles as $id => $boucle) {
1434
+        $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1435
+        if ($boucle->return === false) {
1436
+            $corps = false;
1437
+            continue;
1438
+        }
1439
+        // appeler la fonction de definition de la boucle
1440
+
1441
+        if ($req = $boucle->type_requete) {
1442
+            // boucle personnalisée ?
1443
+            $table = strtoupper($boucle->type_requete);
1444
+            $serveur = strtolower($boucle->sql_serveur);
1445
+            if (
1446
+                // fonction de boucle avec serveur & table
1447
+                (!$serveur or
1448
+                    ((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1449
+                        and (!function_exists($f = $f . "_dist"))
1450
+                    )
1451
+                )
1452
+                // fonction de boucle avec table
1453
+                and (!function_exists($f = "boucle_" . $table))
1454
+                and (!function_exists($f = $f . "_dist"))
1455
+            ) {
1456
+                // fonction de boucle standard 
1457
+                if (!function_exists($f = 'boucle_DEFAUT')) {
1458
+                    $f = 'boucle_DEFAUT_dist';
1459
+                }
1460
+            }
1461
+
1462
+            $req = "\n\n\tstatic \$command = array();\n\t" .
1463
+                "static \$connect;\n\t" .
1464
+                "\$command['connect'] = \$connect = " .
1465
+                _q($boucle->sql_serveur) .
1466
+                ";" .
1467
+                $f($id, $boucles);
1468
+        } else {
1469
+            $req = ("\n\treturn '';");
1470
+        }
1471
+
1472
+        $boucles[$id]->return =
1473
+            "\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1474
+            '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1475
+            $req .
1476
+            "\n}\n";
1477
+    }
1478
+
1479
+    // Au final, si le corps ou un critere au moins s'est mal compile
1480
+    // retourner False, sinon inserer leur decompilation
1481
+    if (is_bool($corps)) {
1482
+        return false;
1483
+    }
1484
+
1485
+    $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1486 1486
 '
1487
-		// reporter de maniere securisee les doublons inclus
1488
-		. '
1487
+        // reporter de maniere securisee les doublons inclus
1488
+        . '
1489 1489
 	if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"]))
1490 1490
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1491 1491
 
1492 1492
 	$connect = ' .
1493
-		_q($connect) . ';
1493
+        _q($connect) . ';
1494 1494
 	$page = ' .
1495
-		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1496
-		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1497
-		// avant de referencer $Cache
1498
-		$corps . ";
1495
+        // ATTENTION, le calcul de l'expression $corps affectera $Cache
1496
+        // c'est pourquoi on l'affecte a la variable auxiliaire $page.
1497
+        // avant de referencer $Cache
1498
+        $corps . ";
1499 1499
 
1500 1500
 	return analyse_resultat_skel(" . var_export($nom, true)
1501
-		. ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1501
+        . ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1502 1502
 }";
1503 1503
 
1504
-	$secondes = spip_timer('calcul_skel');
1505
-	spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1506
-	// $connect n'est pas sûr : on nettoie
1507
-	$connect = preg_replace(',[^\w],', '', $connect);
1504
+    $secondes = spip_timer('calcul_skel');
1505
+    spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1506
+    // $connect n'est pas sûr : on nettoie
1507
+    $connect = preg_replace(',[^\w],', '', $connect);
1508 1508
 
1509
-	// Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1510
-	$code = new Boucle;
1511
-	$code->descr = $descr;
1512
-	$code->return = '
1509
+    // Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1510
+    $code = new Boucle;
1511
+    $code->descr = $descr;
1512
+    $code->return = '
1513 1513
 //
1514 1514
 // Fonction principale du squelette ' .
1515
-		$sourcefile .
1516
-		($connect ? " pour $connect" : '') .
1517
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1518
-		"\n//\n" .
1519
-		$principal;
1515
+        $sourcefile .
1516
+        ($connect ? " pour $connect" : '') .
1517
+        (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1518
+        "\n//\n" .
1519
+        $principal;
1520 1520
 
1521
-	$boucles[''] = $code;
1521
+    $boucles[''] = $code;
1522 1522
 
1523
-	return $boucles;
1523
+    return $boucles;
1524 1524
 }
1525 1525
 
1526 1526
 
@@ -1537,18 +1537,18 @@  discard block
 block discarded – undo
1537 1537
  *
1538 1538
  **/
1539 1539
 function requeteur_php_dist(&$boucles, &$boucle, &$id) {
1540
-	if (class_exists($boucle->type_requete)) {
1541
-		$g = charger_fonction('php', 'iterateur');
1542
-		$boucles[$id] = $g($boucle, $boucle->type_requete);
1543
-	} else {
1544
-		$x = $boucle->type_requete;
1545
-		$boucle->type_requete = false;
1546
-		$msg = array(
1547
-			'zbug_iterateur_inconnu',
1548
-			array('iterateur' => $x)
1549
-		);
1550
-		erreur_squelette($msg, $boucle);
1551
-	}
1540
+    if (class_exists($boucle->type_requete)) {
1541
+        $g = charger_fonction('php', 'iterateur');
1542
+        $boucles[$id] = $g($boucle, $boucle->type_requete);
1543
+    } else {
1544
+        $x = $boucle->type_requete;
1545
+        $boucle->type_requete = false;
1546
+        $msg = array(
1547
+            'zbug_iterateur_inconnu',
1548
+            array('iterateur' => $x)
1549
+        );
1550
+        erreur_squelette($msg, $boucle);
1551
+    }
1552 1552
 }
1553 1553
 
1554 1554
 
@@ -1566,23 +1566,23 @@  discard block
 block discarded – undo
1566 1566
  *
1567 1567
  **/
1568 1568
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1569
-	include_spip('iterateur/data');
1570
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1571
-		$g = charger_fonction('data', 'iterateur');
1572
-		$boucles[$id] = $g($boucle);
1573
-		// from[0] stocke le type de data (rss, yql, ...)
1574
-		$boucles[$id]->from[] = $boucle->type_requete;
1575
-
1576
-	} else {
1577
-		$x = $boucle->type_requete;
1578
-		$boucle->type_requete = false;
1579
-		$msg = array(
1580
-			'zbug_requeteur_inconnu',
1581
-			array(
1582
-				'requeteur' => 'data',
1583
-				'type' => $x
1584
-			)
1585
-		);
1586
-		erreur_squelette($msg, $boucle);
1587
-	}
1569
+    include_spip('iterateur/data');
1570
+    if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1571
+        $g = charger_fonction('data', 'iterateur');
1572
+        $boucles[$id] = $g($boucle);
1573
+        // from[0] stocke le type de data (rss, yql, ...)
1574
+        $boucles[$id]->from[] = $boucle->type_requete;
1575
+
1576
+    } else {
1577
+        $x = $boucle->type_requete;
1578
+        $boucle->type_requete = false;
1579
+        $msg = array(
1580
+            'zbug_requeteur_inconnu',
1581
+            array(
1582
+                'requeteur' => 'data',
1583
+                'type' => $x
1584
+            )
1585
+        );
1586
+        erreur_squelette($msg, $boucle);
1587
+    }
1588 1588
 }
Please login to merge, or discard this patch.
Spacing   +108 added lines, -116 removed lines patch added patch discarded remove patch
@@ -97,7 +97,7 @@  discard block
 block discarded – undo
97 97
 				preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m);
98 98
 				$m = array_pad($m, 3, null);
99 99
 				$var = $m[1];
100
-				$auto = false;;
100
+				$auto = false; ;
101 101
 				if ($m[2]) {
102 102
 					$v = $m[3];
103 103
 					if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
122 122
 					if ($var !== 1) {
123 123
 						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
124
-							. $val . ($echap ? ") . '" : " ");
124
+							. $val.($echap ? ") . '" : " ");
125 125
 					} else {
126 126
 						$val = $echap ? "'.$val.'" : $val;
127 127
 					}
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
 	if (!$lang) {
143 143
 		$lang = '$GLOBALS["spip_lang"]';
144 144
 	}
145
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " ");
145
+	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ").$lang.($echap ? ") . '" : " ");
146 146
 
147 147
 	return $l;
148 148
 }
@@ -171,7 +171,7 @@  discard block
 block discarded – undo
171 171
 	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
172 172
 	if (is_string($p->texte)) {
173 173
 		$fichier = $p->texte;
174
-		$code = "\"".str_replace('"','\"',$fichier)."\"";
174
+		$code = "\"".str_replace('"', '\"', $fichier)."\"";
175 175
 
176 176
 	} else {
177 177
 		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
@@ -213,7 +213,7 @@  discard block
 block discarded – undo
213 213
 		return false;
214 214
 	} // j'aurais voulu toucher le fond ...
215 215
 
216
-	$contexte = 'array(' . $_contexte . ')';
216
+	$contexte = 'array('.$_contexte.')';
217 217
 
218 218
 	if ($env) {
219 219
 		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
@@ -228,11 +228,11 @@  discard block
 block discarded – undo
228 228
 			$_options[] = $ajax;
229 229
 		}
230 230
 		$code = " ' . argumenter_squelette($code) . '";
231
-		$code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
232
-				"_request(\"connect\")") . ';';
231
+		$code = "echo ".sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options),
232
+				"_request(\"connect\")").';';
233 233
 	}
234 234
 
235
-	return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
235
+	return "\n'<'.'"."?php ".$code."\n?'."."'>'";
236 236
 }
237 237
 
238 238
 
@@ -312,17 +312,17 @@  discard block
 block discarded – undo
312 312
 					$id = $id_table;
313 313
 					$statut = preg_replace(',\W,', '', $s['champ']); // securite
314 314
 				}
315
-				$mstatut = $id . '.' . $statut;
315
+				$mstatut = $id.'.'.$statut;
316 316
 
317 317
 				$arg_ignore_previsu = ($ignore_previsu ? ",true" : '');
318 318
 				include_spip('public/quete');
319 319
 				if (isset($s['post_date']) and $s['post_date']
320 320
 					and $GLOBALS['meta']["post_dates"] == 'non'
321 321
 				) {
322
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
322
+					$date = $id.'.'.preg_replace(',\W,', '', $s['post_date']); // securite
323 323
 					array_unshift($boucle->where,
324 324
 						$echapper ?
325
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
325
+							"\nquete_condition_postdates('$date',"._q($boucle->sql_serveur)."$arg_ignore_previsu)"
326 326
 							:
327 327
 							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
328 328
 					);
@@ -330,9 +330,9 @@  discard block
 block discarded – undo
330 330
 				array_unshift($boucle->where,
331 331
 					$echapper ?
332 332
 						"\nquete_condition_statut('$mstatut',"
333
-						. _q($s['previsu']) . ","
334
-						. _q($s['publie']) . ","
335
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
333
+						. _q($s['previsu']).","
334
+						. _q($s['publie']).","
335
+						. _q($boucle->sql_serveur)."$arg_ignore_previsu)"
336 336
 						:
337 337
 						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
338 338
 				);
@@ -366,7 +366,7 @@  discard block
 block discarded – undo
366 366
 	if (_request('var_mode_affiche') != 'resultat') {
367 367
 		$trace = '';
368 368
 	} else {
369
-		$trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
369
+		$trace = $boucles[$id_boucle]->descr['nom'].$id_boucle;
370 370
 		$trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['$trace'])<3)
371 371
 	    \$GLOBALS['debug_objets']['resultat']['$trace'][] = \$t0;";
372 372
 	}
@@ -401,7 +401,7 @@  discard block
 block discarded – undo
401 401
 	return
402 402
 		// Numrows[$nom] peut ne pas être encore defini
403 403
 		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
404
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";"
404
+		. "\n\t\$t0 = ".$boucles[$id_boucle]->return.";"
405 405
 		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
406 406
 		. $trace
407 407
 		. "\n\treturn \$t0;";
@@ -469,7 +469,7 @@  discard block
 block discarded – undo
469 469
 	// faudrait expanser le foreach a la compil, car y en a souvent qu'un 
470 470
 	// et puis faire un [] plutot qu'un "','."
471 471
 	if ($boucle->doublons) {
472
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
472
+		$corps .= "\n\t\t\tforeach(".$boucle->doublons.' as $k) $doublons[$k] .= "," . '.
473 473
 			index_pile($id_boucle, $primary, $boucles)
474 474
 			. "; // doublons\n";
475 475
 	}
@@ -496,13 +496,13 @@  discard block
 block discarded – undo
496 496
 		$corps .=
497 497
 			"\n\t\tlang_select_public("
498 498
 			. index_pile($id_boucle, 'lang', $boucles)
499
-			. ", '" . $boucle->lang_select . "'"
499
+			. ", '".$boucle->lang_select."'"
500 500
 			. (in_array($type_boucle, array(
501 501
 				'articles',
502 502
 				'rubriques',
503 503
 				'hierarchie',
504 504
 				'breves'
505
-			)) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
505
+			)) ? ', '.index_pile($id_boucle, 'titre', $boucles) : '')
506 506
 			. ');';
507 507
 	} else {
508 508
 		$init_lang = '';
@@ -523,26 +523,22 @@  discard block
 block discarded – undo
523 523
 
524 524
 	// gestion optimale des separateurs et des boucles constantes
525 525
 	if (count($boucle->separateur)) {
526
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
526
+		$code_sep = ("'".str_replace("'", "\'", join('', $boucle->separateur))."'");
527 527
 	}
528 528
 
529 529
 	$corps .=
530 530
 		((!$boucle->separateur) ?
531
-			(($constant && !$corps && !$flag_cpt) ? $return :
532
-				(($return === "''") ? '' :
533
-					("\n\t\t" . '$t0 .= ' . $return . ";"))) :
534
-			("\n\t\t\$t1 " .
531
+			(($constant && !$corps && !$flag_cpt) ? $return : (($return === "''") ? '' : ("\n\t\t".'$t0 .= '.$return.";"))) : ("\n\t\t\$t1 ".
535 532
 				((strpos($return, '$t1.') === 0) ?
536
-					(".=" . substr($return, 4)) :
537
-					('= ' . $return)) .
538
-				";\n\t\t" .
539
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
533
+					(".=".substr($return, 4)) : ('= '.$return)).
534
+				";\n\t\t".
535
+				'$t0 .= ((strlen($t1) && strlen($t0)) ? '.$code_sep." : '') . \$t1;"));
540 536
 
541 537
 	// Calculer les invalideurs si c'est une boucle non constante et si on
542 538
 	// souhaite invalider ces elements
543 539
 	if (!$constant and $primary) {
544 540
 		include_spip('inc/invalideur');
545
-		$corps = calcul_invalideurs($corps, $primary,$boucles, $id_boucle);
541
+		$corps = calcul_invalideurs($corps, $primary, $boucles, $id_boucle);
546 542
 	}
547 543
 
548 544
 	// gerer le compteur de boucle 
@@ -616,7 +612,7 @@  discard block
 block discarded – undo
616 612
 		$corps,
617 613
 		$fin_lang,
618 614
 		$trace,
619
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
615
+		'BOUCLE'.$id_boucle.' @ '.($boucle->descr['sourcefile'])
620 616
 	);
621 617
 
622 618
 #	var_dump($a);exit;
@@ -637,20 +633,20 @@  discard block
 block discarded – undo
637 633
  **/
638 634
 function calculer_requete_sql($boucle) {
639 635
 	$init = array();
640
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
641
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
636
+	$init[] = calculer_dec('table', "'".$boucle->id_table."'");
637
+	$init[] = calculer_dec('id', "'".$boucle->id_boucle."'");
642 638
 	# En absence de champ c'est un decompte :
643 639
 	$init[] = calculer_dec('from', calculer_from($boucle));
644 640
 	$init[] = calculer_dec('type', calculer_from_type($boucle));
645 641
 	$init[] = calculer_dec('groupby',
646
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")");
647
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")");
648
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")");
642
+		'array('.(($g = join("\",\n\t\t\"", $boucle->group)) ? '"'.$g.'"' : '').")");
643
+	$init[] = calculer_dec('select', 'array("'.join("\",\n\t\t\"", $boucle->select)."\")");
644
+	$init[] = calculer_dec('orderby', 'array('.calculer_order($boucle).")");
649 645
 	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
650 646
 	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
651 647
 	$init[] = calculer_dec('limit',
652 648
 		(strpos($boucle->limit, 'intval') === false ?
653
-			"'" . $boucle->limit . "'"
649
+			"'".$boucle->limit."'"
654 650
 			:
655 651
 			$boucle->limit));
656 652
 	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
@@ -659,17 +655,17 @@  discard block
 block discarded – undo
659 655
 	// ou recalculée à chaque passage (vide)
660 656
 	foreach ($init as $i) {
661 657
 		if (reset($i)) {
662
-			$s .= "\n\t\t" . end($i);
658
+			$s .= "\n\t\t".end($i);
663 659
 		} # statique
664 660
 		else {
665
-			$d .= "\n\t" . end($i);
661
+			$d .= "\n\t".end($i);
666 662
 		} # dynamique
667 663
 	}
668 664
 
669 665
 	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
670 666
 	. $boucle->in
671 667
 	. $boucle->hash
672
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
668
+	. "\n\t".'if (!isset($command[\'table\'])) {'
673 669
 	. $s
674 670
 	. "\n\t}"
675 671
 	. $d;
@@ -752,7 +748,7 @@  discard block
 block discarded – undo
752 748
  *    - index 1 : Code de l'affectation
753 749
  **/
754 750
 function calculer_dec($nom, $val) {
755
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
751
+	$static = 'if (!isset($command[\''.$nom.'\'])) ';
756 752
 	// si une variable apparait dans le calcul de la clause
757 753
 	// il faut la re-evaluer a chaque passage
758 754
 	if (
@@ -769,7 +765,7 @@  discard block
 block discarded – undo
769 765
 		$static = "";
770 766
 	}
771 767
 
772
-	return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';');
768
+	return array($static, '$command[\''.$nom.'\'] = '.$val.';');
773 769
 }
774 770
 
775 771
 /**
@@ -794,16 +790,16 @@  discard block
 block discarded – undo
794 790
 	}
795 791
 	$res = "";
796 792
 	if ($a and $a[0] == "'?'") {
797
-		return ("(" . calculer_dump_array($a[1]) .
798
-			" ? " . calculer_dump_array($a[2]) .
799
-			" : " . calculer_dump_array($a[3]) .
793
+		return ("(".calculer_dump_array($a[1]).
794
+			" ? ".calculer_dump_array($a[2]).
795
+			" : ".calculer_dump_array($a[3]).
800 796
 			")");
801 797
 	} else {
802 798
 		foreach ($a as $v) {
803
-			$res .= ", " . calculer_dump_array($v);
799
+			$res .= ", ".calculer_dump_array($v);
804 800
 		}
805 801
 
806
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
802
+		return "\n\t\t\tarray(".substr($res, 2).')';
807 803
 	}
808 804
 }
809 805
 
@@ -811,10 +807,10 @@  discard block
 block discarded – undo
811 807
 function calculer_dump_join($a) {
812 808
 	$res = "";
813 809
 	foreach ($a as $k => $v) {
814
-		$res .= ", '$k' => array(" . implode(',', $v) . ")";
810
+		$res .= ", '$k' => array(".implode(',', $v).")";
815 811
 	}
816 812
 
817
-	return 'array(' . substr($res, 2) . ')';
813
+	return 'array('.substr($res, 2).')';
818 814
 }
819 815
 
820 816
 /**
@@ -831,7 +827,7 @@  discard block
 block discarded – undo
831 827
 		$res .= ",'$k' => '$v'";
832 828
 	}
833 829
 
834
-	return 'array(' . substr($res, 1) . ')';
830
+	return 'array('.substr($res, 1).')';
835 831
 }
836 832
 
837 833
 /**
@@ -849,7 +845,7 @@  discard block
 block discarded – undo
849 845
 		$res .= ",'$k' => '$v'";
850 846
 	}
851 847
 
852
-	return 'array(' . substr($res, 1) . ')';
848
+	return 'array('.substr($res, 1).')';
853 849
 }
854 850
 
855 851
 // http://code.spip.net/@calculer_order
@@ -903,17 +899,17 @@  discard block
 block discarded – undo
903 899
 				) {
904 900
 					$res .= " .\n$tab$code";
905 901
 				} else {
906
-					$res = substr($res, 0, -1) . substr($code, 1);
902
+					$res = substr($res, 0, -1).substr($code, 1);
907 903
 				}
908 904
 			}
909 905
 
910
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
906
+			return '('.substr($res, 2 + $descr['niv']).')';
911 907
 		}
912 908
 	} else {
913
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : '');
909
+		$nom = $descr['nom'].$id_boucle.($descr['niv'] ? $descr['niv'] : '');
914 910
 
915
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab",
916
-			$codes) . ")))";
911
+		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(".join(" ,\n$tab",
912
+			$codes).")))";
917 913
 	}
918 914
 }
919 915
 
@@ -941,7 +937,7 @@  discard block
 block discarded – undo
941 937
 			// texte seul
942 938
 			case 'texte':
943 939
 				$code = sandbox_composer_texte($p->texte, $p);
944
-				$commentaire = strlen($p->texte) . " signes";
940
+				$commentaire = strlen($p->texte)." signes";
945 941
 				$avant = '';
946 942
 				$apres = '';
947 943
 				$altern = "''";
@@ -950,14 +946,14 @@  discard block
 block discarded – undo
950 946
 			case 'polyglotte':
951 947
 				$code = "";
952 948
 				foreach ($p->traductions as $k => $v) {
953
-					$code .= ",'" .
954
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) .
955
-						"' => '" .
956
-						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) .
949
+					$code .= ",'".
950
+						str_replace(array("\\", "'"), array("\\\\", "\\'"), $k).
951
+						"' => '".
952
+						str_replace(array("\\", "'"), array("\\\\", "\\'"), $v).
957 953
 						"'";
958 954
 				}
959
-				$code = "choisir_traduction(array(" .
960
-					substr($code, 1) .
955
+				$code = "choisir_traduction(array(".
956
+					substr($code, 1).
961 957
 					"))";
962 958
 				$commentaire = '&';
963 959
 				$avant = '';
@@ -973,7 +969,7 @@  discard block
 block discarded – undo
973 969
 					$err_e_c = true;
974 970
 					$code = "''";
975 971
 				} else {
976
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
972
+					$commentaire = '<INCLURE '.addslashes(str_replace("\n", ' ', $code)).'>';
977 973
 					$avant = '';
978 974
 					$apres = '';
979 975
 					$altern = "''";
@@ -997,8 +993,8 @@  discard block
 block discarded – undo
997 993
 					$err_e_c = true;
998 994
 					$code = "''";
999 995
 				} else {
1000
-					$code = 'BOUCLE' .
1001
-						str_replace("-", "_", $nom) . $descr['nom'] .
996
+					$code = 'BOUCLE'.
997
+						str_replace("-", "_", $nom).$descr['nom'].
1002 998
 						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1003 999
 					$commentaire = "?$nom";
1004 1000
 					if (!$boucles[$nom]->milieu
@@ -1025,24 +1021,22 @@  discard block
 block discarded – undo
1025 1021
 				foreach ($p->arg as $k => $v) {
1026 1022
 					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1027 1023
 					if ($k) {
1028
-						$l[] = _q($k) . ' => ' . $_v;
1024
+						$l[] = _q($k).' => '.$_v;
1029 1025
 					} else {
1030 1026
 						$code = $_v;
1031 1027
 					}
1032 1028
 				}
1033 1029
 				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1034 1030
 				if ($p->module) {
1035
-					$m = $p->module . ':' . $p->nom_champ;
1031
+					$m = $p->module.':'.$p->nom_champ;
1036 1032
 				} elseif ($p->nom_champ) {
1037
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1033
+					$m = MODULES_IDIOMES.':'.$p->nom_champ;
1038 1034
 				} else {
1039 1035
 					$m = '';
1040 1036
 				}
1041 1037
 
1042
-				$code = (!$code ? "'$m'" :
1043
-						($m ? "'$m' . $code" :
1044
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1045
-					. (!$l ? '' : (", array(" . implode(",\n", $l) . ")"));
1038
+				$code = (!$code ? "'$m'" : ($m ? "'$m' . $code" : ("(strpos(\$x=$code, ':') ? \$x : ('".MODULES_IDIOMES.":' . \$x))")))
1039
+					. (!$l ? '' : (", array(".implode(",\n", $l).")"));
1046 1040
 				$code = "_T($code)";
1047 1041
 				if ($p->param) {
1048 1042
 					$p->id_boucle = $id_boucle;
@@ -1065,7 +1059,7 @@  discard block
 block discarded – undo
1065 1059
 				$p->type_requete = $type;
1066 1060
 
1067 1061
 				$code = calculer_champ($p);
1068
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1062
+				$commentaire = '#'.$p->nom_champ.$p->etoile;
1069 1063
 				$avant = calculer_liste($p->avant,
1070 1064
 					$descr, $boucles, $id_boucle);
1071 1065
 				$apres = calculer_liste($p->apres,
@@ -1096,10 +1090,9 @@  discard block
 block discarded – undo
1096 1090
 		if ($code != "''") {
1097 1091
 			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1098 1092
 			$codes[] = (($mode == 'validation') ?
1099
-				"array($code, '$commentaire', " . $p->ligne . ")"
1093
+				"array($code, '$commentaire', ".$p->ligne.")"
1100 1094
 				: (($mode == 'code') ?
1101
-					"\n// $commentaire\n$code" :
1102
-					$code));
1095
+					"\n// $commentaire\n$code" : $code));
1103 1096
 		}
1104 1097
 	} // foreach
1105 1098
 
@@ -1127,19 +1120,19 @@  discard block
 block discarded – undo
1127 1120
 		$cond = '';
1128 1121
 	} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1129 1122
 		$t = $r[2];
1130
-		$cond = '!' . $r[1];
1123
+		$cond = '!'.$r[1];
1131 1124
 	} else {
1132 1125
 		if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1133 1126
 			$t = $r[2];
1134 1127
 			$cond = $r[1];
1135 1128
 		} else {
1136
-			$t = '$t' . $n;
1129
+			$t = '$t'.$n;
1137 1130
 			$cond = "($t = $code)!==''";
1138 1131
 		}
1139 1132
 	}
1140 1133
 
1141
-	$res = (!$avant ? "" : "$avant . ") .
1142
-		$t .
1134
+	$res = (!$avant ? "" : "$avant . ").
1135
+		$t.
1143 1136
 		(!$apres ? "" : " . $apres");
1144 1137
 
1145 1138
 	if ($res !== $t) {
@@ -1188,12 +1181,12 @@  discard block
 block discarded – undo
1188 1181
 
1189 1182
 	// rendre inertes les echappements de #[](){}<>
1190 1183
 	$i = 0;
1191
-	while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1184
+	while (false !== strpos($squelette, $inerte = '-INERTE'.$i)) {
1192 1185
 		$i++;
1193 1186
 	}
1194 1187
 	$squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),',
1195 1188
 		function($a) use ($inerte) {
1196
-			return "$inerte-" . ord($a[1]) . '-';
1189
+			return "$inerte-".ord($a[1]).'-';
1197 1190
 		},
1198 1191
 		$squelette,
1199 1192
 		-1,
@@ -1210,7 +1203,7 @@  discard block
 block discarded – undo
1210 1203
 	// Phraser le squelette, selon sa grammaire
1211 1204
 
1212 1205
 	$boucles = array();
1213
-	$f = charger_fonction('phraser_' . $gram, 'public');
1206
+	$f = charger_fonction('phraser_'.$gram, 'public');
1214 1207
 
1215 1208
 	$squelette = $f($squelette, '', $boucles, $descr);
1216 1209
 
@@ -1229,7 +1222,7 @@  discard block
 block discarded – undo
1229 1222
 			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1230 1223
 				",$inerte-(\d+)-,",
1231 1224
 				function($a) {
1232
-					return "\\\\" . chr($a[1]);
1225
+					return "\\\\".chr($a[1]);
1233 1226
 				},
1234 1227
 				$boucle->descr['squelette']
1235 1228
 			);
@@ -1241,19 +1234,19 @@  discard block
 block discarded – undo
1241 1234
 		include_spip('public/decompiler');
1242 1235
 		foreach ($boucles as $id => $boucle) {
1243 1236
 			if ($id) {
1244
-				$decomp = "\n/* BOUCLE " .
1245
-					$boucle->type_requete .
1246
-					" " .
1247
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1248
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1237
+				$decomp = "\n/* BOUCLE ".
1238
+					$boucle->type_requete.
1239
+					" ".
1240
+					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')).
1241
+					($boucle->debug ? "\n *\n * ".implode("\n * ", $boucle->debug)."\n" : '').
1249 1242
 					" */\n";
1250 1243
 			} else {
1251
-				$decomp = ("\n/*\n" .
1244
+				$decomp = ("\n/*\n".
1252 1245
 					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1253 1246
 					. "\n*/");
1254 1247
 			}
1255
-			$boucles[$id]->return = $decomp . $boucle->return;
1256
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1248
+			$boucles[$id]->return = $decomp.$boucle->return;
1249
+			$GLOBALS['debug_objets']['code'][$nom.$id] = $boucle->return;
1257 1250
 		}
1258 1251
 	}
1259 1252
 
@@ -1276,7 +1269,7 @@  discard block
 block discarded – undo
1276 1269
 		}
1277 1270
 	}
1278 1271
 	foreach ($boucles as $id => $boucle) {
1279
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1272
+		$GLOBALS['debug_objets']['boucle'][$nom.$id] = $boucle;
1280 1273
 	}
1281 1274
 	$descr['documents'] = compile_inclure_doublons($squelette);
1282 1275
 
@@ -1358,8 +1351,7 @@  discard block
 block discarded – undo
1358 1351
 						} else {
1359 1352
 							$boucles[$id]->type_requete = false;
1360 1353
 							$boucle = $boucles[$id];
1361
-							$x = (!$boucle->sql_serveur ? '' :
1362
-									($boucle->sql_serveur . ":")) .
1354
+							$x = (!$boucle->sql_serveur ? '' : ($boucle->sql_serveur.":")).
1363 1355
 								$type;
1364 1356
 							$msg = array(
1365 1357
 								'zbug_table_inconnue',
@@ -1445,13 +1437,13 @@  discard block
 block discarded – undo
1445 1437
 			if (
1446 1438
 				// fonction de boucle avec serveur & table
1447 1439
 				(!$serveur or
1448
-					((!function_exists($f = "boucle_" . $serveur . "_" . $table))
1449
-						and (!function_exists($f = $f . "_dist"))
1440
+					((!function_exists($f = "boucle_".$serveur."_".$table))
1441
+						and (!function_exists($f = $f."_dist"))
1450 1442
 					)
1451 1443
 				)
1452 1444
 				// fonction de boucle avec table
1453
-				and (!function_exists($f = "boucle_" . $table))
1454
-				and (!function_exists($f = $f . "_dist"))
1445
+				and (!function_exists($f = "boucle_".$table))
1446
+				and (!function_exists($f = $f."_dist"))
1455 1447
 			) {
1456 1448
 				// fonction de boucle standard 
1457 1449
 				if (!function_exists($f = 'boucle_DEFAUT')) {
@@ -1459,20 +1451,20 @@  discard block
 block discarded – undo
1459 1451
 				}
1460 1452
 			}
1461 1453
 
1462
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1463
-				"static \$connect;\n\t" .
1464
-				"\$command['connect'] = \$connect = " .
1465
-				_q($boucle->sql_serveur) .
1466
-				";" .
1454
+			$req = "\n\n\tstatic \$command = array();\n\t".
1455
+				"static \$connect;\n\t".
1456
+				"\$command['connect'] = \$connect = ".
1457
+				_q($boucle->sql_serveur).
1458
+				";".
1467 1459
 				$f($id, $boucles);
1468 1460
 		} else {
1469 1461
 			$req = ("\n\treturn '';");
1470 1462
 		}
1471 1463
 
1472 1464
 		$boucles[$id]->return =
1473
-			"\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom .
1474
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1475
-			$req .
1465
+			"\n\nfunction BOUCLE".strtr($id, "-", "_").$nom.
1466
+			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {'.
1467
+			$req.
1476 1468
 			"\n}\n";
1477 1469
 	}
1478 1470
 
@@ -1482,7 +1474,7 @@  discard block
 block discarded – undo
1482 1474
 		return false;
1483 1475
 	}
1484 1476
 
1485
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1477
+	$principal = "\nfunction ".$nom.'($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1486 1478
 '
1487 1479
 		// reporter de maniere securisee les doublons inclus
1488 1480
 		. '
@@ -1490,15 +1482,15 @@  discard block
 block discarded – undo
1490 1482
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1491 1483
 
1492 1484
 	$connect = ' .
1493
-		_q($connect) . ';
1485
+		_q($connect).';
1494 1486
 	$page = ' .
1495 1487
 		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1496 1488
 		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1497 1489
 		// avant de referencer $Cache
1498
-		$corps . ";
1490
+		$corps.";
1499 1491
 
1500 1492
 	return analyse_resultat_skel(" . var_export($nom, true)
1501
-		. ", \$Cache, \$page, " . var_export($sourcefile, true) . ");
1493
+		. ", \$Cache, \$page, ".var_export($sourcefile, true).");
1502 1494
 }";
1503 1495
 
1504 1496
 	$secondes = spip_timer('calcul_skel');
@@ -1512,10 +1504,10 @@  discard block
 block discarded – undo
1512 1504
 	$code->return = '
1513 1505
 //
1514 1506
 // Fonction principale du squelette ' .
1515
-		$sourcefile .
1516
-		($connect ? " pour $connect" : '') .
1517
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1518
-		"\n//\n" .
1507
+		$sourcefile.
1508
+		($connect ? " pour $connect" : '').
1509
+		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes").
1510
+		"\n//\n".
1519 1511
 		$principal;
1520 1512
 
1521 1513
 	$boucles[''] = $code;
@@ -1567,7 +1559,7 @@  discard block
 block discarded – undo
1567 1559
  **/
1568 1560
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1569 1561
 	include_spip('iterateur/data');
1570
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1562
+	if ($h = charger_fonction($boucle->type_requete.'_to_array', 'inc', true)) {
1571 1563
 		$g = charger_fonction('data', 'iterateur');
1572 1564
 		$boucles[$id] = $g($boucle);
1573 1565
 		// from[0] stocke le type de data (rss, yql, ...)
Please login to merge, or discard this patch.