Completed
Push — master ( f30f27...7c506a )
by cam
01:04
created
ecrire/balise/logo_.php 1 patch
Indentation   +95 added lines, -95 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
 
@@ -54,84 +54,84 @@  discard block
 block discarded – undo
54 54
  */
55 55
 function balise_LOGO__dist($p) {
56 56
 
57
-	preg_match(',^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
58
-	$type = strtolower($regs[1]);
59
-	$suite_logo = $regs[2];
60
-
61
-	// cas de #LOGO_SITE_SPIP
62
-	if ($type == 'site_spip') {
63
-		$type = 'site';
64
-		$_id_objet = "\"'0'\"";
65
-	}
66
-
67
-	$id_objet = id_table_objet($type);
68
-	if (!isset($_id_objet)) {
69
-		$_id_objet = champ_sql($id_objet, $p);
70
-	}
71
-
72
-	$fichier = ($p->etoile === '**') ? -1 : 0;
73
-	$coord = [];
74
-	$align = $lien = '';
75
-	$mode_logo = '';
76
-
77
-	if ($p->param and !$p->param[0][0]) {
78
-		$params = $p->param[0];
79
-		array_shift($params);
80
-		foreach ($params as $a) {
81
-			if ($a[0]->type === 'texte') {
82
-				$n = $a[0]->texte;
83
-				if (is_numeric($n)) {
84
-					$coord[] = $n;
85
-				} elseif (in_array($n, ['top', 'left', 'right', 'center', 'bottom'])) {
86
-					$align = $n;
87
-				} elseif (in_array($n, ['auto', 'icone', 'apercu', 'vignette'])) {
88
-					$mode_logo = $n;
89
-				}
90
-			} else {
91
-				$lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle);
92
-			}
93
-		}
94
-	}
95
-
96
-	$coord_x = !$coord ? 0 : intval(array_shift($coord));
97
-	$coord_y = !$coord ? 0 : intval(array_shift($coord));
98
-
99
-	if ($p->etoile === '*') {
100
-		include_spip('balise/url_');
101
-		$lien = generer_generer_url_arg($type, $p, $_id_objet);
102
-	}
103
-
104
-	$connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
105
-	if ($type == 'document') {
106
-		$qconnect = _q($connect);
107
-		$doc = "quete_document($_id_objet, $qconnect)";
108
-		if ($fichier) {
109
-			$code = "quete_logo_file($doc, $qconnect)";
110
-		} else {
111
-			$code = "quete_logo_document($doc, " . ($lien ?: "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)";
112
-		}
113
-		// (x=non-faux ? y : '') pour affecter x en retournant y
114
-		if ($p->descr['documents']) {
115
-			$code = '(($doublons["documents"] .= ",". '
116
-				. $_id_objet
117
-				. ") ? $code : '')";
118
-		}
119
-	} elseif ($connect) {
120
-		$code = "''";
121
-		spip_log('Les logos distants ne sont pas prevus');
122
-	} else {
123
-		$code = logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite_logo);
124
-	}
125
-
126
-	// demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
127
-	if ($coord_x or $coord_y) {
128
-		$code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))";
129
-	}
130
-
131
-	$p->code = $code;
132
-	$p->interdire_scripts = false;
133
-
134
-	return $p;
57
+    preg_match(',^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i', $p->nom_champ, $regs);
58
+    $type = strtolower($regs[1]);
59
+    $suite_logo = $regs[2];
60
+
61
+    // cas de #LOGO_SITE_SPIP
62
+    if ($type == 'site_spip') {
63
+        $type = 'site';
64
+        $_id_objet = "\"'0'\"";
65
+    }
66
+
67
+    $id_objet = id_table_objet($type);
68
+    if (!isset($_id_objet)) {
69
+        $_id_objet = champ_sql($id_objet, $p);
70
+    }
71
+
72
+    $fichier = ($p->etoile === '**') ? -1 : 0;
73
+    $coord = [];
74
+    $align = $lien = '';
75
+    $mode_logo = '';
76
+
77
+    if ($p->param and !$p->param[0][0]) {
78
+        $params = $p->param[0];
79
+        array_shift($params);
80
+        foreach ($params as $a) {
81
+            if ($a[0]->type === 'texte') {
82
+                $n = $a[0]->texte;
83
+                if (is_numeric($n)) {
84
+                    $coord[] = $n;
85
+                } elseif (in_array($n, ['top', 'left', 'right', 'center', 'bottom'])) {
86
+                    $align = $n;
87
+                } elseif (in_array($n, ['auto', 'icone', 'apercu', 'vignette'])) {
88
+                    $mode_logo = $n;
89
+                }
90
+            } else {
91
+                $lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle);
92
+            }
93
+        }
94
+    }
95
+
96
+    $coord_x = !$coord ? 0 : intval(array_shift($coord));
97
+    $coord_y = !$coord ? 0 : intval(array_shift($coord));
98
+
99
+    if ($p->etoile === '*') {
100
+        include_spip('balise/url_');
101
+        $lien = generer_generer_url_arg($type, $p, $_id_objet);
102
+    }
103
+
104
+    $connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : '';
105
+    if ($type == 'document') {
106
+        $qconnect = _q($connect);
107
+        $doc = "quete_document($_id_objet, $qconnect)";
108
+        if ($fichier) {
109
+            $code = "quete_logo_file($doc, $qconnect)";
110
+        } else {
111
+            $code = "quete_logo_document($doc, " . ($lien ?: "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)";
112
+        }
113
+        // (x=non-faux ? y : '') pour affecter x en retournant y
114
+        if ($p->descr['documents']) {
115
+            $code = '(($doublons["documents"] .= ",". '
116
+                . $_id_objet
117
+                . ") ? $code : '')";
118
+        }
119
+    } elseif ($connect) {
120
+        $code = "''";
121
+        spip_log('Les logos distants ne sont pas prevus');
122
+    } else {
123
+        $code = logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite_logo);
124
+    }
125
+
126
+    // demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0}
127
+    if ($coord_x or $coord_y) {
128
+        $code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))";
129
+    }
130
+
131
+    $p->code = $code;
132
+    $p->interdire_scripts = false;
133
+
134
+    return $p;
135 135
 }
136 136
 
137 137
 /**
@@ -158,20 +158,20 @@  discard block
 block discarded – undo
158 158
  *     Code compilé retournant le chemin du logo ou le code HTML du logo.
159 159
  **/
160 160
 function logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $_lien, $p, $suite) {
161
-	$code = "quete_logo('$id_objet', '" .
162
-		(($suite == '_SURVOL') ? 'off' :
163
-			(($suite == '_NORMAL') ? 'on' : 'ON')) .
164
-		"', $_id_objet," .
165
-		(($suite == '_RUBRIQUE') ?
166
-			champ_sql('id_rubrique', $p) :
167
-			(($type == 'rubrique') ? "quete_parent($_id_objet)" : "''")) .
168
-		', ' . intval($fichier) . ')';
169
-
170
-	if ($fichier) {
171
-		return $code;
172
-	}
173
-
174
-	$align = preg_replace(',\W,', '', $align);
175
-
176
-	return "quete_html_logo($code, '$align', " . ($_lien ?: "''") . ')';
161
+    $code = "quete_logo('$id_objet', '" .
162
+        (($suite == '_SURVOL') ? 'off' :
163
+            (($suite == '_NORMAL') ? 'on' : 'ON')) .
164
+        "', $_id_objet," .
165
+        (($suite == '_RUBRIQUE') ?
166
+            champ_sql('id_rubrique', $p) :
167
+            (($type == 'rubrique') ? "quete_parent($_id_objet)" : "''")) .
168
+        ', ' . intval($fichier) . ')';
169
+
170
+    if ($fichier) {
171
+        return $code;
172
+    }
173
+
174
+    $align = preg_replace(',\W,', '', $align);
175
+
176
+    return "quete_html_logo($code, '$align', " . ($_lien ?: "''") . ')';
177 177
 }
Please login to merge, or discard this patch.
ecrire/balise/info_.php 1 patch
Indentation   +23 added lines, -23 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
 /**
@@ -40,29 +40,29 @@  discard block
 block discarded – undo
40 40
  *     Pile complétée par le code à générer
41 41
  */
42 42
 function balise_INFO__dist($p) {
43
-	$info = $p->nom_champ;
44
-	$type_objet = interprete_argument_balise(1, $p);
45
-	$id_objet = interprete_argument_balise(2, $p);
46
-	if ($info === 'INFO_' or !$type_objet or !$id_objet) {
47
-		$msg = _T('zbug_balise_sans_argument', ['balise' => ' INFO_']);
48
-		erreur_squelette($msg, $p);
49
-		$p->interdire_scripts = true;
43
+    $info = $p->nom_champ;
44
+    $type_objet = interprete_argument_balise(1, $p);
45
+    $id_objet = interprete_argument_balise(2, $p);
46
+    if ($info === 'INFO_' or !$type_objet or !$id_objet) {
47
+        $msg = _T('zbug_balise_sans_argument', ['balise' => ' INFO_']);
48
+        erreur_squelette($msg, $p);
49
+        $p->interdire_scripts = true;
50 50
 
51
-		return $p;
52
-	} else {
53
-		// Récupérer tous les params à la suite de objet et id_objet
54
-		$_params = '[';
55
-		$nb_params = is_countable($p->param[0]) ? count($p->param[0]) : 0; // 1ère valeur vide donc 1 en plus
56
-		for ($i = 3; $i < $nb_params; $i++) {
57
-			$_params .= interprete_argument_balise($i, $p) . ',';
58
-		}
59
-		$_params .= ']';
51
+        return $p;
52
+    } else {
53
+        // Récupérer tous les params à la suite de objet et id_objet
54
+        $_params = '[';
55
+        $nb_params = is_countable($p->param[0]) ? count($p->param[0]) : 0; // 1ère valeur vide donc 1 en plus
56
+        for ($i = 3; $i < $nb_params; $i++) {
57
+            $_params .= interprete_argument_balise($i, $p) . ',';
58
+        }
59
+        $_params .= ']';
60 60
 
61
-		$info_sql = strtolower(substr($info, 5));
62
-		$code = "generer_info_entite($id_objet, $type_objet, '$info_sql', " . ($p->etoile ? _q($p->etoile) : "''") . ", $_params)";
63
-		$p->code = champ_sql($info, $p, $code);
64
-		$p->interdire_scripts = true;
61
+        $info_sql = strtolower(substr($info, 5));
62
+        $code = "generer_info_entite($id_objet, $type_objet, '$info_sql', " . ($p->etoile ? _q($p->etoile) : "''") . ", $_params)";
63
+        $p->code = champ_sql($info, $p, $code);
64
+        $p->interdire_scripts = true;
65 65
 
66
-		return $p;
67
-	}
66
+        return $p;
67
+    }
68 68
 }
Please login to merge, or discard this patch.
ecrire/balise/url_logout.php 1 patch
Indentation   +8 added lines, -8 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
 /**
@@ -36,7 +36,7 @@  discard block
 block discarded – undo
36 36
  *     Pile complétée du code compilé
37 37
  **/
38 38
 function balise_URL_LOGOUT($p) {
39
-	return calculer_balise_dynamique($p, 'URL_LOGOUT', []);
39
+    return calculer_balise_dynamique($p, 'URL_LOGOUT', []);
40 40
 }
41 41
 
42 42
 
@@ -52,9 +52,9 @@  discard block
 block discarded – undo
52 52
  *   Liste (url) des arguments collectés.
53 53
  */
54 54
 function balise_URL_LOGOUT_stat($args, $context_compil) {
55
-	$url = $args[0] ?? '';
55
+    $url = $args[0] ?? '';
56 56
 
57
-	return [$url];
57
+    return [$url];
58 58
 }
59 59
 
60 60
 /**
@@ -69,9 +69,9 @@  discard block
 block discarded – undo
69 69
  **/
70 70
 function balise_URL_LOGOUT_dyn($cible) {
71 71
 
72
-	if (empty($GLOBALS['visiteur_session']['login']) and empty($GLOBALS['visiteur_session']['statut'])) {
73
-		return '';
74
-	}
72
+    if (empty($GLOBALS['visiteur_session']['login']) and empty($GLOBALS['visiteur_session']['statut'])) {
73
+        return '';
74
+    }
75 75
 
76
-	return generer_url_action('logout', 'logout=public&url=' . rawurlencode($cible ?: self('&')));
76
+    return generer_url_action('logout', 'logout=public&url=' . rawurlencode($cible ?: self('&')));
77 77
 }
Please login to merge, or discard this patch.
ecrire/balise/formulaire_.php 1 patch
Indentation   +266 added lines, -266 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/filtres');
@@ -35,22 +35,22 @@  discard block
 block discarded – undo
35 35
  *     Saisie protégée
36 36
  **/
37 37
 function protege_champ($texte) {
38
-	if (is_array($texte)) {
39
-		return array_map('protege_champ', $texte);
40
-	} elseif ($texte === null) {
41
-		return $texte;
42
-	} elseif (is_bool($texte)) {
43
-		return $texte ? '1' : '';
44
-	} elseif (is_string($texte) and $texte) {
45
-		if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
-			// ne pas corrompre une valeur serialize
47
-			return $texte;
48
-		} elseif (strpbrk($texte, "&\"'<>") !== false) {
49
-			return spip_htmlspecialchars($texte, ENT_QUOTES);
50
-		}
51
-	}
52
-
53
-	return $texte;
38
+    if (is_array($texte)) {
39
+        return array_map('protege_champ', $texte);
40
+    } elseif ($texte === null) {
41
+        return $texte;
42
+    } elseif (is_bool($texte)) {
43
+        return $texte ? '1' : '';
44
+    } elseif (is_string($texte) and $texte) {
45
+        if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
+            // ne pas corrompre une valeur serialize
47
+            return $texte;
48
+        } elseif (strpbrk($texte, "&\"'<>") !== false) {
49
+            return spip_htmlspecialchars($texte, ENT_QUOTES);
50
+        }
51
+    }
52
+
53
+    return $texte;
54 54
 }
55 55
 
56 56
 /**
@@ -64,17 +64,17 @@  discard block
 block discarded – undo
64 64
  *     - false : pas de squelette trouvé
65 65
  **/
66 66
 function existe_formulaire($form) {
67
-	if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
-		$form = strtolower(substr($form, 11));
69
-	} else {
70
-		$form = strtolower($form);
71
-	}
67
+    if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
+        $form = strtolower(substr($form, 11));
69
+    } else {
70
+        $form = strtolower($form);
71
+    }
72 72
 
73
-	if (!$form) {
74
-		return '';
75
-	} // on ne sait pas, le nom du formulaire n'est pas fourni ici
73
+    if (!$form) {
74
+        return '';
75
+    } // on ne sait pas, le nom du formulaire n'est pas fourni ici
76 76
 
77
-	return trouver_fond($form, 'formulaires/') ? $form : false;
77
+    return trouver_fond($form, 'formulaires/') ? $form : false;
78 78
 }
79 79
 
80 80
 /**
@@ -83,31 +83,31 @@  discard block
 block discarded – undo
83 83
  * @return false|array
84 84
  */
85 85
 function test_formulaire_inclus_par_modele() {
86
-	$trace = debug_backtrace(null, 20);
87
-	$trace_fonctions = array_column($trace, 'function');
88
-	$trace_fonctions = array_map('strtolower', $trace_fonctions);
89
-
90
-	// regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
-	if (
92
-		function_exists('arguments_balise_dyn_depuis_modele')
93
-		and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
-	) {
95
-		if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
-			$k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
-			if ($trace[$k]['args'][0] === $form) {
98
-				return $trace[$k]['args'];
99
-			}
100
-		}
101
-	}
102
-
103
-	// fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
-	// mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
-	if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
-		$k = array_search('inclure_modele', $trace_fonctions);
107
-		// les arguments de recuperer_fond() passes par inclure_modele()
108
-		return $trace[$k - 1]['args'][1]['args'];
109
-	}
110
-	return false;
86
+    $trace = debug_backtrace(null, 20);
87
+    $trace_fonctions = array_column($trace, 'function');
88
+    $trace_fonctions = array_map('strtolower', $trace_fonctions);
89
+
90
+    // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
+    if (
92
+        function_exists('arguments_balise_dyn_depuis_modele')
93
+        and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
+    ) {
95
+        if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
+            $k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
+            if ($trace[$k]['args'][0] === $form) {
98
+                return $trace[$k]['args'];
99
+            }
100
+        }
101
+    }
102
+
103
+    // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
+    // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
+    if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
+        $k = array_search('inclure_modele', $trace_fonctions);
107
+        // les arguments de recuperer_fond() passes par inclure_modele()
108
+        return $trace[$k - 1]['args'][1]['args'];
109
+    }
110
+    return false;
111 111
 }
112 112
 
113 113
 /**
@@ -122,32 +122,32 @@  discard block
 block discarded – undo
122 122
  **/
123 123
 function balise_FORMULAIRE__dist($p) {
124 124
 
125
-	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
-	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
-	if (existe_formulaire($p->nom_champ) === false) {
128
-		$p->code = "''";
129
-		$p->interdire_scripts = false;
130
-
131
-		return $p;
132
-	}
133
-
134
-	// sinon renvoyer un code php dynamique
135
-	$p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
-
137
-	if (
138
-		!test_espace_prive()
139
-		and !empty($p->descr['sourcefile'])
140
-		and $f = $p->descr['sourcefile']
141
-		and basename(dirname($f)) === 'modeles'
142
-	) {
143
-		// un modele est toujours inséré en texte dans son contenant
144
-		// donc si on est dans le public avec un cache on va perdre le dynamisme
145
-		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
-		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
-		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
-	}
150
-	return $p;
125
+    // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
+    // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
+    if (existe_formulaire($p->nom_champ) === false) {
128
+        $p->code = "''";
129
+        $p->interdire_scripts = false;
130
+
131
+        return $p;
132
+    }
133
+
134
+    // sinon renvoyer un code php dynamique
135
+    $p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
+
137
+    if (
138
+        !test_espace_prive()
139
+        and !empty($p->descr['sourcefile'])
140
+        and $f = $p->descr['sourcefile']
141
+        and basename(dirname($f)) === 'modeles'
142
+    ) {
143
+        // un modele est toujours inséré en texte dans son contenant
144
+        // donc si on est dans le public avec un cache on va perdre le dynamisme
145
+        // et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
+        // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
+        $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
+        // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
+    }
150
+    return $p;
151 151
 }
152 152
 
153 153
 /**
@@ -167,17 +167,17 @@  discard block
 block discarded – undo
167 167
  *     - string : texte à afficher directement
168 168
  */
169 169
 function balise_FORMULAIRE__dyn($form, ...$args) {
170
-	$form = existe_formulaire($form);
171
-	if (!$form) {
172
-		return '';
173
-	}
170
+    $form = existe_formulaire($form);
171
+    if (!$form) {
172
+        return '';
173
+    }
174 174
 
175
-	$contexte = balise_FORMULAIRE__contexte($form, $args);
176
-	if (!is_array($contexte)) {
177
-		return $contexte;
178
-	}
175
+    $contexte = balise_FORMULAIRE__contexte($form, $args);
176
+    if (!is_array($contexte)) {
177
+        return $contexte;
178
+    }
179 179
 
180
-	return ["formulaires/$form", 3600, $contexte];
180
+    return ["formulaires/$form", 3600, $contexte];
181 181
 }
182 182
 
183 183
 /**
@@ -191,84 +191,84 @@  discard block
 block discarded – undo
191 191
  *     Contexte d'environnement à envoyer au squelette
192 192
  **/
193 193
 function balise_FORMULAIRE__contexte($form, $args) {
194
-	// tester si ce formulaire vient d'etre poste (memes arguments)
195
-	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
196
-	// si poste, on recupere les erreurs
197
-
198
-	$je_suis_poste = false;
199
-	if (
200
-		$post_form = _request('formulaire_action')
201
-		and $post_form == $form
202
-		and $p = _request('formulaire_action_args')
203
-		and is_array($p = decoder_contexte_ajax($p, $post_form))
204
-	) {
205
-		// enlever le faux attribut de langue masque
206
-		array_shift($p);
207
-		if (formulaire__identifier($form, $args, $p)) {
208
-			$je_suis_poste = true;
209
-		}
210
-	}
211
-
212
-	$editable = true;
213
-	$erreurs = $post = [];
214
-	if ($je_suis_poste) {
215
-		$post = traiter_formulaires_dynamiques(true);
216
-		$e = "erreurs_$form";
217
-		$erreurs = $post[$e] ?? [];
218
-		$editable = "editable_$form";
219
-		$editable = (!isset($post[$e]))
220
-			|| (is_countable($erreurs) ? count($erreurs) : 0)
221
-			|| (isset($post[$editable]) && $post[$editable]);
222
-	}
223
-
224
-	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
225
-
226
-	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
227
-	// C'est plus fort qu'editable qui est gere par le squelette
228
-	// Idealement $valeur doit etre alors un message explicatif.
229
-	if (!is_array($valeurs)) {
230
-		return is_string($valeurs) ? $valeurs : '';
231
-	}
232
-
233
-	// charger peut passer une action si le formulaire ne tourne pas sur self()
234
-	// ou une action vide si elle ne sert pas
235
-	$action = $valeurs['action'] ?? self('&amp;', true);
236
-	// bug IEx : si action finit par /
237
-	// IE croit que le <form ... action=../ > est autoferme
238
-	if (substr($action, -1) == '/') {
239
-		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
240
-		$action .= '#';
241
-	}
242
-
243
-	// recuperer la saisie en cours si erreurs
244
-	// seulement si c'est ce formulaire qui est poste
245
-	// ou si on le demande explicitement par le parametre _forcer_request = true
246
-	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
247
-	foreach (array_keys($valeurs) as $champ) {
248
-		if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
249
-			if ($dispo and (($v = _request($champ)) !== null)) {
250
-				$valeurs[$champ] = $v;
251
-			}
252
-			// nettoyer l'url des champs qui vont etre saisis
253
-			if ($action) {
254
-				$action = parametre_url($action, $champ, '');
255
-			}
256
-			// proteger les ' et les " dans les champs que l'on va injecter
257
-			$valeurs[$champ] = protege_champ($valeurs[$champ]);
258
-		}
259
-	}
260
-
261
-	if ($action) {
262
-		// nettoyer l'url
263
-		$action = parametre_url($action, 'formulaire_action', '');
264
-		$action = parametre_url($action, 'formulaire_action_args', '');
265
-	}
266
-
267
-	/**
268
-	 * @deprecated
269
-	 * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
270
-	 */
271
-	/*
194
+    // tester si ce formulaire vient d'etre poste (memes arguments)
195
+    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
196
+    // si poste, on recupere les erreurs
197
+
198
+    $je_suis_poste = false;
199
+    if (
200
+        $post_form = _request('formulaire_action')
201
+        and $post_form == $form
202
+        and $p = _request('formulaire_action_args')
203
+        and is_array($p = decoder_contexte_ajax($p, $post_form))
204
+    ) {
205
+        // enlever le faux attribut de langue masque
206
+        array_shift($p);
207
+        if (formulaire__identifier($form, $args, $p)) {
208
+            $je_suis_poste = true;
209
+        }
210
+    }
211
+
212
+    $editable = true;
213
+    $erreurs = $post = [];
214
+    if ($je_suis_poste) {
215
+        $post = traiter_formulaires_dynamiques(true);
216
+        $e = "erreurs_$form";
217
+        $erreurs = $post[$e] ?? [];
218
+        $editable = "editable_$form";
219
+        $editable = (!isset($post[$e]))
220
+            || (is_countable($erreurs) ? count($erreurs) : 0)
221
+            || (isset($post[$editable]) && $post[$editable]);
222
+    }
223
+
224
+    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
225
+
226
+    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
227
+    // C'est plus fort qu'editable qui est gere par le squelette
228
+    // Idealement $valeur doit etre alors un message explicatif.
229
+    if (!is_array($valeurs)) {
230
+        return is_string($valeurs) ? $valeurs : '';
231
+    }
232
+
233
+    // charger peut passer une action si le formulaire ne tourne pas sur self()
234
+    // ou une action vide si elle ne sert pas
235
+    $action = $valeurs['action'] ?? self('&amp;', true);
236
+    // bug IEx : si action finit par /
237
+    // IE croit que le <form ... action=../ > est autoferme
238
+    if (substr($action, -1) == '/') {
239
+        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
240
+        $action .= '#';
241
+    }
242
+
243
+    // recuperer la saisie en cours si erreurs
244
+    // seulement si c'est ce formulaire qui est poste
245
+    // ou si on le demande explicitement par le parametre _forcer_request = true
246
+    $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
247
+    foreach (array_keys($valeurs) as $champ) {
248
+        if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
249
+            if ($dispo and (($v = _request($champ)) !== null)) {
250
+                $valeurs[$champ] = $v;
251
+            }
252
+            // nettoyer l'url des champs qui vont etre saisis
253
+            if ($action) {
254
+                $action = parametre_url($action, $champ, '');
255
+            }
256
+            // proteger les ' et les " dans les champs que l'on va injecter
257
+            $valeurs[$champ] = protege_champ($valeurs[$champ]);
258
+        }
259
+    }
260
+
261
+    if ($action) {
262
+        // nettoyer l'url
263
+        $action = parametre_url($action, 'formulaire_action', '');
264
+        $action = parametre_url($action, 'formulaire_action_args', '');
265
+    }
266
+
267
+    /**
268
+     * @deprecated
269
+     * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
270
+     */
271
+    /*
272 272
 	if (isset($valeurs['_action'])) {
273 273
 		$securiser_action = charger_fonction('securiser_action', 'inc');
274 274
 		$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@@ -278,59 +278,59 @@  discard block
 block discarded – undo
278 278
 	}
279 279
 	*/
280 280
 
281
-	// empiler la lang en tant que premier argument implicite du CVT
282
-	// pour permettre de la restaurer au moment du Verifier et du Traiter
283
-	array_unshift($args, $GLOBALS['spip_lang']);
284
-
285
-	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
286
-	$valeurs['erreurs'] = $erreurs;
287
-	$valeurs['action'] = $action;
288
-	$valeurs['form'] = $form;
289
-
290
-	$valeurs['formulaire_sign'] = '';
291
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
292
-		$securiser_action = charger_fonction('securiser_action', 'inc');
293
-		$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
294
-		$valeurs['formulaire_sign'] = $secu['hash'];
295
-	}
296
-
297
-	if (!isset($valeurs['id'])) {
298
-		$valeurs['id'] = 'new';
299
-	}
300
-	// editable peut venir de charger() ou de traiter() sinon
301
-	if (!isset($valeurs['editable'])) {
302
-		$valeurs['editable'] = $editable;
303
-	}
304
-	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
305
-	$valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
306
-
307
-	if ($je_suis_poste) {
308
-		$valeurs['message_erreur'] = '';
309
-		if (isset($erreurs['message_erreur'])) {
310
-			$valeurs['message_erreur'] = $erreurs['message_erreur'];
311
-		}
312
-
313
-		$valeurs['message_ok'] = '';
314
-		if (isset($post["message_ok_$form"])) {
315
-			$valeurs['message_ok'] = $post["message_ok_$form"];
316
-		} elseif (isset($erreurs['message_ok'])) {
317
-			$valeurs['message_ok'] = $erreurs['message_ok'];
318
-		}
319
-
320
-		// accessibilite : encapsuler toutes les erreurs dans un role='alert'
321
-		// uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
322
-		// et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
323
-		if (html5_permis()) {
324
-			foreach ($erreurs as $k => $v) {
325
-				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
326
-					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
327
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
328
-				}
329
-			}
330
-		}
331
-	}
332
-
333
-	return $valeurs;
281
+    // empiler la lang en tant que premier argument implicite du CVT
282
+    // pour permettre de la restaurer au moment du Verifier et du Traiter
283
+    array_unshift($args, $GLOBALS['spip_lang']);
284
+
285
+    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
286
+    $valeurs['erreurs'] = $erreurs;
287
+    $valeurs['action'] = $action;
288
+    $valeurs['form'] = $form;
289
+
290
+    $valeurs['formulaire_sign'] = '';
291
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
292
+        $securiser_action = charger_fonction('securiser_action', 'inc');
293
+        $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
294
+        $valeurs['formulaire_sign'] = $secu['hash'];
295
+    }
296
+
297
+    if (!isset($valeurs['id'])) {
298
+        $valeurs['id'] = 'new';
299
+    }
300
+    // editable peut venir de charger() ou de traiter() sinon
301
+    if (!isset($valeurs['editable'])) {
302
+        $valeurs['editable'] = $editable;
303
+    }
304
+    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
305
+    $valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
306
+
307
+    if ($je_suis_poste) {
308
+        $valeurs['message_erreur'] = '';
309
+        if (isset($erreurs['message_erreur'])) {
310
+            $valeurs['message_erreur'] = $erreurs['message_erreur'];
311
+        }
312
+
313
+        $valeurs['message_ok'] = '';
314
+        if (isset($post["message_ok_$form"])) {
315
+            $valeurs['message_ok'] = $post["message_ok_$form"];
316
+        } elseif (isset($erreurs['message_ok'])) {
317
+            $valeurs['message_ok'] = $erreurs['message_ok'];
318
+        }
319
+
320
+        // accessibilite : encapsuler toutes les erreurs dans un role='alert'
321
+        // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
322
+        // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
323
+        if (html5_permis()) {
324
+            foreach ($erreurs as $k => $v) {
325
+                if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
326
+                    // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
327
+                    $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
328
+                }
329
+            }
330
+        }
331
+    }
332
+
333
+    return $valeurs;
334 334
 }
335 335
 
336 336
 /**
@@ -342,51 +342,51 @@  discard block
 block discarded – undo
342 342
  * @return array
343 343
  */
344 344
 function formulaire__charger($form, $args, $poste) {
345
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
346
-		$valeurs = call_user_func_array($charger_valeurs, $args);
347
-	} else {
348
-		$valeurs = [];
349
-	}
350
-
351
-	$valeurs = pipeline(
352
-		'formulaire_charger',
353
-		[
354
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
355
-			'data' => $valeurs
356
-		]
357
-	);
358
-
359
-	// prise en charge CVT multi etape
360
-	if (is_array($valeurs) and isset($valeurs['_etapes'])) {
361
-		include_spip('inc/cvt_multietapes');
362
-		$valeurs = cvtmulti_formulaire_charger_etapes(
363
-			['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
364
-			$valeurs
365
-		);
366
-	}
367
-
368
-	// si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
369
-	if (is_array($valeurs)) {
370
-		if (!isset($valeurs['_pipelines'])) {
371
-			$valeurs['_pipelines'] = [];
372
-		}
373
-		// l'ancien argument _pipeline devient maintenant _pipelines
374
-		// reinjectons le vieux _pipeline au debut de _pipelines
375
-		if (isset($valeurs['_pipeline'])) {
376
-			$pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
377
-			$args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
378
-
379
-			$pipelines = [$pipe => $args];
380
-			$valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
381
-		}
382
-
383
-		// et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
384
-		// qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
385
-		// (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
386
-		$valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
387
-	}
388
-
389
-	return $valeurs;
345
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
346
+        $valeurs = call_user_func_array($charger_valeurs, $args);
347
+    } else {
348
+        $valeurs = [];
349
+    }
350
+
351
+    $valeurs = pipeline(
352
+        'formulaire_charger',
353
+        [
354
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
355
+            'data' => $valeurs
356
+        ]
357
+    );
358
+
359
+    // prise en charge CVT multi etape
360
+    if (is_array($valeurs) and isset($valeurs['_etapes'])) {
361
+        include_spip('inc/cvt_multietapes');
362
+        $valeurs = cvtmulti_formulaire_charger_etapes(
363
+            ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
364
+            $valeurs
365
+        );
366
+    }
367
+
368
+    // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
369
+    if (is_array($valeurs)) {
370
+        if (!isset($valeurs['_pipelines'])) {
371
+            $valeurs['_pipelines'] = [];
372
+        }
373
+        // l'ancien argument _pipeline devient maintenant _pipelines
374
+        // reinjectons le vieux _pipeline au debut de _pipelines
375
+        if (isset($valeurs['_pipeline'])) {
376
+            $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
377
+            $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
378
+
379
+            $pipelines = [$pipe => $args];
380
+            $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
381
+        }
382
+
383
+        // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
384
+        // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
385
+        // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
386
+        $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
387
+    }
388
+
389
+    return $valeurs;
390 390
 }
391 391
 
392 392
 /**
@@ -405,9 +405,9 @@  discard block
 block discarded – undo
405 405
  * @return bool
406 406
  */
407 407
 function formulaire__identifier($form, $args, $p) {
408
-	if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
409
-		return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
410
-	}
408
+    if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
409
+        return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p);
410
+    }
411 411
 
412
-	return $args === $p;
412
+    return $args === $p;
413 413
 }
Please login to merge, or discard this patch.
ecrire/balise/formulaire_inscription.php 1 patch
Indentation   +6 added lines, -6 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
 include_spip('base/abstract_sql');
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
  *     Pile complétée du code compilé
44 44
  **/
45 45
 function balise_FORMULAIRE_INSCRIPTION($p) {
46
-	return calculer_balise_dynamique($p, 'FORMULAIRE_INSCRIPTION', []);
46
+    return calculer_balise_dynamique($p, 'FORMULAIRE_INSCRIPTION', []);
47 47
 }
48 48
 
49 49
 /**
@@ -72,9 +72,9 @@  discard block
 block discarded – undo
72 72
  *   - chaîne vide sinon.
73 73
  */
74 74
 function balise_FORMULAIRE_INSCRIPTION_stat($args, $context_compil) {
75
-	[$mode, $id, $retour] = array_pad($args, 3, null);
76
-	include_spip('action/inscrire_auteur');
77
-	$mode = tester_statut_inscription($mode, $id ?? 0);
75
+    [$mode, $id, $retour] = array_pad($args, 3, null);
76
+    include_spip('action/inscrire_auteur');
77
+    $mode = tester_statut_inscription($mode, $id ?? 0);
78 78
 
79
-	return $mode ? [$mode, $id, $retour] : '';
79
+    return $mode ? [$mode, $id, $retour] : '';
80 80
 }
Please login to merge, or discard this patch.
ecrire/public/balises.php 1 patch
Indentation   +948 added lines, -948 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@  discard block
 block discarded – undo
26 26
  **/
27 27
 
28 28
 if (!defined('_ECRIRE_INC_VERSION')) {
29
-	return;
29
+    return;
30 30
 }
