Completed
Push — master ( a2da30...e9ce2d )
by cam
01:03
created
ecrire/public/composer.php 2 patches
Indentation   +760 added lines, -760 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
 include_spip('inc/texte');
@@ -42,233 +42,233 @@  discard block
 block discarded – undo
42 42
 
43 43
 function public_composer_dist($squelette, $mime_type, $gram, $source, string $connect = '') {
44 44
 
45
-	$skel = null;
46
-	$boucle = null;
47
-	$nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
48
-
49
-	//  si deja en memoire (INCLURE  a repetition) c'est bon.
50
-	if (function_exists($nom)) {
51
-		return $nom;
52
-	}
53
-
54
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
55
-		$GLOBALS['debug_objets']['courant'] = $nom;
56
-	}
57
-
58
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
59
-
60
-	// si squelette est deja compile et perenne, le charger
61
-	if (!squelette_obsolete($phpfile, $source)) {
62
-		include_once $phpfile;
63
-		#if (!squelette_obsolete($phpfile, $source)
64
-		#  AND lire_fichier ($phpfile, $skel_code,
65
-		#  array('critique' => 'oui', 'phpcheck' => 'oui'))){
66
-		## eval('?'.'>'.$skel_code);
67
-		#	 spip_log($skel_code, 'comp')
68
-		#}
69
-	}
70
-
71
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
72
-		include_once $lib;
73
-	}
74
-
75
-	// tester si le eval ci-dessus a mis le squelette en memoire
76
-
77
-	if (function_exists($nom)) {
78
-		return $nom;
79
-	}
80
-
81
-	// charger le source, si possible, et compiler
82
-	$skel_code = '';
83
-	if (lire_fichier($source, $skel)) {
84
-		$compiler = charger_fonction('compiler', 'public');
85
-		$skel_code = $compiler($skel, $nom, $gram, $source, $connect);
86
-	}
87
-
88
-	// Ne plus rien faire si le compilateur n'a pas pu operer.
89
-	if (!$skel_code) {
90
-		return false;
91
-	}
92
-
93
-	foreach ($skel_code as $id => $boucle) {
94
-		$f = $boucle->return;
95
-		try {
96
-			eval("return true; $f ;");
97
-		} catch (\ParseError $e) {
98
-			// Code syntaxiquement faux (critere etc mal programme')
99
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
100
-			erreur_squelette($msg, $boucle);
101
-			// continuer pour trouver d'autres fautes eventuelles
102
-			// mais prevenir que c'est mort
103
-			$nom = '';
104
-		}
105
-
106
-		// Contexte de compil inutile a present
107
-		// (mais la derniere valeur de $boucle est utilisee ci-dessous)
108
-		$skel_code[$id] = $f;
109
-	}
110
-
111
-	$code = '';
112
-	if ($nom) {
113
-		// Si le code est bon, concatener et mettre en cache
114
-		if (function_exists($nom)) {
115
-			$code = squelette_traduit($skel, $source, $phpfile, $skel_code);
116
-		} else {
117
-			// code semantiquement faux: bug du compilateur
118
-			// $boucle est en fait ici la fct principale du squelette
119
-			$msg = _T('zbug_erreur_compilation');
120
-			erreur_squelette($msg, $boucle);
121
-			$nom = '';
122
-		}
123
-	}
124
-
125
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
126
-		// Tracer ce qui vient d'etre compile
127
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
128
-
129
-		// si c'est ce que demande le debusqueur, lui passer la main
130
-		if (
131
-			$GLOBALS['debug_objets']['sourcefile']
132
-			and (_request('var_mode_objet') == $nom)
133
-			and (_request('var_mode_affiche') == 'code')
134
-		) {
135
-			erreur_squelette();
136
-		}
137
-	}
138
-
139
-	return $nom ?: false;
45
+    $skel = null;
46
+    $boucle = null;
47
+    $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect);
48
+
49
+    //  si deja en memoire (INCLURE  a repetition) c'est bon.
50
+    if (function_exists($nom)) {
51
+        return $nom;
52
+    }
53
+
54
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
55
+        $GLOBALS['debug_objets']['courant'] = $nom;
56
+    }
57
+
58
+    $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
59
+
60
+    // si squelette est deja compile et perenne, le charger
61
+    if (!squelette_obsolete($phpfile, $source)) {
62
+        include_once $phpfile;
63
+        #if (!squelette_obsolete($phpfile, $source)
64
+        #  AND lire_fichier ($phpfile, $skel_code,
65
+        #  array('critique' => 'oui', 'phpcheck' => 'oui'))){
66
+        ## eval('?'.'>'.$skel_code);
67
+        #	 spip_log($skel_code, 'comp')
68
+        #}
69
+    }
70
+
71
+    if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
72
+        include_once $lib;
73
+    }
74
+
75
+    // tester si le eval ci-dessus a mis le squelette en memoire
76
+
77
+    if (function_exists($nom)) {
78
+        return $nom;
79
+    }
80
+
81
+    // charger le source, si possible, et compiler
82
+    $skel_code = '';
83
+    if (lire_fichier($source, $skel)) {
84
+        $compiler = charger_fonction('compiler', 'public');
85
+        $skel_code = $compiler($skel, $nom, $gram, $source, $connect);
86
+    }
87
+
88
+    // Ne plus rien faire si le compilateur n'a pas pu operer.
89
+    if (!$skel_code) {
90
+        return false;
91
+    }
92
+
93
+    foreach ($skel_code as $id => $boucle) {
94
+        $f = $boucle->return;
95
+        try {
96
+            eval("return true; $f ;");
97
+        } catch (\ParseError $e) {
98
+            // Code syntaxiquement faux (critere etc mal programme')
99
+            $msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
100
+            erreur_squelette($msg, $boucle);
101
+            // continuer pour trouver d'autres fautes eventuelles
102
+            // mais prevenir que c'est mort
103
+            $nom = '';
104
+        }
105
+
106
+        // Contexte de compil inutile a present
107
+        // (mais la derniere valeur de $boucle est utilisee ci-dessous)
108
+        $skel_code[$id] = $f;
109
+    }
110
+
111
+    $code = '';
112
+    if ($nom) {
113
+        // Si le code est bon, concatener et mettre en cache
114
+        if (function_exists($nom)) {
115
+            $code = squelette_traduit($skel, $source, $phpfile, $skel_code);
116
+        } else {
117
+            // code semantiquement faux: bug du compilateur
118
+            // $boucle est en fait ici la fct principale du squelette
119
+            $msg = _T('zbug_erreur_compilation');
120
+            erreur_squelette($msg, $boucle);
121
+            $nom = '';
122
+        }
123
+    }
124
+
125
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
126
+        // Tracer ce qui vient d'etre compile
127
+        $GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
128
+
129
+        // si c'est ce que demande le debusqueur, lui passer la main
130
+        if (
131
+            $GLOBALS['debug_objets']['sourcefile']
132
+            and (_request('var_mode_objet') == $nom)
133
+            and (_request('var_mode_affiche') == 'code')
134
+        ) {
135
+            erreur_squelette();
136
+        }
137
+    }
138
+
139
+    return $nom ?: false;
140 140
 }
141 141
 
142 142
 function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) {
143 143
 
144
-	$code = null;
145
-	// Le dernier index est '' (fonction principale)
146
-	$noms = substr(join(', ', array_keys($boucles)), 0, -2);
147
-	if (CODE_COMMENTE) {
148
-		$code = "
144
+    $code = null;
145
+    // Le dernier index est '' (fonction principale)
146
+    $noms = substr(join(', ', array_keys($boucles)), 0, -2);
147
+    if (CODE_COMMENTE) {
148
+        $code = "
149 149
 /*
150 150
  * Squelette : $sourcefile
151 151
  * Date :      " . gmdate('D, d M Y H:i:s', @filemtime($sourcefile)) . ' GMT
152 152
  * Compile :   ' . gmdate('D, d M Y H:i:s', time()) . ' GMT
153 153
  * ' . (!$boucles ? 'Pas de boucle' : ('Boucles :   ' . $noms)) . '
154 154
  */ ';
155
-	}
155
+    }
156 156
 
157
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
158
-	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
159
-		ecrire_fichier($phpfile, $code);
160
-	}
157
+    $code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
158
+    if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
159
+        ecrire_fichier($phpfile, $code);
160
+    }
161 161
 
162
-	return $code;
162
+    return $code;
163 163
 }
164 164
 
165 165
 // Le squelette compile est-il trop vieux ?
166 166
 function squelette_obsolete($skel, $squelette) {
167
-	static $date_change = null;
168
-	// ne verifier la date de mes_fonctions et mes_options qu'une seule fois
169
-	// par hit
170
-	if (is_null($date_change)) {
171
-		if (@file_exists($fonc = 'mes_fonctions.php')) {
172
-			$date_change = @filemtime($fonc);
173
-		} # compatibilite
174
-		if (defined('_FILE_OPTIONS')) {
175
-			$date_change = max($date_change, @filemtime(_FILE_OPTIONS));
176
-		}
177
-	}
178
-
179
-	return (
180
-		(defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug']))
181
-		or !@file_exists($skel)
182
-		or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
183
-			> ($date = @filemtime($skel)))
184
-		or ($date_change > $date)
185
-	);
167
+    static $date_change = null;
168
+    // ne verifier la date de mes_fonctions et mes_options qu'une seule fois
169
+    // par hit
170
+    if (is_null($date_change)) {
171
+        if (@file_exists($fonc = 'mes_fonctions.php')) {
172
+            $date_change = @filemtime($fonc);
173
+        } # compatibilite
174
+        if (defined('_FILE_OPTIONS')) {
175
+            $date_change = max($date_change, @filemtime(_FILE_OPTIONS));
176
+        }
177
+    }
178
+
179
+    return (
180
+        (defined('_VAR_MODE') and in_array(_VAR_MODE, ['recalcul', 'preview', 'debug']))
181
+        or !@file_exists($skel)
182
+        or ((@file_exists($squelette) ? @filemtime($squelette) : 0)
183
+            > ($date = @filemtime($skel)))
184
+        or ($date_change > $date)
185
+    );
186 186
 }
187 187
 
188 188
 // Activer l'invalideur de session
189 189
 function invalideur_session(&$Cache, $code = null) {
190
-	$Cache['session'] = spip_session();
190
+    $Cache['session'] = spip_session();
191 191
 
192
-	return $code;
192
+    return $code;
193 193
 }
194 194
 
195 195
 
196 196
 function analyse_resultat_skel($nom, $cache, $corps, $source = '') {
197
-	static $filtres = [];
198
-	$headers = [];
199
-
200
-	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
201
-	// note: on essaie d'attrapper aussi certains de ces entetes codes
202
-	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
203
-	if (
204
-		stripos($corps, 'header') !== false
205
-		and preg_match_all(
206
-			'/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
207
-			$corps,
208
-			$regs,
209
-			PREG_SET_ORDER
210
-		)
211
-	) {
212
-		foreach ($regs as $r) {
213
-			$corps = str_replace($r[0], '', $corps);
214
-			# $j = Content-Type, et pas content-TYPE.
215
-			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
216
-
217
-			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
218
-				$headers[$j] .= '|' . $r[3];
219
-			} else {
220
-				$headers[$j] = $r[3];
221
-			}
222
-		}
223
-	}
224
-	// S'agit-il d'un resultat constant ou contenant du code php
225
-	$process_ins = (
226
-		strpos($corps, '<' . '?') === false
227
-		or
228
-		(strpos($corps, '<' . '?xml') !== false and
229
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
230
-	)
231
-		? 'html'
232
-		: 'php';
233
-
234
-	$skel = [
235
-		'squelette' => $nom,
236
-		'source' => $source,
237
-		'process_ins' => $process_ins,
238
-		'invalideurs' => $cache,
239
-		'entetes' => $headers,
240
-		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
241
-	];
242
-
243
-	// traiter #FILTRE{} et filtres
244
-	if (!isset($filtres[$nom])) {
245
-		$filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]);
246
-	}
247
-	$filtres_headers = [];
248
-	if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
249
-		$filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
250
-		unset($headers['X-Spip-Filtre']);
251
-	}
252
-	if (is_array($filtres[$nom]) || $filtres[$nom] instanceof \Countable ? count($filtres[$nom]) : 0 or count($filtres_headers)) {
253
-		include_spip('public/sandbox');
254
-		$corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
255
-
256
-		if ($process_ins == 'html') {
257
-			$skel['process_ins'] = (
258
-				strpos($corps, '<' . '?') === false
259
-				or
260
-				(strpos($corps, '<' . '?xml') !== false and
261
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
262
-			)
263
-				? 'html'
264
-				: 'php';
265
-		}
266
-	}
267
-
268
-	$skel['entetes'] = $headers;
269
-	$skel['texte'] = $corps;
270
-
271
-	return $skel;
197
+    static $filtres = [];
198
+    $headers = [];
199
+
200
+    // Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
201
+    // note: on essaie d'attrapper aussi certains de ces entetes codes
202
+    // "a la main" dans les squelettes, mais evidemment sans exhaustivite
203
+    if (
204
+        stripos($corps, 'header') !== false
205
+        and preg_match_all(
206
+            '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
207
+            $corps,
208
+            $regs,
209
+            PREG_SET_ORDER
210
+        )
211
+    ) {
212
+        foreach ($regs as $r) {
213
+            $corps = str_replace($r[0], '', $corps);
214
+            # $j = Content-Type, et pas content-TYPE.
215
+            $j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
216
+
217
+            if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
218
+                $headers[$j] .= '|' . $r[3];
219
+            } else {
220
+                $headers[$j] = $r[3];
221
+            }
222
+        }
223
+    }
224
+    // S'agit-il d'un resultat constant ou contenant du code php
225
+    $process_ins = (
226
+        strpos($corps, '<' . '?') === false
227
+        or
228
+        (strpos($corps, '<' . '?xml') !== false and
229
+            strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
230
+    )
231
+        ? 'html'
232
+        : 'php';
233
+
234
+    $skel = [
235
+        'squelette' => $nom,
236
+        'source' => $source,
237
+        'process_ins' => $process_ins,
238
+        'invalideurs' => $cache,
239
+        'entetes' => $headers,
240
+        'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
241
+    ];
242
+
243
+    // traiter #FILTRE{} et filtres
244
+    if (!isset($filtres[$nom])) {
245
+        $filtres[$nom] = pipeline('declarer_filtres_squelettes', ['args' => $skel, 'data' => []]);
246
+    }
247
+    $filtres_headers = [];
248
+    if (isset($headers['X-Spip-Filtre']) and strlen($headers['X-Spip-Filtre'])) {
249
+        $filtres_headers = array_filter(explode('|', $headers['X-Spip-Filtre']));
250
+        unset($headers['X-Spip-Filtre']);
251
+    }
252
+    if (is_array($filtres[$nom]) || $filtres[$nom] instanceof \Countable ? count($filtres[$nom]) : 0 or count($filtres_headers)) {
253
+        include_spip('public/sandbox');
254
+        $corps = sandbox_filtrer_squelette($skel, $corps, $filtres_headers, $filtres[$nom]);
255
+
256
+        if ($process_ins == 'html') {
257
+            $skel['process_ins'] = (
258
+                strpos($corps, '<' . '?') === false
259
+                or
260
+                (strpos($corps, '<' . '?xml') !== false and
261
+                    strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
262
+            )
263
+                ? 'html'
264
+                : 'php';
265
+        }
266
+    }
267
+
268
+    $skel['entetes'] = $headers;
269
+    $skel['texte'] = $corps;
270
+
271
+    return $skel;
272 272
 }
273 273
 
274 274
 //
@@ -282,7 +282,7 @@  discard block
 block discarded – undo
282 282
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
283 283
 if ($lang_select) lang_select();
284 284
 ?'
285
-	. '>');
285
+    . '>');
286 286
 
287 287
 /**
288 288
  * Synthétise une balise dynamique : crée l'appel à l'inclusion
@@ -302,35 +302,35 @@  discard block
 block discarded – undo
302 302
  *     Code PHP pour inclure le squelette de la balise dynamique
303 303
  **/
304 304
 function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
305
-	if (
306
-		strncmp($file, '/', 1) !== 0
307
-		// pas de lien symbolique sous Windows
308
-		and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
309
-	) {
310
-		$file = './" . _DIR_RACINE . "' . $file;
311
-	}
312
-
313
-	$lang = $context_compil[4];
314
-	if (preg_match(',\W,', $lang)) {
315
-		$lang = '';
316
-	}
317
-
318
-	$args = array_map('argumenter_squelette', $args);
319
-	if (!empty($context_compil['appel_php_depuis_modele'])) {
320
-		$args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
321
-	}
322
-	$args = join(', ', $args);
323
-
324
-	$r = sprintf(
325
-		CODE_INCLURE_BALISE,
326
-		$file,
327
-		$lang,
328
-		$nom,
329
-		$args,
330
-		join(', ', array_map('_q', $context_compil))
331
-	);
332
-
333
-	return $r;
305
+    if (
306
+        strncmp($file, '/', 1) !== 0
307
+        // pas de lien symbolique sous Windows
308
+        and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
309
+    ) {
310
+        $file = './" . _DIR_RACINE . "' . $file;
311
+    }
312
+
313
+    $lang = $context_compil[4];
314
+    if (preg_match(',\W,', $lang)) {
315
+        $lang = '';
316
+    }
317
+
318
+    $args = array_map('argumenter_squelette', $args);
319
+    if (!empty($context_compil['appel_php_depuis_modele'])) {
320
+        $args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
321
+    }
322
+    $args = join(', ', $args);
323
+
324
+    $r = sprintf(
325
+        CODE_INCLURE_BALISE,
326
+        $file,
327
+        $lang,
328
+        $nom,
329
+        $args,
330
+        join(', ', array_map('_q', $context_compil))
331
+    );
332
+
333
+    return $r;
334 334
 }
335 335
 
336 336
 /**
@@ -348,18 +348,18 @@  discard block
 block discarded – undo
348 348
  **/