31 31
 
32 32
 /**
@@ -48,16 +48,16 @@  discard block
 block discarded – undo
48 48
  *     Code PHP si cet argument est présent, sinon null
49 49
  **/
50 50
 function interprete_argument_balise(int $n, Champ $p): ?string {
51
-	if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
52
-		return calculer_liste(
53
-			$p->param[0][$n],
54
-			$p->descr,
55
-			$p->boucles,
56
-			$p->id_boucle
57
-		);
58
-	} else {
59
-		return null;
60
-	}
51
+    if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
52
+        return calculer_liste(
53
+            $p->param[0][$n],
54
+            $p->descr,
55
+            $p->boucles,
56
+            $p->id_boucle
57
+        );
58
+    } else {
59
+        return null;
60
+    }
61 61
 }
62 62
 
63 63
 
@@ -77,10 +77,10 @@  discard block
 block discarded – undo
77 77
  *     Pile complétée par le code à générer
78 78
  **/
79 79
 function balise_NOM_SITE_SPIP_dist($p) {
80
-	$p->code = "\$GLOBALS['meta']['nom_site']";
80
+    $p->code = "\$GLOBALS['meta']['nom_site']";
81 81
 
82
-	#$p->interdire_scripts = true;
83
-	return $p;
82
+    #$p->interdire_scripts = true;
83
+    return $p;
84 84
 }
85 85
 
86 86
 /**
@@ -96,10 +96,10 @@  discard block
 block discarded – undo
96 96
  *     Pile complétée par le code à générer
97 97
  **/
98 98
 function balise_EMAIL_WEBMASTER_dist($p) {
99
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
99
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
100 100
 
101
-	#$p->interdire_scripts = true;
102
-	return $p;
101
+    #$p->interdire_scripts = true;
102
+    return $p;
103 103
 }
104 104
 
105 105
 /**
@@ -115,10 +115,10 @@  discard block
 block discarded – undo
115 115
  *     Pile complétée par le code à générer
116 116
  **/
117 117
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
118
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
118
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
119 119
 
120
-	#$p->interdire_scripts = true;
121
-	return $p;
120
+    #$p->interdire_scripts = true;
121
+    return $p;
122 122
 }
123 123
 
124 124
 
@@ -139,10 +139,10 @@  discard block
 block discarded – undo
139 139
  *     Pile complétée par le code à générer
140 140
  **/
141 141
 function balise_CHARSET_dist($p) {
142
-	$p->code = "\$GLOBALS['meta']['charset']";
142
+    $p->code = "\$GLOBALS['meta']['charset']";
143 143
 
144
-	#$p->interdire_scripts = true;
145
-	return $p;
144
+    #$p->interdire_scripts = true;
145
+    return $p;
146 146
 }
147 147
 
148 148
 /**
@@ -167,11 +167,11 @@  discard block
 block discarded – undo
167 167
  *     Pile complétée par le code à générer
168 168
  **/
169 169
 function balise_LANG_LEFT_dist($p) {
170
-	$_lang = champ_sql('lang', $p);
171
-	$p->code = "lang_dir($_lang, 'left','right')";
172
-	$p->interdire_scripts = false;
170
+    $_lang = champ_sql('lang', $p);
171
+    $p->code = "lang_dir($_lang, 'left','right')";
172
+    $p->interdire_scripts = false;
173 173
 
174
-	return $p;
174
+    return $p;
175 175
 }
176 176
 
177 177
 /**
@@ -191,11 +191,11 @@  discard block
 block discarded – undo
191 191
  *     Pile complétée par le code à générer
192 192
  **/
193 193
 function balise_LANG_RIGHT_dist($p) {
194
-	$_lang = champ_sql('lang', $p);
195
-	$p->code = "lang_dir($_lang, 'right','left')";
196
-	$p->interdire_scripts = false;
194
+    $_lang = champ_sql('lang', $p);
195
+    $p->code = "lang_dir($_lang, 'right','left')";
196
+    $p->interdire_scripts = false;
197 197
 
198
-	return $p;
198
+    return $p;
199 199
 }
200 200
 
201 201
 /**
@@ -220,11 +220,11 @@  discard block
 block discarded – undo
220 220
  *     Pile complétée par le code à générer
221 221
  **/
222 222
 function balise_LANG_DIR_dist($p) {
223
-	$_lang = champ_sql('lang', $p);
224
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
225
-	$p->interdire_scripts = false;
223
+    $_lang = champ_sql('lang', $p);
224
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
225
+    $p->interdire_scripts = false;
226 226
 
227
-	return $p;
227
+    return $p;
228 228
 }
229 229
 
230 230
 
@@ -241,10 +241,10 @@  discard block
 block discarded – undo
241 241
  *     Pile complétée par le code à générer
242 242
  **/
243 243
 function balise_PUCE_dist($p) {
244
-	$p->code = 'definir_puce()';
245
-	$p->interdire_scripts = false;
244
+    $p->code = 'definir_puce()';
245
+    $p->interdire_scripts = false;
246 246
 
247
-	return $p;
247
+    return $p;
248 248
 }
249 249
 
250 250
 
@@ -268,9 +268,9 @@  discard block
 block discarded – undo
268 268
  *     Pile completée du code PHP d'exécution de la balise
269 269
  */
270 270
 function balise_DATE_dist($p) {
271
-	$p->code = champ_sql('date', $p);
271
+    $p->code = champ_sql('date', $p);
272 272
 
273
-	return $p;
273
+    return $p;
274 274
 }
275 275
 
276 276
 
@@ -290,10 +290,10 @@  discard block
 block discarded – undo
290 290
  *     Pile completée du code PHP d'exécution de la balise
291 291
  */
292 292
 function balise_DATE_REDAC_dist($p) {
293
-	$p->code = champ_sql('date_redac', $p);
294
-	$p->interdire_scripts = false;
293
+    $p->code = champ_sql('date_redac', $p);
294
+    $p->interdire_scripts = false;
295 295
 
296
-	return $p;
296
+    return $p;
297 297
 }
298 298
 
299 299
 /**
@@ -312,10 +312,10 @@  discard block
 block discarded – undo
312 312
  *     Pile completée du code PHP d'exécution de la balise
313 313
  */
314 314
 function balise_DATE_MODIF_dist($p) {
315
-	$p->code = champ_sql('date_modif', $p);
316
-	$p->interdire_scripts = false;
315
+    $p->code = champ_sql('date_modif', $p);
316
+    $p->interdire_scripts = false;
317 317
 
318
-	return $p;
318
+    return $p;
319 319
 }
320 320
 
321 321
 /**
@@ -333,13 +333,13 @@  discard block
 block discarded – undo
333 333
  *     Pile completée du code PHP d'exécution de la balise
334 334
  */
335 335
 function balise_DATE_NOUVEAUTES_dist($p) {
336
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
336
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
337 337
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
338 338
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
339 339
 	\"'0000-00-00'\")";
340
-	$p->interdire_scripts = false;
340
+    $p->interdire_scripts = false;
341 341
 
342
-	return $p;
342
+    return $p;
343 343
 }
344 344
 
345 345
 
@@ -357,11 +357,11 @@  discard block
 block discarded – undo
357 357
  *     Pile completée du code PHP d'exécution de la balise
358 358
  */
359 359
 function balise_DOSSIER_SQUELETTE_dist($p) {
360
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
361
-	$p->code = "_DIR_RACINE . '$code'" .
362
-		$p->interdire_scripts = false;
360
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
361
+    $p->code = "_DIR_RACINE . '$code'" .
362
+        $p->interdire_scripts = false;
363 363
 
364
-	return $p;
364
+    return $p;
365 365
 }
366 366
 
367 367
 /**
@@ -376,11 +376,11 @@  discard block
 block discarded – undo
376 376
  *     Pile completée du code PHP d'exécution de la balise
377 377
  */
378 378
 function balise_SQUELETTE_dist($p) {
379
-	$code = addslashes($p->descr['sourcefile']);
380
-	$p->code = "'$code'" .
381
-		$p->interdire_scripts = false;
379
+    $code = addslashes($p->descr['sourcefile']);
380
+    $p->code = "'$code'" .
381
+        $p->interdire_scripts = false;
382 382
 
383
-	return $p;
383
+    return $p;
384 384
 }
385 385
 
386 386
 /**
@@ -399,10 +399,10 @@  discard block
 block discarded – undo
399 399
  *     Pile completée du code PHP d'exécution de la balise
400 400
  */
401 401
 function balise_SPIP_VERSION_dist($p) {
402
-	$p->code = 'spip_version()';
403
-	$p->interdire_scripts = false;
402
+    $p->code = 'spip_version()';
403
+    $p->interdire_scripts = false;
404 404
 
405
-	return $p;
405
+    return $p;
406 406
 }
407 407
 
408 408
 
@@ -428,18 +428,18 @@  discard block
 block discarded – undo
428 428
  *     Pile complétée par le code à générer
429 429
  **/
430 430
 function balise_NOM_SITE_dist($p) {
431
-	if (!$p->etoile) {
432
-		$p->code = 'supprimer_numero(calculer_url(' .
433
-			champ_sql('url_site', $p) . ',' .
434
-			champ_sql('nom_site', $p) .
435
-			", 'titre', \$connect, false))";
436
-	} else {
437
-		$p->code = champ_sql('nom_site', $p);
438
-	}
431
+    if (!$p->etoile) {
432
+        $p->code = 'supprimer_numero(calculer_url(' .
433
+            champ_sql('url_site', $p) . ',' .
434
+            champ_sql('nom_site', $p) .
435
+            ", 'titre', \$connect, false))";
436
+    } else {
437
+        $p->code = champ_sql('nom_site', $p);
438
+    }
439 439
 
440
-	$p->interdire_scripts = true;
440
+    $p->interdire_scripts = true;
441 441
 
442
-	return $p;
442
+    return $p;
443 443
 }
444 444
 
445 445
 
@@ -456,11 +456,11 @@  discard block
 block discarded – undo
456 456
  *     Pile complétée par le code à générer
457 457
  **/
458 458
 function balise_NOTES_dist($p) {
459
-	// Recuperer les notes
460
-	$p->code = 'calculer_notes()';
459
+    // Recuperer les notes
460
+    $p->code = 'calculer_notes()';
461 461
 
462
-	#$p->interdire_scripts = true;
463
-	return $p;
462
+    #$p->interdire_scripts = true;
463
+    return $p;
464 464
 }
465 465
 
466 466
 
@@ -482,10 +482,10 @@  discard block
 block discarded – undo
482 482
  *     Pile complétée par le code à générer
483 483
  **/
484 484
 function balise_RECHERCHE_dist($p) {
485
-	$p->code = 'entites_html(_request("recherche"))';
486
-	$p->interdire_scripts = false;
485
+    $p->code = 'entites_html(_request("recherche"))';
486
+    $p->interdire_scripts = false;
487 487
 
488
-	return $p;
488
+    return $p;
489 489
 }
490 490
 
491 491
 
@@ -503,17 +503,17 @@  discard block
 block discarded – undo
503 503
  *     Pile complétée par le code à générer
504 504
  **/
505 505
 function balise_COMPTEUR_BOUCLE_dist($p) {
506
-	$b = index_boucle_mere($p);
507
-	if ($b === '') {
508
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
509
-		erreur_squelette($msg, $p);
510
-	} else {
511
-		$p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
-		$p->boucles[$b]->cptrows = true;
513
-		$p->interdire_scripts = false;
506
+    $b = index_boucle_mere($p);
507
+    if ($b === '') {
508
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
509
+        erreur_squelette($msg, $p);
510
+    } else {
511
+        $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
+        $p->boucles[$b]->cptrows = true;
513
+        $p->interdire_scripts = false;
514 514
 
515
-		return $p;
516
-	}
515
+        return $p;
516
+    }
517 517
 }
518 518
 
519 519
 /**
@@ -531,17 +531,17 @@  discard block
 block discarded – undo
531 531
  *     Pile complétée par le code à générer
532 532
  **/
533 533
 function balise_TOTAL_BOUCLE_dist($p) {
534
-	$b = index_boucle_mere($p);
535
-	if ($b === '') {
536
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
-		erreur_squelette($msg, $p);
538
-	} else {
539
-		$p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
-		$p->boucles[$b]->numrows = true;
541
-		$p->interdire_scripts = false;
542
-	}
534
+    $b = index_boucle_mere($p);
535
+    if ($b === '') {
536
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
+        erreur_squelette($msg, $p);
538
+    } else {
539
+        $p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
+        $p->boucles[$b]->numrows = true;
541
+        $p->interdire_scripts = false;
542
+    }
543 543
 
544
-	return $p;
544
+    return $p;
545 545
 }
546 546
 
547 547
 
@@ -561,7 +561,7 @@  discard block
 block discarded – undo
561 561
  *     Pile complétée par le code à générer
562 562
  **/
563 563
 function balise_POINTS_dist($p) {
564
-	return rindex_pile($p, 'points', 'recherche');
564
+    return rindex_pile($p, 'points', 'recherche');
565 565
 }
566 566
 
567 567
 
@@ -582,12 +582,12 @@  discard block
 block discarded – undo
582 582
  *     Pile complétée par le code à générer
583 583
  **/
584 584
 function balise_POPULARITE_ABSOLUE_dist($p) {
585
-	$p->code = 'ceil(' .
586
-		champ_sql('popularite', $p) .
587
-		')';
588
-	$p->interdire_scripts = false;
585
+    $p->code = 'ceil(' .
586
+        champ_sql('popularite', $p) .
587
+        ')';
588
+    $p->interdire_scripts = false;
589 589
 
590
-	return $p;
590
+    return $p;
591 591
 }
592 592
 
593 593
 /**
@@ -607,10 +607,10 @@  discard block
 block discarded – undo
607 607
  *     Pile complétée par le code à générer
608 608
  **/
609 609
 function balise_POPULARITE_SITE_dist($p) {
610
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
-	$p->interdire_scripts = false;
610
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
+    $p->interdire_scripts = false;
612 612
 
613
-	return $p;
613
+    return $p;
614 614
 }
615 615
 
616 616
 /**
@@ -631,10 +631,10 @@  discard block
 block discarded – undo
631 631
  *     Pile complétée par le code à générer
632 632
  **/
633 633
 function balise_POPULARITE_MAX_dist($p) {
634
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
-	$p->interdire_scripts = false;
634
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
+    $p->interdire_scripts = false;
636 636
 
637
-	return $p;
637
+    return $p;
638 638
 }
639 639
 
640 640
 
@@ -660,15 +660,15 @@  discard block
 block discarded – undo
660 660
  *     Pile complétée par le code à générer
661 661
  **/
662 662
 function balise_VALEUR_dist($p) {
663
-	$b = $p->nom_boucle ?: $p->id_boucle;
664
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
663
+    $b = $p->nom_boucle ?: $p->id_boucle;
664
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
665 665
 ;
666
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
667
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
-	}
669
-	$p->interdire_scripts = true;
666
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
667
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
+    }
669
+    $p->interdire_scripts = true;
670 670
 
671
-	return $p;
671
+    return $p;
672 672
 }
673 673
 
674 674
 /**
@@ -697,16 +697,16 @@  discard block
 block discarded – undo
697 697
  *     Pile complétée par le code à générer
698 698
  **/
699 699
 function balise_EXPOSE_dist($p) {
700
-	$on = "'on'";
701
-	$off = "''";
702
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
703
-		$on = $v;
704
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
705
-			$off = $v;
706
-		}
707
-	}
700
+    $on = "'on'";
701
+    $off = "''";
702
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
703
+        $on = $v;
704
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
705
+            $off = $v;
706
+        }
707
+    }
708 708
 
709
-	return calculer_balise_expose($p, $on, $off);
709
+    return calculer_balise_expose($p, $on, $off);
710 710
 }
711 711
 
712 712
 /**
@@ -724,35 +724,35 @@  discard block
 block discarded – undo
724 724
  *     Pile complétée par le code à générer
725 725
  **/
726 726
 function calculer_balise_expose($p, $on, $off) {
727
-	$b = index_boucle($p);
728
-	if (empty($p->boucles[$b]->primary)) {
729
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
-		erreur_squelette($msg, $p);
731
-	} else {
732
-		$key = $p->boucles[$b]->primary;
733
-		$type = $p->boucles[$p->id_boucle]->primary;
734
-		$desc = $p->boucles[$b]->show;
735
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
727
+    $b = index_boucle($p);
728
+    if (empty($p->boucles[$b]->primary)) {
729
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
+        erreur_squelette($msg, $p);
731
+    } else {
732
+        $key = $p->boucles[$b]->primary;
733
+        $type = $p->boucles[$p->id_boucle]->primary;
734
+        $desc = $p->boucles[$b]->show;
735
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
736 736
 
737
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
737
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
739 739
 
740
-		if (isset($desc['field']['id_parent'])) {
741
-			$parent = 0; // pour if (!$parent) dans calculer_expose
742
-		} elseif (isset($desc['field']['id_rubrique'])) {
743
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
-		} elseif (isset($desc['field']['id_groupe'])) {
745
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
-		} else {
747
-			$parent = "''";
748
-		}
740
+        if (isset($desc['field']['id_parent'])) {
741
+            $parent = 0; // pour if (!$parent) dans calculer_expose
742
+        } elseif (isset($desc['field']['id_rubrique'])) {
743
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
+        } elseif (isset($desc['field']['id_groupe'])) {
745
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
+        } else {
747
+            $parent = "''";
748
+        }
749 749
 
750
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
-	}
750
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
+    }
752 752
 
753
-	$p->interdire_scripts = false;
753
+    $p->interdire_scripts = false;
754 754
 
755
-	return $p;
755
+    return $p;
756 756
 }
757 757
 
758 758
 
@@ -792,46 +792,46 @@  discard block
 block discarded – undo
792 792
  **/
793 793
 function balise_INTRODUCTION_dist($p) {
794 794
 
795
-	$type_objet = $p->type_requete;
796
-	$cle_objet = id_table_objet($type_objet);
797
-	$_id_objet = champ_sql($cle_objet, $p);
798
-
799
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
800
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
801
-	$_introduction_longueur = 'null';
802
-	$_ligne = 'array(';
803
-	$trouver_table = charger_fonction('trouver_table', 'base');
804
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
805
-		if (isset($desc['field']['descriptif'])) {
806
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
807
-		}
808
-		if (isset($desc['field']['texte'])) {
809
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
810
-		}
811
-		if (isset($desc['field']['chapo'])) {
812
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
813
-		}
814
-		if (isset($desc['introduction_longueur'])) {
815
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
816
-		}
817
-	}
818
-	$_ligne .= ')';
819
-
820
-	// Récupérer la longueur et la suite passés en paramètres
821
-	$_longueur_ou_suite = 'null';
822
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
823
-		$_longueur_ou_suite = $v1;
824
-	}
825
-	$_suite = 'null';
826
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
827
-		$_suite = $v2;
828
-	}
829
-
830
-	$p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
831
-
832
-	#$p->interdire_scripts = true;
833
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
834
-	return $p;
795
+    $type_objet = $p->type_requete;
796
+    $cle_objet = id_table_objet($type_objet);
797
+    $_id_objet = champ_sql($cle_objet, $p);
798
+
799
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
800
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
801
+    $_introduction_longueur = 'null';
802
+    $_ligne = 'array(';
803
+    $trouver_table = charger_fonction('trouver_table', 'base');
804
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
805
+        if (isset($desc['field']['descriptif'])) {
806
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
807
+        }
808
+        if (isset($desc['field']['texte'])) {
809
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
810
+        }
811
+        if (isset($desc['field']['chapo'])) {
812
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
813
+        }
814
+        if (isset($desc['introduction_longueur'])) {
815
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
816
+        }
817
+    }
818
+    $_ligne .= ')';
819
+
820
+    // Récupérer la longueur et la suite passés en paramètres
821
+    $_longueur_ou_suite = 'null';
822
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
823
+        $_longueur_ou_suite = $v1;
824
+    }
825
+    $_suite = 'null';
826
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
827
+        $_suite = $v2;
828
+    }
829
+
830
+    $p->code = "generer_introduction_entite($_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
831
+
832
+    #$p->interdire_scripts = true;
833
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
834
+    return $p;
835 835
 }
836 836
 
837 837
 
@@ -851,15 +851,15 @@  discard block
 block discarded – undo
851 851
  *     Pile complétée par le code à générer
852 852
  **/
853 853
 function balise_LANG_dist($p) {
854
-	$_lang = champ_sql('lang', $p);
855
-	if (!$p->etoile) {
856
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
857
-	} else {
858
-		$p->code = "spip_htmlentities($_lang)";
859
-	}
860
-	$p->interdire_scripts = false;
854
+    $_lang = champ_sql('lang', $p);
855
+    if (!$p->etoile) {
856
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
857
+    } else {
858
+        $p->code = "spip_htmlentities($_lang)";
859
+    }
860
+    $p->interdire_scripts = false;
861 861
 
862
-	return $p;
862
+    return $p;
863 863
 }
864 864
 
865 865
 /**
@@ -881,48 +881,48 @@  discard block
 block discarded – undo
881 881
  *     Pile complétée par le code à générer
882 882
  */
883 883
 function balise_LESAUTEURS_dist($p) {
884
-	// Cherche le champ 'lesauteurs' dans la pile
885
-	$_lesauteurs = champ_sql('lesauteurs', $p, false);
886
-
887
-	// Si le champ n'existe pas (cas de spip_articles), on applique
888
-	// le modele lesauteurs.html en passant id_article dans le contexte;
889
-	// dans le cas contraire on prend le champ 'lesauteurs'
890
-	// (cf extension sites/)
891
-	if (
892
-		$_lesauteurs
893
-		and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
894
-	) {
895
-		$p->code = "safehtml($_lesauteurs)";
896
-		// $p->interdire_scripts = true;
897
-	} else {
898
-		if (!$p->id_boucle) {
899
-			$connect = '';
900
-			$objet = 'article';
901
-			$id_table_objet = 'id_article';
902
-		} else {
903
-			$b = $p->nom_boucle ?: $p->id_boucle;
904
-			$connect = $p->boucles[$b]->sql_serveur;
905
-			$type_boucle = $p->boucles[$b]->type_requete;
906
-			$objet = objet_type($type_boucle);
907
-			$id_table_objet = id_table_objet($type_boucle);
908
-		}
909
-		$c = memoriser_contexte_compil($p);
910
-
911
-		$p->code = sprintf(
912
-			CODE_RECUPERER_FOND,
913
-			"'modeles/lesauteurs'",
914
-			"array('objet'=>'" . $objet .
915
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
916
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
917
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
918
-			')',
919
-			"'trim'=>true, 'compil'=>array($c)",
920
-			_q($connect)
921
-		);
922
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
923
-	}
924
-
925
-	return $p;
884
+    // Cherche le champ 'lesauteurs' dans la pile
885
+    $_lesauteurs = champ_sql('lesauteurs', $p, false);
886
+
887
+    // Si le champ n'existe pas (cas de spip_articles), on applique
888
+    // le modele lesauteurs.html en passant id_article dans le contexte;
889
+    // dans le cas contraire on prend le champ 'lesauteurs'
890
+    // (cf extension sites/)
891
+    if (
892
+        $_lesauteurs
893
+        and $_lesauteurs != '@$Pile[0][\'lesauteurs\']'
894
+    ) {
895
+        $p->code = "safehtml($_lesauteurs)";
896
+        // $p->interdire_scripts = true;
897
+    } else {
898
+        if (!$p->id_boucle) {
899
+            $connect = '';
900
+            $objet = 'article';
901
+            $id_table_objet = 'id_article';
902
+        } else {
903
+            $b = $p->nom_boucle ?: $p->id_boucle;
904
+            $connect = $p->boucles[$b]->sql_serveur;
905
+            $type_boucle = $p->boucles[$b]->type_requete;
906
+            $objet = objet_type($type_boucle);
907
+            $id_table_objet = id_table_objet($type_boucle);
908
+        }
909
+        $c = memoriser_contexte_compil($p);
910
+
911
+        $p->code = sprintf(
912
+            CODE_RECUPERER_FOND,
913
+            "'modeles/lesauteurs'",
914
+            "array('objet'=>'" . $objet .
915
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
916
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
917
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
918
+            ')',
919
+            "'trim'=>true, 'compil'=>array($c)",
920
+            _q($connect)
921
+        );
922
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
923
+    }
924
+
925
+    return $p;
926 926
 }
927 927
 
928 928
 
@@ -949,76 +949,76 @@  discard block
 block discarded – undo
949 949
  *     Pile complétée par le code à générer
950 950
  */
951 951
 function balise_RANG_dist($p) {
952
-	$b = index_boucle($p);
953
-	if ($b === '') {
954
-		$msg = [
955
-			'zbug_champ_hors_boucle',
956
-			['champ' => '#RANG']
957
-		];
958
-		erreur_squelette($msg, $p);
959
-	} else {
960
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
961
-		// dans la boucle immediatement englobante uniquement
962
-		// sinon on compose le champ calcule
963
-		$_rang = champ_sql('rang', $p, '', false);
964
-
965
-		// si pas trouve de champ sql rang :
966
-		if (!$_rang or $_rang == "''") {
967
-			$boucle = &$p->boucles[$b];
968
-
969
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
970
-			$trouver_table = charger_fonction('trouver_table', 'base');
971
-			$desc = $trouver_table($boucle->id_table);
972
-			$_titre = ''; # où extraire le numero ?
973
-
974
-			if (isset($desc['titre'])) {
975
-				$t = $desc['titre'];
976
-				if (
977
-					// Soit on trouve avec la déclaration de la lang AVANT
978
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
979
-					// Soit on prend depuis le début
980
-					or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
981
-				) {
982
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
983
-					$m = trim($m);
984
-					if ($m != "''") {
985
-						if (!preg_match(',\W,', $m)) {
986
-							$m = $boucle->id_table . ".$m";
987
-						}
988
-
989
-						$m .= ' AS titre_rang';
990
-
991
-						$boucle->select[] = $m;
992
-						$_titre = '$Pile[$SP][\'titre_rang\']';
993
-					}
994
-				}
995
-			}
996
-
997
-			// si on n'a rien trouvé, on utilise le champ titre classique
998
-			if (!$_titre) {
999
-				$_titre = champ_sql('titre', $p);
1000
-			}
1001
-
1002
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1003
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1004
-			$type_boucle = $boucle->type_requete;
1005
-			$objet = objet_type($type_boucle);
1006
-			$id_table_objet = id_table_objet($type_boucle);
1007
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1008
-			$_env = '$Pile[0]';
1009
-
1010
-			if (!$_titre) {$_titre = "''";
1011
-			}
1012
-			if (!$_primary) {$_primary = "''";
1013
-			}
1014
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1015
-		}
1016
-
1017
-		$p->code = $_rang;
1018
-		$p->interdire_scripts = false;
1019
-	}
1020
-
1021
-	return $p;
952
+    $b = index_boucle($p);
953
+    if ($b === '') {
954
+        $msg = [
955
+            'zbug_champ_hors_boucle',
956
+            ['champ' => '#RANG']
957
+        ];
958
+        erreur_squelette($msg, $p);
959
+    } else {
960
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
961
+        // dans la boucle immediatement englobante uniquement
962
+        // sinon on compose le champ calcule
963
+        $_rang = champ_sql('rang', $p, '', false);
964
+
965
+        // si pas trouve de champ sql rang :
966
+        if (!$_rang or $_rang == "''") {
967
+            $boucle = &$p->boucles[$b];
968
+
969
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
970
+            $trouver_table = charger_fonction('trouver_table', 'base');
971
+            $desc = $trouver_table($boucle->id_table);
972
+            $_titre = ''; # où extraire le numero ?
973
+
974
+            if (isset($desc['titre'])) {
975
+                $t = $desc['titre'];
976
+                if (
977
+                    // Soit on trouve avec la déclaration de la lang AVANT
978
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
979
+                    // Soit on prend depuis le début
980
+                    or preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
981
+                ) {
982
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
983
+                    $m = trim($m);
984
+                    if ($m != "''") {
985
+                        if (!preg_match(',\W,', $m)) {
986
+                            $m = $boucle->id_table . ".$m";
987
+                        }
988
+
989
+                        $m .= ' AS titre_rang';
990
+
991
+                        $boucle->select[] = $m;
992
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
993
+                    }
994
+                }
995
+            }
996
+
997
+            // si on n'a rien trouvé, on utilise le champ titre classique
998
+            if (!$_titre) {
999
+                $_titre = champ_sql('titre', $p);
1000
+            }
1001
+
1002
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1003
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1004
+            $type_boucle = $boucle->type_requete;
1005
+            $objet = objet_type($type_boucle);
1006
+            $id_table_objet = id_table_objet($type_boucle);
1007
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1008
+            $_env = '$Pile[0]';
1009
+
1010
+            if (!$_titre) {$_titre = "''";
1011
+            }
1012
+            if (!$_primary) {$_primary = "''";
1013
+            }
1014
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1015
+        }
1016
+
1017
+        $p->code = $_rang;
1018
+        $p->interdire_scripts = false;
1019
+    }
1020
+
1021
+    return $p;
1022 1022
 }
1023 1023
 
1024 1024
 
@@ -1040,12 +1040,12 @@  discard block
 block discarded – undo
1040 1040
  *     Pile complétée par le code à générer
1041 1041
  **/
1042 1042
 function balise_POPULARITE_dist($p) {
1043
-	$_popularite = champ_sql('popularite', $p);
1044
-	$p->code = "(ceil(min(100, 100 * $_popularite
1043
+    $_popularite = champ_sql('popularite', $p);
1044
+    $p->code = "(ceil(min(100, 100 * $_popularite
1045 1045
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1046
-	$p->interdire_scripts = false;
1046
+    $p->interdire_scripts = false;
1047 1047
 
1048
-	return $p;
1048
+    return $p;
1049 1049
 }
1050 1050
 
1051 1051
 /**
@@ -1056,8 +1056,8 @@  discard block
 block discarded – undo
1056 1056
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1057 1057
  */
1058 1058
 define(
1059
-	'CODE_PAGINATION',
1060
-	'%s($Numrows["%s"]["grand_total"],
1059
+    'CODE_PAGINATION',
1060
+    '%s($Numrows["%s"]["grand_total"],
1061 1061
  		%s,
1062 1062
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1063 1063
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1094,75 +1094,75 @@  discard block
 block discarded – undo
1094 1094
  *     Pile complétée par le code à générer
1095 1095
  */
1096 1096
 function balise_PAGINATION_dist($p, $liste = 'true') {
1097
-	$b = index_boucle_mere($p);
1098
-
1099
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1100
-	if ($b === '') {
1101
-		$msg = [
1102
-			'zbug_champ_hors_boucle',
1103
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1104
-		];
1105
-		erreur_squelette($msg, $p);
1106
-
1107
-		return $p;
1108
-	}
1109
-
1110
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1111
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1112
-	if (!$p->boucles[$b]->mode_partie) {
1113
-		if (!$p->boucles[$b]->table_optionnelle) {
1114
-			$msg = [
1115
-				'zbug_pagination_sans_critere',
1116
-				['champ' => '#PAGINATION']
1117
-			];
1118
-			erreur_squelette($msg, $p);
1119
-		}
1120
-
1121
-		return $p;
1122
-	}
1123
-
1124
-	// a priori true
1125
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1126
-	// si true, les arguments simples (sans truc=chose) vont degager
1127
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1128
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1129
-		$key = key($_contexte);
1130
-		if (is_numeric($key)) {
1131
-			array_shift($_contexte);
1132
-			$__modele = interprete_argument_balise(1, $p);
1133
-		}
1134
-	}
1135
-
1136
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1137
-		$code_contexte = implode(',', $_contexte);
1138
-	} else {
1139
-		$code_contexte = '';
1140
-	}
1141
-
1142
-	$connect = $p->boucles[$b]->sql_serveur;
1143
-	$pas = $p->boucles[$b]->total_parties;
1144
-	$f_pagination = chercher_filtre('pagination');
1145
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1146
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1147
-		: ("'debut" . substr($type, 1));
1148
-
1149
-	$p->code = sprintf(
1150
-		CODE_PAGINATION,
1151
-		$f_pagination,
1152
-		$b,
1153
-		$type,
1154
-		$modif,
1155
-		$pas,
1156
-		$liste,
1157
-		((isset($__modele) and $__modele) ? $__modele : "''"),
1158
-		_q($connect),
1159
-		$code_contexte
1160
-	);
1161
-
1162
-	$p->boucles[$b]->numrows = true;
1163
-	$p->interdire_scripts = false;
1164
-
1165
-	return $p;
1097
+    $b = index_boucle_mere($p);
1098
+
1099
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1100
+    if ($b === '') {
1101
+        $msg = [
1102
+            'zbug_champ_hors_boucle',
1103
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1104
+        ];
1105
+        erreur_squelette($msg, $p);
1106
+
1107
+        return $p;
1108
+    }
1109
+
1110
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1111
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1112
+    if (!$p->boucles[$b]->mode_partie) {
1113
+        if (!$p->boucles[$b]->table_optionnelle) {
1114
+            $msg = [
1115
+                'zbug_pagination_sans_critere',
1116
+                ['champ' => '#PAGINATION']
1117
+            ];
1118
+            erreur_squelette($msg, $p);
1119
+        }
1120
+
1121
+        return $p;
1122
+    }
1123
+
1124
+    // a priori true
1125
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1126
+    // si true, les arguments simples (sans truc=chose) vont degager
1127
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1128
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1129
+        $key = key($_contexte);
1130
+        if (is_numeric($key)) {
1131
+            array_shift($_contexte);
1132
+            $__modele = interprete_argument_balise(1, $p);
1133
+        }
1134
+    }
1135
+
1136
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1137
+        $code_contexte = implode(',', $_contexte);
1138
+    } else {
1139
+        $code_contexte = '';
1140
+    }
1141
+
1142
+    $connect = $p->boucles[$b]->sql_serveur;
1143
+    $pas = $p->boucles[$b]->total_parties;
1144
+    $f_pagination = chercher_filtre('pagination');
1145
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1146
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1147
+        : ("'debut" . substr($type, 1));
1148
+
1149
+    $p->code = sprintf(
1150
+        CODE_PAGINATION,
1151
+        $f_pagination,
1152
+        $b,
1153
+        $type,
1154
+        $modif,
1155
+        $pas,
1156
+        $liste,
1157
+        ((isset($__modele) and $__modele) ? $__modele : "''"),
1158
+        _q($connect),
1159
+        $code_contexte
1160
+    );
1161
+
1162
+    $p->boucles[$b]->numrows = true;
1163
+    $p->interdire_scripts = false;
1164
+
1165
+    return $p;
1166 1166
 }