349 349
 function argumenter_squelette($v) {
350 350
 
351
-	if (is_object($v)) {
352
-		return var_export($v, true);
353
-	} elseif (!is_array($v)) {
354
-		return "'" . texte_script((string) $v) . "'";
355
-	} else {
356
-		$out = [];
357
-		foreach ($v as $k => $val) {
358
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
359
-		}
360
-
361
-		return 'array(' . join(', ', $out) . ')';
362
-	}
351
+    if (is_object($v)) {
352
+        return var_export($v, true);
353
+    } elseif (!is_array($v)) {
354
+        return "'" . texte_script((string) $v) . "'";
355
+    } else {
356
+        $out = [];
357
+        foreach ($v as $k => $val) {
358
+            $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
359
+        }
360
+
361
+        return 'array(' . join(', ', $out) . ')';
362
+    }
363 363
 }
364 364
 
365 365
 
@@ -390,87 +390,87 @@  discard block
 block discarded – undo
390 390
  *     Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique
391 391
  **/
392 392
 function executer_balise_dynamique($nom, $args, $context_compil) {
393
-	/** @var string Nom de la balise à charger (balise demandée ou balise générique) */
394
-	$nom_balise = $nom;
395
-	/** @var string Nom de la balise générique (si utilisée) */
396
-	$nom_balise_generique = '';
397
-
398
-	$appel_php_depuis_modele = false;
399
-	if (
400
-		is_array($context_compil)
401
-		and !is_numeric($context_compil[3])
402
-		and empty($context_compil[0])
403
-		and empty($context_compil[1])
404
-		and empty($context_compil[2])
405
-		and empty($context_compil[3])
406
-	) {
407
-		$appel_php_depuis_modele = true;
408
-	}
409
-
410
-	if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
411
-		// Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
412
-		if ($balise_generique = chercher_balise_generique($nom)) {
413
-			// injecter en premier arg le nom de la balise
414
-			array_unshift($args, $nom);
415
-			$nom_balise_generique = $balise_generique['nom_generique'];
416
-			$fonction_balise = $balise_generique['fonction_generique'];
417
-			$nom_balise = $nom_balise_generique;
418
-		}
419
-		unset($balise_generique);
420
-	}
421
-
422
-	if (!$fonction_balise) {
423
-		$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
424
-		erreur_squelette($msg, $context_compil);
425
-
426
-		return '';
427
-	}
428
-
429
-	// retrouver le fichier qui a déclaré la fonction
430
-	// même si la fonction dynamique est déclarée dans un fichier de fonctions.
431
-	// Attention sous windows, getFileName() retourne un antislash.
432
-	$reflector = new ReflectionFunction($fonction_balise);
433
-	$file = str_replace('\\', '/', $reflector->getFileName());
434
-	if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
435
-		$file = substr($file, strlen(_ROOT_RACINE));
436
-	}
437
-
438
-	// Y a-t-il une fonction de traitement des arguments ?
439
-	$f = 'balise_' . $nom_balise . '_stat';
440
-
441
-	$r = !function_exists($f) ? $args : $f($args, $context_compil);
442
-
443
-	if (!is_array($r)) {
444
-		return $r;
445
-	}
446
-
447
-	// verifier que la fonction dyn est la,
448
-	// sinon se replier sur la generique si elle existe
449
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
450
-		if (
451
-			$balise_generique = chercher_balise_generique($nom)
452
-			and $nom_balise_generique = $balise_generique['nom_generique']
453
-			and $file = include_spip('balise/' . strtolower($nom_balise_generique))
454
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
455
-		) {
456
-			// et lui injecter en premier arg le nom de la balise
457
-			array_unshift($r, $nom);
458
-			$nom_balise = $nom_balise_generique;
459
-			if (!_DIR_RESTREINT) {
460
-				$file = _DIR_RESTREINT_ABS . $file;
461
-			}
462
-		} else {
463
-			$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
464
-			erreur_squelette($msg, $context_compil);
465
-
466
-			return '';
467
-		}
468
-	}
469
-
470
-	if ($appel_php_depuis_modele) {
471
-		$context_compil['appel_php_depuis_modele'] = true;
472
-	}
473
-	return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
393
+    /** @var string Nom de la balise à charger (balise demandée ou balise générique) */
394
+    $nom_balise = $nom;
395
+    /** @var string Nom de la balise générique (si utilisée) */
396
+    $nom_balise_generique = '';
397
+
398
+    $appel_php_depuis_modele = false;
399
+    if (
400
+        is_array($context_compil)
401
+        and !is_numeric($context_compil[3])
402
+        and empty($context_compil[0])
403
+        and empty($context_compil[1])
404
+        and empty($context_compil[2])
405
+        and empty($context_compil[3])
406
+    ) {
407
+        $appel_php_depuis_modele = true;
408
+    }
409
+
410
+    if (!$fonction_balise = charger_fonction($nom_balise, 'balise', true)) {
411
+        // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article')
412
+        if ($balise_generique = chercher_balise_generique($nom)) {
413
+            // injecter en premier arg le nom de la balise
414
+            array_unshift($args, $nom);
415
+            $nom_balise_generique = $balise_generique['nom_generique'];
416
+            $fonction_balise = $balise_generique['fonction_generique'];
417
+            $nom_balise = $nom_balise_generique;
418
+        }
419
+        unset($balise_generique);
420
+    }
421
+
422
+    if (!$fonction_balise) {
423
+        $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
424
+        erreur_squelette($msg, $context_compil);
425
+
426
+        return '';
427
+    }
428
+
429
+    // retrouver le fichier qui a déclaré la fonction
430
+    // même si la fonction dynamique est déclarée dans un fichier de fonctions.
431
+    // Attention sous windows, getFileName() retourne un antislash.
432
+    $reflector = new ReflectionFunction($fonction_balise);
433
+    $file = str_replace('\\', '/', $reflector->getFileName());
434
+    if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) {
435
+        $file = substr($file, strlen(_ROOT_RACINE));
436
+    }
437
+
438
+    // Y a-t-il une fonction de traitement des arguments ?
439
+    $f = 'balise_' . $nom_balise . '_stat';
440
+
441
+    $r = !function_exists($f) ? $args : $f($args, $context_compil);
442
+
443
+    if (!is_array($r)) {
444
+        return $r;
445
+    }
446
+
447
+    // verifier que la fonction dyn est la,
448
+    // sinon se replier sur la generique si elle existe
449
+    if (!function_exists('balise_' . $nom_balise . '_dyn')) {
450
+        if (
451
+            $balise_generique = chercher_balise_generique($nom)
452
+            and $nom_balise_generique = $balise_generique['nom_generique']
453
+            and $file = include_spip('balise/' . strtolower($nom_balise_generique))
454
+            and function_exists('balise_' . $nom_balise_generique . '_dyn')
455
+        ) {
456
+            // et lui injecter en premier arg le nom de la balise
457
+            array_unshift($r, $nom);
458
+            $nom_balise = $nom_balise_generique;
459
+            if (!_DIR_RESTREINT) {
460
+                $file = _DIR_RESTREINT_ABS . $file;
461
+            }
462
+        } else {
463
+            $msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
464
+            erreur_squelette($msg, $context_compil);
465
+
466
+            return '';
467
+        }
468
+    }
469
+
470
+    if ($appel_php_depuis_modele) {
471
+        $context_compil['appel_php_depuis_modele'] = true;
472
+    }
473
+    return synthetiser_balise_dynamique($nom_balise, $r, $file, $context_compil);
474 474
 }
475 475
 
476 476
 /**
@@ -485,23 +485,23 @@  discard block
 block discarded – undo
485 485
  * @return array|null
486 486
  */
487 487
 function chercher_balise_generique($nom) {
488
-	if (false === strpos($nom, '_')) {
489
-		return null;
490
-	}
491
-	$nom_generique = $nom;
492
-	while (false !== ($p = strrpos($nom_generique, '_'))) {
493
-		$nom_generique = substr($nom_generique, 0, $p + 1);
494
-		$fonction_generique = charger_fonction($nom_generique, 'balise', true);
495
-		if ($fonction_generique) {
496
-			return [
497
-				'nom' => $nom,
498
-				'nom_generique' => $nom_generique,
499
-				'fonction_generique' => $fonction_generique,
500
-			];
501
-		}
502
-		$nom_generique = substr($nom_generique, 0, -1);
503
-	}
504
-	return null;
488
+    if (false === strpos($nom, '_')) {
489
+        return null;
490
+    }
491
+    $nom_generique = $nom;
492
+    while (false !== ($p = strrpos($nom_generique, '_'))) {
493
+        $nom_generique = substr($nom_generique, 0, $p + 1);
494
+        $fonction_generique = charger_fonction($nom_generique, 'balise', true);
495
+        if ($fonction_generique) {
496
+            return [
497
+                'nom' => $nom,
498
+                'nom_generique' => $nom_generique,
499
+                'fonction_generique' => $fonction_generique,
500
+            ];
501
+        }
502
+        $nom_generique = substr($nom_generique, 0, -1);
503
+    }
504
+    return null;
505 505
 }
506 506
 
507 507
 
@@ -525,50 +525,50 @@  discard block
 block discarded – undo
525 525
  * @return null;
526 526
  **/
527 527
 function lang_select_public($lang, $lang_select, $titre = null) {
528
-	// Cas 1. forcer_lang = true et pas de critere {lang_select}
529
-	if (
530
-		isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
531
-		and $lang_select !== 'oui'
532
-	) {
533
-		$lang = $GLOBALS['spip_lang'];
534
-	} // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
535
-	elseif (!strlen($lang)) {
536
-		$lang = $GLOBALS['spip_lang'];
537
-	} // Cas 3. l'objet est multilingue !
538
-	elseif (
539
-		$lang_select !== 'oui'
540
-		and strlen($titre) > 10
541
-		and strpos($titre, '<multi>') !== false
542
-		and strpos(echappe_html($titre), '<multi>') !== false
543
-	) {
544
-		$lang = $GLOBALS['spip_lang'];
545
-	}
546
-
547
-	// faire un lang_select() eventuellement sur la langue inchangee
548
-	lang_select($lang);
549
-
550
-	return;
528
+    // Cas 1. forcer_lang = true et pas de critere {lang_select}
529
+    if (
530
+        isset($GLOBALS['forcer_lang']) and $GLOBALS['forcer_lang']
531
+        and $lang_select !== 'oui'
532
+    ) {
533
+        $lang = $GLOBALS['spip_lang'];
534
+    } // Cas 2. l'objet n'a pas de langue definie (ou definie a '')
535
+    elseif (!strlen($lang)) {
536
+        $lang = $GLOBALS['spip_lang'];
537
+    } // Cas 3. l'objet est multilingue !
538
+    elseif (
539
+        $lang_select !== 'oui'
540
+        and strlen($titre) > 10
541
+        and strpos($titre, '<multi>') !== false
542
+        and strpos(echappe_html($titre), '<multi>') !== false
543
+    ) {
544
+        $lang = $GLOBALS['spip_lang'];
545
+    }
546
+
547
+    // faire un lang_select() eventuellement sur la langue inchangee
548
+    lang_select($lang);
549
+
550
+    return;
551 551
 }
552 552
 
553 553
 
554 554
 // Si un tableau &doublons[articles] est passe en parametre,
555 555
 // il faut le nettoyer car il pourrait etre injecte en SQL
556 556
 function nettoyer_env_doublons($envd) {
557
-	foreach ($envd as $table => $liste) {
558
-		$n = '';
559
-		foreach (explode(',', $liste) as $val) {
560
-			if ($a = intval($val) and $val === strval($a)) {
561
-				$n .= ',' . $val;
562
-			}
563
-		}
564
-		if (strlen($n)) {
565
-			$envd[$table] = $n;
566
-		} else {
567
-			unset($envd[$table]);
568
-		}
569
-	}
570
-
571
-	return $envd;
557
+    foreach ($envd as $table => $liste) {
558
+        $n = '';
559
+        foreach (explode(',', $liste) as $val) {
560
+            if ($a = intval($val) and $val === strval($a)) {
561
+                $n .= ',' . $val;
562
+            }
563
+        }
564
+        if (strlen($n)) {
565
+            $envd[$table] = $n;
566
+        } else {
567
+            unset($envd[$table]);
568
+        }
569
+    }
570
+
571
+    return $envd;
572 572
 }
573 573
 
574 574
 /**
@@ -587,21 +587,21 @@  discard block
 block discarded – undo
587 587
  *     Opérateur trouvé (SELF ou SUBSELECT) sinon false.
588 588
  **/
589 589
 function match_self($w) {
590
-	if (is_string($w)) {
591
-		return false;
592
-	}
593
-	if (is_array($w)) {
594
-		if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
595
-			return $w;
596
-		}
597
-		foreach (array_filter($w, 'is_array') as $sw) {
598
-			if ($m = match_self($sw)) {
599
-				return $m;
600
-			}
601
-		}
602
-	}
603
-
604
-	return false;
590
+    if (is_string($w)) {
591
+        return false;
592
+    }
593
+    if (is_array($w)) {
594
+        if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
595
+            return $w;
596
+        }
597
+        foreach (array_filter($w, 'is_array') as $sw) {
598
+            if ($m = match_self($sw)) {
599
+                return $m;
600
+            }
601
+        }
602
+    }
603
+
604
+    return false;
605 605
 }
606 606
 
607 607
 /**
@@ -617,16 +617,16 @@  discard block
 block discarded – undo
617 617
  *     est remplacée par son code.
618 618
  **/
619 619
 function remplace_sous_requete($w, $sousrequete) {
620
-	if (is_array($w)) {
621
-		if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
622
-			return $sousrequete;
623
-		}
624
-		foreach ($w as $k => $sw) {
625
-			$w[$k] = remplace_sous_requete($sw, $sousrequete);
626
-		}
627
-	}
628
-
629
-	return $w;
620
+    if (is_array($w)) {
621
+        if (in_array(reset($w), ['SELF', 'SUBSELECT'])) {
622
+            return $sousrequete;
623
+        }
624
+        foreach ($w as $k => $sw) {
625
+            $w[$k] = remplace_sous_requete($sw, $sousrequete);
626
+        }
627
+    }
628
+
629
+    return $w;
630 630
 }
631 631
 
632 632
 /**
@@ -640,17 +640,17 @@  discard block
 block discarded – undo
640 640
  *     - Conditions avec des sous requêtes
641 641
  **/
642 642
 function trouver_sous_requetes($where) {
643
-	$where_simples = [];
644
-	$where_sous = [];
645
-	foreach ($where as $k => $w) {
646
-		if (match_self($w)) {
647
-			$where_sous[$k] = $w;
648
-		} else {
649
-			$where_simples[$k] = $w;
650
-		}
651
-	}
652
-
653
-	return [$where_simples, $where_sous];
643
+    $where_simples = [];
644
+    $where_sous = [];
645
+    foreach ($where as $k => $w) {
646
+        if (match_self($w)) {
647
+            $where_sous[$k] = $w;
648
+        } else {
649
+            $where_simples[$k] = $w;
650
+        }
651
+    }
652
+
653
+    return [$where_simples, $where_sous];
654 654
 }
655 655
 
656 656
 
@@ -676,292 +676,292 @@  discard block
 block discarded – undo
676 676
  * @return resource
677 677
  */