1167 1167
 
1168 1168
 
@@ -1189,11 +1189,11 @@  discard block
 block discarded – undo
1189 1189
  *     Pile complétée par le code à générer
1190 1190
  **/
1191 1191
 function balise_ANCRE_PAGINATION_dist($p) {
1192
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1193
-		return $f($p, $liste = 'false');
1194
-	} else {
1195
-		return null;
1196
-	} // ou une erreur ?
1192
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1193
+        return $f($p, $liste = 'false');
1194
+    } else {
1195
+        return null;
1196
+    } // ou une erreur ?
1197 1197
 }
1198 1198
 
1199 1199
 
@@ -1214,17 +1214,17 @@  discard block
 block discarded – undo
1214 1214
  *     Pile complétée par le code à générer
1215 1215
  **/
1216 1216
 function balise_GRAND_TOTAL_dist($p) {
1217
-	$b = index_boucle_mere($p);
1218
-	if ($b === '') {
1219
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1220
-		erreur_squelette($msg, $p);
1221
-	} else {
1222
-		$p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1223
-		$p->boucles[$b]->numrows = true;
1224
-		$p->interdire_scripts = false;
1225
-	}
1217
+    $b = index_boucle_mere($p);
1218
+    if ($b === '') {
1219
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1220
+        erreur_squelette($msg, $p);
1221
+    } else {
1222
+        $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1223
+        $p->boucles[$b]->numrows = true;
1224
+        $p->interdire_scripts = false;
1225
+    }
1226 1226
 
1227
-	return $p;
1227
+    return $p;
1228 1228
 }
1229 1229
 
1230 1230
 
@@ -1252,10 +1252,10 @@  discard block
 block discarded – undo
1252 1252
  *     Pile complétée par le code à générer
1253 1253
  **/
1254 1254
 function balise_SELF_dist($p) {
1255
-	$p->code = 'self()';
1256
-	$p->interdire_scripts = false;
1255
+    $p->code = 'self()';
1256
+    $p->interdire_scripts = false;
1257 1257
 
1258
-	return $p;
1258
+    return $p;
1259 1259
 }
1260 1260
 
1261 1261
 
@@ -1282,17 +1282,17 @@  discard block
 block discarded – undo
1282 1282
  *     Pile complétée par le code à générer
1283 1283
  **/
1284 1284
 function balise_CHEMIN_dist($p) {
1285
-	$arg = interprete_argument_balise(1, $p);
1286
-	if (!$arg) {
1287
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1288
-		erreur_squelette($msg, $p);
1289
-	} else {
1290
-		$p->code = 'find_in_path(' . $arg . ')';
1291
-	}
1285
+    $arg = interprete_argument_balise(1, $p);
1286
+    if (!$arg) {
1287
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1288
+        erreur_squelette($msg, $p);
1289
+    } else {
1290
+        $p->code = 'find_in_path(' . $arg . ')';
1291
+    }
1292 1292
 
1293
-	$p->interdire_scripts = false;
1293
+    $p->interdire_scripts = false;
1294 1294
 
1295
-	return $p;
1295
+    return $p;
1296 1296
 }
1297 1297
 
1298 1298
 /**
@@ -1317,16 +1317,16 @@  discard block
 block discarded – undo
1317 1317
  *     Pile complétée par le code à générer
1318 1318
  **/
1319 1319
 function balise_CHEMIN_IMAGE_dist($p) {
1320
-	$arg = interprete_argument_balise(1, $p);
1321
-	if (!$arg) {
1322
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1323
-		erreur_squelette($msg, $p);
1324
-	} else {
1325
-		$p->code = 'chemin_image(' . $arg . ')';
1326
-	}
1320
+    $arg = interprete_argument_balise(1, $p);
1321
+    if (!$arg) {
1322
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1323
+        erreur_squelette($msg, $p);
1324
+    } else {
1325
+        $p->code = 'chemin_image(' . $arg . ')';
1326
+    }
1327 1327
 
1328
-	$p->interdire_scripts = false;
1329
-	return $p;
1328
+    $p->interdire_scripts = false;
1329
+    return $p;
1330 1330
 }
1331 1331
 
1332 1332
 
@@ -1364,36 +1364,36 @@  discard block
 block discarded – undo
1364 1364
  **/
1365 1365
 function balise_ENV_dist($p, $src = null) {
1366 1366
 
1367
-	// cle du tableau desiree
1368
-	$_nom = interprete_argument_balise(1, $p);
1369
-	// valeur par defaut
1370
-	$_sinon = interprete_argument_balise(2, $p);
1367
+    // cle du tableau desiree
1368
+    $_nom = interprete_argument_balise(1, $p);
1369
+    // valeur par defaut
1370
+    $_sinon = interprete_argument_balise(2, $p);
1371 1371
 
1372
-	// $src est un tableau de donnees sources eventuellement transmis
1373
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1372
+    // $src est un tableau de donnees sources eventuellement transmis
1373
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1374 1374
 
1375
-	if (!$_nom) {
1376
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1377
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1378
-		if ($src) {
1379
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1380
-		} else {
1381
-			$p->code = 'serialize($Pile[0]??[])';
1382
-		}
1383
-	} else {
1384
-		if (!$src) {
1385
-			$src = '$Pile[0]??[]';
1386
-		}
1387
-		if ($_sinon) {
1388
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1389
-		} else {
1390
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1391
-		}
1392
-	}
1375
+    if (!$_nom) {
1376
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1377
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1378
+        if ($src) {
1379
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1380
+        } else {
1381
+            $p->code = 'serialize($Pile[0]??[])';
1382
+        }
1383
+    } else {
1384
+        if (!$src) {
1385
+            $src = '$Pile[0]??[]';
1386
+        }
1387
+        if ($_sinon) {
1388
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1389
+        } else {
1390
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1391
+        }
1392
+    }
1393 1393
 
1394
-	#$p->interdire_scripts = true;
1394
+    #$p->interdire_scripts = true;
1395 1395
 
1396
-	return $p;
1396
+    return $p;
1397 1397
 }
1398 1398
 
1399 1399
 /**
@@ -1423,16 +1423,16 @@  discard block
 block discarded – undo
1423 1423
  *     Pile completée du code PHP d'exécution de la balise
1424 1424
  */
1425 1425
 function balise_CONFIG_dist($p) {
1426
-	if (!$arg = interprete_argument_balise(1, $p)) {
1427
-		$arg = "''";
1428
-	}
1429
-	$_sinon = interprete_argument_balise(2, $p);
1430
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1426
+    if (!$arg = interprete_argument_balise(1, $p)) {
1427
+        $arg = "''";
1428
+    }
1429
+    $_sinon = interprete_argument_balise(2, $p);
1430
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1431 1431
 
1432
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1433
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1432
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1433
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1434 1434
 
1435
-	return $p;
1435
+    return $p;
1436 1436
 }
1437 1437
 
1438 1438
 
@@ -1455,10 +1455,10 @@  discard block
 block discarded – undo
1455 1455
  *     Pile completée du code PHP d'exécution de la balise
1456 1456
  */
1457 1457
 function balise_CONNECT_dist($p) {
1458
-	$p->code = '($connect ? $connect : NULL)';
1459
-	$p->interdire_scripts = false;
1458
+    $p->code = '($connect ? $connect : NULL)';
1459
+    $p->interdire_scripts = false;
1460 1460
 
1461
-	return $p;
1461
+    return $p;
1462 1462
 }
1463 1463
 
1464 1464
 
@@ -1486,15 +1486,15 @@  discard block
 block discarded – undo
1486 1486
  *     Pile completée du code PHP d'exécution de la balise
1487 1487
  **/
1488 1488
 function balise_SESSION_dist($p) {
1489
-	$p->descr['session'] = true;
1489
+    $p->descr['session'] = true;
1490 1490
 
1491
-	$f = function_exists('balise_ENV')
1492
-		? 'balise_ENV'
1493
-		: 'balise_ENV_dist';
1491
+    $f = function_exists('balise_ENV')
1492
+        ? 'balise_ENV'
1493
+        : 'balise_ENV_dist';
1494 1494
 
1495
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1495
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1496 1496
 
1497
-	return $p;
1497
+    return $p;
1498 1498
 }
1499 1499
 
1500 1500
 
@@ -1517,18 +1517,18 @@  discard block
 block discarded – undo
1517 1517
  *     Pile completée du code PHP d'exécution de la balise
1518 1518
  **/
1519 1519
 function balise_SESSION_SET_dist($p) {
1520
-	$_nom = interprete_argument_balise(1, $p);
1521
-	$_val = interprete_argument_balise(2, $p);
1522
-	if (!$_nom or !$_val) {
1523
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1524
-		erreur_squelette($err_b_s_a, $p);
1525
-	} else {
1526
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1527
-	}
1520
+    $_nom = interprete_argument_balise(1, $p);
1521
+    $_val = interprete_argument_balise(2, $p);
1522
+    if (!$_nom or !$_val) {
1523
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1524
+        erreur_squelette($err_b_s_a, $p);
1525
+    } else {
1526
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1527
+    }
1528 1528
 
1529
-	$p->interdire_scripts = false;
1529
+    $p->interdire_scripts = false;
1530 1530
 
1531
-	return $p;
1531
+    return $p;
1532 1532
 }
1533 1533
 
1534 1534
 
@@ -1559,30 +1559,30 @@  discard block
 block discarded – undo
1559 1559
  *     Pile completée du code PHP d'exécution de la balise
1560 1560
  **/
1561 1561
 function balise_EVAL_dist($p) {
1562
-	$php = interprete_argument_balise(1, $p);
1563
-	if ($php) {
1564
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1565
-		# attention au commentaire "// x signes" qui precede
1566
-		if (
1567
-			preg_match(
1568
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1569
-				$php,
1570
-				$r
1571
-			)
1572
-		) {
1573
-			$p->code = /* $r[1]. */
1574
-				'(' . $r[2] . ')';
1575
-		} else {
1576
-			$p->code = "eval('return '.$php.';')";
1577
-		}
1578
-	} else {
1579
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1580
-		erreur_squelette($msg, $p);
1581
-	}
1582
-
1583
-	#$p->interdire_scripts = true;
1584
-
1585
-	return $p;
1562
+    $php = interprete_argument_balise(1, $p);
1563
+    if ($php) {
1564
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1565
+        # attention au commentaire "// x signes" qui precede
1566
+        if (
1567
+            preg_match(
1568
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1569
+                $php,
1570
+                $r
1571
+            )
1572
+        ) {
1573
+            $p->code = /* $r[1]. */
1574
+                '(' . $r[2] . ')';
1575
+        } else {
1576
+            $p->code = "eval('return '.$php.';')";
1577
+        }
1578
+    } else {
1579
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1580
+        erreur_squelette($msg, $p);
1581
+    }
1582
+
1583
+    #$p->interdire_scripts = true;
1584
+
1585
+    return $p;
1586 1586
 }
1587 1587
 
1588 1588
 
@@ -1612,19 +1612,19 @@  discard block
 block discarded – undo
1612 1612
  **/
1613 1613
 function balise_CHAMP_SQL_dist($p) {
1614 1614
 
1615
-	if (
1616
-		$p->param
1617
-		and isset($p->param[0][1][0])
1618
-		and $champ = ($p->param[0][1][0]->texte)
1619
-	) {
1620
-		$p->code = champ_sql($champ, $p);
1621
-	} else {
1622
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1623
-		erreur_squelette($err_b_s_a, $p);
1624
-	}
1615
+    if (
1616
+        $p->param
1617
+        and isset($p->param[0][1][0])
1618
+        and $champ = ($p->param[0][1][0]->texte)
1619
+    ) {
1620
+        $p->code = champ_sql($champ, $p);
1621
+    } else {
1622
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1623
+        erreur_squelette($err_b_s_a, $p);
1624
+    }
1625 1625
 
1626
-	#$p->interdire_scripts = true;
1627
-	return $p;
1626
+    #$p->interdire_scripts = true;
1627
+    return $p;
1628 1628
 }
1629 1629
 
1630 1630
 /**
@@ -1650,13 +1650,13 @@  discard block
 block discarded – undo
1650 1650
  *     Pile complétée par le code à générer
1651 1651
  **/
1652 1652
 function balise_VAL_dist($p) {
1653
-	$p->code = interprete_argument_balise(1, $p);
1654
-	if ($p->code === null || !strlen($p->code)) {
1655
-		$p->code = "''";
1656
-	}
1657
-	$p->interdire_scripts = false;
1653
+    $p->code = interprete_argument_balise(1, $p);
1654
+    if ($p->code === null || !strlen($p->code)) {
1655
+        $p->code = "''";
1656
+    }
1657
+    $p->interdire_scripts = false;
1658 1658
 
1659
-	return $p;
1659
+    return $p;
1660 1660
 }
1661 1661
 
1662 1662
 /**
@@ -1685,10 +1685,10 @@  discard block
 block discarded – undo
1685 1685
  *     Pile complétée par le code à générer
1686 1686
  **/
1687 1687
 function balise_REM_dist($p) {
1688
-	$p->code = "''";
1689
-	$p->interdire_scripts = false;
1688
+    $p->code = "''";
1689
+    $p->interdire_scripts = false;
1690 1690
 
1691
-	return $p;
1691
+    return $p;
1692 1692
 }
1693 1693
 
1694 1694
 /**
@@ -1698,10 +1698,10 @@  discard block
 block discarded – undo
1698 1698
  * @return mixed
1699 1699
  */
1700 1700
 function balise_NULL_dist($p) {
1701
-	$p->code = 'null';
1702
-	$p->interdire_scripts = false;
1701
+    $p->code = 'null';
1702
+    $p->interdire_scripts = false;
1703 1703
 
1704
-	return $p;
1704
+    return $p;
1705 1705
 }
1706 1706
 
1707 1707
 
@@ -1725,18 +1725,18 @@  discard block
 block discarded – undo
1725 1725
  **/
1726 1726
 function balise_HTTP_HEADER_dist($p) {
1727 1727
 
1728
-	$header = interprete_argument_balise(1, $p);
1729
-	if (!$header) {
1730
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1731
-		erreur_squelette($err_b_s_a, $p);
1732
-	} else {
1733
-		$p->code = "'<'.'?php header(' . _q("
1734
-			. $header
1735
-			. ") . '); ?'.'>'";
1736
-	}
1737
-	$p->interdire_scripts = false;
1728
+    $header = interprete_argument_balise(1, $p);
1729
+    if (!$header) {
1730
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1731
+        erreur_squelette($err_b_s_a, $p);
1732
+    } else {
1733
+        $p->code = "'<'.'?php header(' . _q("
1734
+            . $header
1735
+            . ") . '); ?'.'>'";
1736
+    }
1737
+    $p->interdire_scripts = false;
1738 1738
 
1739
-	return $p;
1739
+    return $p;
1740 1740
 }
1741 1741
 
1742 1742
 
@@ -1761,20 +1761,20 @@  discard block
 block discarded – undo
1761 1761
  *     Pile complétée par le code à générer
1762 1762
  **/
1763 1763
 function balise_FILTRE_dist($p) {
1764
-	if ($p->param) {
1765
-		$args = [];
1766
-		foreach ($p->param as $i => $ignore) {
1767
-			$args[] = interprete_argument_balise($i + 1, $p);
1768
-		}
1769
-		$p->code = "'<' . '"
1770
-			. '?php header("X-Spip-Filtre: \'.'
1771
-			. join('.\'|\'.', $args)
1772
-			. " . '\"); ?'.'>'";
1764
+    if ($p->param) {
1765
+        $args = [];
1766
+        foreach ($p->param as $i => $ignore) {
1767
+            $args[] = interprete_argument_balise($i + 1, $p);
1768
+        }
1769
+        $p->code = "'<' . '"
1770
+            . '?php header("X-Spip-Filtre: \'.'
1771
+            . join('.\'|\'.', $args)
1772
+            . " . '\"); ?'.'>'";
1773 1773
 
1774
-		$p->interdire_scripts = false;
1774
+        $p->interdire_scripts = false;
1775 1775
 
1776
-		return $p;
1777
-	}
1776
+        return $p;
1777
+    }
1778 1778
 }
1779 1779
 
1780 1780
 
@@ -1810,55 +1810,55 @@  discard block
 block discarded – undo
1810 1810
  **/
1811 1811
 function balise_CACHE_dist($p) {
1812 1812
 
1813
-	if ($p->param) {
1814
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1815
-
1816
-		// noter la duree du cache dans un entete proprietaire
1817
-
1818
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1819
-			. $duree
1820
-			. '"); ?' . "'.'>'";
1821
-
1822
-		// Remplir le header Cache-Control
1823
-		// cas #CACHE{0}
1824
-		if ($duree == 0) {
1825
-			$code .= ".'<'.'"
1826
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1827
-				. "'.'><'.'"
1828
-				. '?php header("Pragma: no-cache"); ?'
1829
-				. "'.'>'";
1830
-		}
1831
-
1832
-		// recuperer les parametres suivants
1833
-		$i = 1;
1834
-		while (isset($p->param[0][++$i])) {
1835
-			$pa = ($p->param[0][$i][0]->texte);
1836
-
1837
-			if (
1838
-				$pa == 'cache-client'
1839
-				and $duree > 0
1840
-			) {
1841
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1842
-					. $duree
1843
-					. '"); ?' . "'.'>'";
1844
-				// il semble logique, si on cache-client, de ne pas invalider
1845
-				$pa = 'statique';
1846
-			}
1847
-
1848
-			if (
1849
-				$pa == 'statique'
1850
-				and $duree > 0
1851
-			) {
1852
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1853
-			}
1854
-		}
1855
-	} else {
1856
-		$code = "''";
1857
-	}
1858
-	$p->code = $code;
1859
-	$p->interdire_scripts = false;
1860
-
1861
-	return $p;
1813
+    if ($p->param) {
1814
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1815
+
1816
+        // noter la duree du cache dans un entete proprietaire
1817
+
1818
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1819
+            . $duree
1820
+            . '"); ?' . "'.'>'";
1821
+
1822
+        // Remplir le header Cache-Control
1823
+        // cas #CACHE{0}
1824
+        if ($duree == 0) {
1825
+            $code .= ".'<'.'"
1826
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1827
+                . "'.'><'.'"
1828
+                . '?php header("Pragma: no-cache"); ?'
1829
+                . "'.'>'";
1830
+        }
1831
+
1832
+        // recuperer les parametres suivants
1833
+        $i = 1;
1834
+        while (isset($p->param[0][++$i])) {
1835
+            $pa = ($p->param[0][$i][0]->texte);
1836
+
1837
+            if (
1838
+                $pa == 'cache-client'
1839
+                and $duree > 0
1840
+            ) {
1841
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1842
+                    . $duree
1843
+                    . '"); ?' . "'.'>'";
1844
+                // il semble logique, si on cache-client, de ne pas invalider
1845
+                $pa = 'statique';
1846
+            }
1847
+
1848
+            if (
1849
+                $pa == 'statique'
1850
+                and $duree > 0
1851
+            ) {
1852
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1853
+            }
1854
+        }
1855
+    } else {
1856
+        $code = "''";
1857
+    }
1858
+    $p->code = $code;
1859
+    $p->interdire_scripts = false;
1860
+
1861
+    return $p;
1862 1862
 }
1863 1863
 
1864 1864
 
@@ -1890,13 +1890,13 @@  discard block
 block discarded – undo
1890 1890
  *     Pile complétée par le code à générer
1891 1891
  */
1892 1892
 function balise_INSERT_HEAD_dist($p) {
1893
-	$p->code = "'<'.'"
1894
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1895
-		. "'.'>'";
1896
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1897
-	$p->interdire_scripts = false;
1893
+    $p->code = "'<'.'"
1894
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1895
+        . "'.'>'";
1896
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1897
+    $p->interdire_scripts = false;
1898 1898
 
1899
-	return $p;
1899
+    return $p;
1900 1900
 }
1901 1901
 
1902 1902
 /**
@@ -1914,10 +1914,10 @@  discard block
 block discarded – undo
1914 1914
  *     Pile complétée par le code à générer
1915 1915
  */
1916 1916
 function balise_INSERT_HEAD_CSS_dist($p) {
1917
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1918
-	$p->interdire_scripts = false;
1917
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1918
+    $p->interdire_scripts = false;
1919 1919
 
1920
-	return $p;
1920
+    return $p;
1921 1921
 }
1922 1922
 
1923 1923
 /**
@@ -1932,11 +1932,11 @@  discard block
 block discarded – undo
1932 1932
  *     Pile complétée par le code à générer
1933 1933
  **/
1934 1934
 function balise_INCLUDE_dist($p) {
1935
-	if (function_exists('balise_INCLURE')) {
1936
-		return balise_INCLURE($p);
1937
-	} else {
1938
-		return balise_INCLURE_dist($p);
1939
-	}
1935
+    if (function_exists('balise_INCLURE')) {
1936
+        return balise_INCLURE($p);
1937
+    } else {
1938
+        return balise_INCLURE_dist($p);
1939
+    }
1940 1940
 }
1941 1941
 
1942 1942
 /**
@@ -1970,66 +1970,66 @@  discard block
 block discarded – undo
1970 1970
  *     Pile complétée par le code à générer
1971 1971
  **/
1972 1972
 function balise_INCLURE_dist($p) {
1973
-	$id_boucle = $p->id_boucle;
1974
-	// la lang n'est pas passe de facon automatique par argumenter
1975
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1976
-	// en option
1977
-
1978
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1979
-
1980
-	// erreur de syntaxe = fond absent
1981
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1982
-	if (!$_contexte) {
1983
-		$contexte = [];
1984
-	}
1985
-
1986
-	if (isset($_contexte['fond'])) {
1987
-		$f = $_contexte['fond'];
1988
-		// toujours vrai :
1989
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1990
-			$f = $r[1];
1991
-			unset($_contexte['fond']);
1992
-		} else {
1993
-			spip_log('compilation de #INCLURE a revoir');
1994
-		}
1995
-
1996
-		// #INCLURE{doublons}
1997
-		if (isset($_contexte['doublons'])) {
1998
-			$_contexte['doublons'] = "'doublons' => \$doublons";
1999
-		}
2000
-
2001
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2002
-		$flag_env = false;
2003
-		if (isset($_contexte['env']) or isset($_contexte['self'])) {
2004
-			$flag_env = true;
2005
-			unset($_contexte['env']);
2006
-		}
2007
-
2008
-		$_options = [];
2009
-		if (isset($_contexte['ajax'])) {
2010
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2011
-			unset($_contexte['ajax']);
2012
-		}
2013
-		if ($p->etoile) {
2014
-			$_options[] = "'etoile'=>true";
2015
-		}
2016
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2017
-
2018
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2019
-		if ($flag_env) {
2020
-			$_l = "array_merge(\$Pile[0],$_l)";
2021
-		}
2022
-
2023
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2024
-	} elseif (!isset($_contexte[1])) {
2025
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2026
-		erreur_squelette($msg, $p);
2027
-	} else {
2028
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2029
-	}
2030
-
2031
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2032
-	return $p;
1973
+    $id_boucle = $p->id_boucle;
1974
+    // la lang n'est pas passe de facon automatique par argumenter
1975
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1976
+    // en option
1977
+
1978
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1979
+
1980
+    // erreur de syntaxe = fond absent
1981
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1982
+    if (!$_contexte) {
1983
+        $contexte = [];
1984
+    }
1985
+
1986
+    if (isset($_contexte['fond'])) {
1987
+        $f = $_contexte['fond'];
1988
+        // toujours vrai :
1989
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1990
+            $f = $r[1];
1991
+            unset($_contexte['fond']);
1992
+        } else {
1993
+            spip_log('compilation de #INCLURE a revoir');
1994
+        }
1995
+
1996
+        // #INCLURE{doublons}
1997
+        if (isset($_contexte['doublons'])) {
1998
+            $_contexte['doublons'] = "'doublons' => \$doublons";
1999
+        }
2000
+
2001
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2002
+        $flag_env = false;
2003
+        if (isset($_contexte['env']) or isset($_contexte['self'])) {
2004
+            $flag_env = true;
2005
+            unset($_contexte['env']);
2006
+        }
2007
+
2008
+        $_options = [];
2009
+        if (isset($_contexte['ajax'])) {
2010
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2011
+            unset($_contexte['ajax']);
2012
+        }
2013
+        if ($p->etoile) {
2014
+            $_options[] = "'etoile'=>true";
2015
+        }
2016
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2017
+
2018
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2019
+        if ($flag_env) {
2020
+            $_l = "array_merge(\$Pile[0],$_l)";
2021
+        }
2022
+
2023
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2024
+    } elseif (!isset($_contexte[1])) {
2025
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2026
+        erreur_squelette($msg, $p);
2027
+    } else {
2028
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2029
+    }
2030
+
2031
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2032
+    return $p;
2033 2033
 }
2034 2034
 
2035 2035
 
@@ -2057,69 +2057,69 @@  discard block
 block discarded – undo
2057 2057
  **/
2058 2058
 function balise_MODELE_dist($p) {
2059 2059
 
2060
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2061
-
2062
-	// erreur de syntaxe = fond absent
2063
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2064
-	if (!$_contexte) {
2065
-		$_contexte = [];
2066
-	}
2067
-
2068
-	if (!isset($_contexte[1])) {
2069
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2070
-		erreur_squelette($msg, $p);
2071
-	} else {
2072
-		$nom = $_contexte[1];
2073
-		unset($_contexte[1]);
2074
-
2075
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2076
-			$nom = "'modeles/" . substr($nom, 1);
2077
-		} else {
2078
-			$nom = "'modeles/' . $nom";
2079
-		}
2080
-
2081
-		$flag_env = false;
2082
-		if (isset($_contexte['env'])) {
2083
-			$flag_env = true;
2084
-			unset($_contexte['env']);
2085
-		}
2086
-
2087
-		// Incoherence dans la syntaxe du contexte. A revoir.
2088
-		// Reserver la cle primaire de la boucle courante si elle existe
2089
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2090
-			$primary = $p->boucles[$p->id_boucle]->primary;
2091
-			if (!strpos($primary, ',')) {
2092
-				$id = champ_sql($primary, $p);
2093
-				$_contexte[] = "'$primary'=>" . $id;
2094
-				$_contexte[] = "'id'=>" . $id;
2095
-			}
2096
-		}
2097
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2098
-		$connect = '';
2099
-		if (isset($p->boucles[$p->id_boucle])) {
2100
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2101
-		}
2102
-
2103
-		$_options = memoriser_contexte_compil($p);
2104
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2105
-		if (isset($_contexte['ajax'])) {
2106
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2107
-			unset($_contexte['ajax']);
2108
-		}
2109
-
2110
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2111
-		if ($flag_env) {
2112
-			$_l = "array_merge(\$Pile[0],$_l)";
2113
-		}
2114
-
2115
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2116
-
2117
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2118
-
2119
-		$p->interdire_scripts = false; // securite assuree par le squelette
2120
-	}
2121
-
2122
-	return $p;
2060
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2061
+
2062
+    // erreur de syntaxe = fond absent
2063
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2064
+    if (!$_contexte) {
2065
+        $_contexte = [];
2066
+    }
2067
+
2068
+    if (!isset($_contexte[1])) {
2069
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2070
+        erreur_squelette($msg, $p);
2071
+    } else {
2072
+        $nom = $_contexte[1];
2073
+        unset($_contexte[1]);
2074
+
2075
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2076
+            $nom = "'modeles/" . substr($nom, 1);
2077
+        } else {
2078
+            $nom = "'modeles/' . $nom";
2079
+        }
2080
+
2081
+        $flag_env = false;
2082
+        if (isset($_contexte['env'])) {
2083
+            $flag_env = true;
2084
+            unset($_contexte['env']);
2085
+        }
2086
+
2087
+        // Incoherence dans la syntaxe du contexte. A revoir.
2088
+        // Reserver la cle primaire de la boucle courante si elle existe
2089
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2090
+            $primary = $p->boucles[$p->id_boucle]->primary;
2091
+            if (!strpos($primary, ',')) {
2092
+                $id = champ_sql($primary, $p);
2093
+                $_contexte[] = "'$primary'=>" . $id;
2094
+                $_contexte[] = "'id'=>" . $id;
2095
+            }
2096
+        }
2097
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2098
+        $connect = '';
2099
+        if (isset($p->boucles[$p->id_boucle])) {
2100
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2101
+        }
2102
+
2103
+        $_options = memoriser_contexte_compil($p);
2104
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2105
+        if (isset($_contexte['ajax'])) {
2106
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2107
+            unset($_contexte['ajax']);
2108
+        }
2109
+
2110
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2111
+        if ($flag_env) {
2112
+            $_l = "array_merge(\$Pile[0],$_l)";
2113
+        }
2114
+
2115
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2116
+
2117
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2118
+
2119
+        $p->interdire_scripts = false; // securite assuree par le squelette
2120
+    }
2121
+
2122
+    return $p;
2123 2123
 }
2124 2124
 
2125 2125
 
@@ -2143,21 +2143,21 @@  discard block
 block discarded – undo
2143 2143
  *     Pile complétée par le code à générer
2144 2144
  **/
2145 2145
 function balise_SET_dist($p) {
2146
-	$_nom = interprete_argument_balise(1, $p);
2147
-	$_val = interprete_argument_balise(2, $p);
2146
+    $_nom = interprete_argument_balise(1, $p);
2147
+    $_val = interprete_argument_balise(2, $p);
2148 2148
 
2149
-	if (!$_nom or !$_val) {
2150
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2151
-		erreur_squelette($err_b_s_a, $p);
2152
-	}
2153
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2154
-	// cf https://bugs.php.net/bug.php?id=65845
2155
-	else {
2156
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2157
-	}
2149
+    if (!$_nom or !$_val) {
2150
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2151
+        erreur_squelette($err_b_s_a, $p);
2152
+    }
2153
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2154
+    // cf https://bugs.php.net/bug.php?id=65845
2155
+    else {
2156
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2157
+    }
2158 2158
 
2159
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2160
-	return $p;
2159
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2160
+    return $p;
2161 2161
 }
2162 2162
 
2163 2163
 
@@ -2187,12 +2187,12 @@  discard block
 block discarded – undo
2187 2187
  *     Pile complétée par le code à générer
2188 2188
  **/
2189 2189
 function balise_GET_dist($p) {
2190
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2191
-	if (function_exists('balise_ENV')) {
2192
-		return balise_ENV($p, '$Pile["vars"]??[]');
2193
-	} else {
2194
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2195
-	}
2190
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2191
+    if (function_exists('balise_ENV')) {
2192
+        return balise_ENV($p, '$Pile["vars"]??[]');
2193
+    } else {
2194
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2195
+    }
2196 2196
 }
2197 2197
 
2198 2198
 
@@ -2215,22 +2215,22 @@  discard block
 block discarded – undo
2215 2215
  *     Pile complétée par le code à générer
2216 2216
  **/
2217 2217
 function balise_DOUBLONS_dist($p) {
2218
-	if ($type = interprete_argument_balise(1, $p)) {
2219
-		if ($famille = interprete_argument_balise(2, $p)) {
2220
-			$type .= '.' . $famille;
2221
-		}
2222
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2223
-		if (!$p->etoile) {
2224
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2225
-				. $p->code . ')))';
2226
-		}
2227
-	} else {
2228
-		$p->code = '$doublons';
2229
-	}
2218
+    if ($type = interprete_argument_balise(1, $p)) {
2219
+        if ($famille = interprete_argument_balise(2, $p)) {
2220
+            $type .= '.' . $famille;
2221
+        }
2222
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2223
+        if (!$p->etoile) {
2224
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2225
+                . $p->code . ')))';
2226
+        }
2227
+    } else {
2228
+        $p->code = '$doublons';
2229
+    }
2230 2230
 
2231
-	$p->interdire_scripts = false;
2231
+    $p->interdire_scripts = false;
2232 2232
 
2233
-	return $p;
2233
+    return $p;
2234 2234
 }
2235 2235
 
2236 2236
 
@@ -2253,18 +2253,18 @@  discard block
 block discarded – undo
2253 2253
  *     Pile complétée par le code à générer
2254 2254
  **/
2255 2255
 function balise_PIPELINE_dist($p) {
2256
-	$_pipe = interprete_argument_balise(1, $p);
2257
-	if (!$_pipe) {
2258
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2259
-		erreur_squelette($err_b_s_a, $p);
2260
-	} else {
2261
-		$_flux = interprete_argument_balise(2, $p);
2262
-		$_flux = $_flux ?: "''";
2263
-		$p->code = "pipeline( $_pipe , $_flux )";
2264
-		$p->interdire_scripts = false;
2265
-	}
2256
+    $_pipe = interprete_argument_balise(1, $p);
2257
+    if (!$_pipe) {
2258
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2259
+        erreur_squelette($err_b_s_a, $p);
2260
+    } else {
2261
+        $_flux = interprete_argument_balise(2, $p);
2262
+        $_flux = $_flux ?: "''";
2263
+        $p->code = "pipeline( $_pipe , $_flux )";
2264
+        $p->interdire_scripts = false;
2265
+    }
2266 2266
 
2267
-	return $p;
2267
+    return $p;
2268 2268
 }
2269 2269
 
2270 2270
 
@@ -2289,10 +2289,10 @@  discard block
 block discarded – undo
2289 2289
  *     Pile complétée par le code à générer
2290 2290
  **/
2291 2291
 function balise_EDIT_dist($p) {
2292
-	$p->code = "''";
2293
-	$p->interdire_scripts = false;
2292
+    $p->code = "''";
2293
+    $p->interdire_scripts = false;
2294 2294
 
2295
-	return $p;
2295
+    return $p;
2296 2296
 }
2297 2297
 
2298 2298
 
@@ -2315,11 +2315,11 @@  discard block
 block discarded – undo
2315 2315
  *     Pile complétée par le code à générer
2316 2316
  **/
2317 2317
 function balise_TOTAL_UNIQUE_dist($p) {
2318
-	$_famille = interprete_argument_balise(1, $p);
2319
-	$_famille = $_famille ?: "''";
2320
-	$p->code = "unique('', $_famille, true)";
2318
+    $_famille = interprete_argument_balise(1, $p);
2319
+    $_famille = $_famille ?: "''";
2320
+    $p->code = "unique('', $_famille, true)";
2321 2321
 
2322
-	return $p;
2322
+    return $p;
2323 2323
 }
2324 2324
 
2325 2325
 /**
@@ -2342,19 +2342,19 @@  discard block
 block discarded – undo
2342 2342
  *     Pile complétée par le code à générer
2343 2343
  **/
2344 2344
 function balise_ARRAY_dist($p) {
2345
-	$_code = [];
2346
-	$n = 1;
2347
-	do {
2348
-		$_key = interprete_argument_balise($n++, $p);
2349
-		$_val = interprete_argument_balise($n++, $p);
2350
-		if ($_key and $_val) {
2351
-			$_code[] = "$_key => $_val";
2352
-		}
2353
-	} while ($_key && $_val);
2354
-	$p->code = 'array(' . join(', ', $_code) . ')';
2355
-	$p->interdire_scripts = false;
2345
+    $_code = [];
2346
+    $n = 1;
2347
+    do {
2348
+        $_key = interprete_argument_balise($n++, $p);
2349
+        $_val = interprete_argument_balise($n++, $p);
2350
+        if ($_key and $_val) {
2351
+            $_code[] = "$_key => $_val";
2352
+        }
2353
+    } while ($_key && $_val);
2354
+    $p->code = 'array(' . join(', ', $_code) . ')';
2355
+    $p->interdire_scripts = false;
2356 2356
 
2357
-	return $p;
2357
+    return $p;
2358 2358
 }
2359 2359
 
2360 2360
 /**
@@ -2373,15 +2373,15 @@  discard block
 block discarded – undo
2373 2373
  *     Pile complétée par le code à générer
2374 2374
  */
2375 2375
 function balise_LISTE_dist($p) {
2376
-	$_code = [];
2377
-	$n = 1;
2378
-	while ($_val = interprete_argument_balise($n++, $p)) {
2379
-		$_code[] = $_val;
2380
-	}
2381
-	$p->code = 'array(' . join(', ', $_code) . ')';
2382
-	$p->interdire_scripts = false;
2376
+    $_code = [];
2377
+    $n = 1;
2378
+    while ($_val = interprete_argument_balise($n++, $p)) {
2379
+        $_code[] = $_val;
2380
+    }
2381
+    $p->code = 'array(' . join(', ', $_code) . ')';
2382
+    $p->interdire_scripts = false;
2383 2383
 
2384
-	return $p;
2384
+    return $p;
2385 2385
 }
2386 2386
 
2387 2387
 
@@ -2415,21 +2415,21 @@  discard block
 block discarded – undo
2415 2415
  *     Pile complétée par le code à générer
2416 2416
  **/
2417 2417
 function balise_AUTORISER_dist($p) {
2418
-	$_code = [];
2419
-	$p->descr['session'] = true; // faire un cache par session
2418
+    $_code = [];
2419
+    $p->descr['session'] = true; // faire un cache par session
2420 2420
 
2421
-	$n = 1;
2422
-	while ($_v = interprete_argument_balise($n++, $p)) {
2423
-		$_code[] = $_v;
2424
-	}
2421
+    $n = 1;
2422
+    while ($_v = interprete_argument_balise($n++, $p)) {
2423
+        $_code[] = $_v;
2424
+    }
2425 2425
 
2426
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2427
-		', ',
2428
-		$_code
2429
-	) . ')?" ":"")';
2430
-	$p->interdire_scripts = false;
2426
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2427
+        ', ',
2428
+        $_code
2429
+    ) . ')?" ":"")';
2430
+    $p->interdire_scripts = false;
2431 2431
 
2432
-	return $p;
2432
+    return $p;
2433 2433
 }
2434 2434
 
2435 2435
 
@@ -2453,15 +2453,15 @@  discard block
 block discarded – undo
2453 2453
  *     Pile complétée par le code à générer
2454 2454
  **/
2455 2455
 function balise_PLUGIN_dist($p) {
2456
-	$plugin = interprete_argument_balise(1, $p);
2457
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2458
-	$type_info = interprete_argument_balise(2, $p);
2459
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2456
+    $plugin = interprete_argument_balise(1, $p);
2457
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2458
+    $type_info = interprete_argument_balise(2, $p);
2459
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2460 2460
 
2461
-	$f = chercher_filtre('info_plugin');
2462
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2461
+    $f = chercher_filtre('info_plugin');
2462
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2463 2463
 
2464
-	return $p;
2464
+    return $p;
2465 2465
 }
2466 2466
 
2467 2467
 /**
@@ -2482,9 +2482,9 @@  discard block
 block discarded – undo
2482 2482
  *     Pile complétée par le code à générer
2483 2483
  **/
2484 2484
 function balise_AIDER_dist($p) {
2485
-	$_motif = interprete_argument_balise(1, $p);
2486
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2487
-	return $p;
2485
+    $_motif = interprete_argument_balise(1, $p);
2486
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2487
+    return $p;
2488 2488
 }
2489 2489
 
2490 2490
 /**
@@ -2510,16 +2510,16 @@  discard block
 block discarded – undo
2510 2510
  *     Pile complétée par le code à générer
2511 2511
  **/
2512 2512
 function balise_ACTION_FORMULAIRE($p) {
2513
-	if (!$_url = interprete_argument_balise(1, $p)) {
2514
-		$_url = "(\$Pile[0]['action'] ?? '')";
2515
-	}
2516
-	if (!$_form = interprete_argument_balise(2, $p)) {
2517
-		$_form = "(\$Pile[0]['form'] ?? '')";
2518
-	}
2519
-
2520
-	// envoyer le nom du formulaire que l'on traite
2521
-	// transmettre les eventuels args de la balise formulaire
2522
-	$p->code = "	'<span class=\"form-hidden\">' .
2513
+    if (!$_url = interprete_argument_balise(1, $p)) {
2514
+        $_url = "(\$Pile[0]['action'] ?? '')";
2515
+    }
2516
+    if (!$_form = interprete_argument_balise(2, $p)) {
2517
+        $_form = "(\$Pile[0]['form'] ?? '')";
2518
+    }
2519
+
2520
+    // envoyer le nom du formulaire que l'on traite
2521
+    // transmettre les eventuels args de la balise formulaire
2522
+    $p->code = "	'<span class=\"form-hidden\">' .
2523 2523
 	form_hidden($_url) .
2524 2524
 	'<input name=\'formulaire_action\' type=\'hidden\'
2525 2525
 		value=\'' . $_form . '\' />' .
@@ -2530,9 +2530,9 @@  discard block
 block discarded – undo
2530 2530
 	(\$Pile[0]['_hidden'] ?? '') .
2531 2531
 	'</span>'";
2532 2532
 
2533
-	$p->interdire_scripts = false;
2533
+    $p->interdire_scripts = false;
2534 2534
 
2535
-	return $p;
2535
+    return $p;
2536 2536
 }
2537 2537
 
2538 2538
 
@@ -2573,25 +2573,25 @@  discard block
 block discarded – undo
2573 2573
  */
2574 2574
 function balise_BOUTON_ACTION_dist($p) {
2575 2575
 
2576
-	$args = [];
2577
-	for ($k = 1; $k <= 6; $k++) {
2578
-		$_a = interprete_argument_balise($k, $p);
2579
-		if (!$_a) {
2580
-			$_a = "''";
2581
-		}
2582
-		$args[] = $_a;
2583
-	}
2584
-	// supprimer les args vides
2585
-	while (end($args) == "''" and count($args) > 2) {
2586
-		array_pop($args);
2587
-	}
2588
-	$args = implode(',', $args);
2576
+    $args = [];
2577
+    for ($k = 1; $k <= 6; $k++) {
2578
+        $_a = interprete_argument_balise($k, $p);
2579
+        if (!$_a) {
2580
+            $_a = "''";
2581
+        }
2582
+        $args[] = $_a;
2583
+    }
2584
+    // supprimer les args vides
2585
+    while (end($args) == "''" and count($args) > 2) {
2586
+        array_pop($args);
2587
+    }
2588
+    $args = implode(',', $args);
2589 2589
 
2590
-	$bouton_action = chercher_filtre('bouton_action');
2591
-	$p->code = "$bouton_action($args)";
2592
-	$p->interdire_scripts = false;
2590
+    $bouton_action = chercher_filtre('bouton_action');
2591
+    $p->code = "$bouton_action($args)";
2592
+    $p->interdire_scripts = false;
2593 2593
 
2594
-	return $p;
2594
+    return $p;
2595 2595
 }
2596 2596
 
2597 2597
 
@@ -2610,10 +2610,10 @@  discard block
 block discarded – undo
2610 2610
  *     Pile complétée par le code à générer
2611 2611
  */
2612 2612
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2613
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2613
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2614 2614
 
2615
-	#$p->interdire_scripts = true;
2616
-	return $p;
2615
+    #$p->interdire_scripts = true;
2616
+    return $p;
2617 2617
 }
2618 2618
 
2619 2619
 
@@ -2637,10 +2637,10 @@  discard block
 block discarded – undo
2637 2637
  *     Pile complétée par le code à générer
2638 2638
  */
2639 2639
 function balise_HTML5_dist($p) {
2640
-	$p->code = html5_permis() ? "' '" : "''";
2641
-	$p->interdire_scripts = false;
2640
+    $p->code = html5_permis() ? "' '" : "''";
2641
+    $p->interdire_scripts = false;
2642 2642
 
2643
-	return $p;
2643
+    return $p;
2644 2644
 }
2645 2645
 
2646 2646
 
@@ -2666,61 +2666,61 @@  discard block
 block discarded – undo
2666 2666
  *     Pile complétée par le code à générer
2667 2667
  */
2668 2668
 function balise_TRI_dist($p, $liste = 'true') {
2669
-	$b = index_boucle_mere($p);
2670
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2671
-	if ($b === '') {
2672
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2673
-		erreur_squelette($msg, $p);
2674
-		$p->code = "''";
2669
+    $b = index_boucle_mere($p);
2670
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2671
+    if ($b === '') {
2672
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2673
+        erreur_squelette($msg, $p);
2674
+        $p->code = "''";
2675 2675
 
2676
-		return $p;
2677
-	}
2678
-	$boucle = $p->boucles[$b];
2676
+        return $p;
2677
+    }
2678
+    $boucle = $p->boucles[$b];
2679 2679
 
2680
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2681
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2682
-	if (!isset($boucle->modificateur['tri_champ'])) {
2683
-		$msg = ['zbug_champ_hors_critere', [
2684
-			'champ' => zbug_presenter_champ($p),
2685
-			'critere' => 'tri'
2686
-		]];
2687
-		erreur_squelette($msg, $p);
2688
-		$p->code = "''";
2680
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2681
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2682
+    if (!isset($boucle->modificateur['tri_champ'])) {
2683
+        $msg = ['zbug_champ_hors_critere', [
2684
+            'champ' => zbug_presenter_champ($p),
2685
+            'critere' => 'tri'
2686
+        ]];
2687
+        erreur_squelette($msg, $p);
2688
+        $p->code = "''";
2689 2689
 
2690
-		return $p;
2691
-	}
2690
+        return $p;
2691
+    }
2692 2692
 
2693
-	$_champ = interprete_argument_balise(1, $p);
2694
-	// si pas de champ, renvoyer le critere de tri utilise
2695
-	if (!$_champ) {
2696
-		$p->code = $boucle->modificateur['tri_champ'];
2693
+    $_champ = interprete_argument_balise(1, $p);
2694
+    // si pas de champ, renvoyer le critere de tri utilise
2695
+    if (!$_champ) {
2696
+        $p->code = $boucle->modificateur['tri_champ'];
2697 2697
 
2698
-		return $p;
2699
-	}
2700
-	// forcer la jointure si besoin, et si le champ est statique
2701
-	if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2702
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2703
-	}
2698
+        return $p;
2699
+    }
2700
+    // forcer la jointure si besoin, et si le champ est statique
2701
+    if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) {
2702
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2703
+    }
2704 2704
 
2705
-	$_libelle = interprete_argument_balise(2, $p);
2706
-	$_libelle = $_libelle ?: $_champ;
2705
+    $_libelle = interprete_argument_balise(2, $p);
2706
+    $_libelle = $_libelle ?: $_champ;
2707 2707
 
2708
-	$_class = interprete_argument_balise(3, $p);
2709
-	// si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2710
-	// si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2711
-	$_issens = "in_array($_champ,array('>','<'))";
2712
-	$_sens = "(strpos('< >',$_champ)-1)";
2708
+    $_class = interprete_argument_balise(3, $p);
2709
+    // si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1
2710
+    // si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1
2711
+    $_issens = "in_array($_champ,array('>','<'))";
2712
+    $_sens = "(strpos('< >',$_champ)-1)";
2713 2713
 
2714
-	$_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2715
-	$_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2716
-	$_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2717
-	$_on = '$s?(' . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2714
+    $_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom'];
2715
+    $_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)";
2716
+    $_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')";
2717
+    $_on = '$s?(' . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)";
2718 2718
 
2719
-	$p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : '') . ')';
2720
-	//$p->code = "''";
2721
-	$p->interdire_scripts = false;
2719
+    $p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : '') . ')';
2720
+    //$p->code = "''";
2721
+    $p->interdire_scripts = false;
2722 2722
 
2723
-	return $p;
2723
+    return $p;
2724 2724
 }
2725 2725
 
2726 2726
 
@@ -2741,21 +2741,21 @@  discard block
 block discarded – undo
2741 2741
  *     Pile complétée par le code à générer
2742 2742
  */
2743 2743
 function balise_SAUTER_dist($p) {
2744
-	$id_boucle = $p->id_boucle;
2744
+    $id_boucle = $p->id_boucle;
2745 2745
 
2746
-	if (empty($p->boucles[$id_boucle])) {
2747
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2748
-		erreur_squelette($msg, $p);
2749
-	} else {
2750
-		$_saut = interprete_argument_balise(1, $p);
2751
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2752
-		$_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2746
+    if (empty($p->boucles[$id_boucle])) {
2747
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2748
+        erreur_squelette($msg, $p);
2749
+    } else {
2750
+        $_saut = interprete_argument_balise(1, $p);
2751
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2752
+        $_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2753 2753
 
2754
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2755
-	}
2756
-	$p->interdire_scripts = false;
2754
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2755
+    }
2756
+    $p->interdire_scripts = false;
2757 2757
 
2758
-	return $p;
2758
+    return $p;
2759 2759
 }
2760 2760
 
2761 2761
 
@@ -2777,22 +2777,22 @@  discard block
 block discarded – undo
2777 2777
  *     Pile complétée par le code à générer
2778 2778
  */
2779 2779
 function balise_PUBLIE_dist($p) {
2780
-	if (!$_type = interprete_argument_balise(1, $p)) {
2781
-		$_type = _q($p->type_requete);
2782
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2783
-	} else {
2784
-		$_id = interprete_argument_balise(2, $p);
2785
-	}
2780
+    if (!$_type = interprete_argument_balise(1, $p)) {
2781
+        $_type = _q($p->type_requete);
2782
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2783
+    } else {
2784
+        $_id = interprete_argument_balise(2, $p);
2785
+    }
2786 2786
 
2787
-	$connect = '';
2788
-	if (isset($p->boucles[$p->id_boucle])) {
2789
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2790
-	}
2787
+    $connect = '';
2788
+    if (isset($p->boucles[$p->id_boucle])) {
2789
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2790
+    }
2791 2791
 
2792
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2793
-	$p->interdire_scripts = false;
2792
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2793
+    $p->interdire_scripts = false;
2794 2794
 
2795
-	return $p;
2795
+    return $p;
2796 2796
 }
2797 2797
 
2798 2798
 /**
@@ -2821,12 +2821,12 @@  discard block
 block discarded – undo
2821 2821
  *     Pile complétée par le code à générer
2822 2822
  */
2823 2823
 function balise_PRODUIRE_dist($p) {
2824
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2825
-	$p = $balise_inclure($p);
2824
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2825
+    $p = $balise_inclure($p);
2826 2826
 
2827
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2827
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2828 2828
 
2829
-	return $p;
2829
+    return $p;
2830 2830
 }
2831 2831
 
2832 2832
 /**
@@ -2845,13 +2845,13 @@  discard block
 block discarded – undo
2845 2845
  *     Pile complétée par le code à générer
2846 2846
  */
2847 2847
 function balise_LARGEUR_ECRAN_dist($p) {
2848
-	$_class = interprete_argument_balise(1, $p);
2849
-	if (!$_class) {
2850
-		$_class = 'null';
2851
-	}
2852
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2848
+    $_class = interprete_argument_balise(1, $p);
2849
+    if (!$_class) {
2850
+        $_class = 'null';
2851
+    }
2852
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2853 2853
 
2854
-	return $p;
2854
+    return $p;
2855 2855
 }
2856 2856
 
2857 2857
 
@@ -2867,14 +2867,14 @@  discard block
 block discarded – undo
2867 2867
  *     Pile complétée par le code à générer
2868 2868
  **/
2869 2869
 function balise_CONST_dist($p) {
2870
-	$_const = interprete_argument_balise(1, $p);
2871
-	if (!strlen($_const)) {
2872
-		$p->code = "''";
2873
-	}
2874
-	else {
2875
-		$p->code = "(defined($_const)?constant($_const):'')";
2876
-	}
2877
-	$p->interdire_scripts = false;
2878
-
2879
-	return $p;
2870
+    $_const = interprete_argument_balise(1, $p);
2871
+    if (!strlen($_const)) {
2872
+        $p->code = "''";
2873
+    }
2874
+    else {
2875
+        $p->code = "(defined($_const)?constant($_const):'')";
2876
+    }
2877
+    $p->interdire_scripts = false;
2878
+
2879
+    return $p;
2880 2880
 }
Please login to merge, or discard this patch.
ecrire/public/cacher.php 1 patch
Indentation   +320 added lines, -320 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 /**
@@ -27,9 +27,9 @@  discard block
 block discarded – undo
27 27
  * @return string
28 28
  */
29 29
 function generer_nom_fichier_cache($contexte, $page) {
30
-	$u = md5(var_export([$contexte, $page], true));
30
+    $u = md5(var_export([$contexte, $page], true));
31 31
 
32
-	return $u . '.cache';
32
+    return $u . '.cache';
33 33
 }
34 34
 
35 35
 /**
@@ -45,26 +45,26 @@  discard block
 block discarded – undo
45 45
  * @return string
46 46
  */
47 47
 function cache_chemin_fichier($nom_cache, $ecrire = false) {
48
-	static $l1, $l2;
49
-	if (is_null($l1)) {
50
-		$length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
51
-		$l1 = intval(floor($length / 2));
52
-		$l2 = $length - $l1;
53
-	}
54
-	$d = substr($nom_cache, 0, $l1);
55
-	$u = substr($nom_cache, $l1, $l2);
56
-
57
-	if ($ecrire) {
58
-		$rep = sous_repertoire(_DIR_CACHE, '', false, true);
59
-		$rep = sous_repertoire($rep, 'calcul/', false, true);
60
-		$rep = sous_repertoire($rep, $d, false, true);
61
-	}
62
-	else {
63
-		// en lecture on essaye pas de creer les repertoires, on va au plus vite
64
-		$rep = _DIR_CACHE . "calcul/$d/";
65
-	}
66
-
67
-	return $rep . $u . '.cache';
48
+    static $l1, $l2;
49
+    if (is_null($l1)) {
50
+        $length = (defined('_CACHE_PROFONDEUR_STOCKAGE') ? min(8, max(_CACHE_PROFONDEUR_STOCKAGE, 2)) : 4);
51
+        $l1 = intval(floor($length / 2));
52
+        $l2 = $length - $l1;
53
+    }
54
+    $d = substr($nom_cache, 0, $l1);
55
+    $u = substr($nom_cache, $l1, $l2);
56
+
57
+    if ($ecrire) {
58
+        $rep = sous_repertoire(_DIR_CACHE, '', false, true);
59
+        $rep = sous_repertoire($rep, 'calcul/', false, true);
60
+        $rep = sous_repertoire($rep, $d, false, true);
61
+    }
62
+    else {
63
+        // en lecture on essaye pas de creer les repertoires, on va au plus vite
64
+        $rep = _DIR_CACHE . "calcul/$d/";
65
+    }
66
+
67
+    return $rep . $u . '.cache';
68 68
 }
69 69
 
70 70
 /**
@@ -75,7 +75,7 @@  discard block
 block discarded – undo
75 75
  * @return bool
76 76
  */
77 77
 function ecrire_cache($nom_cache, $valeur) {
78
-	return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
78
+    return ecrire_fichier(cache_chemin_fichier($nom_cache, true), serialize(['nom_cache' => $nom_cache, 'valeur' => $valeur]));
79 79
 }
80 80
 
81 81
 /**
@@ -85,38 +85,38 @@  discard block
 block discarded – undo
85 85
  * @return mixed
86 86
  */
87 87
 function lire_cache($nom_cache) {
88
-	$tmp = [];
89
-	if (
90
-		file_exists($f = cache_chemin_fichier($nom_cache))
91
-		and lire_fichier($f, $tmp)
92
-		and $tmp = unserialize($tmp)
93
-		and $tmp['nom_cache'] == $nom_cache
94
-		and isset($tmp['valeur'])
95
-	) {
96
-		return $tmp['valeur'];
97
-	}
98
-
99
-	return false;
88
+    $tmp = [];
89
+    if (
90
+        file_exists($f = cache_chemin_fichier($nom_cache))
91
+        and lire_fichier($f, $tmp)
92
+        and $tmp = unserialize($tmp)
93
+        and $tmp['nom_cache'] == $nom_cache
94
+        and isset($tmp['valeur'])
95
+    ) {
96
+        return $tmp['valeur'];
97
+    }
98
+
99
+    return false;
100 100
 }
101 101
 
102 102
 // Parano : on signe le cache, afin d'interdire un hack d'injection
103 103
 // dans notre memcache
104 104
 function cache_signature(&$page) {
105
-	if (!isset($GLOBALS['meta']['cache_signature'])) {
106
-		include_spip('inc/acces');
107
-		include_spip('auth/sha256.inc');
108
-		ecrire_meta(
109
-			'cache_signature',
110
-			spip_sha256(
111
-				$_SERVER['DOCUMENT_ROOT']
112
-				. ($_SERVER['SERVER_SIGNATURE'] ?? '')
113
-				. creer_uniqid()
114
-			),
115
-			'non'
116
-		);
117
-	}
118
-
119
-	return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
105
+    if (!isset($GLOBALS['meta']['cache_signature'])) {
106
+        include_spip('inc/acces');
107
+        include_spip('auth/sha256.inc');
108
+        ecrire_meta(
109
+            'cache_signature',
110
+            spip_sha256(
111
+                $_SERVER['DOCUMENT_ROOT']
112
+                . ($_SERVER['SERVER_SIGNATURE'] ?? '')
113
+                . creer_uniqid()
114
+            ),
115
+            'non'
116
+        );
117
+    }
118
+
119
+    return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']);
120 120
 }
121 121
 
122 122
 /**
@@ -130,14 +130,14 @@  discard block
 block discarded – undo
130 130
  * @return array
131 131
  */
132 132
 function gzip_page($page) {
133
-	if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
134
-		$page['gz'] = true;
135
-		$page['texte'] = gzcompress($page['texte']);
136
-	} else {
137
-		$page['gz'] = false;
138
-	}
139
-
140
-	return $page;
133
+    if (function_exists('gzcompress') and strlen($page['texte']) > 16 * 1024) {
134
+        $page['gz'] = true;
135
+        $page['texte'] = gzcompress($page['texte']);
136
+    } else {
137
+        $page['gz'] = false;
138
+    }
139
+
140
+    return $page;
141 141
 }
142 142
 
143 143
 /**
@@ -152,10 +152,10 @@  discard block
 block discarded – undo
152 152
  * @return void
153 153
  */
154 154
 function gunzip_page(&$page) {
155
-	if ($page['gz']) {
156
-		$page['texte'] = gzuncompress($page['texte']);
157
-		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
158
-	}
155
+    if ($page['gz']) {
156
+        $page['texte'] = gzuncompress($page['texte']);
157
+        $page['gz'] = false; // ne pas gzuncompress deux fois une meme page
158
+    }
159 159
 }
160 160
 
161 161
 /**
@@ -171,72 +171,72 @@  discard block
 block discarded – undo
171 171
  */
172 172
 /// https://code.spip.net/@cache_valide
173 173
 function cache_valide(&$page, $date) {
174
-	$now = $_SERVER['REQUEST_TIME'];
175
-
176
-	// Apparition d'un nouvel article post-date ?
177
-	if (
178
-		isset($GLOBALS['meta']['post_dates'])
179
-		and $GLOBALS['meta']['post_dates'] == 'non'
180
-		and isset($GLOBALS['meta']['date_prochain_postdate'])
181
-		and $now > $GLOBALS['meta']['date_prochain_postdate']
182
-	) {
183
-		spip_log('Un article post-date invalide le cache');
184
-		include_spip('inc/rubriques');
185
-		calculer_prochain_postdate(true);
186
-	}
187
-
188
-	if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
189
-		return -1;
190
-	}
191
-	if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
192
-		return -1;
193
-	}
194
-	if (defined('_NO_CACHE')) {
195
-		return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
196
-	}
197
-
198
-	// pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
199
-	if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
200
-		return _IS_BOT ? -1 : 1;
201
-	}
202
-
203
-	// controle de la signature
204
-	if ($page['sig'] !== cache_signature($page)) {
205
-		return _IS_BOT ? -1 : 1;
206
-	}
207
-
208
-	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
209
-	// cf. ecrire/public/balises.php, balise_CACHE_dist()
210
-	if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
211
-		// Cache invalide par la meta 'derniere_modif'
212
-		// sauf pour les bots, qui utilisent toujours le cache
213
-		if (
214
-			!_IS_BOT
215
-			and $GLOBALS['derniere_modif_invalide']
216
-			and isset($GLOBALS['meta']['derniere_modif'])
217
-			and $date < $GLOBALS['meta']['derniere_modif']
218
-		) {
219
-			return 1;
220
-		}
221
-	}
222
-
223
-	// Sinon comparer l'age du fichier a sa duree de cache
224
-	$duree = intval($page['entetes']['X-Spip-Cache']);
225
-	$cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
226
-	if ($duree == 0) {  #CACHE{0}
227
-	return -1;
228
-	} // sauf pour les bots, qui utilisent toujours le cache
229
-	else {
230
-		if (
231
-			(!_IS_BOT and $date + $duree < $now)
232
-			# le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
233
-			or $date < $cache_mark
234
-		) {
235
-			return _IS_BOT ? -1 : 1;
236
-		} else {
237
-			return 0;
238
-		}
239
-	}
174
+    $now = $_SERVER['REQUEST_TIME'];
175
+
176
+    // Apparition d'un nouvel article post-date ?
177
+    if (
178
+        isset($GLOBALS['meta']['post_dates'])
179
+        and $GLOBALS['meta']['post_dates'] == 'non'
180
+        and isset($GLOBALS['meta']['date_prochain_postdate'])
181
+        and $now > $GLOBALS['meta']['date_prochain_postdate']
182
+    ) {
183
+        spip_log('Un article post-date invalide le cache');
184
+        include_spip('inc/rubriques');
185
+        calculer_prochain_postdate(true);
186
+    }
187
+
188
+    if (defined('_VAR_NOCACHE') and _VAR_NOCACHE) {
189
+        return -1;
190
+    }
191
+    if (isset($GLOBALS['meta']['cache_inhib']) and $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) {
192
+        return -1;
193
+    }
194
+    if (defined('_NO_CACHE')) {
195
+        return (_NO_CACHE == 0 and !isset($page['texte'])) ? 1 : _NO_CACHE;
196
+    }
197
+
198
+    // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)
199
+    if (!$page or !isset($page['texte']) or !isset($page['entetes']['X-Spip-Cache'])) {
200
+        return _IS_BOT ? -1 : 1;
201
+    }
202
+
203
+    // controle de la signature
204
+    if ($page['sig'] !== cache_signature($page)) {
205
+        return _IS_BOT ? -1 : 1;
206
+    }
207
+
208
+    // #CACHE{n,statique} => on n'invalide pas avec derniere_modif
209
+    // cf. ecrire/public/balises.php, balise_CACHE_dist()
210
+    if (!isset($page['entetes']['X-Spip-Statique']) or $page['entetes']['X-Spip-Statique'] !== 'oui') {
211
+        // Cache invalide par la meta 'derniere_modif'
212
+        // sauf pour les bots, qui utilisent toujours le cache
213
+        if (
214
+            !_IS_BOT
215
+            and $GLOBALS['derniere_modif_invalide']
216
+            and isset($GLOBALS['meta']['derniere_modif'])
217
+            and $date < $GLOBALS['meta']['derniere_modif']
218
+        ) {
219
+            return 1;
220
+        }
221
+    }
222
+
223
+    // Sinon comparer l'age du fichier a sa duree de cache
224
+    $duree = intval($page['entetes']['X-Spip-Cache']);
225
+    $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0);
226
+    if ($duree == 0) {  #CACHE{0}
227
+    return -1;
228
+    } // sauf pour les bots, qui utilisent toujours le cache
229
+    else {
230
+        if (
231
+            (!_IS_BOT and $date + $duree < $now)
232
+            # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots
233
+            or $date < $cache_mark
234
+        ) {
235
+            return _IS_BOT ? -1 : 1;
236
+        } else {
237
+            return 0;
238
+        }
239
+    }
240 240
 }
241 241
 
242 242
 /**
@@ -251,59 +251,59 @@  discard block
 block discarded – undo
251 251
  */
252 252
 function creer_cache(&$page, &$chemin_cache) {
253 253
 
254
-	// Ne rien faire si on est en preview, debug, ou si une erreur
255
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
256
-	// le cas var_nocache ne devrait jamais arriver ici (securite)
257
-	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
258
-	if (
259
-		(defined('_VAR_NOCACHE') and _VAR_NOCACHE)
260
-		or defined('spip_interdire_cache')
261
-	) {
262
-		return;
263
-	}
264
-
265
-	// Si la page c1234 a un invalideur de session 'zz', sauver dans
266
-	// 'tmp/cache/MD5(chemin_cache)_zz'
267
-	if (
268
-		isset($page['invalideurs'])
269
-		and isset($page['invalideurs']['session'])
270
-	) {
271
-		// on verifie que le contenu du chemin cache indique seulement
272
-		// "cache sessionne" ; sa date indique la date de validite
273
-		// des caches sessionnes
274
-		if (!$tmp = lire_cache($chemin_cache)) {
275
-			spip_log('Creation cache sessionne ' . $chemin_cache);
276
-			$tmp = [
277
-				'invalideurs' => ['session' => ''],
278
-				'lastmodified' => $_SERVER['REQUEST_TIME']
279
-			];
280
-			ecrire_cache($chemin_cache, $tmp);
281
-		}
282
-		$chemin_cache = generer_nom_fichier_cache(
283
-			['chemin_cache' => $chemin_cache],
284
-			['session' => $page['invalideurs']['session']]
285
-		);
286
-	}
287
-
288
-	// ajouter la date de production dans le cache lui meme
289
-	// (qui contient deja sa duree de validite)
290
-	$page['lastmodified'] = $_SERVER['REQUEST_TIME'];
291
-
292
-	// compresser le contenu si besoin
293
-	$pagez = gzip_page($page);
294
-
295
-	// signer le contenu
296
-	$pagez['sig'] = cache_signature($pagez);
297
-
298
-	// l'enregistrer, compresse ou non...
299
-	$ok = ecrire_cache($chemin_cache, $pagez);
300
-
301
-	spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
302
-		. $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
303
-
304
-	// Inserer ses invalideurs
305
-	include_spip('inc/invalideur');
306
-	maj_invalideurs($chemin_cache, $page);
254
+    // Ne rien faire si on est en preview, debug, ou si une erreur
255
+    // grave s'est presentee (compilation du squelette, MySQL, etc)
256
+    // le cas var_nocache ne devrait jamais arriver ici (securite)
257
+    // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
258
+    if (
259
+        (defined('_VAR_NOCACHE') and _VAR_NOCACHE)
260
+        or defined('spip_interdire_cache')
261
+    ) {
262
+        return;
263
+    }
264
+
265
+    // Si la page c1234 a un invalideur de session 'zz', sauver dans
266
+    // 'tmp/cache/MD5(chemin_cache)_zz'
267
+    if (
268
+        isset($page['invalideurs'])
269
+        and isset($page['invalideurs']['session'])
270
+    ) {
271
+        // on verifie que le contenu du chemin cache indique seulement
272
+        // "cache sessionne" ; sa date indique la date de validite
273
+        // des caches sessionnes
274
+        if (!$tmp = lire_cache($chemin_cache)) {
275
+            spip_log('Creation cache sessionne ' . $chemin_cache);
276
+            $tmp = [
277
+                'invalideurs' => ['session' => ''],
278
+                'lastmodified' => $_SERVER['REQUEST_TIME']
279
+            ];
280
+            ecrire_cache($chemin_cache, $tmp);
281
+        }
282
+        $chemin_cache = generer_nom_fichier_cache(
283
+            ['chemin_cache' => $chemin_cache],
284
+            ['session' => $page['invalideurs']['session']]
285
+        );
286
+    }
287
+
288
+    // ajouter la date de production dans le cache lui meme
289
+    // (qui contient deja sa duree de validite)
290
+    $page['lastmodified'] = $_SERVER['REQUEST_TIME'];
291
+
292
+    // compresser le contenu si besoin
293
+    $pagez = gzip_page($page);
294
+
295
+    // signer le contenu
296
+    $pagez['sig'] = cache_signature($pagez);
297
+
298
+    // l'enregistrer, compresse ou non...
299
+    $ok = ecrire_cache($chemin_cache, $pagez);
300
+
301
+    spip_log((_IS_BOT ? 'Bot:' : '') . "Creation du cache $chemin_cache pour "
302
+        . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)'), _LOG_INFO);
303
+
304
+    // Inserer ses invalideurs
305
+    include_spip('inc/invalideur');
306
+    maj_invalideurs($chemin_cache, $page);
307 307
 }
308 308
 
309 309
 
@@ -318,15 +318,15 @@  discard block
 block discarded – undo
318 318
  * @return void
319 319
  */