678 678
 function calculer_select(
679
-	$select = [],
680
-	$from = [],
681
-	$from_type = [],
682
-	$where = [],
683
-	$join = [],
684
-	$groupby = [],
685
-	$orderby = [],
686
-	$limit = '',
687
-	$having = [],
688
-	$table = '',
689
-	$id = '',
690
-	$serveur = '',
691
-	$requeter = true
679
+    $select = [],
680
+    $from = [],
681
+    $from_type = [],
682
+    $where = [],
683
+    $join = [],
684
+    $groupby = [],
685
+    $orderby = [],
686
+    $limit = '',
687
+    $having = [],
688
+    $table = '',
689
+    $id = '',
690
+    $serveur = '',
691
+    $requeter = true
692 692
 ) {
693 693
 
694
-	// retirer les criteres vides:
695
-	// {X ?} avec X absent de l'URL
696
-	// {par #ENV{X}} avec X absent de l'URL
697
-	// IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
698
-	$menage = false;
699
-	foreach ($where as $k => $v) {
700
-		if (is_array($v) and count($v)) {
701
-			if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
702
-				$op = false;
703
-			} elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
704
-				$op = false;
705
-			} else {
706
-				$op = $v[0] ?: $v;
707
-			}
708
-		} else {
709
-			$op = $v;
710
-		}
711
-		if ((!$op) or ($op == 1) or ($op == '0=0')) {
712
-			unset($where[$k]);
713
-			$menage = true;
714
-		}
715
-	}
716
-
717
-	// evacuer les eventuels groupby vide issus d'un calcul dynamique
718
-	$groupby = array_diff($groupby, ['']);
719
-
720
-	// remplacer les sous requetes recursives au calcul
721
-	[$where_simples, $where_sous] = trouver_sous_requetes($where);
722
-	foreach ($where_sous as $k => $w) {
723
-		$menage = true;
724
-		// on recupere la sous requete
725
-		$sous = match_self($w);
726
-		if ($sous[0] == 'SELF') {
727
-			// c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
728
-			array_push($where_simples, $sous[2]);
729
-			$wheresub = [
730
-				$sous[2],
731
-				'0=0'
732
-			]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
733
-			$jsub = $join;
734
-			// trouver les jointures utiles a
735
-			// reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
736
-			// ie L1.objet='article'
737
-			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
738
-			$i = 0;
739
-			do {
740
-				$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
741
-					[$sous[1] . ' AS id'],
742
-					$from,
743
-					$from_type,
744
-					$wheresub,
745
-					$jsub,
746
-					[],
747
-					[],
748
-					'',
749
-					$having,
750
-					$table,
751
-					$id,
752
-					$serveur,
753
-					false
754
-				) . ')');
755
-				if (!$i) {
756
-					$i = 1;
757
-					$wherestring = calculer_where_to_string($where[$k]);
758
-					foreach ($join as $cle => $wj) {
759
-						if (
760
-							(is_countable($wj) ? count($wj) : 0) == 4
761
-							and strpos($wherestring, (string) "{$cle}.") !== false
762
-						) {
763
-							$i = 0;
764
-							$wheresub[] = $wj[3];
765
-							unset($jsub[$cle][3]);
766
-						}
767
-					}
768
-				}
769
-			} while ($i++ < 1);
770
-		}
771
-		if ($sous[0] == 'SUBSELECT') {
772
-			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
773
-			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
774
-			$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
775
-				$sous[1], # select
776
-				$sous[2], #from
777
-				[], #from_type
778
-				$sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [],
779
-				#where, qui peut etre de la forme string comme dans sql_select
780
-					[], #join
781
-				$sous[4] ?: [], #groupby
782
-				$sous[5] ?: [], #orderby
783
-				$sous[6], #limit
784
-				$sous[7] ?: [], #having
785
-				$table,
786
-				$id,
787
-				$serveur,
788
-				false
789
-			) . ')');
790
-		}
791
-		array_pop($where_simples);
792
-	}
793
-
794
-	foreach ($having as $k => $v) {
795
-		if ((!$v) or ($v == 1) or ($v == '0=0')) {
796
-			unset($having[$k]);
797
-		}
798
-	}
799
-
800
-	// Installer les jointures.
801
-	// Retirer celles seulement utiles aux criteres finalement absents mais
802
-	// parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
803
-	// si elle est seulement utile a Ln+1 elle meme inutile
804
-
805
-	$afrom = [];
806
-	$equiv = [];
807
-	$k = count($join);
808
-	foreach (array_reverse($join, true) as $cledef => $j) {
809
-		$cle = $cledef;
810
-		// le format de join est :
811
-		// array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
812
-		$join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
813
-		if (count($join[$cle]) == 2) {
814
-			$join[$cle][] = $join[$cle][1];
815
-		}
816
-		if ((is_array($join[$cle]) || $join[$cle] instanceof \Countable ? count($join[$cle]) : 0) == 3) {
817
-			$join[$cle][] = '';
818
-		}
819
-		[$t, $c, $carr, $and] = $join[$cle];
820
-		// si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
821
-		// pour compat avec ancienne convention
822
-		if (is_numeric($cle)) {
823
-			$cle = "L$k";
824
-		}
825
-		$cle_where_lie = "JOIN-$cle";
826
-		if (
827
-			!$menage
828
-			or isset($afrom[$cle])
829
-			or calculer_jointnul($cle, $select)
830
-			or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]]))
831
-			or calculer_jointnul($cle, $having)
832
-			or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
833
-		) {
834
-			// corriger les references non explicites dans select
835
-			// ou groupby
836
-			foreach ($select as $i => $s) {
837
-				if ($s == $c) {
838
-					$select[$i] = "$cle.$c AS $c";
839
-					break;
840
-				}
841
-			}
842
-			foreach ($groupby as $i => $g) {
843
-				if ($g == $c) {
844
-					$groupby[$i] = "$cle.$c";
845
-					break;
846
-				}
847
-			}
848
-			// on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
849
-			// sans recours a preg_match
850
-			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
851
-			$afrom[$t][$cle] = [
852
-				"\n" .
853
-				($from_type[$cle] ?? 'INNER') . ' JOIN',
854
-				$from[$cle],
855
-				"AS $cle",
856
-				'ON (',
857
-				"$cle.$c",
858
-				'=',
859
-				"$t.$carr",
860
-				($and ? 'AND ' . $and : '') .
861
-				')'
862
-			];
863
-			if (isset($afrom[$cle])) {
864
-				$afrom[$t] = $afrom[$t] + $afrom[$cle];
865
-				unset($afrom[$cle]);
866
-			}
867
-			$equiv[] = $carr;
868
-		} else {
869
-			unset($join[$cledef]);
870
-			if (isset($where_simples[$cle_where_lie])) {
871
-				unset($where_simples[$cle_where_lie]);
872
-				unset($where[$cle_where_lie]);
873
-			}
874
-		}
875
-		unset($from[$cle]);
876
-		$k--;
877
-	}
878
-
879
-	if (count($afrom)) {
880
-		// Regarder si la table principale ne sert finalement a rien comme dans
881
-		//<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
882
-		//<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
883
-		//<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
884
-		// ou dans
885
-		//<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
886
-		// qui comporte plusieurs jointures
887
-		// ou dans
888
-		// <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
889
-		// <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
890
-		// penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
891
-		// <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
892
-		// penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
893
-		// <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
894
-
895
-		$t = key($from);
896
-		$c = current($from);
897
-		reset($from);
898
-		$e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
899
-		if (
900
-			!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
901
-				calculer_jointnul($t, $select, $e) or
902
-				calculer_jointnul($t, $join, $e) or
903
-				calculer_jointnul($t, $where, $e) or
904
-				calculer_jointnul($t, $orderby, $e) or
905
-				calculer_jointnul($t, $groupby, $e) or
906
-				calculer_jointnul($t, $having, $e))
907
-			&& count($afrom[$t])
908
-		) {
909
-			$nfrom = reset($afrom[$t]);
910
-			$nt = array_key_first($afrom[$t]);
911
-			unset($from[$t]);
912
-			$from[$nt] = $nfrom[1];
913
-			unset($afrom[$t][$nt]);
914
-			$afrom[$nt] = $afrom[$t];
915
-			unset($afrom[$t]);
916
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
917
-			$t = $nfrom[4];
918
-			$alias = '';
919
-			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
920
-			$oldcle = explode('.', $nfrom[6]);
921
-			$oldcle = end($oldcle);
922
-			$newcle = explode('.', $nfrom[4]);
923
-			$newcle = end($newcle);
924
-			if ($newcle != $oldcle) {
925
-				// si l'ancienne cle etait deja dans le select avec un AS
926
-				// reprendre simplement ce AS
927
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
928
-				if (preg_match($as, implode(',', $select), $m)) {
929
-					$alias = '';
930
-				} else {
931
-					$alias = ', ' . $nfrom[4] . " AS $oldcle";
932
-				}
933
-			}
934
-			$select = remplacer_jointnul($t . $alias, $select, $e);
935
-			$join = remplacer_jointnul($t, $join, $e);
936
-			$where = remplacer_jointnul($t, $where, $e);
937
-			$having = remplacer_jointnul($t, $having, $e);
938
-			$groupby = remplacer_jointnul($t, $groupby, $e);
939
-			$orderby = remplacer_jointnul($t, $orderby, $e);
940
-		}
941
-		$from = reinjecte_joint($afrom, $from);
942
-	}
943
-	if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) {
944
-		$wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
945
-		$GLOBALS['debug'] = [];
946
-		if ($wasdebug) {
947
-			$GLOBALS['debug']['debug'] = true;
948
-		}
949
-	}
950
-	$GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
951
-	$r = sql_select(
952
-		$select,
953
-		$from,
954
-		$where,
955
-		$groupby,
956
-		array_filter($orderby),
957
-		$limit,
958
-		$having,
959
-		$serveur,
960
-		$requeter
961
-	);
962
-	unset($GLOBALS['debug']['aucasou']);
963
-
964
-	return $r;
694
+    // retirer les criteres vides:
695
+    // {X ?} avec X absent de l'URL
696
+    // {par #ENV{X}} avec X absent de l'URL
697
+    // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
698
+    $menage = false;
699
+    foreach ($where as $k => $v) {
700
+        if (is_array($v) and count($v)) {
701
+            if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) {
702
+                $op = false;
703
+            } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) {
704
+                $op = false;
705
+            } else {
706
+                $op = $v[0] ?: $v;
707
+            }
708
+        } else {
709
+            $op = $v;
710
+        }
711
+        if ((!$op) or ($op == 1) or ($op == '0=0')) {
712
+            unset($where[$k]);
713
+            $menage = true;
714
+        }
715
+    }
716
+
717
+    // evacuer les eventuels groupby vide issus d'un calcul dynamique
718
+    $groupby = array_diff($groupby, ['']);
719
+
720
+    // remplacer les sous requetes recursives au calcul
721
+    [$where_simples, $where_sous] = trouver_sous_requetes($where);
722
+    foreach ($where_sous as $k => $w) {
723
+        $menage = true;
724
+        // on recupere la sous requete
725
+        $sous = match_self($w);
726
+        if ($sous[0] == 'SELF') {
727
+            // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where)
728
+            array_push($where_simples, $sous[2]);
729
+            $wheresub = [
730
+                $sous[2],
731
+                '0=0'
732
+            ]; // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where
733
+            $jsub = $join;
734
+            // trouver les jointures utiles a
735
+            // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees
736
+            // ie L1.objet='article'
737
+            // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
738
+            $i = 0;
739
+            do {
740
+                $where[$k] = remplace_sous_requete($w, '(' . calculer_select(
741
+                    [$sous[1] . ' AS id'],
742
+                    $from,
743
+                    $from_type,
744
+                    $wheresub,
745
+                    $jsub,
746
+                    [],
747
+                    [],
748
+                    '',
749
+                    $having,
750
+                    $table,
751
+                    $id,
752
+                    $serveur,
753
+                    false
754
+                ) . ')');
755
+                if (!$i) {
756
+                    $i = 1;
757
+                    $wherestring = calculer_where_to_string($where[$k]);
758
+                    foreach ($join as $cle => $wj) {
759
+                        if (
760
+                            (is_countable($wj) ? count($wj) : 0) == 4
761
+                            and strpos($wherestring, (string) "{$cle}.") !== false
762
+                        ) {
763
+                            $i = 0;
764
+                            $wheresub[] = $wj[3];
765
+                            unset($jsub[$cle][3]);
766
+                        }
767
+                    }
768
+                }
769
+            } while ($i++ < 1);
770
+        }
771
+        if ($sous[0] == 'SUBSELECT') {
772
+            // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
773
+            array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
774
+            $where[$k] = remplace_sous_requete($w, '(' . calculer_select(
775
+                $sous[1], # select
776
+                $sous[2], #from
777
+                [], #from_type
778
+                $sous[3] ? (is_array($sous[3]) ? $sous[3] : [$sous[3]]) : [],
779
+                #where, qui peut etre de la forme string comme dans sql_select
780
+                    [], #join
781
+                $sous[4] ?: [], #groupby
782
+                $sous[5] ?: [], #orderby
783
+                $sous[6], #limit
784
+                $sous[7] ?: [], #having
785
+                $table,
786
+                $id,
787
+                $serveur,
788
+                false
789
+            ) . ')');
790
+        }
791
+        array_pop($where_simples);
792
+    }
793
+
794
+    foreach ($having as $k => $v) {
795
+        if ((!$v) or ($v == 1) or ($v == '0=0')) {
796
+            unset($having[$k]);
797
+        }
798
+    }
799
+
800
+    // Installer les jointures.
801
+    // Retirer celles seulement utiles aux criteres finalement absents mais
802
+    // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
803
+    // si elle est seulement utile a Ln+1 elle meme inutile
804
+
805
+    $afrom = [];
806
+    $equiv = [];
807
+    $k = count($join);
808
+    foreach (array_reverse($join, true) as $cledef => $j) {
809
+        $cle = $cledef;
810
+        // le format de join est :
811
+        // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]])
812
+        $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber
813
+        if (count($join[$cle]) == 2) {
814
+            $join[$cle][] = $join[$cle][1];
815
+        }
816
+        if ((is_array($join[$cle]) || $join[$cle] instanceof \Countable ? count($join[$cle]) : 0) == 3) {
817
+            $join[$cle][] = '';
818
+        }
819
+        [$t, $c, $carr, $and] = $join[$cle];
820
+        // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste
821
+        // pour compat avec ancienne convention
822
+        if (is_numeric($cle)) {
823
+            $cle = "L$k";
824
+        }
825
+        $cle_where_lie = "JOIN-$cle";
826
+        if (
827
+            !$menage
828
+            or isset($afrom[$cle])
829
+            or calculer_jointnul($cle, $select)
830
+            or calculer_jointnul($cle, array_diff_key($join, [$cle => $join[$cle]]))
831
+            or calculer_jointnul($cle, $having)
832
+            or calculer_jointnul($cle, array_diff_key($where_simples, [$cle_where_lie => '']))
833
+        ) {
834
+            // corriger les references non explicites dans select
835
+            // ou groupby
836
+            foreach ($select as $i => $s) {
837
+                if ($s == $c) {
838
+                    $select[$i] = "$cle.$c AS $c";
839
+                    break;
840
+                }
841
+            }
842
+            foreach ($groupby as $i => $g) {
843
+                if ($g == $c) {
844
+                    $groupby[$i] = "$cle.$c";
845
+                    break;
846
+                }
847
+            }
848
+            // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin
849
+            // sans recours a preg_match
850
+            // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
851
+            $afrom[$t][$cle] = [
852
+                "\n" .
853
+                ($from_type[$cle] ?? 'INNER') . ' JOIN',
854
+                $from[$cle],
855
+                "AS $cle",
856
+                'ON (',
857
+                "$cle.$c",
858
+                '=',
859
+                "$t.$carr",
860
+                ($and ? 'AND ' . $and : '') .
861
+                ')'
862
+            ];
863
+            if (isset($afrom[$cle])) {
864
+                $afrom[$t] = $afrom[$t] + $afrom[$cle];
865
+                unset($afrom[$cle]);
866
+            }
867
+            $equiv[] = $carr;
868
+        } else {
869
+            unset($join[$cledef]);
870
+            if (isset($where_simples[$cle_where_lie])) {
871
+                unset($where_simples[$cle_where_lie]);
872
+                unset($where[$cle_where_lie]);
873
+            }
874
+        }
875
+        unset($from[$cle]);
876
+        $k--;
877
+    }
878
+
879
+    if (count($afrom)) {
880
+        // Regarder si la table principale ne sert finalement a rien comme dans
881
+        //<BOUCLE3(MOTS){id_article}{id_mot}> class='on'</BOUCLE3>
882
+        //<BOUCLE2(MOTS){id_article} />#TOTAL_BOUCLE<//B2>
883
+        //<BOUCLE5(RUBRIQUES){id_mot}{tout} />#TOTAL_BOUCLE<//B5>
884
+        // ou dans
885
+        //<BOUCLE8(HIERARCHIE){id_rubrique}{tout}{type='Squelette'}{inverse}{0,1}{lang_select=non} />#TOTAL_BOUCLE<//B8>
886
+        // qui comporte plusieurs jointures
887
+        // ou dans
888
+        // <BOUCLE6(ARTICLES){id_mot=2}{statut==.*} />#TOTAL_BOUCLE<//B6>
889
+        // <BOUCLE7(ARTICLES){id_mot>0}{statut?} />#TOTAL_BOUCLE<//B7>
890
+        // penser a regarder aussi la clause orderby pour ne pas simplifier abusivement
891
+        // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9>
892
+        // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement
893
+        // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10>
894
+
895
+        $t = key($from);
896
+        $c = current($from);
897
+        reset($from);
898
+        $e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
899
+        if (
900
+            !(strpos($t, ' ') or // jointure des le depart cf boucle_doc
901
+                calculer_jointnul($t, $select, $e) or
902
+                calculer_jointnul($t, $join, $e) or
903
+                calculer_jointnul($t, $where, $e) or
904
+                calculer_jointnul($t, $orderby, $e) or
905
+                calculer_jointnul($t, $groupby, $e) or
906
+                calculer_jointnul($t, $having, $e))
907
+            && count($afrom[$t])
908
+        ) {
909
+            $nfrom = reset($afrom[$t]);
910
+            $nt = array_key_first($afrom[$t]);
911
+            unset($from[$t]);
912
+            $from[$nt] = $nfrom[1];
913
+            unset($afrom[$t][$nt]);
914
+            $afrom[$nt] = $afrom[$t];
915
+            unset($afrom[$t]);
916
+            $e = '/\b' . preg_quote($nfrom[6]) . '\b/';
917
+            $t = $nfrom[4];
918
+            $alias = '';
919
+            // verifier que les deux cles sont homonymes, sinon installer un alias dans le select
920
+            $oldcle = explode('.', $nfrom[6]);
921
+            $oldcle = end($oldcle);
922
+            $newcle = explode('.', $nfrom[4]);
923
+            $newcle = end($newcle);
924
+            if ($newcle != $oldcle) {
925
+                // si l'ancienne cle etait deja dans le select avec un AS
926
+                // reprendre simplement ce AS
927
+                $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
928
+                if (preg_match($as, implode(',', $select), $m)) {
929
+                    $alias = '';
930
+                } else {
931
+                    $alias = ', ' . $nfrom[4] . " AS $oldcle";
932
+                }
933
+            }
934
+            $select = remplacer_jointnul($t . $alias, $select, $e);
935
+            $join = remplacer_jointnul($t, $join, $e);
936
+            $where = remplacer_jointnul($t, $where, $e);
937
+            $having = remplacer_jointnul($t, $having, $e);
938
+            $groupby = remplacer_jointnul($t, $groupby, $e);
939
+            $orderby = remplacer_jointnul($t, $orderby, $e);
940
+        }
941
+        $from = reinjecte_joint($afrom, $from);
942
+    }
943
+    if (empty($GLOBALS['debug']) or !is_array($GLOBALS['debug'])) {
944
+        $wasdebug = empty($GLOBALS['debug']) ? false : $GLOBALS['debug'];
945
+        $GLOBALS['debug'] = [];
946
+        if ($wasdebug) {
947
+            $GLOBALS['debug']['debug'] = true;
948
+        }
949
+    }
950
+    $GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
951
+    $r = sql_select(
952
+        $select,
953
+        $from,
954
+        $where,
955
+        $groupby,
956
+        array_filter($orderby),
957
+        $limit,
958
+        $having,
959
+        $serveur,
960
+        $requeter
961
+    );
962
+    unset($GLOBALS['debug']['aucasou']);
963
+
964
+    return $r;
965 965
 }