320 320
 function nettoyer_petit_cache($prefix, $duree = 300) {
321
-	// determiner le repertoire a purger : 'tmp/CACHE/rech/'
322
-	$dircache = sous_repertoire(_DIR_CACHE, $prefix);
323
-	if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
324
-		foreach (preg_files($dircache, '[.]txt$') as $f) {
325
-			if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
326
-				spip_unlink($f);
327
-			}
328
-		}
329
-	}
321
+    // determiner le repertoire a purger : 'tmp/CACHE/rech/'
322
+    $dircache = sous_repertoire(_DIR_CACHE, $prefix);
323
+    if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) {
324
+        foreach (preg_files($dircache, '[.]txt$') as $f) {
325
+            if ($_SERVER['REQUEST_TIME'] - (@file_exists($f) ? @filemtime($f) : 0) > $duree) {
326
+                spip_unlink($f);
327
+            }
328
+        }
329
+    }
330 330
 }
331 331
 
332 332
 
@@ -356,133 +356,133 @@  discard block
 block discarded – undo
356 356
  */
357 357
 function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {
358 358
 
359
-	# fonction de cache minimale : dire "non on ne met rien en cache"
360
-	# $use_cache = -1; return;
361
-
362
-	// Second appel, destine a l'enregistrement du cache sur le disque
363
-	if (isset($chemin_cache)) {
364
-		return creer_cache($page, $chemin_cache);
365
-	}
366
-
367
-	// Toute la suite correspond au premier appel
368
-	$contexte_implicite = $page['contexte_implicite'];
369
-
370
-	// Cas ignorant le cache car completement dynamique
371
-	if (
372
-		(!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
373
-		or _request('connect')
374
-	) {
375
-		$use_cache = -1;
376
-		$lastmodified = 0;
377
-		$chemin_cache = '';
378
-		$page = [];
379
-
380
-		return;
381
-	}
382
-
383
-	// Controler l'existence d'un cache nous correspondant
384
-	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
385
-	$lastmodified = 0;
386
-
387
-	// charger le cache s'il existe (et si il a bien le bon hash = anticollision)
388
-	if (!$page = lire_cache($chemin_cache)) {
389
-		$page = [];
390
-	}
391
-
392
-	// s'il est sessionne, charger celui correspondant a notre session
393
-	if (
394
-		isset($page['invalideurs'])
395
-		and isset($page['invalideurs']['session'])
396
-	) {
397
-		$chemin_cache_session = generer_nom_fichier_cache(
398
-			['chemin_cache' => $chemin_cache],
399
-			['session' => spip_session()]
400
-		);
401
-		if (
402
-			$page_session = lire_cache($chemin_cache_session)
403
-			and $page_session['lastmodified'] >= $page['lastmodified']
404
-		) {
405
-			$page = $page_session;
406
-		} else {
407
-			$page = [];
408
-		}
409
-	}
410
-
411
-
412
-	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
413
-	if (isset($GLOBALS['meta']['invalider'])) {
414
-		// ne le faire que si la base est disponible
415
-		if (spip_connect()) {
416
-			include_spip('inc/invalideur');
417
-			retire_caches($chemin_cache); # API invalideur inutile
418
-			supprimer_fichier(_DIR_CACHE . $chemin_cache);
419
-			if (isset($chemin_cache_session) and $chemin_cache_session) {
420
-				supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
421
-			}
422
-		}
423
-	}
424
-
425
-	// Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
426
-	// on supprime le cache
427
-	if (
428
-		defined('_VAR_MODE') &&
429
-		_VAR_MODE &&
430
-		(isset($_COOKIE['spip_session']) ||
431
-			isset($_COOKIE['spip_admin']) ||
432
-			@file_exists(_ACCESS_FILE_NAME))
433
-	) {
434
-		$page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
435
-		include_spip('inc/invalideur');
436
-		retire_caches($chemin_cache); # API invalideur inutile
437
-		supprimer_fichier(_DIR_CACHE . $chemin_cache);
438
-		if (isset($chemin_cache_session) and $chemin_cache_session) {
439
-			supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
440
-		}
441
-	}
442
-
443
-	// $delais par defaut
444
-	// pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
445
-	// qui sont a cache nul par defaut
446
-	if (!isset($GLOBALS['delais'])) {
447
-		if (!defined('_DUREE_CACHE_DEFAUT')) {
448
-			define('_DUREE_CACHE_DEFAUT', 24 * 3600);
449
-		}
450
-		$GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
451
-	}
452
-
453
-	// determiner la validite de la page
454
-	if ($page) {
455
-		$use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
456
-		// le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
457
-		// par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
458
-		$page['contexte_implicite'] = $contexte_implicite;
459
-		if (!$use_cache) {
460
-			// $page est un cache utilisable
461
-			gunzip_page($page);
462
-
463
-			return;
464
-		}
465
-	} else {
466
-		$page = ['contexte_implicite' => $contexte_implicite];
467
-		$use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
468
-	}
469
-
470
-	// Si pas valide mais pas de connexion a la base, le garder quand meme
471
-	if (!spip_connect()) {
472
-		if (isset($page['texte'])) {
473
-			gunzip_page($page);
474
-			$use_cache = 0;
475
-		} else {
476
-			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
477
-			include_spip('inc/minipres');
478
-
479
-			return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
480
-		}
481
-	}
482
-
483
-	if ($use_cache < 0) {
484
-		$chemin_cache = '';
485
-	}
486
-
487
-	return;
359
+    # fonction de cache minimale : dire "non on ne met rien en cache"
360
+    # $use_cache = -1; return;
361
+
362
+    // Second appel, destine a l'enregistrement du cache sur le disque
363
+    if (isset($chemin_cache)) {
364
+        return creer_cache($page, $chemin_cache);
365
+    }
366
+
367
+    // Toute la suite correspond au premier appel
368
+    $contexte_implicite = $page['contexte_implicite'];
369
+
370
+    // Cas ignorant le cache car completement dynamique
371
+    if (
372
+        (!empty($_SERVER['REQUEST_METHOD']) and $_SERVER['REQUEST_METHOD'] === 'POST')
373
+        or _request('connect')
374
+    ) {
375
+        $use_cache = -1;
376
+        $lastmodified = 0;
377
+        $chemin_cache = '';
378
+        $page = [];
379
+
380
+        return;
381
+    }
382
+
383
+    // Controler l'existence d'un cache nous correspondant
384
+    $chemin_cache = generer_nom_fichier_cache($contexte, $page);
385
+    $lastmodified = 0;
386
+
387
+    // charger le cache s'il existe (et si il a bien le bon hash = anticollision)
388
+    if (!$page = lire_cache($chemin_cache)) {
389
+        $page = [];
390
+    }
391
+
392
+    // s'il est sessionne, charger celui correspondant a notre session
393
+    if (
394
+        isset($page['invalideurs'])
395
+        and isset($page['invalideurs']['session'])
396
+    ) {
397
+        $chemin_cache_session = generer_nom_fichier_cache(
398
+            ['chemin_cache' => $chemin_cache],
399
+            ['session' => spip_session()]
400
+        );
401
+        if (
402
+            $page_session = lire_cache($chemin_cache_session)
403
+            and $page_session['lastmodified'] >= $page['lastmodified']
404
+        ) {
405
+            $page = $page_session;
406
+        } else {
407
+            $page = [];
408
+        }
409
+    }
410
+
411
+
412
+    // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
413
+    if (isset($GLOBALS['meta']['invalider'])) {
414
+        // ne le faire que si la base est disponible
415
+        if (spip_connect()) {
416
+            include_spip('inc/invalideur');
417
+            retire_caches($chemin_cache); # API invalideur inutile
418
+            supprimer_fichier(_DIR_CACHE . $chemin_cache);
419
+            if (isset($chemin_cache_session) and $chemin_cache_session) {
420
+                supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
421
+            }
422
+        }
423
+    }
424
+
425
+    // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande,
426
+    // on supprime le cache
427
+    if (
428
+        defined('_VAR_MODE') &&
429
+        _VAR_MODE &&
430
+        (isset($_COOKIE['spip_session']) ||
431
+            isset($_COOKIE['spip_admin']) ||
432
+            @file_exists(_ACCESS_FILE_NAME))
433
+    ) {
434
+        $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu
435
+        include_spip('inc/invalideur');
436
+        retire_caches($chemin_cache); # API invalideur inutile
437
+        supprimer_fichier(_DIR_CACHE . $chemin_cache);
438
+        if (isset($chemin_cache_session) and $chemin_cache_session) {
439
+            supprimer_fichier(_DIR_CACHE . $chemin_cache_session);
440
+        }
441
+    }
442
+
443
+    // $delais par defaut
444
+    // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé
445
+    // qui sont a cache nul par defaut
446
+    if (!isset($GLOBALS['delais'])) {
447
+        if (!defined('_DUREE_CACHE_DEFAUT')) {
448
+            define('_DUREE_CACHE_DEFAUT', 24 * 3600);
449
+        }
450
+        $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT;
451
+    }
452
+
453
+    // determiner la validite de la page
454
+    if ($page) {
455
+        $use_cache = cache_valide($page, $page['lastmodified'] ?? 0);
456
+        // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence
457
+        // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul
458
+        $page['contexte_implicite'] = $contexte_implicite;
459
+        if (!$use_cache) {
460
+            // $page est un cache utilisable
461
+            gunzip_page($page);
462
+
463
+            return;
464
+        }
465
+    } else {
466
+        $page = ['contexte_implicite' => $contexte_implicite];
467
+        $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul
468
+    }
469
+
470
+    // Si pas valide mais pas de connexion a la base, le garder quand meme
471
+    if (!spip_connect()) {
472
+        if (isset($page['texte'])) {
473
+            gunzip_page($page);
474
+            $use_cache = 0;
475
+        } else {
476
+            spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
477
+            include_spip('inc/minipres');
478
+
479
+            return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]);
480
+        }
481
+    }
482
+
483
+    if ($use_cache < 0) {
484
+        $chemin_cache = '';
485
+    }
486
+
487
+    return;
488 488
 }
Please login to merge, or discard this patch.
ecrire/public/jointures.php 1 patch
Indentation   +401 added lines, -401 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
 
@@ -33,11 +33,11 @@  discard block
 block discarded – undo
33 33
  *     Chaine sinon : le nom du champ (non décomposable donc)
34 34
  */
35 35
 function decompose_champ_id_objet($champ) {
36
-	if (($champ !== 'id_objet') and preg_match(',^id_([a-z_]+)$,', $champ, $regs)) {
37
-		return ['id_objet', 'objet', objet_type($champ)];
38
-	}
36
+    if (($champ !== 'id_objet') and preg_match(',^id_([a-z_]+)$,', $champ, $regs)) {
37
+        return ['id_objet', 'objet', objet_type($champ)];
38
+    }
39 39
 
40
-	return $champ;
40
+    return $champ;
41 41
 }
42 42
 
43 43
 /**
@@ -56,21 +56,21 @@  discard block
 block discarded – undo
56 56
  *     - array(id_objet, objet), si le champ n'existe pas mais qu'on peut décomposer
57 57
  */
58 58
 function trouver_champs_decomposes($champ, $desc) {
59
-	if (
60
-		!is_array($desc) // on ne se risque pas en conjectures si on ne connait pas la table
61
-		or array_key_exists($champ, $desc['field'])
62
-	) {
63
-		return [$champ];
64
-	}
65
-	// si le champ se décompose, tester que les colonnes décomposées sont présentes
66
-	if (is_array($decompose = decompose_champ_id_objet($champ))) {
67
-		array_pop($decompose);
68
-		if (count(array_intersect($decompose, array_keys($desc['field']))) == count($decompose)) {
69
-			return $decompose;
70
-		}
71
-	}
72
-
73
-	return [$champ];
59
+    if (
60
+        !is_array($desc) // on ne se risque pas en conjectures si on ne connait pas la table
61
+        or array_key_exists($champ, $desc['field'])
62
+    ) {
63
+        return [$champ];
64
+    }
65
+    // si le champ se décompose, tester que les colonnes décomposées sont présentes
66
+    if (is_array($decompose = decompose_champ_id_objet($champ))) {
67
+        array_pop($decompose);
68
+        if (count(array_intersect($decompose, array_keys($desc['field']))) == count($decompose)) {
69
+            return $decompose;
70
+        }
71
+    }
72
+
73
+    return [$champ];
74 74
 }
75 75
 
76 76
 
@@ -100,23 +100,23 @@  discard block
 block discarded – undo
100 100
  *     Alias de la table de jointure (Lx)
101 101
  */
102 102
 function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false, $max_liens = 5) {
103
-	// les jointures minimales sont optimales :
104
-	// on contraint le nombre d'etapes en l'augmentant
105
-	// jusqu'a ce qu'on trouve une jointure ou qu'on atteigne la limite maxi
106
-	$max = 1;
107
-	$res = false;
108
-	$milieu_exclus = ($col ?: []);
109
-	while ($max <= $max_liens and !$res) {
110
-		$res = calculer_chaine_jointures($boucle, $depart, $arrivee, [], $milieu_exclus, $max);
111
-		$max++;
112
-	}
113
-	if (!$res) {
114
-		return '';
115
-	}
116
-
117
-	[$nom, $desc] = $depart;
118
-
119
-	return fabrique_jointures($boucle, $res, $cond, $desc, $nom, $col);
103
+    // les jointures minimales sont optimales :
104
+    // on contraint le nombre d'etapes en l'augmentant
105
+    // jusqu'a ce qu'on trouve une jointure ou qu'on atteigne la limite maxi
106
+    $max = 1;
107
+    $res = false;
108
+    $milieu_exclus = ($col ?: []);
109
+    while ($max <= $max_liens and !$res) {
110
+        $res = calculer_chaine_jointures($boucle, $depart, $arrivee, [], $milieu_exclus, $max);
111
+        $max++;
112
+    }
113
+    if (!$res) {
114
+        return '';
115
+    }
116
+
117
+    [$nom, $desc] = $depart;
118
+
119
+    return fabrique_jointures($boucle, $res, $cond, $desc, $nom, $col);
120 120
 }
121 121
 
122 122
 /**
@@ -155,82 +155,82 @@  discard block
 block discarded – undo
155 155
  *     Alias de la table de jointure (Lx)
156 156
  */
157 157
 function fabrique_jointures(&$boucle, $res, $cond = false, $desc = [], $nom = '', $col = '', $echap = true) {
158
-	$a = [];
159
-	$j = null;
160
-	$n = null;
161
-	static $num = [];
162
-	$id_table = '';
163
-	$cpt = &$num[$boucle->descr['nom']][$boucle->descr['gram']][$boucle->id_boucle];
164
-	foreach ($res as $cle => $r) {
165
-		[$d, $a, $j] = $r;
166
-		if (!$id_table) {
167
-			$id_table = $d;
168
-		}
169
-		$n = ++$cpt;
170
-		if (is_array($j)) { // c'est un lien sur un champ du type id_objet,objet,'article'
171
-			[$j1, $j2, $obj, $type] = $j;
172
-			// trouver de quel cote est (id_objet,objet)
173
-			if ($j1 == "id_$obj") {
174
-				$obj = "$id_table.$obj";
175
-			} else {
176
-				$obj = "L$n.$obj";
177
-			}
178
-			// le where complementaire est envoye dans la jointure et dans le where
179
-			// on utilise une clé qui le relie a la jointure pour que l'optimiseur
180
-			// sache qu'il peut enlever ce where si il enleve la jointure
181
-			$boucle->where["JOIN-L$n"] =
182
-				$echap ?
183
-					["'='","'$obj'","sql_quote('$type')"]
184
-					:
185
-					['=',"$obj",sql_quote($type)];
186
-			$boucle->join["L$n"] =
187
-				$echap ?
188
-					["'$id_table'", "'$j2'", "'$j1'", "'$obj='.sql_quote('$type')"]
189
-					:
190
-					[$id_table, $j2, $j1, "$obj=" . sql_quote($type)];
191
-		} else {
192
-			$boucle->join["L$n"] = $echap ? ["'$id_table'", "'$j'"] : [$id_table, $j];
193
-		}
194
-		$boucle->from[$id_table = "L$n"] = $a[0];
195
-	}
196
-
197
-
198
-	// pas besoin de group by
199
-	// (cf http://article.gmane.org/gmane.comp.web.spip.devel/30555)
200
-	// si une seule jointure et sur une table avec primary key formee
201
-	// de l'index principal et de l'index de jointure (non conditionnel! [6031])
202
-	// et operateur d'egalite (https://core.spip.net/issues/477)
203
-
204
-	if ($pk = (isset($a[1]) && (count($boucle->from) == 2) && !$cond)) {
205
-		$pk = nogroupby_if($desc, $a[1], $col);
206
-	}
207
-
208
-	// pas de group by
209
-	// si une seule jointure
210
-	// et si l'index de jointure est une primary key a l'arrivee !
211
-	if (
212
-		!$pk
213
-		and (count($boucle->from) == 2)
214
-		and isset($a[1]['key']['PRIMARY KEY'])
215
-		and ($j == $a[1]['key']['PRIMARY KEY'])
216
-	) {
217
-		$pk = true;
218
-	}
219
-
220
-	// la clause Group by est en conflit avec ORDER BY, a completer
221
-	$groups = liste_champs_jointures($nom, $desc, true);
222
-	if (!$pk) {
223
-		foreach ($groups as $id_prim) {
224
-			$id_field = $nom . '.' . $id_prim;
225
-			if (!in_array($id_field, $boucle->group)) {
226
-				$boucle->group[] = $id_field;
227
-			}
228
-		}
229
-	}
230
-
231
-	$boucle->modificateur['lien'] = true;
232
-
233
-	return "L$n";
158
+    $a = [];
159
+    $j = null;
160
+    $n = null;
161
+    static $num = [];
162
+    $id_table = '';
163
+    $cpt = &$num[$boucle->descr['nom']][$boucle->descr['gram']][$boucle->id_boucle];
164
+    foreach ($res as $cle => $r) {
165
+        [$d, $a, $j] = $r;
166
+        if (!$id_table) {
167
+            $id_table = $d;
168
+        }
169
+        $n = ++$cpt;
170
+        if (is_array($j)) { // c'est un lien sur un champ du type id_objet,objet,'article'
171
+            [$j1, $j2, $obj, $type] = $j;
172
+            // trouver de quel cote est (id_objet,objet)
173
+            if ($j1 == "id_$obj") {
174
+                $obj = "$id_table.$obj";
175
+            } else {
176
+                $obj = "L$n.$obj";
177
+            }
178
+            // le where complementaire est envoye dans la jointure et dans le where
179
+            // on utilise une clé qui le relie a la jointure pour que l'optimiseur
180
+            // sache qu'il peut enlever ce where si il enleve la jointure
181
+            $boucle->where["JOIN-L$n"] =
182
+                $echap ?
183
+                    ["'='","'$obj'","sql_quote('$type')"]
184
+                    :
185
+                    ['=',"$obj",sql_quote($type)];
186
+            $boucle->join["L$n"] =
187
+                $echap ?
188
+                    ["'$id_table'", "'$j2'", "'$j1'", "'$obj='.sql_quote('$type')"]
189
+                    :
190
+                    [$id_table, $j2, $j1, "$obj=" . sql_quote($type)];
191
+        } else {
192
+            $boucle->join["L$n"] = $echap ? ["'$id_table'", "'$j'"] : [$id_table, $j];
193
+        }
194
+        $boucle->from[$id_table = "L$n"] = $a[0];
195
+    }
196
+
197
+
198
+    // pas besoin de group by
199
+    // (cf http://article.gmane.org/gmane.comp.web.spip.devel/30555)
200
+    // si une seule jointure et sur une table avec primary key formee
201
+    // de l'index principal et de l'index de jointure (non conditionnel! [6031])
202
+    // et operateur d'egalite (https://core.spip.net/issues/477)
203
+
204
+    if ($pk = (isset($a[1]) && (count($boucle->from) == 2) && !$cond)) {
205
+        $pk = nogroupby_if($desc, $a[1], $col);
206
+    }
207
+
208
+    // pas de group by
209
+    // si une seule jointure
210
+    // et si l'index de jointure est une primary key a l'arrivee !
211
+    if (
212
+        !$pk
213
+        and (count($boucle->from) == 2)
214
+        and isset($a[1]['key']['PRIMARY KEY'])
215
+        and ($j == $a[1]['key']['PRIMARY KEY'])
216
+    ) {
217
+        $pk = true;
218
+    }
219
+
220
+    // la clause Group by est en conflit avec ORDER BY, a completer
221
+    $groups = liste_champs_jointures($nom, $desc, true);
222
+    if (!$pk) {
223
+        foreach ($groups as $id_prim) {
224
+            $id_field = $nom . '.' . $id_prim;
225
+            if (!in_array($id_field, $boucle->group)) {
226
+                $boucle->group[] = $id_field;
227
+            }
228
+        }
229
+    }
230
+
231
+    $boucle->modificateur['lien'] = true;
232
+
233
+    return "L$n";
234 234
 }
235 235
 
236 236
 /**
@@ -245,19 +245,19 @@  discard block
 block discarded – undo
245 245
  * @return bool
246 246
  */
247 247
 function nogroupby_if($depart, $arrivee, $col) {
248
-	if (
249
-		empty($arrivee['key']['PRIMARY KEY'])
250
-		or !($pk = $arrivee['key']['PRIMARY KEY'])
251
-		or empty($depart['key']['PRIMARY KEY'])
252
-	) {
253
-		return false;
254
-	}
255
-	$id_primary = $depart['key']['PRIMARY KEY'];
256
-	if (is_array($col)) {
257
-		$col = implode(', *', $col);
258
-	} // cas id_objet, objet
259
-	return (preg_match("/^$id_primary, *$col$/", $pk) or
260
-		preg_match("/^$col, *$id_primary$/", $pk));
248
+    if (
249
+        empty($arrivee['key']['PRIMARY KEY'])
250
+        or !($pk = $arrivee['key']['PRIMARY KEY'])
251
+        or empty($depart['key']['PRIMARY KEY'])
252
+    ) {
253
+        return false;
254
+    }
255
+    $id_primary = $depart['key']['PRIMARY KEY'];
256
+    if (is_array($col)) {
257
+        $col = implode(', *', $col);
258
+    } // cas id_objet, objet
259
+    return (preg_match("/^$id_primary, *$col$/", $pk) or
260
+        preg_match("/^$col, *$id_primary$/", $pk));
261 261
 }
262 262
 
263 263
 /**
@@ -275,46 +275,46 @@  discard block
 block discarded – undo
275 275
  */
276 276
 function liste_champs_jointures($nom, $desc, $primary = false) {
277 277
 
278
-	static $nojoin = ['idx', 'maj', 'date', 'statut'];
278
+    static $nojoin = ['idx', 'maj', 'date', 'statut'];
279 279
 
280
-	// si cle primaire demandee, la privilegier
281
-	if ($primary && isset($desc['key']['PRIMARY KEY'])) {
282
-		return split_key($desc['key']['PRIMARY KEY']);
283
-	}
280
+    // si cle primaire demandee, la privilegier
281
+    if ($primary && isset($desc['key']['PRIMARY KEY'])) {
282
+        return split_key($desc['key']['PRIMARY KEY']);
283
+    }
284 284
 
285
-	// les champs declares explicitement pour les jointures
286
-	if (isset($desc['join'])) {
287
-		return $desc['join'];
288
-	}
289
-	/*elseif (isset($GLOBALS['tables_principales'][$nom]['join'])) return $GLOBALS['tables_principales'][$nom]['join'];
285
+    // les champs declares explicitement pour les jointures
286
+    if (isset($desc['join'])) {
287
+        return $desc['join'];
288
+    }
289
+    /*elseif (isset($GLOBALS['tables_principales'][$nom]['join'])) return $GLOBALS['tables_principales'][$nom]['join'];
290 290
 	elseif (isset($GLOBALS['tables_auxiliaires'][$nom]['join'])) return $GLOBALS['tables_auxiliaires'][$nom]['join'];*/
291 291
 
292
-	// si pas de cle, c'est fichu
293
-	if (!isset($desc['key'])) {
294
-		return [];
295
-	}
296
-
297
-	// si cle primaire
298
-	if (isset($desc['key']['PRIMARY KEY'])) {
299
-		return split_key($desc['key']['PRIMARY KEY']);
300
-	}
301
-
302
-	// ici on se rabat sur les cles secondaires,
303
-	// en eliminant celles qui sont pas pertinentes (idx, maj)
304
-	// si jamais le resultat n'est pas pertinent pour une table donnee,
305
-	// il faut declarer explicitement le champ 'join' de sa description
306
-
307
-	$join = [];
308
-	foreach ($desc['key'] as $v) {
309
-		$join = split_key($v, $join);
310
-	}
311
-	foreach ($join as $k) {
312
-		if (in_array($k, $nojoin)) {
313
-			unset($join[$k]);
314
-		}
315
-	}
316
-
317
-	return $join;
292
+    // si pas de cle, c'est fichu
293
+    if (!isset($desc['key'])) {
294
+        return [];
295
+    }
296
+
297
+    // si cle primaire
298
+    if (isset($desc['key']['PRIMARY KEY'])) {
299
+        return split_key($desc['key']['PRIMARY KEY']);
300
+    }
301
+
302
+    // ici on se rabat sur les cles secondaires,
303
+    // en eliminant celles qui sont pas pertinentes (idx, maj)
304
+    // si jamais le resultat n'est pas pertinent pour une table donnee,
305
+    // il faut declarer explicitement le champ 'join' de sa description
306
+
307
+    $join = [];
308
+    foreach ($desc['key'] as $v) {
309
+        $join = split_key($v, $join);
310
+    }
311
+    foreach ($join as $k) {
312
+        if (in_array($k, $nojoin)) {
313
+            unset($join[$k]);
314
+        }
315
+    }
316
+
317
+    return $join;
318 318
 }
319 319
 
320 320
 /**
@@ -325,14 +325,14 @@  discard block
 block discarded – undo
325 325
  * @return array
326 326
  */
327 327
 function split_key($v, $join = []) {
328
-	foreach (preg_split('/,\s*/', $v) as $k) {
329
-		if (strpos($k, '(') !== false) {
330
-			$k = explode('(', $k);
331
-			$k = trim(reset($k));
332
-		}
333
-		$join[$k] = $k;
334
-	}
335
-	return $join;
328
+    foreach (preg_split('/,\s*/', $v) as $k) {
329
+        if (strpos($k, '(') !== false) {
330
+            $k = explode('(', $k);
331
+            $k = trim(reset($k));
332
+        }
333
+        $join[$k] = $k;
334
+    }
335
+    return $join;
336 336
 }
337 337
 
338 338
 /**
@@ -355,135 +355,135 @@  discard block
 block discarded – undo
355 355
  * @return array
356 356
  */
357 357
 function calculer_chaine_jointures(
358
-	&$boucle,
359
-	$depart,
360
-	$arrivee,
361
-	$vu = [],
362
-	$milieu_exclus = [],
363
-	$max_liens = 5
358
+    &$boucle,
359
+    $depart,
360
+    $arrivee,
361
+    $vu = [],
362
+    $milieu_exclus = [],
363
+    $max_liens = 5
364 364
 ) {
365
-	static $trouver_table;
366
-	if (!$trouver_table) {
367
-		$trouver_table = charger_fonction('trouver_table', 'base');
368
-	}
369
-
370
-	if (is_string($milieu_exclus)) {
371
-		$milieu_exclus = [$milieu_exclus];
372
-	}
373
-	// quand on a exclus id_objet comme cle de jointure, il faut aussi exclure objet
374
-	// faire une jointure sur objet tout seul n'a pas de sens
375
-	if (in_array('id_objet', $milieu_exclus) and !in_array('objet', $milieu_exclus)) {
376
-		$milieu_exclus[] = 'objet';
377
-	}
378
-
379
-	[$dnom, $ddesc] = $depart;
380
-	[$anom, $adesc] = $arrivee;
381
-	if (!count($vu)) {
382
-		$vu[] = $dnom; // ne pas oublier la table de depart
383
-		$vu[] = $anom; // ne pas oublier la table d'arrivee
384
-	}
385
-
386
-	$akeys = [];
387
-	foreach ($adesc['key'] as $k) {
388
-		// respecter l'ordre de $adesc['key'] pour ne pas avoir id_trad en premier entre autres...
389
-		$akeys = array_merge($akeys, preg_split('/,\s*/', $k));
390
-	}
391
-
392
-	// enlever les cles d'arrivee exclues par l'appel
393
-	$akeys = array_diff($akeys, $milieu_exclus);
394
-
395
-	// cles candidates au depart
396
-	$keys = liste_champs_jointures($dnom, $ddesc);
397
-	// enlever les cles dde depart exclues par l'appel
398
-	$keys = array_diff($keys, $milieu_exclus);
399
-
400
-	$v = !$keys ? false : array_intersect(array_values($keys), $akeys);
401
-
402
-	if ($v) {
403
-		return [[$dnom, [$adesc['table'], $adesc], array_shift($v)]];
404
-	}
405
-
406
-	// regarder si l'on a (id_objet,objet) au depart et si on peut le mapper sur un id_xx
407
-	if (count(array_intersect(['id_objet', 'objet'], $keys)) == 2) {
408
-		// regarder si l'une des cles d'arrivee peut se decomposer en
409
-		// id_objet,objet
410
-		// si oui on la prend
411
-		foreach ($akeys as $key) {
412
-			$v = decompose_champ_id_objet($key);
413
-			if (is_array($v)) {
414
-				$objet = array_shift($v); // objet,'article'
415
-				array_unshift($v, $key); // id_article,objet,'article'
416
-				array_unshift($v, $objet); // id_objet,id_article,objet,'article'
417
-				return [[$dnom, [$adesc['table'], $adesc], $v]];
418
-			}
419
-		}
420
-	} else {
421
-		// regarder si l'une des cles de depart peut se decomposer en
422
-		// id_objet,objet a l'arrivee
423
-		// si oui on la prend
424
-		foreach ($keys as $key) {
425
-			if (count($v = trouver_champs_decomposes($key, $adesc)) > 1) {
426
-				if (count($v) == count(array_intersect($v, $akeys))) {
427
-					$v = decompose_champ_id_objet($key); // id_objet,objet,'article'
428
-					array_unshift($v, $key); // id_article,id_objet,objet,'article'
429
-					return [[$dnom, [$adesc['table'], $adesc], $v]];
430
-				}
431
-			}
432
-		}
433
-	}
434
-	// si l'on voulait une jointure direct, c'est rate !
435
-	if ($max_liens <= 1) {
436
-		return [];
437
-	}
438
-
439
-	// sinon essayer de passer par une autre table
440
-	$new = $vu;
441
-	foreach ($boucle->jointures as $v) {
442
-		if (
443
-			$v
444
-			and !in_array($v, $vu)
445
-			and $def = $trouver_table($v, $boucle->sql_serveur)
446
-			and !in_array($def['table_sql'], $vu)
447
-		) {
448
-			// ne pas tester les cles qui sont exclues a l'appel
449
-			// ie la cle de la jointure precedente
450
-			$test_cles = $milieu_exclus;
451
-			$new[] = $v;
452
-			$max_iter = 50; // securite
453
-			while (
454
-				count($jointure_directe_possible = calculer_chaine_jointures(
455
-					$boucle,
456
-					$depart,
457
-					[$v, $def],
458
-					$vu,
459
-					$test_cles,
460
-					1
461
-				))
462
-				and $max_iter--
463
-			) {
464
-				$jointure_directe_possible = reset($jointure_directe_possible);
465
-				$milieu = end($jointure_directe_possible);
466
-				$exclure_fin = $milieu_exclus;
467
-				if (is_string($milieu)) {
468
-					$exclure_fin[] = $milieu;
469
-					$test_cles[] = $milieu;
470
-				} else {
471
-					$exclure_fin = array_merge($exclure_fin, $milieu);
472
-					$test_cles = array_merge($test_cles, $milieu);
473
-				}
474
-				// essayer de rejoindre l'arrivee a partir de cette etape intermediaire
475
-				// sans repasser par la meme cle milieu, ni une cle deja vue !
476
-				$r = calculer_chaine_jointures($boucle, [$v, $def], $arrivee, $new, $exclure_fin, $max_liens - 1);
477
-				if ($r) {
478
-					array_unshift($r, $jointure_directe_possible);
479
-
480
-					return $r;
481
-				}
482
-			}
483
-		}
484
-	}
485
-
486
-	return [];
365
+    static $trouver_table;
366
+    if (!$trouver_table) {
367
+        $trouver_table = charger_fonction('trouver_table', 'base');
368
+    }
369
+
370
+    if (is_string($milieu_exclus)) {
371
+        $milieu_exclus = [$milieu_exclus];
372
+    }
373
+    // quand on a exclus id_objet comme cle de jointure, il faut aussi exclure objet
374
+    // faire une jointure sur objet tout seul n'a pas de sens
375
+    if (in_array('id_objet', $milieu_exclus) and !in_array('objet', $milieu_exclus)) {
376
+        $milieu_exclus[] = 'objet';
377
+    }
378
+
379
+    [$dnom, $ddesc] = $depart;
380
+    [$anom, $adesc] = $arrivee;
381
+    if (!count($vu)) {
382
+        $vu[] = $dnom; // ne pas oublier la table de depart
383
+        $vu[] = $anom; // ne pas oublier la table d'arrivee
384
+    }
385
+
386
+    $akeys = [];
387
+    foreach ($adesc['key'] as $k) {
388
+        // respecter l'ordre de $adesc['key'] pour ne pas avoir id_trad en premier entre autres...
389
+        $akeys = array_merge($akeys, preg_split('/,\s*/', $k));
390
+    }
391
+
392
+    // enlever les cles d'arrivee exclues par l'appel
393
+    $akeys = array_diff($akeys, $milieu_exclus);
394
+
395
+    // cles candidates au depart
396
+    $keys = liste_champs_jointures($dnom, $ddesc);
397
+    // enlever les cles dde depart exclues par l'appel
398
+    $keys = array_diff($keys, $milieu_exclus);
399
+
400
+    $v = !$keys ? false : array_intersect(array_values($keys), $akeys);
401
+
402
+    if ($v) {
403
+        return [[$dnom, [$adesc['table'], $adesc], array_shift($v)]];
404
+    }
405
+
406
+    // regarder si l'on a (id_objet,objet) au depart et si on peut le mapper sur un id_xx
407
+    if (count(array_intersect(['id_objet', 'objet'], $keys)) == 2) {
408
+        // regarder si l'une des cles d'arrivee peut se decomposer en
409
+        // id_objet,objet
410
+        // si oui on la prend
411
+        foreach ($akeys as $key) {
412
+            $v = decompose_champ_id_objet($key);
413
+            if (is_array($v)) {
414
+                $objet = array_shift($v); // objet,'article'
415
+                array_unshift($v, $key); // id_article,objet,'article'
416
+                array_unshift($v, $objet); // id_objet,id_article,objet,'article'
417
+                return [[$dnom, [$adesc['table'], $adesc], $v]];
418
+            }
419
+        }
420
+    } else {
421
+        // regarder si l'une des cles de depart peut se decomposer en
422
+        // id_objet,objet a l'arrivee
423
+        // si oui on la prend
424
+        foreach ($keys as $key) {
425
+            if (count($v = trouver_champs_decomposes($key, $adesc)) > 1) {
426
+                if (count($v) == count(array_intersect($v, $akeys))) {
427
+                    $v = decompose_champ_id_objet($key); // id_objet,objet,'article'
428
+                    array_unshift($v, $key); // id_article,id_objet,objet,'article'
429
+                    return [[$dnom, [$adesc['table'], $adesc], $v]];
430
+                }
431
+            }
432
+        }
433
+    }
434
+    // si l'on voulait une jointure direct, c'est rate !
435
+    if ($max_liens <= 1) {
436
+        return [];
437
+    }
438
+
439
+    // sinon essayer de passer par une autre table
440
+    $new = $vu;
441
+    foreach ($boucle->jointures as $v) {
442
+        if (
443
+            $v
444
+            and !in_array($v, $vu)
445
+            and $def = $trouver_table($v, $boucle->sql_serveur)
446
+            and !in_array($def['table_sql'], $vu)
447
+        ) {
448
+            // ne pas tester les cles qui sont exclues a l'appel
449
+            // ie la cle de la jointure precedente
450
+            $test_cles = $milieu_exclus;
451
+            $new[] = $v;
452
+            $max_iter = 50; // securite
453
+            while (
454
+                count($jointure_directe_possible = calculer_chaine_jointures(
455
+                    $boucle,
456
+                    $depart,
457
+                    [$v, $def],
458
+                    $vu,
459
+                    $test_cles,
460
+                    1
461
+                ))
462
+                and $max_iter--
463
+            ) {
464
+                $jointure_directe_possible = reset($jointure_directe_possible);
465
+                $milieu = end($jointure_directe_possible);
466
+                $exclure_fin = $milieu_exclus;
467
+                if (is_string($milieu)) {
468
+                    $exclure_fin[] = $milieu;
469
+                    $test_cles[] = $milieu;
470
+                } else {
471
+                    $exclure_fin = array_merge($exclure_fin, $milieu);
472
+                    $test_cles = array_merge($test_cles, $milieu);
473
+                }
474
+                // essayer de rejoindre l'arrivee a partir de cette etape intermediaire
475
+                // sans repasser par la meme cle milieu, ni une cle deja vue !
476
+                $r = calculer_chaine_jointures($boucle, [$v, $def], $arrivee, $new, $exclure_fin, $max_liens - 1);
477
+                if ($r) {
478
+                    array_unshift($r, $jointure_directe_possible);
479
+
480
+                    return $r;
481
+                }
482
+            }
483
+        }
484
+    }
485
+
486
+    return [];
487 487
 }