966 966
 
967 967
 /**
@@ -972,79 +972,79 @@  discard block
 block discarded – undo
972 972
  * @return string
973 973
  */
974 974
 function calculer_where_to_string($v, $join = 'AND') {
975
-	if (empty($v)) {
976
-		return '';
977
-	}
978
-
979
-	if (!is_array($v)) {
980
-		return $v;
981
-	} else {
982
-		$exp = '';
983
-		if (strtoupper($join) === 'AND') {
984
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
985
-		} else {
986
-			return $exp . join($join, $v);
987
-		}
988
-	}
975
+    if (empty($v)) {
976
+        return '';
977
+    }
978
+
979
+    if (!is_array($v)) {
980
+        return $v;
981
+    } else {
982
+        $exp = '';
983
+        if (strtoupper($join) === 'AND') {
984
+            return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
985
+        } else {
986
+            return $exp . join($join, $v);
987
+        }
988
+    }
989 989
 }
990 990
 
991 991
 
992 992
 //condition suffisante (mais non necessaire) pour qu'une table soit utile
993 993
 
994 994
 function calculer_jointnul($cle, $exp, $equiv = '') {
995
-	if (!is_array($exp)) {
996
-		if ($equiv) {
997
-			$exp = preg_replace($equiv, '', $exp);
998
-		}
999
-
1000
-		return preg_match("/\\b$cle\\./", $exp);
1001
-	} else {
1002
-		foreach ($exp as $v) {
1003
-			if (calculer_jointnul($cle, $v, $equiv)) {
1004
-				return true;
1005
-			}
1006
-		}
1007
-
1008
-		return false;
1009
-	}
995
+    if (!is_array($exp)) {
996
+        if ($equiv) {
997
+            $exp = preg_replace($equiv, '', $exp);
998
+        }
999
+
1000
+        return preg_match("/\\b$cle\\./", $exp);
1001
+    } else {
1002
+        foreach ($exp as $v) {
1003
+            if (calculer_jointnul($cle, $v, $equiv)) {
1004
+                return true;
1005
+            }
1006
+        }
1007
+
1008
+        return false;
1009
+    }
1010 1010
 }