488 488
 
489 489
 /**
@@ -494,18 +494,18 @@  discard block
 block discarded – undo
494 494
  * @return array
495 495
  */
496 496
 function trouver_cles_table($keys) {
497
-	$res = [];
498
-	foreach ($keys as $v) {
499
-		if (!strpos($v, ',')) {
500
-			$res[$v] = 1;
501
-		} else {
502
-			foreach (preg_split('/\s*,\s*/', $v) as $k) {
503
-				$res[$k] = 1;
504
-			}
505
-		}
506
-	}
507
-
508
-	return array_keys($res);
497
+    $res = [];
498
+    foreach ($keys as $v) {
499
+        if (!strpos($v, ',')) {
500
+            $res[$v] = 1;
501
+        } else {
502
+            foreach (preg_split('/\s*,\s*/', $v) as $k) {
503
+                $res[$k] = 1;
504
+            }
505
+        }
506
+    }
507
+
508
+    return array_keys($res);
509 509
 }
510 510
 
511 511
 
@@ -532,34 +532,34 @@  discard block
 block discarded – undo
532 532
  *     - 'alias' : alias utilisé pour la table (si pertinent. ie: avec `$boucle->from` transmis par exemple)
533 533
  */
534 534
 function chercher_champ_dans_tables($cle, $tables, $connect, $checkarrivee = false) {
535
-	static $trouver_table = '';
536
-	if (!$trouver_table) {
537
-		$trouver_table = charger_fonction('trouver_table', 'base');
538
-	}
539
-
540
-	if (!is_array($cle)) {
541
-		$cle = [$cle];
542
-	}
543
-
544
-	foreach ($tables as $k => $table) {
545
-		if ($table && $desc = $trouver_table($table, $connect)) {
546
-			if (
547
-				isset($desc['field'])
548
-				// verifier que toutes les cles cherchees sont la
549
-				and (count(array_intersect($cle, array_keys($desc['field']))) == count($cle))
550
-				// si on sait ou on veut arriver, il faut que ca colle
551
-				and ($checkarrivee == false || $checkarrivee == $desc['table'])
552
-			) {
553
-				return [
554
-					'desc' => $desc,
555
-					'table' => $desc['table'],
556
-					'alias' => $k,
557
-				];
558
-			}
559
-		}
560
-	}
561
-
562
-	return false;
535
+    static $trouver_table = '';
536
+    if (!$trouver_table) {
537
+        $trouver_table = charger_fonction('trouver_table', 'base');
538
+    }
539
+
540
+    if (!is_array($cle)) {
541
+        $cle = [$cle];
542
+    }
543
+
544
+    foreach ($tables as $k => $table) {
545
+        if ($table && $desc = $trouver_table($table, $connect)) {
546
+            if (
547
+                isset($desc['field'])
548
+                // verifier que toutes les cles cherchees sont la
549
+                and (count(array_intersect($cle, array_keys($desc['field']))) == count($cle))
550
+                // si on sait ou on veut arriver, il faut que ca colle
551
+                and ($checkarrivee == false || $checkarrivee == $desc['table'])
552
+            ) {
553
+                return [
554
+                    'desc' => $desc,
555
+                    'table' => $desc['table'],
556
+                    'alias' => $k,
557
+                ];
558
+            }
559
+        }
560
+    }
561
+
562
+    return false;
563 563
 }
564 564
 
565 565
 /**
@@ -585,52 +585,52 @@  discard block
 block discarded – undo
585 585
  */
586 586
 function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) {
587 587
 
588
-	// support de la recherche multi champ :
589
-	// si en seconde etape on a decompose le champ id_xx en id_objet,objet
590
-	// on reentre ici soit en cherchant une table les 2 champs id_objet,objet
591
-	// soit une table avec les 3 champs id_xx, id_objet, objet
592
-	if (!is_array($cle)) {
593
-		$cle = [$cle];
594
-	}
595
-
596
-	if ($infos = chercher_champ_dans_tables($cle, $joints, $boucle->sql_serveur, $checkarrivee)) {
597
-		return [$infos['table'], $infos['desc'], $cle];
598
-	}
599
-
600
-	// au premier coup, on essaye de decomposer, si possible
601
-	if (
602
-		count($cle) == 1
603
-		and $c = reset($cle)
604
-		and is_array($decompose = decompose_champ_id_objet($c))
605
-	) {
606
-		$desc = $boucle->show;
607
-
608
-		// cas 1 : la cle id_xx est dans la table de depart
609
-		// -> on cherche uniquement id_objet,objet a l'arrivee
610
-		if (isset($desc['field'][$c])) {
611
-			$cle = [];
612
-			$cle[] = array_shift($decompose); // id_objet
613
-			$cle[] = array_shift($decompose); // objet
614
-			return trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee);
615
-		}
616
-		// cas 2 : la cle id_xx n'est pas dans la table de depart
617
-		// -> il faut trouver une cle de depart zzz telle que
618
-		// id_objet,objet,zzz soit a l'arrivee
619
-		else {
620
-			$depart = liste_champs_jointures(($desc['table'] ?? ''), $desc);
621
-			foreach ($depart as $d) {
622
-				$cle = [];
623
-				$cle[] = array_shift($decompose); // id_objet
624
-				$cle[] = array_shift($decompose); // objet
625
-				$cle[] = $d;
626
-				if ($ext = trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee)) {
627
-					return $ext;
628
-				}
629
-			}
630
-		}
631
-	}
632
-
633
-	return '';
588
+    // support de la recherche multi champ :
589
+    // si en seconde etape on a decompose le champ id_xx en id_objet,objet
590
+    // on reentre ici soit en cherchant une table les 2 champs id_objet,objet
591
+    // soit une table avec les 3 champs id_xx, id_objet, objet
592
+    if (!is_array($cle)) {
593
+        $cle = [$cle];
594
+    }
595
+
596
+    if ($infos = chercher_champ_dans_tables($cle, $joints, $boucle->sql_serveur, $checkarrivee)) {
597
+        return [$infos['table'], $infos['desc'], $cle];
598
+    }
599
+
600
+    // au premier coup, on essaye de decomposer, si possible
601
+    if (
602
+        count($cle) == 1
603
+        and $c = reset($cle)
604
+        and is_array($decompose = decompose_champ_id_objet($c))
605
+    ) {
606
+        $desc = $boucle->show;
607
+
608
+        // cas 1 : la cle id_xx est dans la table de depart
609
+        // -> on cherche uniquement id_objet,objet a l'arrivee
610
+        if (isset($desc['field'][$c])) {
611
+            $cle = [];
612
+            $cle[] = array_shift($decompose); // id_objet
613
+            $cle[] = array_shift($decompose); // objet
614
+            return trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee);
615
+        }
616
+        // cas 2 : la cle id_xx n'est pas dans la table de depart
617
+        // -> il faut trouver une cle de depart zzz telle que
618
+        // id_objet,objet,zzz soit a l'arrivee
619
+        else {
620
+            $depart = liste_champs_jointures(($desc['table'] ?? ''), $desc);
621
+            foreach ($depart as $d) {
622
+                $cle = [];
623
+                $cle[] = array_shift($decompose); // id_objet
624
+                $cle[] = array_shift($decompose); // objet
625
+                $cle[] = $d;
626
+                if ($ext = trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee)) {
627
+                    return $ext;
628
+                }
629
+            }
630
+        }
631
+    }
632
+
633
+    return '';
634 634
 }
635 635
 
636 636
 /**
@@ -662,21 +662,21 @@  discard block
 block discarded – undo
662 662
  * @return string
663 663
  */
664 664
 function trouver_jointure_champ($champ, &$boucle, $jointures = false, $cond = false, $checkarrivee = false) {
665
-	if ($jointures === false) {
666
-		$jointures = $boucle->jointures;
667
-	}
668
-	// TODO : aberration, on utilise $jointures pour trouver le champ
669
-	// mais pas poour construire la jointure ensuite
670
-	$arrivee = trouver_champ_exterieur($champ, $jointures, $boucle, $checkarrivee);
671
-	if ($arrivee) {
672
-		$desc = $boucle->show;
673
-		array_pop($arrivee); // enlever la cle en 3eme argument
674
-		$cle = calculer_jointure($boucle, [$desc['id_table'], $desc], $arrivee, '', $cond);
675
-		if ($cle) {
676
-			return $cle;
677
-		}
678
-	}
679
-	spip_log("trouver_jointure_champ: $champ inconnu");
680
-
681
-	return '';
665
+    if ($jointures === false) {
666
+        $jointures = $boucle->jointures;
667
+    }
668
+    // TODO : aberration, on utilise $jointures pour trouver le champ
669
+    // mais pas poour construire la jointure ensuite
670
+    $arrivee = trouver_champ_exterieur($champ, $jointures, $boucle, $checkarrivee);
671
+    if ($arrivee) {
672
+        $desc = $boucle->show;
673
+        array_pop($arrivee); // enlever la cle en 3eme argument
674
+        $cle = calculer_jointure($boucle, [$desc['id_table'], $desc], $arrivee, '', $cond);
675
+        if ($cle) {
676
+            return $cle;
677
+        }
678
+    }
679
+    spip_log("trouver_jointure_champ: $champ inconnu");
680
+
681
+    return '';
682 682
 }
Please login to merge, or discard this patch.
ecrire/public/compiler.php 1 patch
Indentation   +1208 added lines, -1208 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
 /** Repérer un code ne calculant rien, meme avec commentaire */
@@ -59,92 +59,92 @@  discard block
 block discarded – undo
59 59
 
60 60
 // https://code.spip.net/@argumenter_inclure
61 61
 function argumenter_inclure(
62
-	$params,
63
-	$rejet_filtres,
64
-	$p,
65
-	&$boucles,
66
-	$id_boucle,
67
-	$echap = true,
68
-	$lang = '',
69
-	$fond1 = false
62
+    $params,
63
+    $rejet_filtres,
64
+    $p,
65
+    &$boucles,
66
+    $id_boucle,
67
+    $echap = true,
68
+    $lang = '',
69
+    $fond1 = false
70 70
 ) {
71
-	$l = [];
72
-	$erreur_p_i_i = '';
73
-	if (!is_array($params)) {
74
-		return $l;
75
-	}
76
-	foreach ($params as $k => $couple) {
77
-		// la liste d'arguments d'inclusion peut se terminer par un filtre
78
-		$filtre = array_shift($couple);
79
-		if ($filtre) {
80
-			break;
81
-		}
82
-		foreach ($couple as $n => $val) {
83
-			$var = $val[0];
84
-			if ($var->type != 'texte') {
85
-				if ($n or $k or $fond1) {
86
-					$erreur_p_i_i = [
87
-						'zbug_parametres_inclus_incorrects',
88
-						['param' => $var->nom_champ]
89
-					];
90
-					erreur_squelette($erreur_p_i_i, $p);
91
-					break;
92
-				} else {
93
-					$l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
94
-				}
95
-			} else {
96
-				preg_match(',^([^=]*)(=?)(.*)$,m', $var->texte, $m);
97
-				$m = array_pad($m, 3, null);
98
-				$var = $m[1];
99
-				$auto = false;
71
+    $l = [];
72
+    $erreur_p_i_i = '';
73
+    if (!is_array($params)) {
74
+        return $l;
75
+    }
76
+    foreach ($params as $k => $couple) {
77
+        // la liste d'arguments d'inclusion peut se terminer par un filtre
78
+        $filtre = array_shift($couple);
79
+        if ($filtre) {
80
+            break;
81
+        }
82
+        foreach ($couple as $n => $val) {
83
+            $var = $val[0];
84
+            if ($var->type != 'texte') {
85
+                if ($n or $k or $fond1) {
86
+                    $erreur_p_i_i = [
87
+                        'zbug_parametres_inclus_incorrects',
88
+                        ['param' => $var->nom_champ]
89
+                    ];
90
+                    erreur_squelette($erreur_p_i_i, $p);
91
+                    break;
92
+                } else {
93
+                    $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
94
+                }
95
+            } else {
96
+                preg_match(',^([^=]*)(=?)(.*)$,m', $var->texte, $m);
97
+                $m = array_pad($m, 3, null);
98
+                $var = $m[1];
99
+                $auto = false;
100 100
 ;
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;
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,84 +168,84 @@  discard block
 block discarded – undo
168 168
  **/
169 169
 function calculer_inclure($p, &$boucles, $id_boucle) {
170 170
 
171
-	$_options = [];
172
-	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
173
-	if (is_string($p->texte)) {
174
-		$fichier = $p->texte;
175
-		$code = '"' . str_replace('"', '\"', $fichier) . '"';
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 === '""' or $code === "''") {
185
-		$trace = $p->fonctions;
186
-		while (
187
-			is_array($trace)
188
-			and $trace = array_filter($trace)
189
-			and count($trace) == 1
190
-		) {
191
-			$trace = reset($trace);
192
-		}
193
-		$erreur_p_i_i = [
194
-			'zbug_parametres_inclus_incorrects',
195
-			['param' => print_r($trace, true)]
196
-		];
197
-		erreur_squelette($erreur_p_i_i, $p);
198
-
199
-		return "''";
200
-	}
201
-	$compil = texte_script(memoriser_contexte_compil($p));
202
-
203
-	if (is_array($_contexte)) {
204
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
205
-		if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
206
-			unset($_contexte['env']);
207
-		}
208
-
209
-		// noter les doublons dans l'appel a public.php
210
-		if (isset($_contexte['doublons'])) {
211
-			$_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
212
-		}
213
-
214
-		if ($ajax = isset($_contexte['ajax'])) {
215
-			$ajax = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
216
-			unset($_contexte['ajax']);
217
-		}
218
-
219
-		$_contexte = join(",\n\t", $_contexte);
220
-	} else {
221
-		return false;
222
-	} // j'aurais voulu toucher le fond ...
223
-
224
-	$contexte = 'array(' . $_contexte . ')';
225
-
226
-	if ($env) {
227
-		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
228
-	}
229
-
230
-	// s'il y a une extension .php, ce n'est pas un squelette
231
-	if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
232
-		$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
233
-	} else {
234
-		$_options[] = "\"compil\"=>array($compil)";
235
-		if ($ajax) {
236
-			$_options[] = $ajax;
237
-		}
238
-		$code = " ' . argumenter_squelette($code) . '";
239
-		$code = 'echo ' . sprintf(
240
-			CODE_RECUPERER_FOND,
241
-			$code,
242
-			$contexte,
243
-			implode(',', $_options),
244
-			"_request(\\'connect\\') ?? \\'\\'"
245
-		) . ';';
246
-	}
247
-
248
-	return "\n'<'.'" . '?php ' . $code . "\n?'." . "'>'";
171
+    $_options = [];
172
+    $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
173
+    if (is_string($p->texte)) {
174
+        $fichier = $p->texte;
175
+        $code = '"' . str_replace('"', '\"', $fichier) . '"';
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 === '""' or $code === "''") {
185
+        $trace = $p->fonctions;
186
+        while (
187
+            is_array($trace)
188
+            and $trace = array_filter($trace)
189
+            and count($trace) == 1
190
+        ) {
191
+            $trace = reset($trace);
192
+        }
193
+        $erreur_p_i_i = [
194
+            'zbug_parametres_inclus_incorrects',
195
+            ['param' => print_r($trace, true)]
196
+        ];
197
+        erreur_squelette($erreur_p_i_i, $p);
198
+
199
+        return "''";
200
+    }
201
+    $compil = texte_script(memoriser_contexte_compil($p));
202
+
203
+    if (is_array($_contexte)) {
204
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
205
+        if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
206
+            unset($_contexte['env']);
207
+        }
208
+
209
+        // noter les doublons dans l'appel a public.php
210
+        if (isset($_contexte['doublons'])) {
211
+            $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
212
+        }
213
+
214
+        if ($ajax = isset($_contexte['ajax'])) {
215
+            $ajax = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
216
+            unset($_contexte['ajax']);
217
+        }
218
+
219
+        $_contexte = join(",\n\t", $_contexte);
220
+    } else {
221
+        return false;
222
+    } // j'aurais voulu toucher le fond ...
223
+
224
+    $contexte = 'array(' . $_contexte . ')';
225
+
226
+    if ($env) {
227
+        $contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
228
+    }
229
+
230
+    // s'il y a une extension .php, ce n'est pas un squelette
231
+    if ($fichier and preg_match('/^.+[.]php$/s', $fichier)) {
232
+        $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
233
+    } else {
234
+        $_options[] = "\"compil\"=>array($compil)";
235
+        if ($ajax) {
236
+            $_options[] = $ajax;
237
+        }
238
+        $code = " ' . argumenter_squelette($code) . '";
239
+        $code = 'echo ' . sprintf(
240
+            CODE_RECUPERER_FOND,
241
+            $code,
242
+            $contexte,
243
+            implode(',', $_options),
244
+            "_request(\\'connect\\') ?? \\'\\'"
245
+        ) . ';';
246
+    }
247
+
248
+    return "\n'<'.'" . '?php ' . $code . "\n?'." . "'>'";
249 249
 }
250 250
 
251 251
 
@@ -263,7 +263,7 @@  discard block
 block discarded – undo
263 263
  *     true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
264 264
  */
265 265
 function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false) {
266
-	/*
266
+    /*
267 267
 	$show['statut'][] = array(
268 268
 		'champ'=>'statut',  // champ de la table sur lequel porte le filtrage par le statut
269 269
 		'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
@@ -287,74 +287,74 @@  discard block
 block discarded – undo
287 287
 	champstatut est alors le champ statut sur la tablen
288 288
 	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
289 289
 */
290
-	$id_table = $boucle->id_table;
291
-	$show = $boucle->show;
292
-	if (isset($show['statut']) and $show['statut']) {
293
-		foreach ($show['statut'] as $k => $s) {
294
-			// Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
295
-			$filtrer = true;
296
-			if (isset($s['exception'])) {
297
-				foreach (is_array($s['exception']) ? $s['exception'] : [$s['exception']] as $m) {
298
-					if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
299
-						$filtrer = false;
300
-						break;
301
-					}
302
-				}
303
-			}
304
-
305
-			if ($filtrer) {
306
-				if (is_array($s['champ'])) {
307
-					$statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
308
-					$jointures = [];
309
-					// indiquer la description de chaque table dans le tableau de jointures,
310
-					// ce qui permet d'eviter certains GROUP BY inutiles.
311
-					$trouver_table = charger_fonction('trouver_table', 'base');
312
-					foreach ($s['champ'] as $j) {
313
-						$id = reset($j);
314
-						$def = $trouver_table($id);
315
-						$jointures[] = ['', [$id, $def], end($j)];
316
-					}
317
-					$jointures[0][0] = $id_table;
318
-					if (!array_search($id, $boucle->from)) {
319
-						include_spip('public/jointures');
320
-						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
321
-					}
322
-					// trouver l'alias de la table d'arrivee qui porte le statut
323
-					$id = array_search($id, $boucle->from);
324
-				} else {
325
-					$id = $id_table;
326
-					$statut = preg_replace(',\W,', '', $s['champ']); // securite
327
-				}
328
-				$mstatut = $id . '.' . $statut;
329
-
330
-				$arg_ignore_previsu = ($ignore_previsu ? ',true' : '');
331
-				include_spip('public/quete');
332
-				if (
333
-					isset($s['post_date']) and $s['post_date']
334
-					and $GLOBALS['meta']['post_dates'] == 'non'
335
-				) {
336
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
337
-					array_unshift(
338
-						$boucle->where,
339
-						$echapper ?
340
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
341
-							:
342
-							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
343
-					);
344
-				}
345
-				array_unshift(
346
-					$boucle->where,
347
-					$echapper ?
348
-						"\nquete_condition_statut('$mstatut',"
349
-						. _q($s['previsu']) . ','
350
-						. _q($s['publie']) . ','
351
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
352
-						:
353
-						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
354
-				);
355
-			}
356
-		}
357
-	}
290
+    $id_table = $boucle->id_table;
291
+    $show = $boucle->show;
292
+    if (isset($show['statut']) and $show['statut']) {
293
+        foreach ($show['statut'] as $k => $s) {
294
+            // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
295
+            $filtrer = true;
296
+            if (isset($s['exception'])) {
297
+                foreach (is_array($s['exception']) ? $s['exception'] : [$s['exception']] as $m) {
298
+                    if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
299
+                        $filtrer = false;
300
+                        break;
301
+                    }
302
+                }
303
+            }
304
+
305
+            if ($filtrer) {
306
+                if (is_array($s['champ'])) {
307
+                    $statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
308
+                    $jointures = [];
309
+                    // indiquer la description de chaque table dans le tableau de jointures,
310
+                    // ce qui permet d'eviter certains GROUP BY inutiles.
311
+                    $trouver_table = charger_fonction('trouver_table', 'base');
312
+                    foreach ($s['champ'] as $j) {
313
+                        $id = reset($j);
314
+                        $def = $trouver_table($id);
315
+                        $jointures[] = ['', [$id, $def], end($j)];
316
+                    }
317
+                    $jointures[0][0] = $id_table;
318
+                    if (!array_search($id, $boucle->from)) {
319
+                        include_spip('public/jointures');
320
+                        fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
321
+                    }
322
+                    // trouver l'alias de la table d'arrivee qui porte le statut
323
+                    $id = array_search($id, $boucle->from);
324
+                } else {
325
+                    $id = $id_table;
326
+                    $statut = preg_replace(',\W,', '', $s['champ']); // securite
327
+                }
328
+                $mstatut = $id . '.' . $statut;
329
+
330
+                $arg_ignore_previsu = ($ignore_previsu ? ',true' : '');
331
+                include_spip('public/quete');
332
+                if (
333
+                    isset($s['post_date']) and $s['post_date']
334
+                    and $GLOBALS['meta']['post_dates'] == 'non'
335
+                ) {
336
+                    $date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
337
+                    array_unshift(
338
+                        $boucle->where,
339
+                        $echapper ?
340
+                            "\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
341
+                            :
342
+                            quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
343
+                    );
344
+                }
345
+                array_unshift(
346
+                    $boucle->where,
347
+                    $echapper ?
348
+                        "\nquete_condition_statut('$mstatut',"
349
+                        . _q($s['previsu']) . ','
350
+                        . _q($s['publie']) . ','
351
+                        . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
352
+                        :
353
+                        quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
354
+                );
355
+            }
356
+        }
357
+    }
358 358
 }
359 359
 
360 360
 /**
@@ -373,29 +373,29 @@  discard block
 block discarded – undo
373 373
  */
374 374
 function calculer_boucle($id_boucle, &$boucles) {
375 375
 
376
-	$boucle = &$boucles[$id_boucle];
377
-	instituer_boucle($boucle);
378
-	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
379
-
380
-	// en mode debug memoriser les premiers passages dans la boucle,
381
-	// mais pas tous, sinon ca pete.
382
-	if (_request('var_mode_affiche') != 'resultat') {
383
-		$trace = '';
384
-	} else {
385
-		$_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
386
-		$_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
387
-		$trace = "
376
+    $boucle = &$boucles[$id_boucle];
377
+    instituer_boucle($boucle);
378
+    $boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
379
+
380
+    // en mode debug memoriser les premiers passages dans la boucle,
381
+    // mais pas tous, sinon ca pete.
382
+    if (_request('var_mode_affiche') != 'resultat') {
383
+        $trace = '';
384
+    } else {
385
+        $_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
386
+        $_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
387
+        $trace = "
388 388
 		if (empty($_trace)) { 
389 389
 			$_trace = []; 
390 390
 		}
391 391
 		if (count($_trace) < 3) { 
392 392
 			$_trace" . '[] = $t0; 
393 393
 		}';
394
-	}
394
+    }
395 395
 
396
-	return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
397
-		? calculer_boucle_rec($id_boucle, $boucles, $trace)
398
-		: calculer_boucle_nonrec($id_boucle, $boucles, $trace);
396
+    return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
397
+        ? calculer_boucle_rec($id_boucle, $boucles, $trace)
398
+        : calculer_boucle_nonrec($id_boucle, $boucles, $trace);
399 399
 }
400 400
 
401 401
 
@@ -418,15 +418,15 @@  discard block
 block discarded – undo
418 418
  *    Code PHP compilé de la boucle récursive
419 419
  **/
420 420
 function calculer_boucle_rec($id_boucle, &$boucles, $trace) {
421
-	$nom = $boucles[$id_boucle]->param[0];
422
-
423
-	return
424
-		// Numrows[$nom] peut ne pas être encore defini
425
-		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
426
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ';'
427
-		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
428
-		. $trace
429
-		. "\n\treturn \$t0;";
421
+    $nom = $boucles[$id_boucle]->param[0];
422
+
423
+    return
424
+        // Numrows[$nom] peut ne pas être encore defini
425
+        "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
426
+        . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ';'
427
+        . "\n\t\$Numrows['$nom'] = (\$save_numrows);"
428
+        . $trace
429
+        . "\n\treturn \$t0;";
430 430
 }
431 431
 
432 432
 /**
@@ -479,174 +479,174 @@  discard block
 block discarded – undo
479 479
  **/
480 480
 function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
481 481
 
482
-	$code_sep = null;
483
-	$boucle = &$boucles[$id_boucle];
484
-	$return = $boucle->return;
485
-	$type_boucle = $boucle->type_requete;
486
-	$primary = $boucle->primary;
487
-	$constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
488
-	$flag_cpt = $boucle->mode_partie || $boucle->cptrows;
489
-	$corps = '';
490
-
491
-	// faudrait expanser le foreach a la compil, car y en a souvent qu'un
492
-	// et puis faire un [] plutot qu'un "','."
493
-	if ($boucle->doublons) {
494
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
495
-			index_pile($id_boucle, $primary, $boucles)
496
-			. "; // doublons\n";
497
-	}
498
-
499
-	// La boucle doit-elle selectionner la langue ?
500
-	// - par defaut, les boucles suivantes le font
501
-	//    (sauf si forcer_lang==true ou si le titre contient <multi>).
502
-	// - a moins d'une demande explicite via {!lang_select}
503
-	if (
504
-		!$constant && $boucle->lang_select != 'non' &&
505
-		(($boucle->lang_select == 'oui') ||
506
-			in_array($type_boucle, [
507
-				'articles',
508
-				'rubriques',
509
-				'hierarchie',
510
-				'breves'
511
-			]))
512
-	) {
513
-		// Memoriser la langue avant la boucle et la restituer apres
514
-		// afin que le corps de boucle affecte la globale directement
515
-		$init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
516
-		$fin_lang = "lang_select();\n\t";
517
-		$fin_lang_select_public = "\n\t\tlang_select();";
518
-
519
-		$corps .=
520
-			"\n\t\tlang_select_public("
521
-			. index_pile($id_boucle, 'lang', $boucles)
522
-			. ", '" . $boucle->lang_select . "'"
523
-			. (in_array($type_boucle, [
524
-				'articles',
525
-				'rubriques',
526
-				'hierarchie',
527
-				'breves'
528
-			]) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
529
-			. ');';
530
-	} else {
531
-		$init_lang = '';
532
-		$fin_lang = '';
533
-		$fin_lang_select_public = '';
534
-		// sortir les appels au traducteur (invariants de boucle)
535
-		if (
536
-			strpos($return, '?php') === false
537
-			and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
538
-		) {
539
-			$i = 1;
540
-			foreach ($r[1] as $t) {
541
-				$init_lang .= "\n\t\$l$i = $t;";
542
-				$return = str_replace($t, "\$l$i", $return);
543
-				$i++;
544
-			}
545
-		}
546
-	}
547
-
548
-	// gestion optimale des separateurs et des boucles constantes
549
-	if (is_countable($boucle->separateur) ? count($boucle->separateur) : 0) {
550
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
551
-	}
552
-
553
-	$corps .=
554
-		((!$boucle->separateur) ?
555
-			(($constant && !$corps && !$flag_cpt) ? $return :
556
-				(($return === "''") ? '' :
557
-					("\n\t\t" . '$t0 .= ' . $return . ';'))) :
558
-			("\n\t\t\$t1 " .
559
-				((strpos($return, '$t1.') === 0) ?
560
-					('.=' . substr($return, 4)) :
561
-					('= ' . $return)) .
562
-				";\n\t\t" .
563
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
564
-
565
-	// Calculer les invalideurs si c'est une boucle non constante et si on
566
-	// souhaite invalider ces elements
567
-	if (!$constant and $primary) {
568
-		include_spip('inc/invalideur');
569
-		$corps = calcul_invalideurs($corps, $primary, $boucles, $id_boucle);
570
-	}
571
-
572
-	// gerer le compteur de boucle
573
-	// avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
574
-
575
-	if ($boucle->partie or $boucle->cptrows) {
576
-		$corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
577
-			. $boucle->partie
578
-			. $corps;
579
-	}
580
-
581
-	// depiler la lang de la boucle si besoin
582
-	$corps .= $fin_lang_select_public;
583
-
584
-	// si le corps est une constante, ne pas appeler le serveur N fois!
585
-
586
-	if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
587
-		if (!isset($r[2]) or (!$r[2])) {
588
-			if (!$boucle->numrows) {
589
-				return "\n\t\$t0 = '';";
590
-			} else {
591
-				$corps = '';
592
-			}
593
-		} else {
594
-			$boucle->numrows = true;
595
-			$corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
596
-		}
597
-	} else {
598
-		$corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
599
-	}
600
-
601
-	$count = '';
602
-	if (!$boucle->select) {
603
-		if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
604
-			$count = '1';
605
-		} else {
606
-			$count = 'count(*)';
607
-		}
608
-		$boucles[$id_boucle]->select[] = $count;
609
-	}
610
-
611
-	if ($flag_cpt) {
612
-		$nums = "\n\t// COMPTEUR\n\t"
613
-			. "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
614
-	} else {
615
-		$nums = '';
616
-	}
617
-
618
-	if ($boucle->numrows or $boucle->mode_partie) {
619
-		$nums .= "\$Numrows['$id_boucle']['command'] = \$command;\n\t"
620
-			. "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
621
-			. $boucle->mode_partie
622
-			. "\n\t";
623
-	}
624
-
625
-	// Ne calculer la requete que maintenant
626
-	// car ce qui precede appelle index_pile qui influe dessus
627
-
628
-	$init = (($init = $boucles[$id_boucle]->doublons)
629
-			? ("\n\t$init = array();") : '')
630
-		. calculer_requete_sql($boucles[$id_boucle]);
631
-
632
-	$contexte = memoriser_contexte_compil($boucle);
633
-
634
-	$a = sprintf(
635
-		CODE_CORPS_BOUCLE,
636
-		$init,
637
-		$boucle->iterateur,
638
-		'$command',
639
-		$contexte,
640
-		$nums,
641
-		$init_lang,
642
-		$corps,
643
-		$fin_lang,
644
-		$trace,
645
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
646
-	);
482
+    $code_sep = null;
483
+    $boucle = &$boucles[$id_boucle];
484
+    $return = $boucle->return;
485
+    $type_boucle = $boucle->type_requete;
486
+    $primary = $boucle->primary;
487
+    $constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
488
+    $flag_cpt = $boucle->mode_partie || $boucle->cptrows;
489
+    $corps = '';
490
+
491
+    // faudrait expanser le foreach a la compil, car y en a souvent qu'un
492
+    // et puis faire un [] plutot qu'un "','."
493
+    if ($boucle->doublons) {
494
+        $corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
495
+            index_pile($id_boucle, $primary, $boucles)
496
+            . "; // doublons\n";
497
+    }
498
+
499
+    // La boucle doit-elle selectionner la langue ?
500
+    // - par defaut, les boucles suivantes le font
501
+    //    (sauf si forcer_lang==true ou si le titre contient <multi>).
502
+    // - a moins d'une demande explicite via {!lang_select}
503
+    if (
504
+        !$constant && $boucle->lang_select != 'non' &&
505
+        (($boucle->lang_select == 'oui') ||
506
+            in_array($type_boucle, [
507
+                'articles',
508
+                'rubriques',
509
+                'hierarchie',
510
+                'breves'
511
+            ]))
512
+    ) {
513
+        // Memoriser la langue avant la boucle et la restituer apres
514
+        // afin que le corps de boucle affecte la globale directement
515
+        $init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
516
+        $fin_lang = "lang_select();\n\t";
517
+        $fin_lang_select_public = "\n\t\tlang_select();";
518
+
519
+        $corps .=
520
+            "\n\t\tlang_select_public("
521
+            . index_pile($id_boucle, 'lang', $boucles)
522
+            . ", '" . $boucle->lang_select . "'"
523
+            . (in_array($type_boucle, [
524
+                'articles',
525
+                'rubriques',
526
+                'hierarchie',
527
+                'breves'
528
+            ]) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
529
+            . ');';
530
+    } else {
531
+        $init_lang = '';
532
+        $fin_lang = '';
533
+        $fin_lang_select_public = '';
534
+        // sortir les appels au traducteur (invariants de boucle)
535
+        if (
536
+            strpos($return, '?php') === false
537
+            and preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
538
+        ) {
539
+            $i = 1;
540
+            foreach ($r[1] as $t) {
541
+                $init_lang .= "\n\t\$l$i = $t;";
542
+                $return = str_replace($t, "\$l$i", $return);
543
+                $i++;
544
+            }
545
+        }
546
+    }
547
+
548
+    // gestion optimale des separateurs et des boucles constantes
549
+    if (is_countable($boucle->separateur) ? count($boucle->separateur) : 0) {
550
+        $code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
551
+    }
552
+
553
+    $corps .=
554
+        ((!$boucle->separateur) ?
555
+            (($constant && !$corps && !$flag_cpt) ? $return :
556
+                (($return === "''") ? '' :
557
+                    ("\n\t\t" . '$t0 .= ' . $return . ';'))) :
558
+            ("\n\t\t\$t1 " .
559
+                ((strpos($return, '$t1.') === 0) ?
560
+                    ('.=' . substr($return, 4)) :
561
+                    ('= ' . $return)) .
562
+                ";\n\t\t" .
563
+                '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
564
+
565
+    // Calculer les invalideurs si c'est une boucle non constante et si on
566
+    // souhaite invalider ces elements
567
+    if (!$constant and $primary) {
568
+        include_spip('inc/invalideur');
569
+        $corps = calcul_invalideurs($corps, $primary, $boucles, $id_boucle);
570
+    }
571
+
572
+    // gerer le compteur de boucle
573
+    // avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
574
+
575
+    if ($boucle->partie or $boucle->cptrows) {
576
+        $corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
577
+            . $boucle->partie
578
+            . $corps;
579
+    }
580
+
581
+    // depiler la lang de la boucle si besoin
582
+    $corps .= $fin_lang_select_public;
583
+
584
+    // si le corps est une constante, ne pas appeler le serveur N fois!
585
+
586
+    if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
587
+        if (!isset($r[2]) or (!$r[2])) {
588
+            if (!$boucle->numrows) {
589
+                return "\n\t\$t0 = '';";
590
+            } else {
591
+                $corps = '';
592
+            }
593
+        } else {
594
+            $boucle->numrows = true;
595
+            $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
596
+        }
597
+    } else {
598
+        $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
599
+    }
600
+
601
+    $count = '';
602
+    if (!$boucle->select) {
603
+        if (!$boucle->numrows or $boucle->limit or $boucle->mode_partie or $boucle->group) {
604
+            $count = '1';
605
+        } else {
606
+            $count = 'count(*)';
607
+        }
608
+        $boucles[$id_boucle]->select[] = $count;
609
+    }
610
+
611
+    if ($flag_cpt) {
612
+        $nums = "\n\t// COMPTEUR\n\t"
613
+            . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
614
+    } else {
615
+        $nums = '';
616
+    }
617
+
618
+    if ($boucle->numrows or $boucle->mode_partie) {
619
+        $nums .= "\$Numrows['$id_boucle']['command'] = \$command;\n\t"
620
+            . "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
621
+            . $boucle->mode_partie
622
+            . "\n\t";
623
+    }
624
+
625
+    // Ne calculer la requete que maintenant
626
+    // car ce qui precede appelle index_pile qui influe dessus
627
+
628
+    $init = (($init = $boucles[$id_boucle]->doublons)
629
+            ? ("\n\t$init = array();") : '')
630
+        . calculer_requete_sql($boucles[$id_boucle]);
631
+
632
+    $contexte = memoriser_contexte_compil($boucle);
633
+
634
+    $a = sprintf(
635
+        CODE_CORPS_BOUCLE,
636
+        $init,
637
+        $boucle->iterateur,
638
+        '$command',
639
+        $contexte,
640
+        $nums,
641
+        $init_lang,
642
+        $corps,
643
+        $fin_lang,
644
+        $trace,
645
+        'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
646
+    );
647 647
 
648 648
 #	var_dump($a);exit;
649
-	return $a;
649
+    return $a;
650 650
 }
651 651
 
652 652
 
@@ -662,48 +662,48 @@  discard block
 block discarded – undo
662 662
  *     Code PHP compilé définissant les informations de requête
663 663
  **/
664 664
 function calculer_requete_sql($boucle) {
665
-	$init = [];
666
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
667
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
668
-	# En absence de champ c'est un decompte :
669
-	$init[] = calculer_dec('from', calculer_from($boucle));
670
-	$init[] = calculer_dec('type', calculer_from_type($boucle));
671
-	$init[] = calculer_dec(
672
-		'groupby',
673
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ')'
674
-	);
675
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . '")');
676
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ')');
677
-	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
678
-	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
679
-	$init[] = calculer_dec(
680
-		'limit',
681
-		(
682
-			strpos($boucle->limit, 'intval') === false ?
683
-			"'" . ($boucle->limit) . "'" :
684
-			$boucle->limit
685
-		)
686
-	);
687
-	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
688
-	$s = $d = '';
689
-	// l'index 0 de $i indique si l'affectation est statique (contenu)
690
-	// ou recalculée à chaque passage (vide)
691
-	foreach ($init as $i) {
692
-		if (reset($i)) {
693
-			$s .= "\n\t\t" . end($i);
694
-		} # statique
695
-		else {
696
-			$d .= "\n\t" . end($i);
697
-		} # dynamique
698
-	}
699
-
700
-	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
701
-	. $boucle->in
702
-	. $boucle->hash
703
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
704
-	. $s
705
-	. "\n\t}"
706
-	. $d;
665
+    $init = [];
666
+    $init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
667
+    $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
668
+    # En absence de champ c'est un decompte :
669
+    $init[] = calculer_dec('from', calculer_from($boucle));
670
+    $init[] = calculer_dec('type', calculer_from_type($boucle));
671
+    $init[] = calculer_dec(
672
+        'groupby',
673
+        'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ')'
674
+    );
675
+    $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . '")');
676
+    $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ')');
677
+    $init[] = calculer_dec('where', calculer_dump_array($boucle->where));
678
+    $init[] = calculer_dec('join', calculer_dump_join($boucle->join));
679
+    $init[] = calculer_dec(
680
+        'limit',
681
+        (
682
+            strpos($boucle->limit, 'intval') === false ?
683
+            "'" . ($boucle->limit) . "'" :
684
+            $boucle->limit
685
+        )
686
+    );
687
+    $init[] = calculer_dec('having', calculer_dump_array($boucle->having));
688
+    $s = $d = '';
689
+    // l'index 0 de $i indique si l'affectation est statique (contenu)
690
+    // ou recalculée à chaque passage (vide)
691
+    foreach ($init as $i) {
692
+        if (reset($i)) {
693
+            $s .= "\n\t\t" . end($i);
694
+        } # statique
695
+        else {
696
+            $d .= "\n\t" . end($i);
697
+        } # dynamique
698
+    }
699
+
700
+    return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
701
+    . $boucle->in
702
+    . $boucle->hash
703
+    . "\n\t" . 'if (!isset($command[\'table\'])) {'
704
+    . $s
705
+    . "\n\t}"
706
+    . $d;
707 707
 }
708 708
 
709 709
 /**
@@ -721,13 +721,13 @@  discard block
 block discarded – undo
721 721
  *     qui peut être utilisé pour la production d'un tableau array()
722 722
  **/
723 723
 function memoriser_contexte_compil($p) {
724
-	return join(',', [
725
-		_q($p->descr['sourcefile'] ?? ''),
726
-		_q($p->descr['nom'] ?? ''),
727
-		_q($p->id_boucle ?? ''),
728
-		intval($p->ligne),
729
-		'$GLOBALS[\'spip_lang\']'
730
-	]);
724
+    return join(',', [
725
+        _q($p->descr['sourcefile'] ?? ''),
726
+        _q($p->descr['nom'] ?? ''),
727
+        _q($p->id_boucle ?? ''),
728
+        intval($p->ligne),
729
+        '$GLOBALS[\'spip_lang\']'
730
+    ]);
731 731
 }
732 732
 
733 733
 /**
@@ -745,19 +745,19 @@  discard block
 block discarded – undo
745 745
  *     Objet Contexte
746 746
  **/
747 747
 function reconstruire_contexte_compil($context_compil) {
748
-	if (!is_array($context_compil)) {
749
-		return $context_compil;
750
-	}
751
-	$p = new Contexte();
752
-	$p->descr = [
753
-		'sourcefile' => $context_compil[0],
754
-		'nom' => $context_compil[1]
755
-	];
756
-	$p->id_boucle = $context_compil[2];
757
-	$p->ligne = $context_compil[3];
758
-	$p->lang = $context_compil[4];
759
-
760
-	return $p;
748
+    if (!is_array($context_compil)) {
749
+        return $context_compil;
750
+    }
751
+    $p = new Contexte();
752
+    $p->descr = [
753
+        'sourcefile' => $context_compil[0],
754
+        'nom' => $context_compil[1]
755
+    ];
756
+    $p->id_boucle = $context_compil[2];
757
+    $p->ligne = $context_compil[3];
758
+    $p->lang = $context_compil[4];
759
+
760
+    return $p;
761 761
 }
762 762
 
763 763
 /**
@@ -783,12 +783,12 @@  discard block
 block discarded – undo
783 783
  *    - index 1 : Code de l'affectation
784 784
  **/
785 785
 function calculer_dec($nom, $val) {
786
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
787
-	// si une variable apparait dans le calcul de la clause
788
-	// il faut la re-evaluer a chaque passage
789
-	if (
790
-		strpos($val, '$') !== false
791
-		/*
786
+    $static = 'if (!isset($command[\'' . $nom . '\'])) ';
787
+    // si une variable apparait dans le calcul de la clause
788
+    // il faut la re-evaluer a chaque passage
789
+    if (
790
+        strpos($val, '$') !== false
791
+        /*
792 792
 		OR strpos($val, 'sql_') !== false
793 793
 		OR (
794 794
 			$test = str_replace(array("array(",'\"',"\'"),array("","",""),$val) // supprimer les array( et les echappements de guillemets
@@ -796,11 +796,11 @@  discard block
 block discarded – undo
796 796
 			AND $test = preg_replace(",'[^']*',UimsS","",$test) // supprimer les chaines qui peuvent contenir des fonctions SQL qui ne genent pas
797 797
 			AND preg_match(",\w+\s*\(,UimsS",$test,$regs) // tester la presence de fonctions restantes
798 798
 		)*/
799
-	) {
800
-		$static = '';
801
-	}
799
+    ) {
800
+        $static = '';
801
+    }
802 802
 
803
-	return [$static, '$command[\'' . $nom . '\'] = ' . $val . ';'];
803
+    return [$static, '$command[\'' . $nom . '\'] = ' . $val . ';'];
804 804
 }
805 805
 
806 806
 /**
@@ -820,33 +820,33 @@  discard block
 block discarded – undo
820 820
  *     Expression PHP décrivant un texte ou un tableau
821 821
  **/
822 822
 function calculer_dump_array($a) {
823
-	if (!is_array($a)) {
824
-		return $a;
825
-	}
826
-	$res = '';
827
-	if ($a and $a[0] == "'?'") {
828
-		return ('(' . calculer_dump_array($a[1]) .
829
-			' ? ' . calculer_dump_array($a[2]) .
830
-			' : ' . calculer_dump_array($a[3]) .
831
-			')');
832
-	} else {
833
-		foreach ($a as $k => $v) {
834
-			$showk = (is_numeric($k) ? '' : sql_quote($k) . ' => ');
835
-			$res .= ', ' . $showk . calculer_dump_array($v);
836
-		}
837
-
838
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
839
-	}
823
+    if (!is_array($a)) {
824
+        return $a;
825
+    }
826
+    $res = '';
827
+    if ($a and $a[0] == "'?'") {
828
+        return ('(' . calculer_dump_array($a[1]) .
829
+            ' ? ' . calculer_dump_array($a[2]) .
830
+            ' : ' . calculer_dump_array($a[3]) .
831
+            ')');
832
+    } else {
833
+        foreach ($a as $k => $v) {
834
+            $showk = (is_numeric($k) ? '' : sql_quote($k) . ' => ');
835
+            $res .= ', ' . $showk . calculer_dump_array($v);
836
+        }
837
+
838
+        return "\n\t\t\tarray(" . substr($res, 2) . ')';
839
+    }
840 840
 }
841 841
 
842 842
 // https://code.spip.net/@calculer_dump_join
843 843
 function calculer_dump_join($a) {
844
-	$res = '';
845
-	foreach ($a as $k => $v) {
846
-		$res .= ", '$k' => array(" . implode(',', $v) . ')';
847
-	}
844
+    $res = '';
845
+    foreach ($a as $k => $v) {
846
+        $res .= ", '$k' => array(" . implode(',', $v) . ')';
847
+    }
848 848
 
849
-	return 'array(' . substr($res, 2) . ')';
849
+    return 'array(' . substr($res, 2) . ')';
850 850
 }
851 851
 
852 852
 /**
@@ -858,12 +858,12 @@  discard block
 block discarded – undo
858 858
  *     Code PHP construisant un tableau des alias et noms des tables du FROM
859 859
  **/
860 860
 function calculer_from(&$boucle) {
861
-	$res = '';
862
-	foreach ($boucle->from as $k => $v) {
863
-		$res .= ",'$k' => '$v'";
864
-	}
861
+    $res = '';
862
+    foreach ($boucle->from as $k => $v) {
863
+        $res .= ",'$k' => '$v'";
864
+    }
865 865
 
866
-	return 'array(' . substr($res, 1) . ')';
866
+    return 'array(' . substr($res, 1) . ')';
867 867
 }
868 868
 
869 869
 /**
@@ -876,31 +876,31 @@  discard block
 block discarded – undo
876 876
  *     Code PHP construisant un tableau des alias et type de jointure du FROM
877 877
  **/
878 878
 function calculer_from_type(&$boucle) {
879
-	$res = '';
880
-	foreach ($boucle->from_type as $k => $v) {
881
-		$res .= ",'$k' => '$v'";
882
-	}
879
+    $res = '';
880
+    foreach ($boucle->from_type as $k => $v) {
881
+        $res .= ",'$k' => '$v'";
882
+    }
883 883
 
884
-	return 'array(' . substr($res, 1) . ')';
884
+    return 'array(' . substr($res, 1) . ')';
885 885
 }
886 886
 
887 887
 // https://code.spip.net/@calculer_order
888 888
 function calculer_order(&$boucle) {
889
-	if (
890
-		!$order = $boucle->order
891
-		and !$order = $boucle->default_order
892
-	) {
893
-		$order = [];
894
-	}
895
-
896
-	/*if (isset($boucle->modificateur['collate'])){
889
+    if (
890
+        !$order = $boucle->order
891
+        and !$order = $boucle->default_order
892
+    ) {
893
+        $order = [];
894
+    }
895
+
896
+    /*if (isset($boucle->modificateur['collate'])){
897 897
 		$col = "." . $boucle->modificateur['collate'];
898 898
 		foreach($order as $k=>$o)
899 899
 			if (strpos($order[$k],'COLLATE')===false)
900 900
 				$order[$k].= $col;
901 901
 	}*/
902 902
 
903
-	return join(', ', $order);
903
+    return join(', ', $order);
904 904
 }
905 905
 
906 906
 // Production du code PHP a partir de la sequence livree par le phraseur
@@ -910,62 +910,62 @@  discard block
 block discarded – undo
910 910
 
911 911
 // https://code.spip.net/@calculer_liste
912 912
 function calculer_liste($tableau, $descr, &$boucles, $id_boucle = '') {
913
-	if (!$tableau) {
914
-		return "''";
915
-	}
916
-	if (is_string($descr)) {
917
-		if (isset($boucles[$descr])) {
918
-			$idb = $descr;
919
-			$descr = [];
920
-			if (isset($boucles[$idb]->descr['id_mere_contexte'])) {
921
-				$descr['id_mere'] = $boucles[$idb]->descr['id_mere_contexte'];
922
-			}
923
-			if (isset($boucles[$idb]->descr['sourcefile'])) {
924
-				$descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
925
-			}
926
-		}
927
-		else {
928
-			$descr = [];
929
-		}
930
-	}
931
-	if (!isset($descr['niv'])) {
932
-		$descr['niv'] = 0;
933
-	}
934
-	$codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
935
-	if ($codes === false) {
936
-		return false;
937
-	}
938
-	$n = is_countable($codes) ? count($codes) : 0;
939
-	if (!$n) {
940
-		return "''";
941
-	}
942
-	$tab = str_repeat("\t", $descr['niv']);
943
-	if (_request('var_mode_affiche') != 'validation') {
944
-		if ($n == 1) {
945
-			return $codes[0];
946
-		} else {
947
-			$res = '';
948
-			foreach ($codes as $code) {
949
-				if (
950
-					!preg_match("/^'[^']*'$/", $code)
951
-					or substr($res, -1, 1) !== "'"
952
-				) {
953
-					$res .= " .\n$tab$code";
954
-				} else {
955
-					$res = substr($res, 0, -1) . substr($code, 1);
956
-				}
957
-			}
958
-
959
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
960
-		}
961
-	} else {
962
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ?: '');
963
-
964
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(
965
-			" ,\n$tab",
966
-			$codes
967
-		) . ')))';
968
-	}
913
+    if (!$tableau) {
914
+        return "''";
915
+    }
916
+    if (is_string($descr)) {
917
+        if (isset($boucles[$descr])) {
918
+            $idb = $descr;
919
+            $descr = [];
920
+            if (isset($boucles[$idb]->descr['id_mere_contexte'])) {
921
+                $descr['id_mere'] = $boucles[$idb]->descr['id_mere_contexte'];
922
+            }
923
+            if (isset($boucles[$idb]->descr['sourcefile'])) {
924
+                $descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
925
+            }
926
+        }
927
+        else {
928
+            $descr = [];
929
+        }
930
+    }
931
+    if (!isset($descr['niv'])) {
932
+        $descr['niv'] = 0;
933
+    }
934
+    $codes = compile_cas($tableau, $descr, $boucles, $id_boucle);
935
+    if ($codes === false) {
936
+        return false;
937
+    }
938
+    $n = is_countable($codes) ? count($codes) : 0;
939
+    if (!$n) {
940
+        return "''";
941
+    }
942
+    $tab = str_repeat("\t", $descr['niv']);
943
+    if (_request('var_mode_affiche') != 'validation') {
944
+        if ($n == 1) {
945
+            return $codes[0];
946
+        } else {
947
+            $res = '';
948
+            foreach ($codes as $code) {
949
+                if (
950
+                    !preg_match("/^'[^']*'$/", $code)
951
+                    or substr($res, -1, 1) !== "'"
952
+                ) {
953
+                    $res .= " .\n$tab$code";
954
+                } else {
955
+                    $res = substr($res, 0, -1) . substr($code, 1);
956
+                }
957
+            }
958
+
959
+            return '(' . substr($res, 2 + $descr['niv']) . ')';
960
+        }
961
+    } else {
962
+        $nom = $descr['nom'] . $id_boucle . ($descr['niv'] ?: '');
963
+
964
+        return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(
965
+            " ,\n$tab",
966
+            $codes
967
+        ) . ')))';
968
+    }
969 969
 }
970 970
 
971 971
 
@@ -976,213 +976,213 @@  discard block
 block discarded – undo
976 976
 // https://code.spip.net/@compile_cas
977 977
 function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
978 978
 
979
-	$codes = [];
980
-	// cas de la boucle recursive
981
-	if (is_array($id_boucle)) {
982
-		$id_boucle = $id_boucle[0];
983
-	}
984
-	$type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
985
-	$tab = str_repeat("\t", ++$descr['niv']);
986
-	$mode = _request('var_mode_affiche');
987
-	$err_e_c = '';
988
-	// chaque commentaire introduit dans le code doit commencer
989
-	// par un caractere distinguant le cas, pour exploitation par debug.
990
-	foreach ($tableau as $p) {
991
-		switch ($p->type) {
992
-			// texte seul
993
-			case 'texte':
994
-				$code = sandbox_composer_texte($p->texte, $p);
995
-				$commentaire = strlen($p->texte) . ' signes';
996
-				$avant = '';
997
-				$apres = '';
998
-				$altern = "''";
999
-				break;
1000
-
1001
-			case 'polyglotte':
1002
-				$code = '';
1003
-				foreach ($p->traductions as $k => $v) {
1004
-					$code .= ",'" .
1005
-						str_replace(['\\', "'"], ['\\\\', "\\'"], $k) .
1006
-						"' => '" .
1007
-						str_replace(['\\', "'"], ['\\\\', "\\'"], $v) .
1008
-						"'";
1009
-				}
1010
-				$code = 'choisir_traduction(array(' .
1011
-					substr($code, 1) .
1012
-					'))';
1013
-				$commentaire = '&';
1014
-				$avant = '';
1015
-				$apres = '';
1016
-				$altern = "''";
1017
-				break;
1018
-
1019
-			// inclure
1020
-			case 'include':
1021
-				$p->descr = $descr;
1022
-				$code = calculer_inclure($p, $boucles, $id_boucle);
1023
-				if ($code === false) {
1024
-					$err_e_c = true;
1025
-					$code = "''";
1026
-				} else {
1027
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1028
-					$avant = '';
1029
-					$apres = '';
1030
-					$altern = "''";
1031
-				}
1032
-				break;
1033
-
1034
-			// boucle
1035
-			case TYPE_RECURSIF:
1036
-				$nom = $p->id_boucle;
1037
-				$newdescr = $descr;
1038
-				$newdescr['id_mere'] = $nom;
1039
-				$newdescr['niv']++;
1040
-				$preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
1041
-				$avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
1042
-				$apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
1043
-				$postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
1044
-				$newdescr['niv']--;
1045
-				$altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
1046
-				if (
1047
-					$preaff === false
1048
-					or $avant === false
1049
-					or $apres === false
1050
-					or $altern === false
1051
-					or $postaff === false
1052
-				) {
1053
-					$err_e_c = true;
1054
-					$code = "''";
1055
-				} else {
1056
-					$code = 'BOUCLE' .
1057
-						str_replace('-', '_', $nom) . $descr['nom'] .
1058
-						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1059
-					$commentaire = "?$nom";
1060
-					if (
1061
-						!$boucles[$nom]->milieu
1062
-						and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1063
-					) {
1064
-						if ($preaff != "''") {
1065
-							$code .= "\n. $preaff";
1066
-						}
1067
-						if ($altern != "''") {
1068
-							$code .= "\n. $altern";
1069
-						}
1070
-						if ($postaff != "''") {
1071
-							$code .= "\n. $postaff";
1072
-						}
1073
-						if ($avant <> "''" or $apres <> "''") {
1074
-							spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1075
-						}
1076
-						$avant = $apres = $altern = "''";
1077
-					} else {
1078
-						if ($preaff != "''") {
1079
-							$avant = compile_concatene_parties_codes($preaff, $avant);
1080
-							$altern = compile_concatene_parties_codes($preaff, $altern);
1081
-						}
1082
-						if ($postaff != "''") {
1083
-							$apres = compile_concatene_parties_codes($apres, $postaff);
1084
-							$altern = compile_concatene_parties_codes($altern, $postaff);
1085
-						}
1086
-						if ($altern != "''") {
1087
-							$altern = "($altern)";
1088
-						}
1089
-					}
1090
-				}
1091
-				break;
1092
-
1093
-			case 'idiome':
1094
-				$l = [];
1095
-				$code = '';
1096
-				foreach ($p->arg as $k => $v) {
1097
-					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1098
-					if ($k) {
1099
-						$l[] = _q($k) . ' => ' . $_v;
1100
-					} else {
1101
-						$code = $_v;
1102
-					}
1103
-				}
1104
-				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1105
-				if ($p->module) {
1106
-					$m = $p->module . ':' . $p->nom_champ;
1107
-				} elseif ($p->nom_champ) {
1108
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1109
-				} else {
1110
-					$m = '';
1111
-				}
1112
-
1113
-				$code = (!$code ? "'$m'" :
1114
-						($m ? "'$m' . $code" :
1115
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1116
-					. (!$l ? '' : (', array(' . implode(",\n", $l) . ')'));
1117
-				$code = "_T($code)";
1118
-				if ($p->param) {
1119
-					$p->id_boucle = $id_boucle;
1120
-					$p->boucles = &$boucles;
1121
-					$code = compose_filtres($p, $code);
1122
-				}
1123
-				$commentaire = ':';
1124
-				$avant = '';
1125
-				$apres = '';
1126
-				$altern = "''";
1127
-				break;
1128
-
1129
-			case 'champ':
1130
-				// cette structure pourrait etre completee des le phrase' (a faire)
1131
-				$p->id_boucle = $id_boucle;
1132
-				$p->boucles = &$boucles;
1133
-				$p->descr = $descr;
1134
-				#$p->interdire_scripts = true;
1135
-				$p->type_requete = $type;
1136
-
1137
-				$code = calculer_champ($p);
1138
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1139
-				$avant = calculer_liste(
1140
-					$p->avant,
1141
-					$descr,
1142
-					$boucles,
1143
-					$id_boucle
1144
-				);
1145
-				$apres = calculer_liste(
1146
-					$p->apres,
1147
-					$descr,
1148
-					$boucles,
1149
-					$id_boucle
1150
-				);
1151
-				$altern = "''";
1152
-				// Si la valeur est destinee a une comparaison a ''
1153
-				// forcer la conversion en une chaine par strval
1154
-				// si ca peut etre autre chose qu'une chaine
1155
-				if (
1156
-					($avant != "''" or $apres != "''")
1157
-					and $code[0] != "'"
979
+    $codes = [];
980
+    // cas de la boucle recursive
981
+    if (is_array($id_boucle)) {
982
+        $id_boucle = $id_boucle[0];
983
+    }
984
+    $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
985
+    $tab = str_repeat("\t", ++$descr['niv']);
986
+    $mode = _request('var_mode_affiche');
987
+    $err_e_c = '';
988
+    // chaque commentaire introduit dans le code doit commencer
989
+    // par un caractere distinguant le cas, pour exploitation par debug.
990
+    foreach ($tableau as $p) {
991
+        switch ($p->type) {
992
+            // texte seul
993
+            case 'texte':
994
+                $code = sandbox_composer_texte($p->texte, $p);
995
+                $commentaire = strlen($p->texte) . ' signes';
996
+                $avant = '';
997
+                $apres = '';
998
+                $altern = "''";
999
+                break;
1000
+
1001
+            case 'polyglotte':
1002
+                $code = '';
1003
+                foreach ($p->traductions as $k => $v) {
1004
+                    $code .= ",'" .
1005
+                        str_replace(['\\', "'"], ['\\\\', "\\'"], $k) .
1006
+                        "' => '" .
1007
+                        str_replace(['\\', "'"], ['\\\\', "\\'"], $v) .
1008
+                        "'";
1009
+                }
1010
+                $code = 'choisir_traduction(array(' .
1011
+                    substr($code, 1) .
1012
+                    '))';
1013
+                $commentaire = '&';
1014
+                $avant = '';
1015
+                $apres = '';
1016
+                $altern = "''";
1017
+                break;
1018
+
1019
+            // inclure
1020
+            case 'include':
1021
+                $p->descr = $descr;
1022
+                $code = calculer_inclure($p, $boucles, $id_boucle);
1023
+                if ($code === false) {
1024
+                    $err_e_c = true;
1025
+                    $code = "''";
1026
+                } else {
1027
+                    $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1028
+                    $avant = '';
1029
+                    $apres = '';
1030
+                    $altern = "''";
1031
+                }
1032
+                break;
1033
+
1034
+            // boucle
1035
+            case TYPE_RECURSIF:
1036
+                $nom = $p->id_boucle;
1037
+                $newdescr = $descr;
1038
+                $newdescr['id_mere'] = $nom;
1039
+                $newdescr['niv']++;
1040
+                $preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
1041
+                $avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
1042
+                $apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
1043
+                $postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
1044
+                $newdescr['niv']--;
1045
+                $altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
1046
+                if (
1047
+                    $preaff === false
1048
+                    or $avant === false
1049
+                    or $apres === false
1050
+                    or $altern === false
1051
+                    or $postaff === false
1052
+                ) {
1053
+                    $err_e_c = true;
1054
+                    $code = "''";
1055
+                } else {
1056
+                    $code = 'BOUCLE' .
1057
+                        str_replace('-', '_', $nom) . $descr['nom'] .
1058
+                        '($Cache, $Pile, $doublons, $Numrows, $SP)';
1059
+                    $commentaire = "?$nom";
1060
+                    if (
1061
+                        !$boucles[$nom]->milieu
1062
+                        and $boucles[$nom]->type_requete <> TYPE_RECURSIF
1063
+                    ) {
1064
+                        if ($preaff != "''") {
1065
+                            $code .= "\n. $preaff";
1066
+                        }
1067
+                        if ($altern != "''") {
1068
+                            $code .= "\n. $altern";
1069
+                        }
1070
+                        if ($postaff != "''") {
1071
+                            $code .= "\n. $postaff";
1072
+                        }
1073
+                        if ($avant <> "''" or $apres <> "''") {
1074
+                            spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1075
+                        }
1076
+                        $avant = $apres = $altern = "''";
1077
+                    } else {
1078
+                        if ($preaff != "''") {
1079
+                            $avant = compile_concatene_parties_codes($preaff, $avant);
1080
+                            $altern = compile_concatene_parties_codes($preaff, $altern);
1081
+                        }
1082
+                        if ($postaff != "''") {
1083
+                            $apres = compile_concatene_parties_codes($apres, $postaff);
1084
+                            $altern = compile_concatene_parties_codes($altern, $postaff);
1085
+                        }
1086
+                        if ($altern != "''") {
1087
+                            $altern = "($altern)";
1088
+                        }
1089
+                    }
1090
+                }
1091
+                break;
1092
+
1093
+            case 'idiome':
1094
+                $l = [];
1095
+                $code = '';
1096
+                foreach ($p->arg as $k => $v) {
1097
+                    $_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1098
+                    if ($k) {
1099
+                        $l[] = _q($k) . ' => ' . $_v;
1100
+                    } else {
1101
+                        $code = $_v;
1102
+                    }
1103
+                }
1104
+                // Si le module n'est pas fourni, l'expliciter sauf si calculé
1105
+                if ($p->module) {
1106
+                    $m = $p->module . ':' . $p->nom_champ;
1107
+                } elseif ($p->nom_champ) {
1108
+                    $m = MODULES_IDIOMES . ':' . $p->nom_champ;
1109
+                } else {
1110
+                    $m = '';
1111
+                }
1112
+
1113
+                $code = (!$code ? "'$m'" :
1114
+                        ($m ? "'$m' . $code" :
1115
+                            ("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1116
+                    . (!$l ? '' : (', array(' . implode(",\n", $l) . ')'));
1117
+                $code = "_T($code)";
1118
+                if ($p->param) {
1119
+                    $p->id_boucle = $id_boucle;
1120
+                    $p->boucles = &$boucles;
1121
+                    $code = compose_filtres($p, $code);
1122
+                }
1123
+                $commentaire = ':';
1124
+                $avant = '';
1125
+                $apres = '';
1126
+                $altern = "''";
1127
+                break;
1128
+
1129
+            case 'champ':
1130
+                // cette structure pourrait etre completee des le phrase' (a faire)
1131
+                $p->id_boucle = $id_boucle;
1132
+                $p->boucles = &$boucles;
1133
+                $p->descr = $descr;
1134
+                #$p->interdire_scripts = true;
1135
+                $p->type_requete = $type;
1136
+
1137
+                $code = calculer_champ($p);
1138
+                $commentaire = '#' . $p->nom_champ . $p->etoile;
1139
+                $avant = calculer_liste(
1140
+                    $p->avant,
1141
+                    $descr,
1142
+                    $boucles,
1143
+                    $id_boucle
1144
+                );
1145
+                $apres = calculer_liste(
1146
+                    $p->apres,
1147
+                    $descr,
1148
+                    $boucles,
1149
+                    $id_boucle
1150
+                );
1151
+                $altern = "''";
1152
+                // Si la valeur est destinee a une comparaison a ''
1153
+                // forcer la conversion en une chaine par strval
1154
+                // si ca peut etre autre chose qu'une chaine
1155
+                if (
1156
+                    ($avant != "''" or $apres != "''")
1157
+                    and $code[0] != "'"
1158 1158
 #			AND (strpos($code,'interdire_scripts') !== 0)
1159
-					and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1160
-					and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1161
-					and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1162
-				) {
1163
-					$code = "strval($code)";
1164
-				}
1165
-				break;
1166
-
1167
-			default:
1168
-				// Erreur de construction de l'arbre de syntaxe abstraite
1169
-				$code = "''";
1170
-				$p->descr = $descr;
1171
-				$err_e_c = _T('zbug_erreur_compilation');
1172
-				erreur_squelette($err_e_c, $p);
1173
-		} // switch
1174
-
1175
-		if ($code != "''") {
1176
-			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1177
-			$codes[] = (($mode == 'validation') ?
1178
-				"array($code, '$commentaire', " . $p->ligne . ')'
1179
-				: (($mode == 'code') ?
1180
-					"\n// $commentaire\n$code" :
1181
-					$code));
1182
-		}
1183
-	} // foreach
1184
-
1185
-	return $err_e_c ? false : $codes;
1159
+                    and !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1160
+                    and !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1161
+                    and !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1162
+                ) {
1163
+                    $code = "strval($code)";
1164
+                }
1165
+                break;
1166
+
1167
+            default:
1168
+                // Erreur de construction de l'arbre de syntaxe abstraite
1169
+                $code = "''";
1170
+                $p->descr = $descr;
1171
+                $err_e_c = _T('zbug_erreur_compilation');
1172
+                erreur_squelette($err_e_c, $p);
1173
+        } // switch
1174
+
1175
+        if ($code != "''") {
1176
+            $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1177
+            $codes[] = (($mode == 'validation') ?
1178
+                "array($code, '$commentaire', " . $p->ligne . ')'
1179
+                : (($mode == 'code') ?
1180
+                    "\n// $commentaire\n$code" :
1181
+                    $code));
1182
+        }
1183
+    } // foreach
1184
+
1185
+    return $err_e_c ? false : $codes;
1186 1186
 }
1187 1187
 
1188 1188
 /**
@@ -1192,13 +1192,13 @@  discard block
 block discarded – undo
1192 1192
  * @return string
1193 1193
  */
1194 1194
 function compile_concatene_parties_codes($partie1, $partie2) {
1195
-	if ($partie1 === "''") {
1196
-		return $partie2;
1197
-	}
1198
-	if ($partie2 === "''") {
1199
-		return $partie1;
1200
-	}
1201
-	return "$partie1\n. $partie2";
1195
+    if ($partie1 === "''") {
1196
+        return $partie2;
1197
+    }
1198
+    if ($partie2 === "''") {
1199
+        return $partie1;
1200
+    }
1201
+    return "$partie1\n. $partie2";
1202 1202
 }
1203 1203
 
1204 1204
 
@@ -1223,56 +1223,56 @@  discard block
 block discarded – undo
1223 1223
  * @return mixed|string
1224 1224
  */
1225 1225
 function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
1226
-	if ($avant === "''") {
1227
-		$avant = '';
1228
-	}
1229
-	if ($apres === "''") {
1230
-		$apres = '';
1231
-	}
1232
-	if ($avant or $apres or ($altern !== "''")) {
1233
-		if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1234
-			$t = $code;
1235
-			$cond = '';
1236
-		} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1237
-			$t = $r[2];
1238
-			$cond = '!' . $r[1];
1239
-		} else {
1240
-			if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1241
-				$t = $r[2];
1242
-				$cond = $r[1];
1243
-			} else {
1244
-				$t = '$t' . $n;
1245
-				$cond = "($t = $code)!==''";
1246
-			}
1247
-		}
1248
-
1249
-		$res = (!$avant ? '' : "$avant . ") .
1250
-			$t .
1251
-			(!$apres ? '' : " . $apres");
1252
-
1253
-		if ($res !== $t) {
1254
-			$res = "($res)";
1255
-		}
1256
-
1257
-		$code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
1258
-	}
1259
-
1260
-	return $code;
1226
+    if ($avant === "''") {
1227
+        $avant = '';
1228
+    }
1229
+    if ($apres === "''") {
1230
+        $apres = '';
1231
+    }
1232
+    if ($avant or $apres or ($altern !== "''")) {
1233
+        if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1234
+            $t = $code;
1235
+            $cond = '';
1236
+        } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1237
+            $t = $r[2];
1238
+            $cond = '!' . $r[1];
1239
+        } else {
1240
+            if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1241
+                $t = $r[2];
1242
+                $cond = $r[1];
1243
+            } else {
1244
+                $t = '$t' . $n;
1245
+                $cond = "($t = $code)!==''";
1246
+            }
1247
+        }
1248
+
1249
+        $res = (!$avant ? '' : "$avant . ") .
1250
+            $t .
1251
+            (!$apres ? '' : " . $apres");
1252
+
1253
+        if ($res !== $t) {
1254
+            $res = "($res)";
1255
+        }
1256
+
1257
+        $code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
1258
+    }
1259
+
1260
+    return $code;
1261 1261
 }