1011 1011
 
1012 1012
 function reinjecte_joint($afrom, $from) {
1013
-	$from_synth = [];
1014
-	foreach ($from as $k => $v) {
1015
-		$from_synth[$k] = $from[$k];
1016
-		if (isset($afrom[$k])) {
1017
-			foreach ($afrom[$k] as $kk => $vv) {
1018
-				$afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1019
-			}
1020
-			$from_synth["$k@"] = implode(' ', $afrom[$k]);
1021
-			unset($afrom[$k]);
1022
-		}
1023
-	}
1024
-
1025
-	return $from_synth;
1013
+    $from_synth = [];
1014
+    foreach ($from as $k => $v) {
1015
+        $from_synth[$k] = $from[$k];
1016
+        if (isset($afrom[$k])) {
1017
+            foreach ($afrom[$k] as $kk => $vv) {
1018
+                $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]);
1019
+            }
1020
+            $from_synth["$k@"] = implode(' ', $afrom[$k]);
1021
+            unset($afrom[$k]);
1022
+        }
1023
+    }
1024
+
1025
+    return $from_synth;
1026 1026
 }
1027 1027
 
1028 1028
 function remplacer_jointnul($cle, $exp, $equiv = '') {
1029
-	if (!is_array($exp)) {
1030
-		return preg_replace($equiv, $cle, $exp);
1031
-	} else {
1032
-		foreach ($exp as $k => $v) {
1033
-			$exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1034
-		}
1035
-
1036
-		return $exp;
1037
-	}
1029
+    if (!is_array($exp)) {
1030
+        return preg_replace($equiv, $cle, $exp);
1031
+    } else {
1032
+        foreach ($exp as $k => $v) {
1033
+            $exp[$k] = remplacer_jointnul($cle, $v, $equiv);
1034
+        }
1035
+
1036
+        return $exp;
1037
+    }
1038 1038
 }
1039 1039
 
1040 1040
 // calcul du nom du squelette
1041 1041
 function calculer_nom_fonction_squel($skel, $mime_type = 'html', string $connect = '') {
1042
-	// ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1043
-	if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1044
-		$skel = substr($skel, strlen(_DIR_RACINE));
1045
-	}
1046
-
1047
-	return $mime_type
1048
-	. (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1049
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1042
+    // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine
1043
+    if ($l = strlen(_DIR_RACINE) and strncmp($skel, _DIR_RACINE, $l) == 0) {
1044
+        $skel = substr($skel, strlen(_DIR_RACINE));
1045
+    }
1046
+
1047
+    return $mime_type
1048
+    . (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1049
+    . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1050 1050
 }
Please login to merge, or discard this patch.
Spacing   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -55,7 +55,7 @@  discard block
 block discarded – undo
55 55
 		$GLOBALS['debug_objets']['courant'] = $nom;
56 56
 	}
57 57
 
58
-	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php';
58
+	$phpfile = sous_repertoire(_DIR_SKELS, '', false, true).$nom.'.php';
59 59
 
60 60
 	// si squelette est deja compile et perenne, le charger
61 61
 	if (!squelette_obsolete($phpfile, $source)) {
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
 		#}
69 69
 	}
70 70
 
71
-	if (file_exists($lib = $squelette . '_fonctions' . '.php')) {
71
+	if (file_exists($lib = $squelette.'_fonctions'.'.php')) {
72 72
 		include_once $lib;
73 73
 	}
74 74
 
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
 			eval("return true; $f ;");
97 97
 		} catch (\ParseError $e) {
98 98
 			// Code syntaxiquement faux (critere etc mal programme')
99
-			$msg = _T('zbug_erreur_compilation') . ' | Line ' . $e->getLine() . ' : ' . $e->getMessage();
99
+			$msg = _T('zbug_erreur_compilation').' | Line '.$e->getLine().' : '.$e->getMessage();
100 100
 			erreur_squelette($msg, $boucle);
101 101
 			// continuer pour trouver d'autres fautes eventuelles
102 102
 			// mais prevenir que c'est mort
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
 
125 125
 	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
126 126
 		// Tracer ce qui vient d'etre compile
127
-		$GLOBALS['debug_objets']['code'][$nom . 'tout'] = $code;
127
+		$GLOBALS['debug_objets']['code'][$nom.'tout'] = $code;
128 128
 
129 129
 		// si c'est ce que demande le debusqueur, lui passer la main
130 130
 		if (
@@ -148,13 +148,13 @@  discard block
 block discarded – undo
148 148
 		$code = "
149 149
 /*
150 150
  * Squelette : $sourcefile
151
- * Date :      " . gmdate('D, d M Y H:i:s', @filemtime($sourcefile)) . ' GMT
152
- * Compile :   ' . gmdate('D, d M Y H:i:s', time()) . ' GMT
153
- * ' . (!$boucles ? 'Pas de boucle' : ('Boucles :   ' . $noms)) . '
151
+ * Date :      ".gmdate('D, d M Y H:i:s', @filemtime($sourcefile)).' GMT
152
+ * Compile :   ' . gmdate('D, d M Y H:i:s', time()).' GMT
153
+ * ' . (!$boucles ? 'Pas de boucle' : ('Boucles :   '.$noms)).'
154 154
  */ ';
155 155
 	}
156 156
 
157
-	$code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>';
157
+	$code = '<'."?php\n".$code.join('', $boucles)."\n?".'>';
158 158
 	if (!defined('_VAR_NOCACHE') or !_VAR_NOCACHE) {
159 159
 		ecrire_fichier($phpfile, $code);
160 160
 	}
@@ -215,7 +215,7 @@  discard block
 block discarded – undo
215 215
 			$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
216 216
 
217 217
 			if ($j == 'X-Spip-Filtre' and isset($headers[$j])) {
218
-				$headers[$j] .= '|' . $r[3];
218
+				$headers[$j] .= '|'.$r[3];
219 219
 			} else {
220 220
 				$headers[$j] = $r[3];
221 221
 			}
@@ -223,10 +223,10 @@  discard block
 block discarded – undo
223 223
 	}
224 224
 	// S'agit-il d'un resultat constant ou contenant du code php
225 225
 	$process_ins = (
226
-		strpos($corps, '<' . '?') === false
226
+		strpos($corps, '<'.'?') === false
227 227
 		or
228
-		(strpos($corps, '<' . '?xml') !== false and
229
-			strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
228
+		(strpos($corps, '<'.'?xml') !== false and
229
+			strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false)
230 230
 	)
231 231
 		? 'html'
232 232
 		: 'php';
@@ -255,10 +255,10 @@  discard block
 block discarded – undo
255 255
 
256 256
 		if ($process_ins == 'html') {
257 257
 			$skel['process_ins'] = (
258
-				strpos($corps, '<' . '?') === false
258
+				strpos($corps, '<'.'?') === false
259 259
 				or
260
-				(strpos($corps, '<' . '?xml') !== false and
261
-					strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false)
260
+				(strpos($corps, '<'.'?xml') !== false and
261
+					strpos(str_replace('<'.'?xml', '', $corps), '<'.'?') === false)
262 262
 			)
263 263
 				? 'html'
264 264
 				: 'php';
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
 //
277 277
 
278 278
 /** Code PHP pour inclure une balise dynamique à l'exécution d'une page */
279
-define('CODE_INCLURE_BALISE', '<' . '?php
279
+define('CODE_INCLURE_BALISE', '<'.'?php
280 280
 include_once("%s");
281 281
 if ($lang_select = "%s") $lang_select = lang_select($lang_select);
282 282
 inserer_balise_dynamique(balise_%s_dyn(%s), array(%s));
@@ -307,7 +307,7 @@  discard block
 block discarded – undo
307 307
 		// pas de lien symbolique sous Windows
308 308
 		and !(stristr(PHP_OS, 'WIN') and strpos($file, ':') !== false)
309 309
 	) {
310
-		$file = './" . _DIR_RACINE . "' . $file;
310
+		$file = './" . _DIR_RACINE . "'.$file;
311 311
 	}
312 312
 
313 313
 	$lang = $context_compil[4];
@@ -317,7 +317,7 @@  discard block
 block discarded – undo
317 317
 
318 318
 	$args = array_map('argumenter_squelette', $args);
319 319
 	if (!empty($context_compil['appel_php_depuis_modele'])) {
320
-		$args[0] = 'arguments_balise_dyn_depuis_modele(' . $args[0] . ')';
320
+		$args[0] = 'arguments_balise_dyn_depuis_modele('.$args[0].')';
321 321
 	}
322 322
 	$args = join(', ', $args);
323 323
 
@@ -351,14 +351,14 @@  discard block
 block discarded – undo
351 351
 	if (is_object($v)) {
352 352
 		return var_export($v, true);
353 353
 	} elseif (!is_array($v)) {
354
-		return "'" . texte_script((string) $v) . "'";
354
+		return "'".texte_script((string) $v)."'";
355 355
 	} else {
356 356
 		$out = [];
357 357
 		foreach ($v as $k => $val) {
358
-			$out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val);
358
+			$out [] = argumenter_squelette($k).'=>'.argumenter_squelette($val);
359 359
 		}
360 360
 
361
-		return 'array(' . join(', ', $out) . ')';
361
+		return 'array('.join(', ', $out).')';
362 362
 	}
363 363
 }
364 364
 
@@ -436,7 +436,7 @@  discard block
 block discarded – undo
436 436
 	}