1262 1262
 
1263 1263
 
1264 1264
 function compile_inclure_doublons($lexemes) {
1265
-	foreach ($lexemes as $v) {
1266
-		if ($v->type === 'include' and $v->param) {
1267
-			foreach ($v->param as $r) {
1268
-				if (trim($r[0]) === 'doublons') {
1269
-					return true;
1270
-				}
1271
-			}
1272
-		}
1273
-	}
1274
-
1275
-	return false;
1265
+    foreach ($lexemes as $v) {
1266
+        if ($v->type === 'include' and $v->param) {
1267
+            foreach ($v->param as $r) {
1268
+                if (trim($r[0]) === 'doublons') {
1269
+                    return true;
1270
+                }
1271
+            }
1272
+        }
1273
+    }
1274
+
1275
+    return false;
1276 1276
 }
1277 1277
 
1278 1278
 // Prend en argument le texte d'un squelette, le nom de son fichier d'origine,
@@ -1292,354 +1292,354 @@  discard block
 block discarded – undo
1292 1292
 
1293 1293
 // https://code.spip.net/@public_compiler_dist
1294 1294
 function public_compiler_dist($squelette, $nom, $gram, $sourcefile, string $connect = '') {
1295
-	// Pre-traitement : reperer le charset du squelette, et le convertir
1296
-	// Bonus : supprime le BOM
1297
-	include_spip('inc/charsets');
1298
-	$squelette = transcoder_page($squelette);
1299
-
1300
-	// rendre inertes les echappements de #[](){}<>
1301
-	$i = 0;
1302
-	while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1303
-		$i++;
1304
-	}
1305
-	$squelette = preg_replace_callback(
1306
-		',\\\\([#[()\]{}<>]),',
1307
-		fn($a) => "$inerte-" . ord($a[1]) . '-',
1308
-		$squelette,
1309
-		-1,
1310
-		$esc
1311
-	);
1312
-
1313
-	$descr = [
1314
-		'nom' => $nom,
1315
-		'gram' => $gram,
1316
-		'sourcefile' => $sourcefile,
1317
-		'squelette' => $squelette
1318
-	];
1319
-
1320
-	// Phraser le squelette, selon sa grammaire
1321
-
1322
-	$boucles = [];
1323
-	$f = charger_fonction('phraser_' . $gram, 'public');
1324
-
1325
-	$squelette = $f($squelette, '', $boucles, $descr);
1326
-
1327
-	$boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1328
-
1329
-	// restituer les echappements
1330
-	if ($esc) {
1331
-		foreach ($boucles as $i => $boucle) {
1332
-			$boucles[$i]->return = preg_replace_callback(
1333
-				",$inerte-(\d+)-,",
1334
-				fn($a) => chr($a[1]),
1335
-				$boucle->return
1336
-			);
1337
-			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1338
-				",$inerte-(\d+)-,",
1339
-				fn($a) => '\\\\' . chr($a[1]),
1340
-				$boucle->descr['squelette']
1341
-			);
1342
-		}
1343
-	}
1344
-
1345
-	$debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1346
-	if ($debug) {
1347
-		include_spip('public/decompiler');
1348
-		foreach ($boucles as $id => $boucle) {
1349
-			if ($id) {
1350
-				$decomp = "\n/* BOUCLE " .
1351
-					$boucle->type_requete .
1352
-					' ' .
1353
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1354
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1355
-					" */\n";
1356
-			} else {
1357
-				$decomp = ("\n/*\n" .
1358
-					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1359
-					. "\n*/");
1360
-			}
1361
-			$boucles[$id]->return = $decomp . $boucle->return;
1362
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1363
-		}
1364
-	}
1365
-
1366
-	return $boucles;
1295
+    // Pre-traitement : reperer le charset du squelette, et le convertir
1296
+    // Bonus : supprime le BOM
1297
+    include_spip('inc/charsets');
1298
+    $squelette = transcoder_page($squelette);
1299
+
1300
+    // rendre inertes les echappements de #[](){}<>
1301
+    $i = 0;
1302
+    while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) {
1303
+        $i++;
1304
+    }
1305
+    $squelette = preg_replace_callback(
1306
+        ',\\\\([#[()\]{}<>]),',
1307
+        fn($a) => "$inerte-" . ord($a[1]) . '-',
1308
+        $squelette,
1309
+        -1,
1310
+        $esc
1311
+    );
1312
+
1313
+    $descr = [
1314
+        'nom' => $nom,
1315
+        'gram' => $gram,
1316
+        'sourcefile' => $sourcefile,
1317
+        'squelette' => $squelette
1318
+    ];
1319
+
1320
+    // Phraser le squelette, selon sa grammaire
1321
+
1322
+    $boucles = [];
1323
+    $f = charger_fonction('phraser_' . $gram, 'public');
1324
+
1325
+    $squelette = $f($squelette, '', $boucles, $descr);
1326
+
1327
+    $boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1328
+
1329
+    // restituer les echappements
1330
+    if ($esc) {
1331
+        foreach ($boucles as $i => $boucle) {
1332
+            $boucles[$i]->return = preg_replace_callback(
1333
+                ",$inerte-(\d+)-,",
1334
+                fn($a) => chr($a[1]),
1335
+                $boucle->return
1336
+            );
1337
+            $boucles[$i]->descr['squelette'] = preg_replace_callback(
1338
+                ",$inerte-(\d+)-,",
1339
+                fn($a) => '\\\\' . chr($a[1]),
1340
+                $boucle->descr['squelette']
1341
+            );
1342
+        }
1343
+    }
1344
+
1345
+    $debug = ($boucles and defined('_VAR_MODE') and _VAR_MODE == 'debug');
1346
+    if ($debug) {
1347
+        include_spip('public/decompiler');
1348
+        foreach ($boucles as $id => $boucle) {
1349
+            if ($id) {
1350
+                $decomp = "\n/* BOUCLE " .
1351
+                    $boucle->type_requete .
1352
+                    ' ' .
1353
+                    str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1354
+                    ($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1355
+                    " */\n";
1356
+            } else {
1357
+                $decomp = ("\n/*\n" .
1358
+                    str_replace('*/', '* /', public_decompiler($squelette, $gram))
1359
+                    . "\n*/");
1360
+            }
1361
+            $boucles[$id]->return = $decomp . $boucle->return;
1362
+            $GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1363
+        }
1364
+    }
1365
+
1366
+    return $boucles;
1367 1367
 }
1368 1368
 
1369 1369
 // Point d'entree pour arbre de syntaxe abstraite fourni en premier argument
1370 1370
 // Autres specifications comme ci-dessus
1371 1371
 
1372 1372
 function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, string $connect = '') {
1373
-	static $trouver_table;
1374
-	spip_timer('calcul_skel');
1375
-
1376
-	if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1377
-		$GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1378
-		$GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1379
-
1380
-		if (!isset($GLOBALS['debug_objets']['principal'])) {
1381
-			$GLOBALS['debug_objets']['principal'] = $nom;
1382
-		}
1383
-	}
1384
-	foreach ($boucles as $id => $boucle) {
1385
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1386
-	}
1387
-	$descr['documents'] = compile_inclure_doublons($squelette);
1388
-
1389
-	// Demander la description des tables une fois pour toutes
1390
-	if (!$trouver_table) {
1391
-		$trouver_table = charger_fonction('trouver_table', 'base');
1392
-	}
1393
-
1394
-	// reperer si les doublons sont demandes
1395
-	// pour un inclure ou une boucle document
1396
-	// c'est utile a la fonction champs_traitements
1397
-	foreach ($boucles as $id => $boucle) {
1398
-		if (!($type = $boucle->type_requete)) {
1399
-			continue;
1400
-		}
1401
-		if (
1402
-			!$descr['documents'] and (
1403
-				(($type == 'documents') and $boucle->doublons) or
1404
-				compile_inclure_doublons($boucle->avant) or
1405
-				compile_inclure_doublons($boucle->apres) or
1406
-				compile_inclure_doublons($boucle->milieu) or
1407
-				compile_inclure_doublons($boucle->altern))
1408
-		) {
1409
-			$descr['documents'] = true;
1410
-		}
1411
-		if ($type != TYPE_RECURSIF) {
1412
-			if (!$boucles[$id]->sql_serveur and $connect) {
1413
-				$boucles[$id]->sql_serveur = $connect;
1414
-			}
1415
-
1416
-			// chercher dans les iterateurs du repertoire iterateur/
1417
-			if (
1418
-				$g = charger_fonction(
1419
-					preg_replace('/\W/', '_', $boucle->type_requete),
1420
-					'iterateur',
1421
-					true
1422
-				)
1423
-			) {
1424
-				$boucles[$id] = $g($boucle);
1425
-
1426
-				// sinon, en cas de requeteur d'un type predefini,
1427
-				// utiliser les informations donnees par le requeteur
1428
-				// cas "php:xx" et "data:xx".
1429
-			} else {
1430
-				if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1431
-					$requeteur($boucles, $boucle, $id);
1432
-
1433
-					// utiliser la description des champs transmis
1434
-				} else {
1435
-					$show = $trouver_table($type, $boucles[$id]->sql_serveur);
1436
-					// si la table n'existe pas avec le connecteur par defaut,
1437
-					// c'est peut etre une table qui necessite son connecteur dedie fourni
1438
-					// permet une ecriture allegee (GEO) -> (geo:GEO)
1439
-					if (
1440
-						!$show
1441
-						and $show = $trouver_table($type, strtolower($type))
1442
-					) {
1443
-						$boucles[$id]->sql_serveur = strtolower($type);
1444
-					}
1445
-					if ($show) {
1446
-						$boucles[$id]->show = $show;
1447
-						// recopie les infos les plus importantes
1448
-						$boucles[$id]->primary = $show['key']['PRIMARY KEY'] ?? '';
1449
-						$boucles[$id]->id_table = $x = preg_replace(',^spip_,', '', $show['id_table']);
1450
-						$boucles[$id]->from[$x] = $nom_table = $show['table'];
1451
-						$boucles[$id]->iterateur = 'SQL';
1452
-
1453
-						if (empty($boucles[$id]->descr)) {
1454
-							$boucles[$id]->descr = &$descr;
1455
-						}
1456
-						if (
1457
-							(!$boucles[$id]->jointures)
1458
-							and is_array($show['tables_jointures'])
1459
-							and count($x = $show['tables_jointures'])
1460
-						) {
1461
-							$boucles[$id]->jointures = $x;
1462
-						}
1463
-						if ($boucles[$id]->jointures_explicites) {
1464
-							$jointures = preg_split('/\s+/', $boucles[$id]->jointures_explicites);
1465
-							while ($j = array_pop($jointures)) {
1466
-								array_unshift($boucles[$id]->jointures, $j);
1467
-							}
1468
-						}
1469
-					} else {
1470
-						// Pas une erreur si la table est optionnelle
1471
-						if ($boucles[$id]->table_optionnelle) {
1472
-							$boucles[$id]->type_requete = '';
1473
-						} else {
1474
-							$boucles[$id]->type_requete = false;
1475
-							$boucle = $boucles[$id];
1476
-							$x = (!$boucle->sql_serveur ? '' :
1477
-									($boucle->sql_serveur . ':')) .
1478
-								$type;
1479
-							$msg = [
1480
-								'zbug_table_inconnue',
1481
-								['table' => $x]
1482
-							];
1483
-							erreur_squelette($msg, $boucle);
1484
-						}
1485
-					}
1486
-				}
1487
-			}
1488
-		}
1489
-	}
1490
-
1491
-	// Commencer par reperer les boucles appelees explicitement
1492
-	// car elles indexent les arguments de maniere derogatoire
1493
-	foreach ($boucles as $id => $boucle) {
1494
-		if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1495
-			$boucles[$id]->descr = &$descr;
1496
-			$rec = &$boucles[$boucle->param[0]];
1497
-			if (!$rec) {
1498
-				$msg = [
1499
-					'zbug_boucle_recursive_undef',
1500
-					['nom' => $boucle->param[0]]
1501
-				];
1502
-				erreur_squelette($msg, $boucle);
1503
-				$boucles[$id]->type_requete = false;
1504
-			} else {
1505
-				$rec->externe = $id;
1506
-				$descr['id_mere'] = $id;
1507
-				$boucles[$id]->return =
1508
-					calculer_liste(
1509
-						[$rec],
1510
-						$descr,
1511
-						$boucles,
1512
-						$boucle->param
1513
-					);
1514
-			}
1515
-		}
1516
-	}
1517
-	foreach ($boucles as $id => $boucle) {
1518
-		$id = strval($id); // attention au type dans index_pile
1519
-		$type = $boucle->type_requete;
1520
-		if ($type and $type != TYPE_RECURSIF) {
1521
-			$res = '';
1522
-			if ($boucle->param) {
1523
-				// retourne un tableau en cas d'erreur
1524
-				$res = calculer_criteres($id, $boucles);
1525
-			}
1526
-			$descr['id_mere'] = $id;
1527
-			$boucles[$id]->return =
1528
-				calculer_liste(
1529
-					$boucle->milieu,
1530
-					$descr,
1531
-					$boucles,
1532
-					$id
1533
-				);
1534
-			// Si les criteres se sont mal compiles
1535
-			// ne pas tenter d'assembler le code final
1536
-			// (mais compiler le corps pour detection d'erreurs)
1537
-			if (is_array($res)) {
1538
-				$boucles[$id]->type_requete = false;
1539
-			}
1540
-		}
1541
-	}
1542
-
1543
-	// idem pour la racine
1544
-	$descr['id_mere'] = '';
1545
-	$corps = calculer_liste($squelette, $descr, $boucles);
1546
-
1547
-
1548
-	// Calcul du corps de toutes les fonctions PHP,
1549
-	// en particulier les requetes SQL et TOTAL_BOUCLE
1550
-	// de'terminables seulement maintenant
1551
-
1552
-	foreach ($boucles as $id => $boucle) {
1553
-		$boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1554
-		if ($boucle->return === false) {
1555
-			$corps = false;
1556
-			continue;
1557
-		}
1558
-		// appeler la fonction de definition de la boucle
1559
-
1560
-		if ($req = $boucle->type_requete) {
1561
-			// boucle personnalisée ?
1562
-			$table = strtoupper($boucle->type_requete);
1563
-			$serveur = strtolower($boucle->sql_serveur);
1564
-			if (
1565
-				// fonction de boucle avec serveur & table
1566
-				(!$serveur or
1567
-					((!function_exists($f = 'boucle_' . $serveur . '_' . $table))
1568
-						and (!function_exists($f = $f . '_dist'))
1569
-					)
1570
-				)
1571
-				// fonction de boucle avec table
1572
-				and (!function_exists($f = 'boucle_' . $table))
1573
-				and (!function_exists($f = $f . '_dist'))
1574
-			) {
1575
-				// fonction de boucle standard
1576
-				if (!function_exists($f = 'boucle_DEFAUT')) {
1577
-					$f = 'boucle_DEFAUT_dist';
1578
-				}
1579
-			}
1580
-
1581
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1582
-				"static \$connect;\n\t" .
1583
-				"\$command['connect'] = \$connect = " .
1584
-				_q($boucle->sql_serveur) .
1585
-				';' .
1586
-				$f($id, $boucles);
1587
-		} else {
1588
-			$req = ("\n\treturn '';");
1589
-		}
1590
-
1591
-		$boucles[$id]->return =
1592
-			"\n\nfunction BOUCLE" . strtr($id, '-', '_') . $nom .
1593
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1594
-			$req .
1595
-			"\n}\n";
1596
-	}
1597
-
1598
-	// Au final, si le corps ou un critere au moins s'est mal compile
1599
-	// retourner False, sinon inserer leur decompilation
1600
-	if (is_bool($corps)) {
1601
-		return false;
1602
-	}
1603
-
1604
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1373
+    static $trouver_table;
1374
+    spip_timer('calcul_skel');
1375
+
1376
+    if (defined('_VAR_MODE') and _VAR_MODE == 'debug') {
1377
+        $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1378
+        $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1379
+
1380
+        if (!isset($GLOBALS['debug_objets']['principal'])) {
1381
+            $GLOBALS['debug_objets']['principal'] = $nom;
1382
+        }
1383
+    }
1384
+    foreach ($boucles as $id => $boucle) {
1385
+        $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1386
+    }
1387
+    $descr['documents'] = compile_inclure_doublons($squelette);
1388
+
1389
+    // Demander la description des tables une fois pour toutes
1390
+    if (!$trouver_table) {
1391
+        $trouver_table = charger_fonction('trouver_table', 'base');
1392
+    }
1393
+
1394
+    // reperer si les doublons sont demandes
1395
+    // pour un inclure ou une boucle document
1396
+    // c'est utile a la fonction champs_traitements
1397
+    foreach ($boucles as $id => $boucle) {
1398
+        if (!($type = $boucle->type_requete)) {
1399
+            continue;
1400
+        }
1401
+        if (
1402
+            !$descr['documents'] and (
1403
+                (($type == 'documents') and $boucle->doublons) or
1404
+                compile_inclure_doublons($boucle->avant) or
1405
+                compile_inclure_doublons($boucle->apres) or
1406
+                compile_inclure_doublons($boucle->milieu) or
1407
+                compile_inclure_doublons($boucle->altern))
1408
+        ) {
1409
+            $descr['documents'] = true;
1410
+        }
1411
+        if ($type != TYPE_RECURSIF) {
1412
+            if (!$boucles[$id]->sql_serveur and $connect) {
1413
+                $boucles[$id]->sql_serveur = $connect;
1414
+            }
1415
+
1416
+            // chercher dans les iterateurs du repertoire iterateur/
1417
+            if (
1418
+                $g = charger_fonction(
1419
+                    preg_replace('/\W/', '_', $boucle->type_requete),
1420
+                    'iterateur',
1421
+                    true
1422
+                )
1423
+            ) {
1424
+                $boucles[$id] = $g($boucle);
1425
+
1426
+                // sinon, en cas de requeteur d'un type predefini,
1427
+                // utiliser les informations donnees par le requeteur
1428
+                // cas "php:xx" et "data:xx".
1429
+            } else {
1430
+                if ($boucle->sql_serveur and $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) {
1431
+                    $requeteur($boucles, $boucle, $id);
1432
+
1433
+                    // utiliser la description des champs transmis
1434
+                } else {
1435
+                    $show = $trouver_table($type, $boucles[$id]->sql_serveur);
1436
+                    // si la table n'existe pas avec le connecteur par defaut,
1437
+                    // c'est peut etre une table qui necessite son connecteur dedie fourni
1438
+                    // permet une ecriture allegee (GEO) -> (geo:GEO)
1439
+                    if (
1440
+                        !$show
1441
+                        and $show = $trouver_table($type, strtolower($type))
1442
+                    ) {
1443
+                        $boucles[$id]->sql_serveur = strtolower($type);
1444
+                    }
1445
+                    if ($show) {
1446
+                        $boucles[$id]->show = $show;
1447
+                        // recopie les infos les plus importantes
1448
+                        $boucles[$id]->primary = $show['key']['PRIMARY KEY'] ?? '';
1449
+                        $boucles[$id]->id_table = $x = preg_replace(',^spip_,', '', $show['id_table']);
1450
+                        $boucles[$id]->from[$x] = $nom_table = $show['table'];
1451
+                        $boucles[$id]->iterateur = 'SQL';
1452
+
1453
+                        if (empty($boucles[$id]->descr)) {
1454
+                            $boucles[$id]->descr = &$descr;
1455
+                        }
1456
+                        if (
1457
+                            (!$boucles[$id]->jointures)
1458
+                            and is_array($show['tables_jointures'])
1459
+                            and count($x = $show['tables_jointures'])
1460
+                        ) {
1461
+                            $boucles[$id]->jointures = $x;
1462
+                        }
1463
+                        if ($boucles[$id]->jointures_explicites) {
1464
+                            $jointures = preg_split('/\s+/', $boucles[$id]->jointures_explicites);
1465
+                            while ($j = array_pop($jointures)) {
1466
+                                array_unshift($boucles[$id]->jointures, $j);
1467
+                            }
1468
+                        }
1469
+                    } else {
1470
+                        // Pas une erreur si la table est optionnelle
1471
+                        if ($boucles[$id]->table_optionnelle) {
1472
+                            $boucles[$id]->type_requete = '';
1473
+                        } else {
1474
+                            $boucles[$id]->type_requete = false;
1475
+                            $boucle = $boucles[$id];
1476
+                            $x = (!$boucle->sql_serveur ? '' :
1477
+                                    ($boucle->sql_serveur . ':')) .
1478
+                                $type;
1479
+                            $msg = [
1480
+                                'zbug_table_inconnue',
1481
+                                ['table' => $x]
1482
+                            ];
1483
+                            erreur_squelette($msg, $boucle);
1484
+                        }
1485
+                    }
1486
+                }
1487
+            }
1488
+        }
1489
+    }
1490
+
1491
+    // Commencer par reperer les boucles appelees explicitement
1492
+    // car elles indexent les arguments de maniere derogatoire
1493
+    foreach ($boucles as $id => $boucle) {
1494
+        if ($boucle->type_requete == TYPE_RECURSIF and $boucle->param) {
1495
+            $boucles[$id]->descr = &$descr;
1496
+            $rec = &$boucles[$boucle->param[0]];
1497
+            if (!$rec) {
1498
+                $msg = [
1499
+                    'zbug_boucle_recursive_undef',
1500
+                    ['nom' => $boucle->param[0]]
1501
+                ];
1502
+                erreur_squelette($msg, $boucle);
1503
+                $boucles[$id]->type_requete = false;
1504
+            } else {
1505
+                $rec->externe = $id;
1506
+                $descr['id_mere'] = $id;
1507
+                $boucles[$id]->return =
1508
+                    calculer_liste(
1509
+                        [$rec],
1510
+                        $descr,
1511
+                        $boucles,
1512
+                        $boucle->param
1513
+                    );
1514
+            }
1515
+        }
1516
+    }
1517
+    foreach ($boucles as $id => $boucle) {
1518
+        $id = strval($id); // attention au type dans index_pile
1519
+        $type = $boucle->type_requete;
1520
+        if ($type and $type != TYPE_RECURSIF) {
1521
+            $res = '';
1522
+            if ($boucle->param) {
1523
+                // retourne un tableau en cas d'erreur
1524
+                $res = calculer_criteres($id, $boucles);
1525
+            }
1526
+            $descr['id_mere'] = $id;
1527
+            $boucles[$id]->return =
1528
+                calculer_liste(
1529
+                    $boucle->milieu,
1530
+                    $descr,
1531
+                    $boucles,
1532
+                    $id
1533
+                );
1534
+            // Si les criteres se sont mal compiles
1535
+            // ne pas tenter d'assembler le code final
1536
+            // (mais compiler le corps pour detection d'erreurs)
1537
+            if (is_array($res)) {
1538
+                $boucles[$id]->type_requete = false;
1539
+            }
1540
+        }
1541
+    }
1542
+
1543
+    // idem pour la racine
1544
+    $descr['id_mere'] = '';
1545
+    $corps = calculer_liste($squelette, $descr, $boucles);
1546
+
1547
+
1548
+    // Calcul du corps de toutes les fonctions PHP,
1549
+    // en particulier les requetes SQL et TOTAL_BOUCLE
1550
+    // de'terminables seulement maintenant
1551
+
1552
+    foreach ($boucles as $id => $boucle) {
1553
+        $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1554
+        if ($boucle->return === false) {
1555
+            $corps = false;
1556
+            continue;
1557
+        }
1558
+        // appeler la fonction de definition de la boucle
1559
+
1560
+        if ($req = $boucle->type_requete) {
1561
+            // boucle personnalisée ?
1562
+            $table = strtoupper($boucle->type_requete);
1563
+            $serveur = strtolower($boucle->sql_serveur);
1564
+            if (
1565
+                // fonction de boucle avec serveur & table
1566
+                (!$serveur or
1567
+                    ((!function_exists($f = 'boucle_' . $serveur . '_' . $table))
1568
+                        and (!function_exists($f = $f . '_dist'))
1569
+                    )
1570
+                )
1571
+                // fonction de boucle avec table
1572
+                and (!function_exists($f = 'boucle_' . $table))
1573
+                and (!function_exists($f = $f . '_dist'))
1574
+            ) {
1575
+                // fonction de boucle standard
1576
+                if (!function_exists($f = 'boucle_DEFAUT')) {
1577
+                    $f = 'boucle_DEFAUT_dist';
1578
+                }
1579
+            }
1580
+
1581
+            $req = "\n\n\tstatic \$command = array();\n\t" .
1582
+                "static \$connect;\n\t" .
1583
+                "\$command['connect'] = \$connect = " .
1584
+                _q($boucle->sql_serveur) .
1585
+                ';' .
1586
+                $f($id, $boucles);
1587
+        } else {
1588
+            $req = ("\n\treturn '';");
1589
+        }
1590
+
1591
+        $boucles[$id]->return =
1592
+            "\n\nfunction BOUCLE" . strtr($id, '-', '_') . $nom .
1593
+            '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1594
+            $req .
1595
+            "\n}\n";
1596
+    }
1597
+
1598
+    // Au final, si le corps ou un critere au moins s'est mal compile
1599
+    // retourner False, sinon inserer leur decompilation
1600
+    if (is_bool($corps)) {
1601
+        return false;
1602
+    }
1603
+
1604
+    $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1605 1605
 '
1606
-		// reporter de maniere securisee les doublons inclus
1607
-		. '
1606
+        // reporter de maniere securisee les doublons inclus
1607
+        . '
1608 1608
 	if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"]))
1609 1609
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1610 1610
 
1611 1611
 	$connect = ' .
1612
-		_q($connect) . ';
1612
+        _q($connect) . ';
1613 1613
 	$page = ' .
1614
-		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1615
-		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1616
-		// avant de referencer $Cache
1617
-		$corps . ';
1614
+        // ATTENTION, le calcul de l'expression $corps affectera $Cache
1615
+        // c'est pourquoi on l'affecte a la variable auxiliaire $page.
1616
+        // avant de referencer $Cache
1617
+        $corps . ';
1618 1618
 
1619 1619
 	return analyse_resultat_skel(' . var_export($nom, true)
1620
-		. ', $Cache, $page, ' . var_export($sourcefile, true) . ');
1620
+        . ', $Cache, $page, ' . var_export($sourcefile, true) . ');
1621 1621
 }';
1622 1622
 
1623
-	$secondes = spip_timer('calcul_skel');
1624
-	spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1625
-	// $connect n'est pas sûr : on nettoie
1626
-	$connect = preg_replace(',[^\w],', '', $connect);
1623
+    $secondes = spip_timer('calcul_skel');
1624
+    spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
1625
+    // $connect n'est pas sûr : on nettoie
1626
+    $connect = preg_replace(',[^\w],', '', $connect);
1627 1627
 
1628
-	// Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1629
-	$code = new Boucle();
1630
-	$code->descr = $descr;
1631
-	$code->return = '
1628
+    // Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1629
+    $code = new Boucle();
1630
+    $code->descr = $descr;
1631
+    $code->return = '
1632 1632
 //
1633 1633
 // Fonction principale du squelette ' .
1634
-		$sourcefile .
1635
-		($connect ? " pour $connect" : '') .
1636
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1637
-		"\n//\n" .
1638
-		$principal;
1634
+        $sourcefile .
1635
+        ($connect ? " pour $connect" : '') .
1636
+        (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1637
+        "\n//\n" .
1638
+        $principal;
1639 1639
 
1640
-	$boucles[''] = $code;
1640
+    $boucles[''] = $code;
1641 1641
 
1642
-	return $boucles;
1642
+    return $boucles;
1643 1643
 }
1644 1644
 
1645 1645
 
@@ -1656,18 +1656,18 @@  discard block
 block discarded – undo
1656 1656
  *
1657 1657
  **/
1658 1658
 function requeteur_php_dist(&$boucles, &$boucle, &$id) {
1659
-	if (class_exists($boucle->type_requete)) {
1660
-		$g = charger_fonction('php', 'iterateur');
1661
-		$boucles[$id] = $g($boucle, $boucle->type_requete);
1662
-	} else {
1663
-		$x = $boucle->type_requete;
1664
-		$boucle->type_requete = false;
1665
-		$msg = [
1666
-			'zbug_iterateur_inconnu',
1667
-			['iterateur' => $x]
1668
-		];
1669
-		erreur_squelette($msg, $boucle);
1670
-	}
1659
+    if (class_exists($boucle->type_requete)) {
1660
+        $g = charger_fonction('php', 'iterateur');
1661
+        $boucles[$id] = $g($boucle, $boucle->type_requete);
1662
+    } else {
1663
+        $x = $boucle->type_requete;
1664
+        $boucle->type_requete = false;
1665
+        $msg = [
1666
+            'zbug_iterateur_inconnu',
1667
+            ['iterateur' => $x]
1668
+        ];
1669
+        erreur_squelette($msg, $boucle);
1670
+    }
1671 1671
 }
1672 1672
 
1673 1673
 
@@ -1685,22 +1685,22 @@  discard block
 block discarded – undo
1685 1685
  *
1686 1686
  **/
1687 1687
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1688
-	include_spip('iterateur/data');
1689
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1690
-		$g = charger_fonction('data', 'iterateur');
1691
-		$boucles[$id] = $g($boucle);
1692
-		// from[0] stocke le type de data (rss, yql, ...)
1693
-		$boucles[$id]->from[] = $boucle->type_requete;
1694
-	} else {
1695
-		$x = $boucle->type_requete;
1696
-		$boucle->type_requete = false;
1697
-		$msg = [
1698
-			'zbug_requeteur_inconnu',
1699
-			[
1700
-				'requeteur' => 'data',
1701
-				'type' => $x
1702
-			]
1703
-		];
1704
-		erreur_squelette($msg, $boucle);
1705
-	}
1688
+    include_spip('iterateur/data');
1689
+    if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1690
+        $g = charger_fonction('data', 'iterateur');
1691
+        $boucles[$id] = $g($boucle);
1692
+        // from[0] stocke le type de data (rss, yql, ...)
1693
+        $boucles[$id]->from[] = $boucle->type_requete;
1694
+    } else {
1695
+        $x = $boucle->type_requete;
1696
+        $boucle->type_requete = false;
1697
+        $msg = [
1698
+            'zbug_requeteur_inconnu',
1699
+            [
1700
+                'requeteur' => 'data',
1701
+                'type' => $x
1702
+            ]
1703
+        ];
1704
+        erreur_squelette($msg, $boucle);
1705
+    }
1706 1706
 }
Please login to merge, or discard this patch.