437 437
 
438 438
 	// Y a-t-il une fonction de traitement des arguments ?
439
-	$f = 'balise_' . $nom_balise . '_stat';
439
+	$f = 'balise_'.$nom_balise.'_stat';
440 440
 
441 441
 	$r = !function_exists($f) ? $args : $f($args, $context_compil);
442 442
 
@@ -446,18 +446,18 @@  discard block
 block discarded – undo
446 446
 
447 447
 	// verifier que la fonction dyn est la,
448 448
 	// sinon se replier sur la generique si elle existe
449
-	if (!function_exists('balise_' . $nom_balise . '_dyn')) {
449
+	if (!function_exists('balise_'.$nom_balise.'_dyn')) {
450 450
 		if (
451 451
 			$balise_generique = chercher_balise_generique($nom)
452 452
 			and $nom_balise_generique = $balise_generique['nom_generique']
453
-			and $file = include_spip('balise/' . strtolower($nom_balise_generique))
454
-			and function_exists('balise_' . $nom_balise_generique . '_dyn')
453
+			and $file = include_spip('balise/'.strtolower($nom_balise_generique))
454
+			and function_exists('balise_'.$nom_balise_generique.'_dyn')
455 455
 		) {
456 456
 			// et lui injecter en premier arg le nom de la balise
457 457
 			array_unshift($r, $nom);
458 458
 			$nom_balise = $nom_balise_generique;
459 459
 			if (!_DIR_RESTREINT) {
460
-				$file = _DIR_RESTREINT_ABS . $file;
460
+				$file = _DIR_RESTREINT_ABS.$file;
461 461
 			}
462 462
 		} else {
463 463
 			$msg = ['zbug_balise_inexistante', ['from' => 'CVT', 'balise' => $nom]];
@@ -558,7 +558,7 @@  discard block
 block discarded – undo
558 558
 		$n = '';
559 559
 		foreach (explode(',', $liste) as $val) {
560 560
 			if ($a = intval($val) and $val === strval($a)) {
561
-				$n .= ',' . $val;
561
+				$n .= ','.$val;
562 562
 			}
563 563
 		}
564 564
 		if (strlen($n)) {
@@ -737,8 +737,8 @@  discard block
 block discarded – undo
737 737
 			// on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction
738 738
 			$i = 0;
739 739
 			do {
740
-				$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
741
-					[$sous[1] . ' AS id'],
740
+				$where[$k] = remplace_sous_requete($w, '('.calculer_select(
741
+					[$sous[1].' AS id'],
742 742
 					$from,
743 743
 					$from_type,
744 744
 					$wheresub,
@@ -751,7 +751,7 @@  discard block
 block discarded – undo
751 751
 					$id,
752 752
 					$serveur,
753 753
 					false
754
-				) . ')');
754
+				).')');
755 755
 				if (!$i) {
756 756
 					$i = 1;
757 757
 					$wherestring = calculer_where_to_string($where[$k]);
@@ -771,7 +771,7 @@  discard block
 block discarded – undo
771 771
 		if ($sous[0] == 'SUBSELECT') {
772 772
 			// c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having)
773 773
 			array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ?
774
-			$where[$k] = remplace_sous_requete($w, '(' . calculer_select(
774
+			$where[$k] = remplace_sous_requete($w, '('.calculer_select(
775 775
 				$sous[1], # select
776 776
 				$sous[2], #from
777 777
 				[], #from_type
@@ -786,7 +786,7 @@  discard block
 block discarded – undo
786 786
 				$id,
787 787
 				$serveur,
788 788
 				false
789
-			) . ')');
789
+			).')');
790 790
 		}
791 791
 		array_pop($where_simples);
792 792
 	}
@@ -849,15 +849,15 @@  discard block
 block discarded – undo
849 849
 			// sans recours a preg_match
850 850
 			// un implode(' ',..) est fait dans reinjecte_joint un peu plus bas
851 851
 			$afrom[$t][$cle] = [
852
-				"\n" .
853
-				($from_type[$cle] ?? 'INNER') . ' JOIN',
852
+				"\n".
853
+				($from_type[$cle] ?? 'INNER').' JOIN',
854 854
 				$from[$cle],
855 855
 				"AS $cle",
856 856
 				'ON (',
857 857
 				"$cle.$c",
858 858
 				'=',
859 859
 				"$t.$carr",
860
-				($and ? 'AND ' . $and : '') .
860
+				($and ? 'AND '.$and : '').
861 861
 				')'
862 862
 			];
863 863
 			if (isset($afrom[$cle])) {
@@ -895,7 +895,7 @@  discard block
 block discarded – undo
895 895
 		$t = key($from);
896 896
 		$c = current($from);
897 897
 		reset($from);
898
-		$e = '/\b(' . "$t\\." . join('|' . $t . '\.', $equiv) . ')\b/';
898
+		$e = '/\b('."$t\\.".join('|'.$t.'\.', $equiv).')\b/';
899 899
 		if (
900 900
 			!(strpos($t, ' ') or // jointure des le depart cf boucle_doc
901 901
 				calculer_jointnul($t, $select, $e) or
@@ -913,7 +913,7 @@  discard block
 block discarded – undo
913 913
 			unset($afrom[$t][$nt]);
914 914
 			$afrom[$nt] = $afrom[$t];
915 915
 			unset($afrom[$t]);
916
-			$e = '/\b' . preg_quote($nfrom[6]) . '\b/';
916
+			$e = '/\b'.preg_quote($nfrom[6]).'\b/';
917 917
 			$t = $nfrom[4];
918 918
 			$alias = '';
919 919
 			// verifier que les deux cles sont homonymes, sinon installer un alias dans le select
@@ -924,14 +924,14 @@  discard block
 block discarded – undo
924 924
 			if ($newcle != $oldcle) {
925 925
 				// si l'ancienne cle etait deja dans le select avec un AS
926 926
 				// reprendre simplement ce AS
927
-				$as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/';
927
+				$as = '/\b'.preg_quote($nfrom[6]).'\s+(AS\s+\w+)\b/';
928 928
 				if (preg_match($as, implode(',', $select), $m)) {
929 929
 					$alias = '';
930 930
 				} else {
931
-					$alias = ', ' . $nfrom[4] . " AS $oldcle";
931
+					$alias = ', '.$nfrom[4]." AS $oldcle";
932 932
 				}
933 933
 			}
934
-			$select = remplacer_jointnul($t . $alias, $select, $e);
934
+			$select = remplacer_jointnul($t.$alias, $select, $e);
935 935
 			$join = remplacer_jointnul($t, $join, $e);
936 936
 			$where = remplacer_jointnul($t, $where, $e);
937 937
 			$having = remplacer_jointnul($t, $having, $e);
@@ -981,9 +981,9 @@  discard block
 block discarded – undo
981 981
 	} else {
982 982
 		$exp = '';
983 983
 		if (strtoupper($join) === 'AND') {
984
-			return $exp . join(" $join ", array_map('calculer_where_to_string', $v));
984
+			return $exp.join(" $join ", array_map('calculer_where_to_string', $v));
985 985
 		} else {
986
-			return $exp . join($join, $v);
986
+			return $exp.join($join, $v);
987 987
 		}
988 988
 	}
989 989
 }
@@ -1045,6 +1045,6 @@  discard block
 block discarded – undo
1045 1045
 	}
1046 1046
 
1047 1047
 	return $mime_type
1048
-	. (!$connect ? '' : preg_replace('/\W/', '_', $connect)) . '_'
1049
-	. md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : ''));
1048
+	. (!$connect ? '' : preg_replace('/\W/', '_', $connect)).'_'
1049
+	. md5($GLOBALS['spip_version_code'].' * '.$skel.(isset($GLOBALS['marqueur_skel']) ? '*'.$GLOBALS['marqueur_skel'] : ''));
1050 1050
 }
Please login to merge, or discard this patch.