Completed
Push — master ( 62aed1...8add54 )
by cam
01:34
created
ecrire/inc/filtres_boites.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -135,7 +135,7 @@
 block discarded – undo
135 135
 		$titre = "<h3>$titre</h3>";
136 136
 	}
137 137
 
138
-	return '<div class="' . $class . ($id ? "\" id=\"$id" : '') . '">'
138
+	return '<div class="'.$class.($id ? "\" id=\"$id" : '').'">'
139 139
 	. ($titre ? "<div class=\"$head_class\">$titre<!--/hd--></div>" : '')
140 140
 	. '<div class="box__body clearfix">';
141 141
 }
Please login to merge, or discard this patch.
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -43,18 +43,18 @@  discard block
 block discarded – undo
43 43
  *     Pile complétée par le code à générer
44 44
  */
45 45
 function balise_BOITE_OUVRIR_dist($p) {
46
-	$_titre = interprete_argument_balise(1, $p);
47
-	$_class = interprete_argument_balise(2, $p);
48
-	$_head_class = interprete_argument_balise(3, $p);
49
-	$_titre = ($_titre ?: "''");
50
-	$_class = ($_class ? ", $_class" : ", 'simple'");
51
-	$_head_class = ($_head_class ? ", $_head_class" : '');
52
-
53
-	$f = chercher_filtre('boite_ouvrir');
54
-	$p->code = "$f($_titre$_class$_head_class)";
55
-	$p->interdire_scripts = false;
56
-
57
-	return $p;
46
+    $_titre = interprete_argument_balise(1, $p);
47
+    $_class = interprete_argument_balise(2, $p);
48
+    $_head_class = interprete_argument_balise(3, $p);
49
+    $_titre = ($_titre ?: "''");
50
+    $_class = ($_class ? ", $_class" : ", 'simple'");
51
+    $_head_class = ($_head_class ? ", $_head_class" : '');
52
+
53
+    $f = chercher_filtre('boite_ouvrir');
54
+    $p->code = "$f($_titre$_class$_head_class)";
55
+    $p->interdire_scripts = false;
56
+
57
+    return $p;
58 58
 }
59 59
 
60 60
 /**
@@ -74,14 +74,14 @@  discard block
 block discarded – undo
74 74
  *     Pile complétée par le code à générer
75 75
  */
76 76
 function balise_BOITE_PIED_dist($p) {
77
-	$_class = interprete_argument_balise(1, $p);
78
-	$_class = ($_class ? "$_class" : '');
77
+    $_class = interprete_argument_balise(1, $p);
78
+    $_class = ($_class ? "$_class" : '');
79 79
 
80
-	$f = chercher_filtre('boite_pied');
81
-	$p->code = "$f($_class)";
82
-	$p->interdire_scripts = false;
80
+    $f = chercher_filtre('boite_pied');
81
+    $p->code = "$f($_class)";
82
+    $p->interdire_scripts = false;
83 83
 
84
-	return $p;
84
+    return $p;
85 85
 }
86 86
 
87 87
 
@@ -101,11 +101,11 @@  discard block
 block discarded – undo
101 101
  *     Pile complétée par le code à générer
102 102
  */
103 103
 function balise_BOITE_FERMER_dist($p) {
104
-	$f = chercher_filtre('boite_fermer');
105
-	$p->code = "$f()";
106
-	$p->interdire_scripts = false;
104
+    $f = chercher_filtre('boite_fermer');
105
+    $p->code = "$f()";
106
+    $p->interdire_scripts = false;
107 107
 
108
-	return $p;
108
+    return $p;
109 109
 }
110 110
 
111 111
 /**
@@ -127,16 +127,16 @@  discard block
 block discarded – undo
127 127
  *     HTML du début de la boîte
128 128
  */
129 129
 function boite_ouvrir($titre, $class = '', $head_class = '', $id = '') {
130
-	$class = "box $class";
131
-	$head_class = "box__header $head_class clearfix";
132
-	// dans l'espace prive, titrer en h3 si pas de balise <hn>
133
-	if (test_espace_prive() && strlen($titre) && !str_contains($titre, '<h')) {
134
-		$titre = "<h3>$titre</h3>";
135
-	}
136
-
137
-	return '<div class="' . $class . ($id ? "\" id=\"$id" : '') . '">'
138
-	. ($titre ? "<div class=\"$head_class\">$titre<!--/hd--></div>" : '')
139
-	. '<div class="box__body clearfix">';
130
+    $class = "box $class";
131
+    $head_class = "box__header $head_class clearfix";
132
+    // dans l'espace prive, titrer en h3 si pas de balise <hn>
133
+    if (test_espace_prive() && strlen($titre) && !str_contains($titre, '<h')) {
134
+        $titre = "<h3>$titre</h3>";
135
+    }
136
+
137
+    return '<div class="' . $class . ($id ? "\" id=\"$id" : '') . '">'
138
+    . ($titre ? "<div class=\"$head_class\">$titre<!--/hd--></div>" : '')
139
+    . '<div class="box__body clearfix">';
140 140
 }
141 141
 
142 142
 
@@ -153,10 +153,10 @@  discard block
 block discarded – undo
153 153
  *     HTML de transition vers le pied de la boîte
154 154
  */
155 155
 function boite_pied($class = 'act') {
156
-	$class = "box__footer $class";
156
+    $class = "box__footer $class";
157 157
 
158
-	return '</div>'
159
-	. "<div class=\"$class clearfix\">";
158
+    return '</div>'
159
+    . "<div class=\"$class clearfix\">";
160 160
 }
161 161
 
162 162
 
@@ -171,5 +171,5 @@  discard block
 block discarded – undo
171 171
  *     HTML de fin de la boîte
172 172
  */
173 173
 function boite_fermer() {
174
-	return '</div></div>';
174
+    return '</div></div>';
175 175
 }
Please login to merge, or discard this patch.
prive/themes/spip/vars.css_fonctions.php 2 patches
Spacing   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -49,8 +49,8 @@  discard block
 block discarded – undo
49 49
 
50 50
 	// Espacements pour le rythme vertical et les gouttières
51 51
 	// Basés sur la hauteur d'une ligne de texte à la racine du document
52
-	$vars->add('--spip-spacing-y', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4) . 'rem');
53
-	$vars->add('--spip-spacing-x', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4) . 'rem');
52
+	$vars->add('--spip-spacing-y', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4).'rem');
53
+	$vars->add('--spip-spacing-x', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4).'rem');
54 54
 	$vars->add('--spip-margin-bottom', $Pile[0]['margin-bottom']); // À déprécier
55 55
 
56 56
 	// Bordures
@@ -60,20 +60,20 @@  discard block
 block discarded – undo
60 60
 
61 61
 	// Ombres portées
62 62
 	$shadow_mini =
63
-		'0 0.05em 0.1em hsla(0, 0%, 0%, 0.33),' .
64
-		'0 0.1em  0.15em hsla(0, 0%, 0%, 0.05),' .
63
+		'0 0.05em 0.1em hsla(0, 0%, 0%, 0.33),'.
64
+		'0 0.1em  0.15em hsla(0, 0%, 0%, 0.05),'.
65 65
 		'0 0.1em  0.25em  hsla(0, 0%, 0%, 0.05)';
66 66
 	$shadow =
67
-		'0 0.05em 0.15em hsla(0, 0%, 0%, 0.33),' .
68
-		'0 0.1em  0.25em hsla(0, 0%, 0%, 0.05),' .
67
+		'0 0.05em 0.15em hsla(0, 0%, 0%, 0.33),'.
68
+		'0 0.1em  0.25em hsla(0, 0%, 0%, 0.05),'.
69 69
 		'0 0.1em  0.5em  hsla(0, 0%, 0%, 0.05)';
70 70
 	$shadow_large =
71
-		'0 0.05em 0.15em hsla(0, 0%, 0%, 0.1),' .
72
-		'0 0.2em  0.5em  hsla(0, 0%, 0%, 0.1),' .
71
+		'0 0.05em 0.15em hsla(0, 0%, 0%, 0.1),'.
72
+		'0 0.2em  0.5em  hsla(0, 0%, 0%, 0.1),'.
73 73
 		'0 0.2em  1em    hsla(0, 0%, 0%, 0.075)';
74 74
 	$shadow_huge =
75
-		'0 0.1em 0.25em hsla(0, 0%, 0%, 0.1),' .
76
-		'0 0.25em  1em  hsla(0, 0%, 0%, 0.1),' .
75
+		'0 0.1em 0.25em hsla(0, 0%, 0%, 0.1),'.
76
+		'0 0.25em  1em  hsla(0, 0%, 0%, 0.1),'.
77 77
 		'0 0.5em  2em    hsla(0, 0%, 0%, 0.075)';
78 78
 	$vars->add('--spip-box-shadow-mini', $shadow_mini);
79 79
 	$vars->add('--spip-box-shadow-mini-hover', $shadow);
Please login to merge, or discard this patch.
Indentation   +144 added lines, -144 removed lines patch added patch discarded remove patch
@@ -8,59 +8,59 @@  discard block
 block discarded – undo
8 8
  * @param Pile $pile Pile
9 9
  */
10 10
 function spip_generer_variables_css_typo(array $Pile): Collection {
11
-	$vars = new Collection();
12
-
13
-	// Direction
14
-	$vars->add('--spip-dir', $Pile[0]['dir']);
15
-	$vars->add('--spip-left', $Pile[0]['left']);
16
-	$vars->add('--spip-right', $Pile[0]['right']);
17
-
18
-	// Typographie
19
-	$vars->add('--spip-font-size', $Pile[0]['font-size']);
20
-	$vars->add('--spip-line-height', $Pile[0]['line-height']);
21
-	$vars->add('--spip-text-indent', $Pile[0]['text-indent']);
22
-	$vars->add('--spip-font-family', $Pile[0]['font-family']);
23
-
24
-	// Couleurs hors thème
25
-	$vars->add('--spip-background-color', $Pile[0]['background-color']);
26
-	$vars->add('--spip-color', $Pile[0]['color']);
27
-
28
-	// Espacements pour le rythme vertical et les gouttières
29
-	// Basés sur la hauteur d'une ligne de texte à la racine du document
30
-	$vars->add('--spip-spacing-y', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4) . 'rem');
31
-	$vars->add('--spip-spacing-x', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4) . 'rem');
32
-	$vars->add('--spip-margin-bottom', $Pile[0]['margin-bottom']); // À déprécier
33
-
34
-	// Bordures
35
-	$vars->add('--spip-border-radius-mini', '0.2rem');
36
-	$vars->add('--spip-border-radius', '0.33rem');
37
-	$vars->add('--spip-border-radius-large', '0.66rem');
38
-
39
-	// Ombres portées
40
-	$shadow_mini =
41
-		'0 0.05em 0.1em hsla(0, 0%, 0%, 0.33),' .
42
-		'0 0.1em  0.15em hsla(0, 0%, 0%, 0.05),' .
43
-		'0 0.1em  0.25em  hsla(0, 0%, 0%, 0.05)';
44
-	$shadow =
45
-		'0 0.05em 0.15em hsla(0, 0%, 0%, 0.33),' .
46
-		'0 0.1em  0.25em hsla(0, 0%, 0%, 0.05),' .
47
-		'0 0.1em  0.5em  hsla(0, 0%, 0%, 0.05)';
48
-	$shadow_large =
49
-		'0 0.05em 0.15em hsla(0, 0%, 0%, 0.1),' .
50
-		'0 0.2em  0.5em  hsla(0, 0%, 0%, 0.1),' .
51
-		'0 0.2em  1em    hsla(0, 0%, 0%, 0.075)';
52
-	$shadow_huge =
53
-		'0 0.1em 0.25em hsla(0, 0%, 0%, 0.1),' .
54
-		'0 0.25em  1em  hsla(0, 0%, 0%, 0.1),' .
55
-		'0 0.5em  2em    hsla(0, 0%, 0%, 0.075)';
56
-	$vars->add('--spip-box-shadow-mini', $shadow_mini);
57
-	$vars->add('--spip-box-shadow-mini-hover', $shadow);
58
-	$vars->add('--spip-box-shadow', $shadow);
59
-	$vars->add('--spip-box-shadow-hover', $shadow_large);
60
-	$vars->add('--spip-box-shadow-large', $shadow_large);
61
-	$vars->add('--spip-box-shadow-large-hover', $shadow_huge);
62
-
63
-	return $vars;
11
+    $vars = new Collection();
12
+
13
+    // Direction
14
+    $vars->add('--spip-dir', $Pile[0]['dir']);
15
+    $vars->add('--spip-left', $Pile[0]['left']);
16
+    $vars->add('--spip-right', $Pile[0]['right']);
17
+
18
+    // Typographie
19
+    $vars->add('--spip-font-size', $Pile[0]['font-size']);
20
+    $vars->add('--spip-line-height', $Pile[0]['line-height']);
21
+    $vars->add('--spip-text-indent', $Pile[0]['text-indent']);
22
+    $vars->add('--spip-font-family', $Pile[0]['font-family']);
23
+
24
+    // Couleurs hors thème
25
+    $vars->add('--spip-background-color', $Pile[0]['background-color']);
26
+    $vars->add('--spip-color', $Pile[0]['color']);
27
+
28
+    // Espacements pour le rythme vertical et les gouttières
29
+    // Basés sur la hauteur d'une ligne de texte à la racine du document
30
+    $vars->add('--spip-spacing-y', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4) . 'rem');
31
+    $vars->add('--spip-spacing-x', round(strmult($Pile[0]['font-size'], $Pile[0]['line-height']), 4) . 'rem');
32
+    $vars->add('--spip-margin-bottom', $Pile[0]['margin-bottom']); // À déprécier
33
+
34
+    // Bordures
35
+    $vars->add('--spip-border-radius-mini', '0.2rem');
36
+    $vars->add('--spip-border-radius', '0.33rem');
37
+    $vars->add('--spip-border-radius-large', '0.66rem');
38
+
39
+    // Ombres portées
40
+    $shadow_mini =
41
+        '0 0.05em 0.1em hsla(0, 0%, 0%, 0.33),' .
42
+        '0 0.1em  0.15em hsla(0, 0%, 0%, 0.05),' .
43
+        '0 0.1em  0.25em  hsla(0, 0%, 0%, 0.05)';
44
+    $shadow =
45
+        '0 0.05em 0.15em hsla(0, 0%, 0%, 0.33),' .
46
+        '0 0.1em  0.25em hsla(0, 0%, 0%, 0.05),' .
47
+        '0 0.1em  0.5em  hsla(0, 0%, 0%, 0.05)';
48
+    $shadow_large =
49
+        '0 0.05em 0.15em hsla(0, 0%, 0%, 0.1),' .
50
+        '0 0.2em  0.5em  hsla(0, 0%, 0%, 0.1),' .
51
+        '0 0.2em  1em    hsla(0, 0%, 0%, 0.075)';
52
+    $shadow_huge =
53
+        '0 0.1em 0.25em hsla(0, 0%, 0%, 0.1),' .
54
+        '0 0.25em  1em  hsla(0, 0%, 0%, 0.1),' .
55
+        '0 0.5em  2em    hsla(0, 0%, 0%, 0.075)';
56
+    $vars->add('--spip-box-shadow-mini', $shadow_mini);
57
+    $vars->add('--spip-box-shadow-mini-hover', $shadow);
58
+    $vars->add('--spip-box-shadow', $shadow);
59
+    $vars->add('--spip-box-shadow-hover', $shadow_large);
60
+    $vars->add('--spip-box-shadow-large', $shadow_large);
61
+    $vars->add('--spip-box-shadow-large-hover', $shadow_huge);
62
+
63
+    return $vars;
64 64
 }
65 65
 
66 66
 /**
@@ -69,101 +69,101 @@  discard block
 block discarded – undo
69 69
  * @param string $couleur Couleur hex
70 70
  */
71 71
 function spip_generer_variables_css_couleurs_theme(string $couleur): Collection {
72
-	$vars = new Collection();
73
-
74
-	#$vars->add('--spip-color-theme--hsl', couleur_hex_to_hsl($couleur, 'h, s, l')); // redéfini ensuite
75
-	$vars->add('--spip-color-theme--h', couleur_hex_to_hsl($couleur, 'h'));
76
-	$vars->add('--spip-color-theme--s', couleur_hex_to_hsl($couleur, 's'));
77
-	$vars->add('--spip-color-theme--l', couleur_hex_to_hsl($couleur, 'l'));
78
-
79
-	// un joli dégradé coloré de presque blanc à presque noir…
80
-	$vars->add('--spip-color-theme--100', couleur_hex_to_hsl(couleur_eclaircir($couleur, .99), 'h, s, l'));
81
-	$vars->add('--spip-color-theme--98', couleur_hex_to_hsl(couleur_eclaircir($couleur, .95), 'h, s, l'));
82
-	$vars->add('--spip-color-theme--95', couleur_hex_to_hsl(couleur_eclaircir($couleur, .90), 'h, s, l'));
83
-	$vars->add('--spip-color-theme--90', couleur_hex_to_hsl(couleur_eclaircir($couleur, .75), 'h, s, l'));
84
-	$vars->add('--spip-color-theme--80', couleur_hex_to_hsl(couleur_eclaircir($couleur, .50), 'h, s, l'));
85
-	$vars->add('--spip-color-theme--70', couleur_hex_to_hsl(couleur_eclaircir($couleur, .25), 'h, s, l'));
86
-	$vars->add('--spip-color-theme--60', couleur_hex_to_hsl($couleur, 'h, s, l'));
87
-	$vars->add('--spip-color-theme--50', couleur_hex_to_hsl(couleur_foncer($couleur, .125), 'h, s, l'));
88
-	$vars->add('--spip-color-theme--40', couleur_hex_to_hsl(couleur_foncer($couleur, .25), 'h, s, l'));
89
-	$vars->add('--spip-color-theme--30', couleur_hex_to_hsl(couleur_foncer($couleur, .375), 'h, s, l'));
90
-	$vars->add('--spip-color-theme--20', couleur_hex_to_hsl(couleur_foncer($couleur, .50), 'h, s, l'));
91
-	$vars->add('--spip-color-theme--10', couleur_hex_to_hsl(couleur_foncer($couleur, .75), 'h, s, l'));
92
-	$vars->add('--spip-color-theme--00', couleur_hex_to_hsl(couleur_foncer($couleur, .98), 'h, s, l'));
93
-
94
-	return $vars;
72
+    $vars = new Collection();
73
+
74
+    #$vars->add('--spip-color-theme--hsl', couleur_hex_to_hsl($couleur, 'h, s, l')); // redéfini ensuite
75
+    $vars->add('--spip-color-theme--h', couleur_hex_to_hsl($couleur, 'h'));
76
+    $vars->add('--spip-color-theme--s', couleur_hex_to_hsl($couleur, 's'));
77
+    $vars->add('--spip-color-theme--l', couleur_hex_to_hsl($couleur, 'l'));
78
+
79
+    // un joli dégradé coloré de presque blanc à presque noir…
80
+    $vars->add('--spip-color-theme--100', couleur_hex_to_hsl(couleur_eclaircir($couleur, .99), 'h, s, l'));
81
+    $vars->add('--spip-color-theme--98', couleur_hex_to_hsl(couleur_eclaircir($couleur, .95), 'h, s, l'));
82
+    $vars->add('--spip-color-theme--95', couleur_hex_to_hsl(couleur_eclaircir($couleur, .90), 'h, s, l'));
83
+    $vars->add('--spip-color-theme--90', couleur_hex_to_hsl(couleur_eclaircir($couleur, .75), 'h, s, l'));
84
+    $vars->add('--spip-color-theme--80', couleur_hex_to_hsl(couleur_eclaircir($couleur, .50), 'h, s, l'));
85
+    $vars->add('--spip-color-theme--70', couleur_hex_to_hsl(couleur_eclaircir($couleur, .25), 'h, s, l'));
86
+    $vars->add('--spip-color-theme--60', couleur_hex_to_hsl($couleur, 'h, s, l'));
87
+    $vars->add('--spip-color-theme--50', couleur_hex_to_hsl(couleur_foncer($couleur, .125), 'h, s, l'));
88
+    $vars->add('--spip-color-theme--40', couleur_hex_to_hsl(couleur_foncer($couleur, .25), 'h, s, l'));
89
+    $vars->add('--spip-color-theme--30', couleur_hex_to_hsl(couleur_foncer($couleur, .375), 'h, s, l'));
90
+    $vars->add('--spip-color-theme--20', couleur_hex_to_hsl(couleur_foncer($couleur, .50), 'h, s, l'));
91
+    $vars->add('--spip-color-theme--10', couleur_hex_to_hsl(couleur_foncer($couleur, .75), 'h, s, l'));
92
+    $vars->add('--spip-color-theme--00', couleur_hex_to_hsl(couleur_foncer($couleur, .98), 'h, s, l'));
93
+
94
+    return $vars;
95 95
 }
96 96
 
97 97
 /**
98 98
  * Génère les variables CSS de couleurs, dont celles dépendantes des couleurs du thème actif.
99 99
  */
100 100
 function spip_generer_variables_css_couleurs(): Collection {
101
-	$vars = new Collection();
102
-
103
-	// nos déclinaisons de couleur (basées sur le dégradé précedent, où 60 est là couleur du thème)
104
-	$vars->add('--spip-color-theme-white--hsl', 'var(--spip-color-theme--100)');
105
-	$vars->add('--spip-color-theme-lightest--hsl', 'var(--spip-color-theme--95)');
106
-	$vars->add('--spip-color-theme-lighter--hsl', 'var(--spip-color-theme--90)');
107
-	$vars->add('--spip-color-theme-light--hsl', 'var(--spip-color-theme--80)');
108
-	$vars->add('--spip-color-theme--hsl', 'var(--spip-color-theme--60)');
109
-	$vars->add('--spip-color-theme-dark--hsl', 'var(--spip-color-theme--40)');
110
-	$vars->add('--spip-color-theme-darker--hsl', 'var(--spip-color-theme--20)');
111
-	$vars->add('--spip-color-theme-darkest--hsl', 'var(--spip-color-theme--10)');
112
-	$vars->add('--spip-color-theme-black--hsl', 'var(--spip-color-theme--00)');
113
-
114
-	$vars->add('--spip-color-theme-white', 'hsl(var(--spip-color-theme-white--hsl))');
115
-	$vars->add('--spip-color-theme-lightest', 'hsl(var(--spip-color-theme-lightest--hsl))');
116
-	$vars->add('--spip-color-theme-lighter', 'hsl(var(--spip-color-theme-lighter--hsl))');
117
-	$vars->add('--spip-color-theme-light', 'hsl(var(--spip-color-theme-light--hsl))');
118
-	$vars->add('--spip-color-theme', 'hsl(var(--spip-color-theme--hsl))');
119
-	$vars->add('--spip-color-theme-dark', 'hsl(var(--spip-color-theme-dark--hsl))');
120
-	$vars->add('--spip-color-theme-darker', 'hsl(var(--spip-color-theme-darker--hsl))');
121
-	$vars->add('--spip-color-theme-darkest', 'hsl(var(--spip-color-theme-darkest--hsl))');
122
-	$vars->add('--spip-color-theme-black', 'hsl(var(--spip-color-theme-black--hsl))');
123
-
124
-	// déclinaisons de gris (luminosité calquée sur le dégradé de couleur)
125
-	$vars->add('--spip-color-white--hsl', '0, 0%, 100%');
126
-	$vars->add('--spip-color-gray-lightest--hsl', '0, 0%, 96%');
127
-	$vars->add('--spip-color-gray-lighter--hsl', '0, 0%, 90%');
128
-	$vars->add('--spip-color-gray-light--hsl', '0, 0%, 80%');
129
-	$vars->add('--spip-color-gray--hsl', '0, 0%, 60%');
130
-	$vars->add('--spip-color-gray-dark--hsl', '0, 0%, 40%');
131
-	$vars->add('--spip-color-gray-darker--hsl', '0, 0%, 20%');
132
-	$vars->add('--spip-color-gray-darkest--hsl', '0, 0%, 10%');
133
-	$vars->add('--spip-color-black--hsl', '0, 0%, 0%');
134
-
135
-	$vars->add('--spip-color-white', 'hsl(var(--spip-color-white--hsl))');
136
-	$vars->add('--spip-color-gray-lightest', 'hsl(var(--spip-color-gray-lightest--hsl))');
137
-	$vars->add('--spip-color-gray-lighter', 'hsl(var(--spip-color-gray-lighter--hsl))');
138
-	$vars->add('--spip-color-gray-light', 'hsl(var(--spip-color-gray-light--hsl))');
139
-	$vars->add('--spip-color-gray', 'hsl(var(--spip-color-gray--hsl))');
140
-	$vars->add('--spip-color-gray-dark', 'hsl(var(--spip-color-gray-dark--hsl))');
141
-	$vars->add('--spip-color-gray-darker', 'hsl(var(--spip-color-gray-darker--hsl))');
142
-	$vars->add('--spip-color-gray-darkest', 'hsl(var(--spip-color-gray-darkest--hsl))');
143
-	$vars->add('--spip-color-black', 'hsl(var(--spip-color-black--hsl))');
144
-
145
-	// Différents états : erreur, etc.
146
-	$vars->add('--spip-color-success--hsl', '72, 66%, 62%');
147
-	$vars->add('--spip-color-success--h', '72');
148
-	$vars->add('--spip-color-success--s', '66%');
149
-	$vars->add('--spip-color-success--l', '62%');
150
-	$vars->add('--spip-color-error--hsl', '356, 70%, 57%');
151
-	$vars->add('--spip-color-error--h', '356');
152
-	$vars->add('--spip-color-error--s', '70%');
153
-	$vars->add('--spip-color-error--l', '57%');
154
-	$vars->add('--spip-color-notice--hsl', '47, 100%, 62%');
155
-	$vars->add('--spip-color-notice--h', '47');
156
-	$vars->add('--spip-color-notice--s', '100%');
157
-	$vars->add('--spip-color-notice--l', '62%');
158
-	$vars->add('--spip-color-info--hsl', '197, 56%, 27%');
159
-	$vars->add('--spip-color-info--h', '197');
160
-	$vars->add('--spip-color-info--s', '56%');
161
-	$vars->add('--spip-color-info--l', '27%');
162
-
163
-	$vars->add('--spip-color-success', 'hsl(var(--spip-color-success--hsl))');
164
-	$vars->add('--spip-color-error', 'hsl(var(--spip-color-error--hsl))');
165
-	$vars->add('--spip-color-notice', 'hsl(var(--spip-color-notice--hsl))');
166
-	$vars->add('--spip-color-info', 'hsl(var(--spip-color-info--hsl))');
167
-
168
-	return $vars;
101
+    $vars = new Collection();
102
+
103
+    // nos déclinaisons de couleur (basées sur le dégradé précedent, où 60 est là couleur du thème)
104
+    $vars->add('--spip-color-theme-white--hsl', 'var(--spip-color-theme--100)');
105
+    $vars->add('--spip-color-theme-lightest--hsl', 'var(--spip-color-theme--95)');
106
+    $vars->add('--spip-color-theme-lighter--hsl', 'var(--spip-color-theme--90)');
107
+    $vars->add('--spip-color-theme-light--hsl', 'var(--spip-color-theme--80)');
108
+    $vars->add('--spip-color-theme--hsl', 'var(--spip-color-theme--60)');
109
+    $vars->add('--spip-color-theme-dark--hsl', 'var(--spip-color-theme--40)');
110
+    $vars->add('--spip-color-theme-darker--hsl', 'var(--spip-color-theme--20)');
111
+    $vars->add('--spip-color-theme-darkest--hsl', 'var(--spip-color-theme--10)');
112
+    $vars->add('--spip-color-theme-black--hsl', 'var(--spip-color-theme--00)');
113
+
114
+    $vars->add('--spip-color-theme-white', 'hsl(var(--spip-color-theme-white--hsl))');
115
+    $vars->add('--spip-color-theme-lightest', 'hsl(var(--spip-color-theme-lightest--hsl))');
116
+    $vars->add('--spip-color-theme-lighter', 'hsl(var(--spip-color-theme-lighter--hsl))');
117
+    $vars->add('--spip-color-theme-light', 'hsl(var(--spip-color-theme-light--hsl))');
118
+    $vars->add('--spip-color-theme', 'hsl(var(--spip-color-theme--hsl))');
119
+    $vars->add('--spip-color-theme-dark', 'hsl(var(--spip-color-theme-dark--hsl))');
120
+    $vars->add('--spip-color-theme-darker', 'hsl(var(--spip-color-theme-darker--hsl))');
121
+    $vars->add('--spip-color-theme-darkest', 'hsl(var(--spip-color-theme-darkest--hsl))');
122
+    $vars->add('--spip-color-theme-black', 'hsl(var(--spip-color-theme-black--hsl))');
123
+
124
+    // déclinaisons de gris (luminosité calquée sur le dégradé de couleur)
125
+    $vars->add('--spip-color-white--hsl', '0, 0%, 100%');
126
+    $vars->add('--spip-color-gray-lightest--hsl', '0, 0%, 96%');
127
+    $vars->add('--spip-color-gray-lighter--hsl', '0, 0%, 90%');
128
+    $vars->add('--spip-color-gray-light--hsl', '0, 0%, 80%');
129
+    $vars->add('--spip-color-gray--hsl', '0, 0%, 60%');
130
+    $vars->add('--spip-color-gray-dark--hsl', '0, 0%, 40%');
131
+    $vars->add('--spip-color-gray-darker--hsl', '0, 0%, 20%');
132
+    $vars->add('--spip-color-gray-darkest--hsl', '0, 0%, 10%');
133
+    $vars->add('--spip-color-black--hsl', '0, 0%, 0%');
134
+
135
+    $vars->add('--spip-color-white', 'hsl(var(--spip-color-white--hsl))');
136
+    $vars->add('--spip-color-gray-lightest', 'hsl(var(--spip-color-gray-lightest--hsl))');
137
+    $vars->add('--spip-color-gray-lighter', 'hsl(var(--spip-color-gray-lighter--hsl))');
138
+    $vars->add('--spip-color-gray-light', 'hsl(var(--spip-color-gray-light--hsl))');
139
+    $vars->add('--spip-color-gray', 'hsl(var(--spip-color-gray--hsl))');
140
+    $vars->add('--spip-color-gray-dark', 'hsl(var(--spip-color-gray-dark--hsl))');
141
+    $vars->add('--spip-color-gray-darker', 'hsl(var(--spip-color-gray-darker--hsl))');
142
+    $vars->add('--spip-color-gray-darkest', 'hsl(var(--spip-color-gray-darkest--hsl))');
143
+    $vars->add('--spip-color-black', 'hsl(var(--spip-color-black--hsl))');
144
+
145
+    // Différents états : erreur, etc.
146
+    $vars->add('--spip-color-success--hsl', '72, 66%, 62%');
147
+    $vars->add('--spip-color-success--h', '72');
148
+    $vars->add('--spip-color-success--s', '66%');
149
+    $vars->add('--spip-color-success--l', '62%');
150
+    $vars->add('--spip-color-error--hsl', '356, 70%, 57%');
151
+    $vars->add('--spip-color-error--h', '356');
152
+    $vars->add('--spip-color-error--s', '70%');
153
+    $vars->add('--spip-color-error--l', '57%');
154
+    $vars->add('--spip-color-notice--hsl', '47, 100%, 62%');
155
+    $vars->add('--spip-color-notice--h', '47');
156
+    $vars->add('--spip-color-notice--s', '100%');
157
+    $vars->add('--spip-color-notice--l', '62%');
158
+    $vars->add('--spip-color-info--hsl', '197, 56%, 27%');
159
+    $vars->add('--spip-color-info--h', '197');
160
+    $vars->add('--spip-color-info--s', '56%');
161
+    $vars->add('--spip-color-info--l', '27%');
162
+
163
+    $vars->add('--spip-color-success', 'hsl(var(--spip-color-success--hsl))');
164
+    $vars->add('--spip-color-error', 'hsl(var(--spip-color-error--hsl))');
165
+    $vars->add('--spip-color-notice', 'hsl(var(--spip-color-notice--hsl))');
166
+    $vars->add('--spip-color-info', 'hsl(var(--spip-color-info--hsl))');
167
+
168
+    return $vars;
169 169
 }
Please login to merge, or discard this patch.
prive/formulaires/configurer_ecran_connexion.php 3 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -3,7 +3,7 @@
 block discarded – undo
3 3
 function formulaires_configurer_ecran_connexion_data(): array {
4 4
 	return [
5 5
 		'couleur_defaut' => '#db1762',
6
-		'img_fond' => _DIR_IMG . 'spip_fond_login.jpg',
6
+		'img_fond' => _DIR_IMG.'spip_fond_login.jpg',
7 7
 	];
8 8
 }
9 9
 
Please login to merge, or discard this patch.
Indentation   +74 added lines, -74 removed lines patch added patch discarded remove patch
@@ -1,94 +1,94 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 function formulaires_configurer_ecran_connexion_data(): array {
4
-	return [
5
-		'couleur_defaut' => '#db1762',
6
-		'img_fond' => _DIR_IMG . 'spip_fond_login.jpg',
7
-	];
4
+    return [
5
+        'couleur_defaut' => '#db1762',
6
+        'img_fond' => _DIR_IMG . 'spip_fond_login.jpg',
7
+    ];
8 8
 }
9 9
 
10 10
 function formulaires_configurer_ecran_connexion_charger_dist() {
11
-	include_spip('inc/config');
12
-	include_spip('inc/autoriser');
11
+    include_spip('inc/config');
12
+    include_spip('inc/autoriser');
13 13
 
14
-	$data = formulaires_configurer_ecran_connexion_data();
14
+    $data = formulaires_configurer_ecran_connexion_data();
15 15
 
16
-	$valeurs = [
17
-		'couleur_login' => lire_config('couleur_login', $data['couleur_defaut']),
18
-		'couleur_defaut_login' => $data['couleur_defaut'],
19
-		'upload_image_fond_login' => '',
20
-	];
16
+    $valeurs = [
17
+        'couleur_login' => lire_config('couleur_login', $data['couleur_defaut']),
18
+        'couleur_defaut_login' => $data['couleur_defaut'],
19
+        'upload_image_fond_login' => '',
20
+    ];
21 21
 
22
-	if (file_exists($data['img_fond'])) {
23
-		$valeurs['src_img'] = $data['img_fond'];
24
-	}
22
+    if (file_exists($data['img_fond'])) {
23
+        $valeurs['src_img'] = $data['img_fond'];
24
+    }
25 25
 
26
-	return $valeurs;
26
+    return $valeurs;
27 27
 }
28 28
 
29 29
 
30 30
 function formulaires_configurer_ecran_connexion_verifier_dist() {
31
-	$erreurs = [];
32
-
33
-	if (_request('supprimer_image_fond_login')) {
34
-		// rien à tester
35
-	}
36
-
37
-	elseif (_request('supprimer_couleur_login')) {
38
-		// rien à tester
39
-	}
40
-
41
-	elseif (!empty($_FILES['upload_image_fond_login'])) {
42
-		$file = $_FILES['upload_image_fond_login'];
43
-		include_spip('inc/documents');
44
-		$extension = pathinfo((string) $file['name'], PATHINFO_EXTENSION);
45
-		$extension = corriger_extension(strtolower($extension));
46
-		if ($extension != 'jpg') {
47
-			$erreurs['upload_image_fond_login'] = _T('erreur_type_fichier');
48
-		}
49
-	}
50
-
51
-	return $erreurs;
31
+    $erreurs = [];
32
+
33
+    if (_request('supprimer_image_fond_login')) {
34
+        // rien à tester
35
+    }
36
+
37
+    elseif (_request('supprimer_couleur_login')) {
38
+        // rien à tester
39
+    }
40
+
41
+    elseif (!empty($_FILES['upload_image_fond_login'])) {
42
+        $file = $_FILES['upload_image_fond_login'];
43
+        include_spip('inc/documents');
44
+        $extension = pathinfo((string) $file['name'], PATHINFO_EXTENSION);
45
+        $extension = corriger_extension(strtolower($extension));
46
+        if ($extension != 'jpg') {
47
+            $erreurs['upload_image_fond_login'] = _T('erreur_type_fichier');
48
+        }
49
+    }
50
+
51
+    return $erreurs;
52 52
 }
53 53
 
54 54
 
55 55
 function formulaires_configurer_ecran_connexion_traiter_dist() {
56 56
 
57
-	$retours = [
58
-		'message_ok' => _T('config_info_enregistree'),
59
-		'editable' => true,
60
-	];
61
-
62
-	include_spip('inc/config');
63
-	$data = formulaires_configurer_ecran_connexion_data();
64
-	$dest = $data['img_fond'];
65
-
66
-	if (_request('couleur_login')) {
67
-		$color = _request('couleur_login');
68
-		if ($color === $data['couleur_defaut']) {
69
-			effacer_config('couleur_login');
70
-		} else {
71
-			ecrire_config('couleur_login', $color);
72
-		}
73
-	}
74
-
75
-	if (_request('supprimer_image_fond_login')) {
76
-		@unlink($dest);
77
-	}
78
-
79
-	elseif (_request('supprimer_couleur_login')) {
80
-		effacer_config('couleur_login');
81
-		set_request('couleur_login', null);
82
-	}
83
-
84
-	elseif (!empty($_FILES['upload_image_fond_login'])) {
85
-		$file = $_FILES['upload_image_fond_login'];
86
-		include_spip('inc/documents');
87
-		deplacer_fichier_upload($file['tmp_name'], $dest);
88
-	}
89
-
90
-	include_spip('inc/invalideur');
91
-	suivre_invalideur('1'); # tout effacer
92
-
93
-	return $retours;
57
+    $retours = [
58
+        'message_ok' => _T('config_info_enregistree'),
59
+        'editable' => true,
60
+    ];
61
+
62
+    include_spip('inc/config');
63
+    $data = formulaires_configurer_ecran_connexion_data();
64
+    $dest = $data['img_fond'];
65
+
66
+    if (_request('couleur_login')) {
67
+        $color = _request('couleur_login');
68
+        if ($color === $data['couleur_defaut']) {
69
+            effacer_config('couleur_login');
70
+        } else {
71
+            ecrire_config('couleur_login', $color);
72
+        }
73
+    }
74
+
75
+    if (_request('supprimer_image_fond_login')) {
76
+        @unlink($dest);
77
+    }
78
+
79
+    elseif (_request('supprimer_couleur_login')) {
80
+        effacer_config('couleur_login');
81
+        set_request('couleur_login', null);
82
+    }
83
+
84
+    elseif (!empty($_FILES['upload_image_fond_login'])) {
85
+        $file = $_FILES['upload_image_fond_login'];
86
+        include_spip('inc/documents');
87
+        deplacer_fichier_upload($file['tmp_name'], $dest);
88
+    }
89
+
90
+    include_spip('inc/invalideur');
91
+    suivre_invalideur('1'); # tout effacer
92
+
93
+    return $retours;
94 94
 }
Please login to merge, or discard this patch.
Braces   +4 added lines, -12 removed lines patch added patch discarded remove patch
@@ -32,13 +32,9 @@  discard block
 block discarded – undo
32 32
 
33 33
 	if (_request('supprimer_image_fond_login')) {
34 34
 		// rien à tester
35
-	}
36
-
37
-	elseif (_request('supprimer_couleur_login')) {
35
+	} elseif (_request('supprimer_couleur_login')) {
38 36
 		// rien à tester
39
-	}
40
-
41
-	elseif (!empty($_FILES['upload_image_fond_login'])) {
37
+	} elseif (!empty($_FILES['upload_image_fond_login'])) {
42 38
 		$file = $_FILES['upload_image_fond_login'];
43 39
 		include_spip('inc/documents');
44 40
 		$extension = pathinfo((string) $file['name'], PATHINFO_EXTENSION);
@@ -74,14 +70,10 @@  discard block
 block discarded – undo
74 70
 
75 71
 	if (_request('supprimer_image_fond_login')) {
76 72
 		@unlink($dest);
77
-	}
78
-
79
-	elseif (_request('supprimer_couleur_login')) {
73
+	} elseif (_request('supprimer_couleur_login')) {
80 74
 		effacer_config('couleur_login');
81 75
 		set_request('couleur_login', null);
82
-	}
83
-
84
-	elseif (!empty($_FILES['upload_image_fond_login'])) {
76
+	} elseif (!empty($_FILES['upload_image_fond_login'])) {
85 77
 		$file = $_FILES['upload_image_fond_login'];
86 78
 		include_spip('inc/documents');
87 79
 		deplacer_fichier_upload($file['tmp_name'], $dest);
Please login to merge, or discard this patch.
prive/formulaires/configurer_annonces.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -96,7 +96,7 @@
 block discarded – undo
96 96
 		$id_job = job_queue_add('mail', 'Test Envoi des nouveautes', [0], 'genie/');
97 97
 		include_spip('inc/queue');
98 98
 		queue_schedule([$id_job]);
99
-		$res['message_ok'] .= '<br />' . _T('info_liste_nouveautes_envoyee');
99
+		$res['message_ok'] .= '<br />'._T('info_liste_nouveautes_envoyee');
100 100
 	}
101 101
 
102 102
 	return $res;
Please login to merge, or discard this patch.
Indentation   +75 added lines, -75 removed lines patch added patch discarded remove patch
@@ -11,93 +11,93 @@
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 function formulaires_configurer_annonces_charger_dist() {
18
-	$valeurs = [];
19
-	foreach (
20
-		[
21
-			'suivi_edito',
22
-			'adresse_suivi',
23
-			'adresse_suivi_inscription',
24
-			'quoi_de_neuf',
25
-			'adresse_neuf',
26
-			'jours_neuf',
27
-			'email_envoi',
28
-		] as $m
29
-	) {
30
-		$valeurs[$m] = $GLOBALS['meta'][$m];
31
-	}
18
+    $valeurs = [];
19
+    foreach (
20
+        [
21
+            'suivi_edito',
22
+            'adresse_suivi',
23
+            'adresse_suivi_inscription',
24
+            'quoi_de_neuf',
25
+            'adresse_neuf',
26
+            'jours_neuf',
27
+            'email_envoi',
28
+        ] as $m
29
+    ) {
30
+        $valeurs[$m] = $GLOBALS['meta'][$m];
31
+    }
32 32
 
33
-	return $valeurs;
33
+    return $valeurs;
34 34
 }
35 35
 
36 36
 function formulaires_configurer_annonces_verifier_dist() {
37
-	$erreurs = [];
38
-	if (_request('suivi_edito') == 'oui') {
39
-		if (!$email = _request('adresse_suivi')) {
40
-			$erreurs['adresse_suivi'] = _T('info_obligatoire');
41
-		} else {
42
-			include_spip('inc/filtres');
43
-			if (!email_valide($email)) {
44
-				$erreurs['adresse_suivi'] = _T('form_prop_indiquer_email');
45
-			}
46
-		}
47
-	}
48
-	if (_request('quoi_de_neuf') == 'oui') {
49
-		if (!$email = _request('adresse_neuf')) {
50
-			$erreurs['adresse_neuf'] = _T('info_obligatoire');
51
-		} else {
52
-			include_spip('inc/filtres');
53
-			if (!email_valide($email)) {
54
-				$erreurs['adresse_neuf'] = _T('form_prop_indiquer_email');
55
-			}
56
-		}
57
-		if (!$email = _request('jours_neuf')) {
58
-			$erreurs['jours_neuf'] = _T('info_obligatoire');
59
-		}
60
-	}
37
+    $erreurs = [];
38
+    if (_request('suivi_edito') == 'oui') {
39
+        if (!$email = _request('adresse_suivi')) {
40
+            $erreurs['adresse_suivi'] = _T('info_obligatoire');
41
+        } else {
42
+            include_spip('inc/filtres');
43
+            if (!email_valide($email)) {
44
+                $erreurs['adresse_suivi'] = _T('form_prop_indiquer_email');
45
+            }
46
+        }
47
+    }
48
+    if (_request('quoi_de_neuf') == 'oui') {
49
+        if (!$email = _request('adresse_neuf')) {
50
+            $erreurs['adresse_neuf'] = _T('info_obligatoire');
51
+        } else {
52
+            include_spip('inc/filtres');
53
+            if (!email_valide($email)) {
54
+                $erreurs['adresse_neuf'] = _T('form_prop_indiquer_email');
55
+            }
56
+        }
57
+        if (!$email = _request('jours_neuf')) {
58
+            $erreurs['jours_neuf'] = _T('info_obligatoire');
59
+        }
60
+    }
61 61
 
62
-	return $erreurs;
62
+    return $erreurs;
63 63
 }
64 64
 
65 65
 function formulaires_configurer_annonces_traiter_dist() {
66
-	$res = ['editable' => true];
67
-	foreach (
68
-		[
69
-			'suivi_edito',
70
-			'quoi_de_neuf',
71
-		] as $m
72
-	) {
73
-		if (!is_null($v = _request($m))) {
74
-			ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
75
-		}
76
-	}
66
+    $res = ['editable' => true];
67
+    foreach (
68
+        [
69
+            'suivi_edito',
70
+            'quoi_de_neuf',
71
+        ] as $m
72
+    ) {
73
+        if (!is_null($v = _request($m))) {
74
+            ecrire_meta($m, $v == 'oui' ? 'oui' : 'non');
75
+        }
76
+    }
77 77
 
78
-	foreach (
79
-		[
80
-			'adresse_suivi',
81
-			'adresse_suivi_inscription',
82
-			'adresse_neuf',
83
-			'jours_neuf',
84
-			'email_envoi',
85
-		] as $m
86
-	) {
87
-		if (!is_null($v = _request($m))) {
88
-			ecrire_meta($m, $v);
89
-		}
90
-	}
78
+    foreach (
79
+        [
80
+            'adresse_suivi',
81
+            'adresse_suivi_inscription',
82
+            'adresse_neuf',
83
+            'jours_neuf',
84
+            'email_envoi',
85
+        ] as $m
86
+    ) {
87
+        if (!is_null($v = _request($m))) {
88
+            ecrire_meta($m, $v);
89
+        }
90
+    }
91 91
 
92
-	$res['message_ok'] = _T('config_info_enregistree');
93
-	// provoquer l'envoi des nouveautes en supprimant le fichier lock
94
-	if (_request('envoi_now')) {
95
-		effacer_meta('dernier_envoi_neuf');
96
-		$id_job = job_queue_add('mail', 'Test Envoi des nouveautes', [0], 'genie/');
97
-		include_spip('inc/queue');
98
-		queue_schedule([$id_job]);
99
-		$res['message_ok'] .= '<br />' . _T('info_liste_nouveautes_envoyee');
100
-	}
92
+    $res['message_ok'] = _T('config_info_enregistree');
93
+    // provoquer l'envoi des nouveautes en supprimant le fichier lock
94
+    if (_request('envoi_now')) {
95
+        effacer_meta('dernier_envoi_neuf');
96
+        $id_job = job_queue_add('mail', 'Test Envoi des nouveautes', [0], 'genie/');
97
+        include_spip('inc/queue');
98
+        queue_schedule([$id_job]);
99
+        $res['message_ok'] .= '<br />' . _T('info_liste_nouveautes_envoyee');
100
+    }
101 101
 
102
-	return $res;
102
+    return $res;
103 103
 }
Please login to merge, or discard this patch.
prive/formulaires/configurer_identite.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -62,5 +62,5 @@
 block discarded – undo
62 62
 	$reload = texte_script(couper(_request('nom_site'), 35));
63 63
 	$reload = "<script type='text/javascript'>if (window.jQuery) jQuery('#bando_identite .nom_site_spip .nom').html('$reload');</script>";
64 64
 
65
-	return ['message_ok' => _T('config_info_enregistree') . $reload, 'editable' => true];
65
+	return ['message_ok' => _T('config_info_enregistree').$reload, 'editable' => true];
66 66
 }
Please login to merge, or discard this patch.
Indentation   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -10,56 +10,56 @@
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 function formulaires_configurer_identite_charger_dist() {
17
-	// travailler sur des meta fraiches
18
-	include_spip('inc/meta');
19
-	lire_metas();
17
+    // travailler sur des meta fraiches
18
+    include_spip('inc/meta');
19
+    lire_metas();
20 20
 
21
-	$valeurs = [];
22
-	foreach (['nom_site', 'adresse_site', 'slogan_site', 'descriptif_site', 'email_webmaster'] as $k) {
23
-		$valeurs[$k] = $GLOBALS['meta'][$k] ?? '';
24
-	}
21
+    $valeurs = [];
22
+    foreach (['nom_site', 'adresse_site', 'slogan_site', 'descriptif_site', 'email_webmaster'] as $k) {
23
+        $valeurs[$k] = $GLOBALS['meta'][$k] ?? '';
24
+    }
25 25
 
26
-	return $valeurs;
26
+    return $valeurs;
27 27
 }
28 28
 
29 29
 function formulaires_configurer_identite_verifier_dist() {
30
-	$erreurs = [];
30
+    $erreurs = [];
31 31
 
32
-	// adresse_site est obligatoire mais rempli automatiquement si absent !
33
-	foreach (['nom_site'/*,'adresse_site'*/] as $obli) {
34
-		if (!_request($obli)) {
35
-			$erreurs[$obli] = _T('info_obligatoire');
36
-		}
37
-	}
32
+    // adresse_site est obligatoire mais rempli automatiquement si absent !
33
+    foreach (['nom_site'/*,'adresse_site'*/] as $obli) {
34
+        if (!_request($obli)) {
35
+            $erreurs[$obli] = _T('info_obligatoire');
36
+        }
37
+    }
38 38
 
39
-	if (($email = _request('email_webmaster')) && !email_valide($email)) {
40
-		$erreurs['email_webmaster'] = _T('info_email_invalide');
41
-	}
39
+    if (($email = _request('email_webmaster')) && !email_valide($email)) {
40
+        $erreurs['email_webmaster'] = _T('info_email_invalide');
41
+    }
42 42
 
43
-	return $erreurs;
43
+    return $erreurs;
44 44
 }
45 45
 
46 46
 function formulaires_configurer_identite_traiter_dist() {
47
-	include_spip('inc/config');
48
-	$adresse_site = $GLOBALS['meta']['adresse_site'] ?? '';
49
-	if (_request('adresse_site') != $adresse_site) {
50
-		refuser_traiter_formulaire_ajax();
51
-	}
47
+    include_spip('inc/config');
48
+    $adresse_site = $GLOBALS['meta']['adresse_site'] ?? '';
49
+    if (_request('adresse_site') != $adresse_site) {
50
+        refuser_traiter_formulaire_ajax();
51
+    }
52 52
 
53
-	set_request('adresse_site', appliquer_adresse_site(_request('adresse_site')));
53
+    set_request('adresse_site', appliquer_adresse_site(_request('adresse_site')));
54 54
 
55
-	include_spip('inc/meta');
56
-	foreach (['nom_site', 'slogan_site', 'descriptif_site', 'email_webmaster'] as $k) {
57
-		ecrire_meta($k, _request($k));
58
-	}
55
+    include_spip('inc/meta');
56
+    foreach (['nom_site', 'slogan_site', 'descriptif_site', 'email_webmaster'] as $k) {
57
+        ecrire_meta($k, _request($k));
58
+    }
59 59
 
60
-	include_spip('inc/texte_mini');
61
-	$reload = texte_script(couper(_request('nom_site'), 35));
62
-	$reload = "<script type='text/javascript'>if (window.jQuery) jQuery('#bando_identite .nom_site_spip .nom').html('$reload');</script>";
60
+    include_spip('inc/texte_mini');
61
+    $reload = texte_script(couper(_request('nom_site'), 35));
62
+    $reload = "<script type='text/javascript'>if (window.jQuery) jQuery('#bando_identite .nom_site_spip .nom').html('$reload');</script>";
63 63
 
64
-	return ['message_ok' => _T('config_info_enregistree') . $reload, 'editable' => true];
64
+    return ['message_ok' => _T('config_info_enregistree') . $reload, 'editable' => true];
65 65
 }
Please login to merge, or discard this patch.
prive/formulaires/recherche_ecrire.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -46,6 +46,6 @@
 block discarded – undo
46 46
 			'recherche' => _request('recherche'),
47 47
 			'lang' => $lang,
48 48
 			'class' => $class,
49
-			'_id_champ' => 'rechercher_' . substr(md5($action . $class), 0, 4),
49
+			'_id_champ' => 'rechercher_'.substr(md5($action.$class), 0, 4),
50 50
 		];
51 51
 }
Please login to merge, or discard this patch.
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  **/
17 17
 
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 /**
@@ -32,15 +32,15 @@  discard block
 block discarded – undo
32 32
  * @return array Environnement du formulaire
33 33
  **/
34 34
 function formulaires_recherche_ecrire_charger_dist($action = '', $class = '') {
35
-	$lang = $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'] ? $GLOBALS['spip_lang'] : '';
35
+    $lang = $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'] ? $GLOBALS['spip_lang'] : '';
36 36
 
37
-	return
38
-		[
39
-			'action' => ($action ?: generer_url_ecrire('recherche')),
40
-			# action specifique, ne passe pas par Verifier, ni Traiter
41
-			'recherche' => _request('recherche'),
42
-			'lang' => $lang,
43
-			'class' => $class,
44
-			'_id_champ' => 'rechercher_' . substr(md5($action . $class), 0, 4),
45
-		];
37
+    return
38
+        [
39
+            'action' => ($action ?: generer_url_ecrire('recherche')),
40
+            # action specifique, ne passe pas par Verifier, ni Traiter
41
+            'recherche' => _request('recherche'),
42
+            'lang' => $lang,
43
+            'class' => $class,
44
+            '_id_champ' => 'rechercher_' . substr(md5($action . $class), 0, 4),
45
+        ];
46 46
 }
Please login to merge, or discard this patch.
ecrire/typographie/fr.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -70,7 +70,7 @@
 block discarded – undo
70 70
 
71 71
 	$cherche2 = [
72 72
 		'/([^-\n]|^)--([^-]|$)/S',
73
-		',(' . _PROTOCOLES_STD . ')~((://[^"\'\s\[\]\}\)<>]+)~([?]))?,S',
73
+		',('._PROTOCOLES_STD.')~((://[^"\'\s\[\]\}\)<>]+)~([?]))?,S',
74 74
 		'/~/'
75 75
 	];
76 76
 	$remplace2 = [
Please login to merge, or discard this patch.
Indentation   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -10,73 +10,73 @@
 block discarded – undo
10 10
 \***************************************************************************/
11 11
 
12 12
 if (!defined('_ECRIRE_INC_VERSION')) {
13
-	return;
13
+    return;
14 14
 }
15 15
 
16 16
 // Correction typographique francaise
17 17
 
18 18
 function typographie_fr_dist($letexte) {
19 19
 
20
-	static $trans;
20
+    static $trans;
21 21
 
22
-	// Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ;
23
-	// 147 = ldquo; 148 = rdquo; ' = zouli apostrophe
24
-	if (!$trans) {
25
-		$trans = [
26
-			"'" => '&#8217;',
27
-			'&nbsp;' => '~',
28
-			'&raquo;' => '&#187;',
29
-			'&laquo;' => '&#171;',
30
-			'&rdquo;' => '&#8221;',
31
-			'&ldquo;' => '&#8220;',
32
-			'&deg;' => '&#176;'
33
-		];
34
-		$chars = [160 => '~', 187 => '&#187;', 171 => '&#171;', 148 => '&#8221;', 147 => '&#8220;', 176 => '&#176;'];
35
-		$chars_trans = array_keys($chars);
36
-		$chars = array_values($chars);
37
-		$chars_trans = implode(' ', array_map('chr', $chars_trans));
38
-		$chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1'));
39
-		$chars_trans = explode(' ', (string) $chars_trans);
40
-		foreach ($chars as $k => $r) {
41
-			$trans[$chars_trans[$k]] = $r;
42
-		}
43
-	}
22
+    // Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ;
23
+    // 147 = ldquo; 148 = rdquo; ' = zouli apostrophe
24
+    if (!$trans) {
25
+        $trans = [
26
+            "'" => '&#8217;',
27
+            '&nbsp;' => '~',
28
+            '&raquo;' => '&#187;',
29
+            '&laquo;' => '&#171;',
30
+            '&rdquo;' => '&#8221;',
31
+            '&ldquo;' => '&#8220;',
32
+            '&deg;' => '&#176;'
33
+        ];
34
+        $chars = [160 => '~', 187 => '&#187;', 171 => '&#171;', 148 => '&#8221;', 147 => '&#8220;', 176 => '&#176;'];
35
+        $chars_trans = array_keys($chars);
36
+        $chars = array_values($chars);
37
+        $chars_trans = implode(' ', array_map('chr', $chars_trans));
38
+        $chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1'));
39
+        $chars_trans = explode(' ', (string) $chars_trans);
40
+        foreach ($chars as $k => $r) {
41
+            $trans[$chars_trans[$k]] = $r;
42
+        }
43
+    }
44 44
 
45
-	$letexte = strtr($letexte, $trans);
45
+    $letexte = strtr($letexte, $trans);
46 46
 
47
-	$cherche1 = [
48
-		/* 1 */
49
-		'/((?:^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/S',
50
-		/* 2 */
51
-		'/&#187;| --?,|(?::(?!:)| %)(?:\W|$)/S',
52
-		/* 3 */
53
-		'/([^[<(!?.])([!?][!?\.]*)/iS',
54
-		/* 4 */
55
-		'/&#171;|(?:M(?:M?\.|mes?|r\.?)|[MnN]&#176;) /S'
56
-	];
57
-	$remplace1 = [
58
-		/* 1 */
59
-		'\1~;',
60
-		/* 2 */
61
-		'~\0',
62
-		/* 3 */
63
-		'\1~\2',
64
-		/* 4 */
65
-		'\0~'
66
-	];
67
-	$letexte = preg_replace($cherche1, $remplace1, $letexte);
68
-	$letexte = preg_replace('/ *~+ */S', '~', $letexte);
47
+    $cherche1 = [
48
+        /* 1 */
49
+        '/((?:^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/S',
50
+        /* 2 */
51
+        '/&#187;| --?,|(?::(?!:)| %)(?:\W|$)/S',
52
+        /* 3 */
53
+        '/([^[<(!?.])([!?][!?\.]*)/iS',
54
+        /* 4 */
55
+        '/&#171;|(?:M(?:M?\.|mes?|r\.?)|[MnN]&#176;) /S'
56
+    ];
57
+    $remplace1 = [
58
+        /* 1 */
59
+        '\1~;',
60
+        /* 2 */
61
+        '~\0',
62
+        /* 3 */
63
+        '\1~\2',
64
+        /* 4 */
65
+        '\0~'
66
+    ];
67
+    $letexte = preg_replace($cherche1, $remplace1, $letexte);
68
+    $letexte = preg_replace('/ *~+ */S', '~', $letexte);
69 69
 
70
-	$cherche2 = [
71
-		'/([^-\n]|^)--([^-]|$)/S',
72
-		',(' . _PROTOCOLES_STD . ')~((://[^"\'\s\[\]\}\)<>]+)~([?]))?,S',
73
-		'/~/'
74
-	];
75
-	$remplace2 = [
76
-		'\1&mdash;\2',
77
-		'\1\3\4',
78
-		'&nbsp;'
79
-	];
70
+    $cherche2 = [
71
+        '/([^-\n]|^)--([^-]|$)/S',
72
+        ',(' . _PROTOCOLES_STD . ')~((://[^"\'\s\[\]\}\)<>]+)~([?]))?,S',
73
+        '/~/'
74
+    ];
75
+    $remplace2 = [
76
+        '\1&mdash;\2',
77
+        '\1\3\4',
78
+        '&nbsp;'
79
+    ];
80 80
 
81
-	return preg_replace($cherche2, $remplace2, $letexte);
81
+    return preg_replace($cherche2, $remplace2, $letexte);
82 82
 }
Please login to merge, or discard this patch.
ecrire/public/jointures.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -177,14 +177,14 @@  discard block
 block discarded – undo
177 177
 			// sache qu'il peut enlever ce where si il enleve la jointure
178 178
 			$boucle->where["JOIN-L$n"] =
179 179
 				$echap ?
180
-					["'='","'$obj'","sql_quote('$type')"]
180
+					["'='", "'$obj'", "sql_quote('$type')"]
181 181
 					:
182
-					['=',"$obj",sql_quote($type)];
182
+					['=', "$obj", sql_quote($type)];
183 183
 			$boucle->join["L$n"] =
184 184
 				$echap ?
185 185
 					["'$id_table'", "'$j2'", "'$j1'", "'$obj='.sql_quote('$type')"]
186 186
 					:
187
-					[$id_table, $j2, $j1, "$obj=" . sql_quote($type)];
187
+					[$id_table, $j2, $j1, "$obj=".sql_quote($type)];
188 188
 		} else {
189 189
 			$boucle->join["L$n"] = $echap ? ["'$id_table'", "'$j'"] : [$id_table, $j];
190 190
 		}
@@ -218,7 +218,7 @@  discard block
 block discarded – undo
218 218
 	$groups = liste_champs_jointures($nom, $desc, true);
219 219
 	if (!$pk) {
220 220
 		foreach ($groups as $id_prim) {
221
-			$id_field = $nom . '.' . $id_prim;
221
+			$id_field = $nom.'.'.$id_prim;
222 222
 			if (!in_array($id_field, $boucle->group)) {
223 223
 				$boucle->group[] = $id_field;
224 224
 			}
Please login to merge, or discard this patch.
Indentation   +395 added lines, -395 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  **/
19 19
 
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 
@@ -34,11 +34,11 @@  discard block
 block discarded – undo
34 34
  *     Chaine sinon : le nom du champ (non décomposable donc)
35 35
  */
36 36
 function decompose_champ_id_objet($champ) {
37
-	if ($champ !== 'id_objet' && preg_match(',^id_([a-z_]+)$,', $champ, $regs)) {
38
-		return ['id_objet', 'objet', objet_type($champ)];
39
-	}
37
+    if ($champ !== 'id_objet' && preg_match(',^id_([a-z_]+)$,', $champ, $regs)) {
38
+        return ['id_objet', 'objet', objet_type($champ)];
39
+    }
40 40
 
41
-	return $champ;
41
+    return $champ;
42 42
 }
43 43
 
44 44
 /**
@@ -57,21 +57,21 @@  discard block
 block discarded – undo
57 57
  *     - array(id_objet, objet), si le champ n'existe pas mais qu'on peut décomposer
58 58
  */
59 59
 function trouver_champs_decomposes($champ, $desc): array {
60
-	if (
61
-		!is_array($desc)
62
-		|| array_key_exists($champ, $desc['field'])
63
-	) {
64
-		return [$champ];
65
-	}
66
-	// si le champ se décompose, tester que les colonnes décomposées sont présentes
67
-	if (is_array($decompose = decompose_champ_id_objet($champ))) {
68
-		array_pop($decompose);
69
-		if (count(array_intersect($decompose, array_keys($desc['field']))) === count($decompose)) {
70
-			return $decompose;
71
-		}
72
-	}
73
-
74
-	return [$champ];
60
+    if (
61
+        !is_array($desc)
62
+        || array_key_exists($champ, $desc['field'])
63
+    ) {
64
+        return [$champ];
65
+    }
66
+    // si le champ se décompose, tester que les colonnes décomposées sont présentes
67
+    if (is_array($decompose = decompose_champ_id_objet($champ))) {
68
+        array_pop($decompose);
69
+        if (count(array_intersect($decompose, array_keys($desc['field']))) === count($decompose)) {
70
+            return $decompose;
71
+        }
72
+    }
73
+
74
+    return [$champ];
75 75
 }
76 76
 
77 77
 
@@ -101,23 +101,23 @@  discard block
 block discarded – undo
101 101
  *     Alias de la table de jointure (Lx)
102 102
  */
103 103
 function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false, $max_liens = 5) {
104
-	// les jointures minimales sont optimales :
105
-	// on contraint le nombre d'etapes en l'augmentant
106
-	// jusqu'a ce qu'on trouve une jointure ou qu'on atteigne la limite maxi
107
-	$max = 1;
108
-	$res = false;
109
-	$milieu_exclus = ($col ?: []);
110
-	while ($max <= $max_liens && !$res) {
111
-		$res = calculer_chaine_jointures($boucle, $depart, $arrivee, [], $milieu_exclus, $max);
112
-		$max++;
113
-	}
114
-	if (!$res) {
115
-		return '';
116
-	}
117
-
118
-	[$nom, $desc] = $depart;
119
-
120
-	return fabrique_jointures($boucle, $res, $cond, $desc, $nom, $col);
104
+    // les jointures minimales sont optimales :
105
+    // on contraint le nombre d'etapes en l'augmentant
106
+    // jusqu'a ce qu'on trouve une jointure ou qu'on atteigne la limite maxi
107
+    $max = 1;
108
+    $res = false;
109
+    $milieu_exclus = ($col ?: []);
110
+    while ($max <= $max_liens && !$res) {
111
+        $res = calculer_chaine_jointures($boucle, $depart, $arrivee, [], $milieu_exclus, $max);
112
+        $max++;
113
+    }
114
+    if (!$res) {
115
+        return '';
116
+    }
117
+
118
+    [$nom, $desc] = $depart;
119
+
120
+    return fabrique_jointures($boucle, $res, $cond, $desc, $nom, $col);
121 121
 }
122 122
 
123 123
 /**
@@ -156,78 +156,78 @@  discard block
 block discarded – undo
156 156
  *     Alias de la table de jointure (Lx)
157 157
  */
158 158
 function fabrique_jointures(&$boucle, $res, $cond = false, $desc = [], $nom = '', $col = '', $echap = true) {
159
-	$a = [];
160
-	$j = null;
161
-	$n = null;
162
-	static $num = [];
163
-	$id_table = '';
164
-	$cpt = &$num[$boucle->descr['nom']][$boucle->descr['gram']][$boucle->id_boucle];
165
-	foreach ($res as $cle => $r) {
166
-		[$d, $a, $j] = $r;
167
-		if (!$id_table) {
168
-			$id_table = $d;
169
-		}
170
-		$n = ++$cpt;
171
-		if (is_array($j)) { // c'est un lien sur un champ du type id_objet,objet,'article'
172
-			[$j1, $j2, $obj, $type] = $j;
173
-			// trouver de quel cote est (id_objet,objet)
174
-			$obj = $j1 == "id_$obj" ? "$id_table.$obj" : "L$n.$obj";
175
-			// le where complementaire est envoye dans la jointure et dans le where
176
-			// on utilise une clé qui le relie a la jointure pour que l'optimiseur
177
-			// sache qu'il peut enlever ce where si il enleve la jointure
178
-			$boucle->where["JOIN-L$n"] =
179
-				$echap ?
180
-					["'='","'$obj'","sql_quote('$type')"]
181
-					:
182
-					['=',"$obj",sql_quote($type)];
183
-			$boucle->join["L$n"] =
184
-				$echap ?
185
-					["'$id_table'", "'$j2'", "'$j1'", "'$obj='.sql_quote('$type')"]
186
-					:
187
-					[$id_table, $j2, $j1, "$obj=" . sql_quote($type)];
188
-		} else {
189
-			$boucle->join["L$n"] = $echap ? ["'$id_table'", "'$j'"] : [$id_table, $j];
190
-		}
191
-		$boucle->from[$id_table = "L$n"] = $a[0];
192
-	}
193
-
194
-
195
-	// pas besoin de group by
196
-	// (cf http://article.gmane.org/gmane.comp.web.spip.devel/30555)
197
-	// si une seule jointure et sur une table avec primary key formee
198
-	// de l'index principal et de l'index de jointure (non conditionnel! [6031])
199
-	// et operateur d'egalite (https://core.spip.net/issues/477)
200
-
201
-	if ($pk = (isset($a[1]) && (count($boucle->from) == 2) && !$cond)) {
202
-		$pk = nogroupby_if($desc, $a[1], $col);
203
-	}
204
-
205
-	// pas de group by
206
-	// si une seule jointure
207
-	// et si l'index de jointure est une primary key a l'arrivee !
208
-	if (
209
-		!$pk
210
-		&& count($boucle->from) == 2
211
-		&& isset($a[1]['key']['PRIMARY KEY'])
212
-		&& $j == $a[1]['key']['PRIMARY KEY']
213
-	) {
214
-		$pk = true;
215
-	}
216
-
217
-	// la clause Group by est en conflit avec ORDER BY, a completer
218
-	$groups = liste_champs_jointures($nom, $desc, true);
219
-	if (!$pk) {
220
-		foreach ($groups as $id_prim) {
221
-			$id_field = $nom . '.' . $id_prim;
222
-			if (!in_array($id_field, $boucle->group)) {
223
-				$boucle->group[] = $id_field;
224
-			}
225
-		}
226
-	}
227
-
228
-	$boucle->modificateur['lien'] = true;
229
-
230
-	return "L$n";
159
+    $a = [];
160
+    $j = null;
161
+    $n = null;
162
+    static $num = [];
163
+    $id_table = '';
164
+    $cpt = &$num[$boucle->descr['nom']][$boucle->descr['gram']][$boucle->id_boucle];
165
+    foreach ($res as $cle => $r) {
166
+        [$d, $a, $j] = $r;
167
+        if (!$id_table) {
168
+            $id_table = $d;
169
+        }
170
+        $n = ++$cpt;
171
+        if (is_array($j)) { // c'est un lien sur un champ du type id_objet,objet,'article'
172
+            [$j1, $j2, $obj, $type] = $j;
173
+            // trouver de quel cote est (id_objet,objet)
174
+            $obj = $j1 == "id_$obj" ? "$id_table.$obj" : "L$n.$obj";
175
+            // le where complementaire est envoye dans la jointure et dans le where
176
+            // on utilise une clé qui le relie a la jointure pour que l'optimiseur
177
+            // sache qu'il peut enlever ce where si il enleve la jointure
178
+            $boucle->where["JOIN-L$n"] =
179
+                $echap ?
180
+                    ["'='","'$obj'","sql_quote('$type')"]
181
+                    :
182
+                    ['=',"$obj",sql_quote($type)];
183
+            $boucle->join["L$n"] =
184
+                $echap ?
185
+                    ["'$id_table'", "'$j2'", "'$j1'", "'$obj='.sql_quote('$type')"]
186
+                    :
187
+                    [$id_table, $j2, $j1, "$obj=" . sql_quote($type)];
188
+        } else {
189
+            $boucle->join["L$n"] = $echap ? ["'$id_table'", "'$j'"] : [$id_table, $j];
190
+        }
191
+        $boucle->from[$id_table = "L$n"] = $a[0];
192
+    }
193
+
194
+
195
+    // pas besoin de group by
196
+    // (cf http://article.gmane.org/gmane.comp.web.spip.devel/30555)
197
+    // si une seule jointure et sur une table avec primary key formee
198
+    // de l'index principal et de l'index de jointure (non conditionnel! [6031])
199
+    // et operateur d'egalite (https://core.spip.net/issues/477)
200
+
201
+    if ($pk = (isset($a[1]) && (count($boucle->from) == 2) && !$cond)) {
202
+        $pk = nogroupby_if($desc, $a[1], $col);
203
+    }
204
+
205
+    // pas de group by
206
+    // si une seule jointure
207
+    // et si l'index de jointure est une primary key a l'arrivee !
208
+    if (
209
+        !$pk
210
+        && count($boucle->from) == 2
211
+        && isset($a[1]['key']['PRIMARY KEY'])
212
+        && $j == $a[1]['key']['PRIMARY KEY']
213
+    ) {
214
+        $pk = true;
215
+    }
216
+
217
+    // la clause Group by est en conflit avec ORDER BY, a completer
218
+    $groups = liste_champs_jointures($nom, $desc, true);
219
+    if (!$pk) {
220
+        foreach ($groups as $id_prim) {
221
+            $id_field = $nom . '.' . $id_prim;
222
+            if (!in_array($id_field, $boucle->group)) {
223
+                $boucle->group[] = $id_field;
224
+            }
225
+        }
226
+    }
227
+
228
+    $boucle->modificateur['lien'] = true;
229
+
230
+    return "L$n";
231 231
 }
232 232
 
233 233
 /**
@@ -242,18 +242,18 @@  discard block
 block discarded – undo
242 242
  * @return bool
243 243
  */
244 244
 function nogroupby_if($depart, $arrivee, $col) {
245
-	if (
246
-		empty($arrivee['key']['PRIMARY KEY'])
247
-		|| !($pk = $arrivee['key']['PRIMARY KEY'])
248
-		|| empty($depart['key']['PRIMARY KEY'])
249
-	) {
250
-		return false;
251
-	}
252
-	$id_primary = $depart['key']['PRIMARY KEY'];
253
-	if (is_array($col)) {
254
-		$col = implode(', *', $col);
255
-	} // cas id_objet, objet
256
-	return (preg_match("/^$id_primary, *$col$/", (string) $pk) || preg_match("/^$col, *$id_primary$/", (string) $pk));
245
+    if (
246
+        empty($arrivee['key']['PRIMARY KEY'])
247
+        || !($pk = $arrivee['key']['PRIMARY KEY'])
248
+        || empty($depart['key']['PRIMARY KEY'])
249
+    ) {
250
+        return false;
251
+    }
252
+    $id_primary = $depart['key']['PRIMARY KEY'];
253
+    if (is_array($col)) {
254
+        $col = implode(', *', $col);
255
+    } // cas id_objet, objet
256
+    return (preg_match("/^$id_primary, *$col$/", (string) $pk) || preg_match("/^$col, *$id_primary$/", (string) $pk));
257 257
 }
258 258
 
259 259
 /**
@@ -271,46 +271,46 @@  discard block
 block discarded – undo
271 271
  */
272 272
 function liste_champs_jointures($nom, $desc, $primary = false) {
273 273
 
274
-	static $nojoin = ['idx', 'maj', 'date', 'statut'];
274
+    static $nojoin = ['idx', 'maj', 'date', 'statut'];
275 275
 
276
-	// si cle primaire demandee, la privilegier
277
-	if ($primary && isset($desc['key']['PRIMARY KEY'])) {
278
-		return split_key($desc['key']['PRIMARY KEY']);
279
-	}
276
+    // si cle primaire demandee, la privilegier
277
+    if ($primary && isset($desc['key']['PRIMARY KEY'])) {
278
+        return split_key($desc['key']['PRIMARY KEY']);
279
+    }
280 280
 
281
-	// les champs declares explicitement pour les jointures
282
-	if (isset($desc['join'])) {
283
-		return $desc['join'];
284
-	}
285
-	/*elseif (isset($GLOBALS['tables_principales'][$nom]['join'])) return $GLOBALS['tables_principales'][$nom]['join'];
281
+    // les champs declares explicitement pour les jointures
282
+    if (isset($desc['join'])) {
283
+        return $desc['join'];
284
+    }
285
+    /*elseif (isset($GLOBALS['tables_principales'][$nom]['join'])) return $GLOBALS['tables_principales'][$nom]['join'];
286 286
 	elseif (isset($GLOBALS['tables_auxiliaires'][$nom]['join'])) return $GLOBALS['tables_auxiliaires'][$nom]['join'];*/
287 287
 
288
-	// si pas de cle, c'est fichu
289
-	if (!isset($desc['key'])) {
290
-		return [];
291
-	}
292
-
293
-	// si cle primaire
294
-	if (isset($desc['key']['PRIMARY KEY'])) {
295
-		return split_key($desc['key']['PRIMARY KEY']);
296
-	}
297
-
298
-	// ici on se rabat sur les cles secondaires,
299
-	// en eliminant celles qui sont pas pertinentes (idx, maj)
300
-	// si jamais le resultat n'est pas pertinent pour une table donnee,
301
-	// il faut declarer explicitement le champ 'join' de sa description
302
-
303
-	$join = [];
304
-	foreach ($desc['key'] as $v) {
305
-		$join = split_key($v, $join);
306
-	}
307
-	foreach ($join as $k) {
308
-		if (in_array($k, $nojoin)) {
309
-			unset($join[$k]);
310
-		}
311
-	}
312
-
313
-	return $join;
288
+    // si pas de cle, c'est fichu
289
+    if (!isset($desc['key'])) {
290
+        return [];
291
+    }
292
+
293
+    // si cle primaire
294
+    if (isset($desc['key']['PRIMARY KEY'])) {
295
+        return split_key($desc['key']['PRIMARY KEY']);
296
+    }
297
+
298
+    // ici on se rabat sur les cles secondaires,
299
+    // en eliminant celles qui sont pas pertinentes (idx, maj)
300
+    // si jamais le resultat n'est pas pertinent pour une table donnee,
301
+    // il faut declarer explicitement le champ 'join' de sa description
302
+
303
+    $join = [];
304
+    foreach ($desc['key'] as $v) {
305
+        $join = split_key($v, $join);
306
+    }
307
+    foreach ($join as $k) {
308
+        if (in_array($k, $nojoin)) {
309
+            unset($join[$k]);
310
+        }
311
+    }
312
+
313
+    return $join;
314 314
 }
315 315
 
316 316
 /**
@@ -321,14 +321,14 @@  discard block
 block discarded – undo
321 321
  * @return array
322 322
  */
323 323
 function split_key($v, $join = []) {
324
-	foreach (preg_split('/,\s*/', $v) as $k) {
325
-		if (str_contains((string) $k, '(')) {
326
-			$k = explode('(', (string) $k);
327
-			$k = trim(reset($k));
328
-		}
329
-		$join[$k] = $k;
330
-	}
331
-	return $join;
324
+    foreach (preg_split('/,\s*/', $v) as $k) {
325
+        if (str_contains((string) $k, '(')) {
326
+            $k = explode('(', (string) $k);
327
+            $k = trim(reset($k));
328
+        }
329
+        $join[$k] = $k;
330
+    }
331
+    return $join;
332 332
 }
333 333
 
334 334
 /**
@@ -351,134 +351,134 @@  discard block
 block discarded – undo
351 351
  * @return array
352 352
  */
353 353
 function calculer_chaine_jointures(
354
-	&$boucle,
355
-	$depart,
356
-	$arrivee,
357
-	$vu = [],
358
-	$milieu_exclus = [],
359
-	$max_liens = 5
354
+    &$boucle,
355
+    $depart,
356
+    $arrivee,
357
+    $vu = [],
358
+    $milieu_exclus = [],
359
+    $max_liens = 5
360 360
 ) {
361
-	static $trouver_table;
362
-	if (!$trouver_table) {
363
-		$trouver_table = charger_fonction('trouver_table', 'base');
364
-	}
365
-
366
-	if (is_string($milieu_exclus)) {
367
-		$milieu_exclus = [$milieu_exclus];
368
-	}
369
-	// quand on a exclus id_objet comme cle de jointure, il faut aussi exclure objet
370
-	// faire une jointure sur objet tout seul n'a pas de sens
371
-	if (in_array('id_objet', $milieu_exclus) && !in_array('objet', $milieu_exclus)) {
372
-		$milieu_exclus[] = 'objet';
373
-	}
374
-
375
-	[$dnom, $ddesc] = $depart;
376
-	[$anom, $adesc] = $arrivee;
377
-	if ($vu === []) {
378
-		$vu[] = $dnom; // ne pas oublier la table de depart
379
-		$vu[] = $anom; // ne pas oublier la table d'arrivee
380
-	}
381
-
382
-	$akeys = [];
383
-	foreach ($adesc['key'] as $k) {
384
-		// respecter l'ordre de $adesc['key'] pour ne pas avoir id_trad en premier entre autres...
385
-		$akeys = array_merge($akeys, preg_split('/,\s*/', (string) $k));
386
-	}
387
-
388
-	// enlever les cles d'arrivee exclues par l'appel
389
-	$akeys = array_diff($akeys, $milieu_exclus);
390
-
391
-	// cles candidates au depart
392
-	$keys = liste_champs_jointures($dnom, $ddesc);
393
-	// enlever les cles dde depart exclues par l'appel
394
-	$keys = array_diff($keys, $milieu_exclus);
395
-
396
-	$v = $keys ? array_intersect(array_values($keys), $akeys) : false;
397
-
398
-	if ($v) {
399
-		return [[$dnom, [$adesc['table'], $adesc], array_shift($v)]];
400
-	}
401
-
402
-	// regarder si l'on a (id_objet,objet) au depart et si on peut le mapper sur un id_xx
403
-	if (count(array_intersect(['id_objet', 'objet'], $keys)) == 2) {
404
-		// regarder si l'une des cles d'arrivee peut se decomposer en
405
-		// id_objet,objet
406
-		// si oui on la prend
407
-		foreach ($akeys as $key) {
408
-			$v = decompose_champ_id_objet($key);
409
-			if (is_array($v)) {
410
-				$objet = array_shift($v); // objet,'article'
411
-				array_unshift($v, $key); // id_article,objet,'article'
412
-				array_unshift($v, $objet); // id_objet,id_article,objet,'article'
413
-				return [[$dnom, [$adesc['table'], $adesc], $v]];
414
-			}
415
-		}
416
-	} else {
417
-		// regarder si l'une des cles de depart peut se decomposer en
418
-		// id_objet,objet a l'arrivee
419
-		// si oui on la prend
420
-		foreach ($keys as $key) {
421
-			if (count($v = trouver_champs_decomposes($key, $adesc)) > 1 && count($v) == count(array_intersect($v, $akeys))) {
422
-				$v = decompose_champ_id_objet($key);
423
-				// id_objet,objet,'article'
424
-				array_unshift($v, $key);
425
-				// id_article,id_objet,objet,'article'
426
-				return [[$dnom, [$adesc['table'], $adesc], $v]];
427
-			}
428
-		}
429
-	}
430
-	// si l'on voulait une jointure direct, c'est rate !
431
-	if ($max_liens <= 1) {
432
-		return [];
433
-	}
434
-
435
-	// sinon essayer de passer par une autre table
436
-	$new = $vu;
437
-	foreach ($boucle->jointures as $v) {
438
-		if (
439
-			$v
440
-			&& !in_array($v, $vu)
441
-			&& ($def = $trouver_table($v, $boucle->sql_serveur))
442
-			&& !in_array($def['table_sql'], $vu)
443
-		) {
444
-			// ne pas tester les cles qui sont exclues a l'appel
445
-			// ie la cle de la jointure precedente
446
-			$test_cles = $milieu_exclus;
447
-			$new[] = $v;
448
-			$max_iter = 50; // securite
449
-			while (
450
-				count($jointure_directe_possible = calculer_chaine_jointures(
451
-					$boucle,
452
-					$depart,
453
-					[$v, $def],
454
-					$vu,
455
-					$test_cles,
456
-					1
457
-				)) && $max_iter--
458
-			) {
459
-				$jointure_directe_possible = reset($jointure_directe_possible);
460
-				$milieu = end($jointure_directe_possible);
461
-				$exclure_fin = $milieu_exclus;
462
-				if (is_string($milieu)) {
463
-					$exclure_fin[] = $milieu;
464
-					$test_cles[] = $milieu;
465
-				} else {
466
-					$exclure_fin = array_merge($exclure_fin, $milieu);
467
-					$test_cles = array_merge($test_cles, $milieu);
468
-				}
469
-				// essayer de rejoindre l'arrivee a partir de cette etape intermediaire
470
-				// sans repasser par la meme cle milieu, ni une cle deja vue !
471
-				$r = calculer_chaine_jointures($boucle, [$v, $def], $arrivee, $new, $exclure_fin, $max_liens - 1);
472
-				if ($r) {
473
-					array_unshift($r, $jointure_directe_possible);
474
-
475
-					return $r;
476
-				}
477
-			}
478
-		}
479
-	}
480
-
481
-	return [];
361
+    static $trouver_table;
362
+    if (!$trouver_table) {
363
+        $trouver_table = charger_fonction('trouver_table', 'base');
364
+    }
365
+
366
+    if (is_string($milieu_exclus)) {
367
+        $milieu_exclus = [$milieu_exclus];
368
+    }
369
+    // quand on a exclus id_objet comme cle de jointure, il faut aussi exclure objet
370
+    // faire une jointure sur objet tout seul n'a pas de sens
371
+    if (in_array('id_objet', $milieu_exclus) && !in_array('objet', $milieu_exclus)) {
372
+        $milieu_exclus[] = 'objet';
373
+    }
374
+
375
+    [$dnom, $ddesc] = $depart;
376
+    [$anom, $adesc] = $arrivee;
377
+    if ($vu === []) {
378
+        $vu[] = $dnom; // ne pas oublier la table de depart
379
+        $vu[] = $anom; // ne pas oublier la table d'arrivee
380
+    }
381
+
382
+    $akeys = [];
383
+    foreach ($adesc['key'] as $k) {
384
+        // respecter l'ordre de $adesc['key'] pour ne pas avoir id_trad en premier entre autres...
385
+        $akeys = array_merge($akeys, preg_split('/,\s*/', (string) $k));
386
+    }
387
+
388
+    // enlever les cles d'arrivee exclues par l'appel
389
+    $akeys = array_diff($akeys, $milieu_exclus);
390
+
391
+    // cles candidates au depart
392
+    $keys = liste_champs_jointures($dnom, $ddesc);
393
+    // enlever les cles dde depart exclues par l'appel
394
+    $keys = array_diff($keys, $milieu_exclus);
395
+
396
+    $v = $keys ? array_intersect(array_values($keys), $akeys) : false;
397
+
398
+    if ($v) {
399
+        return [[$dnom, [$adesc['table'], $adesc], array_shift($v)]];
400
+    }
401
+
402
+    // regarder si l'on a (id_objet,objet) au depart et si on peut le mapper sur un id_xx
403
+    if (count(array_intersect(['id_objet', 'objet'], $keys)) == 2) {
404
+        // regarder si l'une des cles d'arrivee peut se decomposer en
405
+        // id_objet,objet
406
+        // si oui on la prend
407
+        foreach ($akeys as $key) {
408
+            $v = decompose_champ_id_objet($key);
409
+            if (is_array($v)) {
410
+                $objet = array_shift($v); // objet,'article'
411
+                array_unshift($v, $key); // id_article,objet,'article'
412
+                array_unshift($v, $objet); // id_objet,id_article,objet,'article'
413
+                return [[$dnom, [$adesc['table'], $adesc], $v]];
414
+            }
415
+        }
416
+    } else {
417
+        // regarder si l'une des cles de depart peut se decomposer en
418
+        // id_objet,objet a l'arrivee
419
+        // si oui on la prend
420
+        foreach ($keys as $key) {
421
+            if (count($v = trouver_champs_decomposes($key, $adesc)) > 1 && count($v) == count(array_intersect($v, $akeys))) {
422
+                $v = decompose_champ_id_objet($key);
423
+                // id_objet,objet,'article'
424
+                array_unshift($v, $key);
425
+                // id_article,id_objet,objet,'article'
426
+                return [[$dnom, [$adesc['table'], $adesc], $v]];
427
+            }
428
+        }
429
+    }
430
+    // si l'on voulait une jointure direct, c'est rate !
431
+    if ($max_liens <= 1) {
432
+        return [];
433
+    }
434
+
435
+    // sinon essayer de passer par une autre table
436
+    $new = $vu;
437
+    foreach ($boucle->jointures as $v) {
438
+        if (
439
+            $v
440
+            && !in_array($v, $vu)
441
+            && ($def = $trouver_table($v, $boucle->sql_serveur))
442
+            && !in_array($def['table_sql'], $vu)
443
+        ) {
444
+            // ne pas tester les cles qui sont exclues a l'appel
445
+            // ie la cle de la jointure precedente
446
+            $test_cles = $milieu_exclus;
447
+            $new[] = $v;
448
+            $max_iter = 50; // securite
449
+            while (
450
+                count($jointure_directe_possible = calculer_chaine_jointures(
451
+                    $boucle,
452
+                    $depart,
453
+                    [$v, $def],
454
+                    $vu,
455
+                    $test_cles,
456
+                    1
457
+                )) && $max_iter--
458
+            ) {
459
+                $jointure_directe_possible = reset($jointure_directe_possible);
460
+                $milieu = end($jointure_directe_possible);
461
+                $exclure_fin = $milieu_exclus;
462
+                if (is_string($milieu)) {
463
+                    $exclure_fin[] = $milieu;
464
+                    $test_cles[] = $milieu;
465
+                } else {
466
+                    $exclure_fin = array_merge($exclure_fin, $milieu);
467
+                    $test_cles = array_merge($test_cles, $milieu);
468
+                }
469
+                // essayer de rejoindre l'arrivee a partir de cette etape intermediaire
470
+                // sans repasser par la meme cle milieu, ni une cle deja vue !
471
+                $r = calculer_chaine_jointures($boucle, [$v, $def], $arrivee, $new, $exclure_fin, $max_liens - 1);
472
+                if ($r) {
473
+                    array_unshift($r, $jointure_directe_possible);
474
+
475
+                    return $r;
476
+                }
477
+            }
478
+        }
479
+    }
480
+
481
+    return [];
482 482
 }
483 483
 
484 484
 /**
@@ -489,18 +489,18 @@  discard block
 block discarded – undo
489 489
  * @return array
490 490
  */
491 491
 function trouver_cles_table($keys) {
492
-	$res = [];
493
-	foreach ($keys as $v) {
494
-		if (!strpos((string) $v, ',')) {
495
-			$res[$v] = 1;
496
-		} else {
497
-			foreach (preg_split('/\s*,\s*/', (string) $v) as $k) {
498
-				$res[$k] = 1;
499
-			}
500
-		}
501
-	}
502
-
503
-	return array_keys($res);
492
+    $res = [];
493
+    foreach ($keys as $v) {
494
+        if (!strpos((string) $v, ',')) {
495
+            $res[$v] = 1;
496
+        } else {
497
+            foreach (preg_split('/\s*,\s*/', (string) $v) as $k) {
498
+                $res[$k] = 1;
499
+            }
500
+        }
501
+    }
502
+
503
+    return array_keys($res);
504 504
 }
505 505
 
506 506
 
@@ -527,34 +527,34 @@  discard block
 block discarded – undo
527 527
  *     - 'alias' : alias utilisé pour la table (si pertinent. ie: avec `$boucle->from` transmis par exemple)
528 528
  */
529 529
 function chercher_champ_dans_tables($cle, $tables, $connect, $checkarrivee = false) {
530
-	static $trouver_table = '';
531
-	if (!$trouver_table) {
532
-		$trouver_table = charger_fonction('trouver_table', 'base');
533
-	}
534
-
535
-	if (!is_array($cle)) {
536
-		$cle = [$cle];
537
-	}
538
-
539
-	foreach ($tables as $k => $table) {
540
-		if (
541
-			$table
542
-			&& ($desc = $trouver_table($table, $connect))
543
-			&& (
544
-				isset($desc['field'])
545
-				&& count(array_intersect($cle, array_keys($desc['field']))) === count($cle)
546
-				&& ($checkarrivee == false || $checkarrivee == $desc['table'])
547
-			)
548
-		) {
549
-			return [
550
-				'desc' => $desc,
551
-				'table' => $desc['table'],
552
-				'alias' => $k,
553
-			];
554
-		}
555
-	}
556
-
557
-	return false;
530
+    static $trouver_table = '';
531
+    if (!$trouver_table) {
532
+        $trouver_table = charger_fonction('trouver_table', 'base');
533
+    }
534
+
535
+    if (!is_array($cle)) {
536
+        $cle = [$cle];
537
+    }
538
+
539
+    foreach ($tables as $k => $table) {
540
+        if (
541
+            $table
542
+            && ($desc = $trouver_table($table, $connect))
543
+            && (
544
+                isset($desc['field'])
545
+                && count(array_intersect($cle, array_keys($desc['field']))) === count($cle)
546
+                && ($checkarrivee == false || $checkarrivee == $desc['table'])
547
+            )
548
+        ) {
549
+            return [
550
+                'desc' => $desc,
551
+                'table' => $desc['table'],
552
+                'alias' => $k,
553
+            ];
554
+        }
555
+    }
556
+
557
+    return false;
558 558
 }
559 559
 
560 560
 /**
@@ -580,52 +580,52 @@  discard block
 block discarded – undo
580 580
  */
581 581
 function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) {
582 582
 
583
-	// support de la recherche multi champ :
584
-	// si en seconde etape on a decompose le champ id_xx en id_objet,objet
585
-	// on reentre ici soit en cherchant une table les 2 champs id_objet,objet
586
-	// soit une table avec les 3 champs id_xx, id_objet, objet
587
-	if (!is_array($cle)) {
588
-		$cle = [$cle];
589
-	}
590
-
591
-	if ($infos = chercher_champ_dans_tables($cle, $joints, $boucle->sql_serveur, $checkarrivee)) {
592
-		return [$infos['table'], $infos['desc'], $cle];
593
-	}
594
-
595
-	// au premier coup, on essaye de decomposer, si possible
596
-	if (
597
-		count($cle) == 1
598
-		&& ($c = reset($cle))
599
-		&& is_array($decompose = decompose_champ_id_objet($c))
600
-	) {
601
-		$desc = $boucle->show;
602
-
603
-		// cas 1 : la cle id_xx est dans la table de depart
604
-		// -> on cherche uniquement id_objet,objet a l'arrivee
605
-		if (isset($desc['field'][$c])) {
606
-			$cle = [];
607
-			$cle[] = array_shift($decompose); // id_objet
608
-			$cle[] = array_shift($decompose); // objet
609
-			return trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee);
610
-		}
611
-		// cas 2 : la cle id_xx n'est pas dans la table de depart
612
-		// -> il faut trouver une cle de depart zzz telle que
613
-		// id_objet,objet,zzz soit a l'arrivee
614
-		else {
615
-			$depart = liste_champs_jointures(($desc['table'] ?? ''), $desc);
616
-			foreach ($depart as $d) {
617
-				$cle = [];
618
-				$cle[] = array_shift($decompose); // id_objet
619
-				$cle[] = array_shift($decompose); // objet
620
-				$cle[] = $d;
621
-				if ($ext = trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee)) {
622
-					return $ext;
623
-				}
624
-			}
625
-		}
626
-	}
627
-
628
-	return '';
583
+    // support de la recherche multi champ :
584
+    // si en seconde etape on a decompose le champ id_xx en id_objet,objet
585
+    // on reentre ici soit en cherchant une table les 2 champs id_objet,objet
586
+    // soit une table avec les 3 champs id_xx, id_objet, objet
587
+    if (!is_array($cle)) {
588
+        $cle = [$cle];
589
+    }
590
+
591
+    if ($infos = chercher_champ_dans_tables($cle, $joints, $boucle->sql_serveur, $checkarrivee)) {
592
+        return [$infos['table'], $infos['desc'], $cle];
593
+    }
594
+
595
+    // au premier coup, on essaye de decomposer, si possible
596
+    if (
597
+        count($cle) == 1
598
+        && ($c = reset($cle))
599
+        && is_array($decompose = decompose_champ_id_objet($c))
600
+    ) {
601
+        $desc = $boucle->show;
602
+
603
+        // cas 1 : la cle id_xx est dans la table de depart
604
+        // -> on cherche uniquement id_objet,objet a l'arrivee
605
+        if (isset($desc['field'][$c])) {
606
+            $cle = [];
607
+            $cle[] = array_shift($decompose); // id_objet
608
+            $cle[] = array_shift($decompose); // objet
609
+            return trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee);
610
+        }
611
+        // cas 2 : la cle id_xx n'est pas dans la table de depart
612
+        // -> il faut trouver une cle de depart zzz telle que
613
+        // id_objet,objet,zzz soit a l'arrivee
614
+        else {
615
+            $depart = liste_champs_jointures(($desc['table'] ?? ''), $desc);
616
+            foreach ($depart as $d) {
617
+                $cle = [];
618
+                $cle[] = array_shift($decompose); // id_objet
619
+                $cle[] = array_shift($decompose); // objet
620
+                $cle[] = $d;
621
+                if ($ext = trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee)) {
622
+                    return $ext;
623
+                }
624
+            }
625
+        }
626
+    }
627
+
628
+    return '';
629 629
 }
630 630
 
631 631
 /**
@@ -657,21 +657,21 @@  discard block
 block discarded – undo
657 657
  * @return string
658 658
  */
659 659
 function trouver_jointure_champ($champ, &$boucle, $jointures = false, $cond = false, $checkarrivee = false) {
660
-	if ($jointures === false) {
661
-		$jointures = $boucle->jointures;
662
-	}
663
-	// TODO : aberration, on utilise $jointures pour trouver le champ
664
-	// mais pas poour construire la jointure ensuite
665
-	$arrivee = trouver_champ_exterieur($champ, $jointures, $boucle, $checkarrivee);
666
-	if ($arrivee) {
667
-		$desc = $boucle->show;
668
-		array_pop($arrivee); // enlever la cle en 3eme argument
669
-		$cle = calculer_jointure($boucle, [$desc['id_table'], $desc], $arrivee, '', $cond);
670
-		if ($cle) {
671
-			return $cle;
672
-		}
673
-	}
674
-	spip_logger()->info("trouver_jointure_champ: $champ inconnu");
675
-
676
-	return '';
660
+    if ($jointures === false) {
661
+        $jointures = $boucle->jointures;
662
+    }
663
+    // TODO : aberration, on utilise $jointures pour trouver le champ
664
+    // mais pas poour construire la jointure ensuite
665
+    $arrivee = trouver_champ_exterieur($champ, $jointures, $boucle, $checkarrivee);
666
+    if ($arrivee) {
667
+        $desc = $boucle->show;
668
+        array_pop($arrivee); // enlever la cle en 3eme argument
669
+        $cle = calculer_jointure($boucle, [$desc['id_table'], $desc], $arrivee, '', $cond);
670
+        if ($cle) {
671
+            return $cle;
672
+        }
673
+    }
674
+    spip_logger()->info("trouver_jointure_champ: $champ inconnu");
675
+
676
+    return '';
677 677
 }
Please login to merge, or discard this patch.
ecrire/public/compiler.php 3 patches
Braces   +1 added lines, -2 removed lines patch added patch discarded remove patch
@@ -920,8 +920,7 @@
 block discarded – undo
920 920
 			if (isset($boucles[$idb]->descr['sourcefile'])) {
921 921
 				$descr['sourcefile'] = $boucles[$idb]->descr['sourcefile'];
922 922
 			}
923
-		}
924
-		else {
923
+		} else {
925 924
 			$descr = [];
926 925
 		}
927 926
 	}
Please login to merge, or discard this patch.
Spacing   +108 added lines, -117 removed lines patch added patch discarded remove patch
@@ -123,7 +123,7 @@  discard block
 block discarded – undo
123 123
 						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
124 124
 					if ($var !== 1) {
125 125
 						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
126
-							. $val . ($echap ? ") . '" : ' ');
126
+							. $val.($echap ? ") . '" : ' ');
127 127
 					} else {
128 128
 						$val = $echap ? "'.$val.'" : $val;
129 129
 					}
@@ -144,7 +144,7 @@  discard block
 block discarded – undo
144 144
 	if (!$lang) {
145 145
 		$lang = '$GLOBALS["spip_lang"]';
146 146
 	}
147
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : ' ');
147
+	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ").$lang.($echap ? ") . '" : ' ');
148 148
 
149 149
 	return $l;
150 150
 }
@@ -174,7 +174,7 @@  discard block
 block discarded – undo
174 174
 	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
175 175
 	if (is_string($p->texte)) {
176 176
 		$fichier = $p->texte;
177
-		$code = '"' . str_replace('"', '\"', $fichier) . '"';
177
+		$code = '"'.str_replace('"', '\"', $fichier).'"';
178 178
 	} else {
179 179
 		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
180 180
 		if ($code && preg_match("/^'([^']*)'/s", $code, $r)) {
@@ -223,7 +223,7 @@  discard block
 block discarded – undo
223 223
 		return false;
224 224
 	} // j'aurais voulu toucher le fond ...
225 225
 
226
-	$contexte = 'array(' . $_contexte . ')';
226
+	$contexte = 'array('.$_contexte.')';
227 227
 
228 228
 	if ($env) {
229 229
 		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
@@ -238,16 +238,16 @@  discard block
 block discarded – undo
238 238
 			$_options[] = $ajax;
239 239
 		}
240 240
 		$code = " ' . argumenter_squelette($code) . '";
241
-		$code = 'echo ' . sprintf(
241
+		$code = 'echo '.sprintf(
242 242
 			CODE_RECUPERER_FOND,
243 243
 			$code,
244 244
 			$contexte,
245 245
 			implode(',', $_options),
246 246
 			"_request(\\'connect\\') ?? \\'\\'"
247
-		) . ';';
247
+		).';';
248 248
 	}
249 249
 
250
-	return "\n'<'.'" . '?php ' . $code . "\n?'." . "'>'";
250
+	return "\n'<'.'".'?php '.$code."\n?'."."'>'";
251 251
 }
252 252
 
253 253
 
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 					$id = $id_table;
328 328
 					$statut = preg_replace(',\W,', '', $s['champ']); // securite
329 329
 				}
330
-				$mstatut = $id . '.' . $statut;
330
+				$mstatut = $id.'.'.$statut;
331 331
 
332 332
 				$arg_ignore_previsu = ($ignore_previsu ? ',true' : '');
333 333
 				include_spip('public/quete');
@@ -336,11 +336,11 @@  discard block
 block discarded – undo
336 336
 					&& $s['post_date']
337 337
 					&& $GLOBALS['meta']['post_dates'] == 'non'
338 338
 				) {
339
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
339
+					$date = $id.'.'.preg_replace(',\W,', '', $s['post_date']); // securite
340 340
 					array_unshift(
341 341
 						$boucle->where,
342 342
 						$echapper ?
343
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
343
+							"\nquete_condition_postdates('$date',"._q($boucle->sql_serveur)."$arg_ignore_previsu)"
344 344
 							:
345 345
 							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
346 346
 					);
@@ -349,9 +349,9 @@  discard block
 block discarded – undo
349 349
 					$boucle->where,
350 350
 					$echapper ?
351 351
 						"\nquete_condition_statut('$mstatut',"
352
-						. _q($s['previsu']) . ','
353
-						. _q($s['publie']) . ','
354
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
352
+						. _q($s['previsu']).','
353
+						. _q($s['publie']).','
354
+						. _q($boucle->sql_serveur)."$arg_ignore_previsu)"
355 355
 						:
356 356
 						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
357 357
 				);
@@ -385,14 +385,14 @@  discard block
 block discarded – undo
385 385
 	if (_request('var_mode_affiche') != 'resultat') {
386 386
 		$trace = '';
387 387
 	} else {
388
-		$_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
388
+		$_trace = $boucles[$id_boucle]->descr['nom'].$id_boucle;
389 389
 		$_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
390 390
 		$trace = "
391 391
 		if (empty($_trace)) {
392 392
 			$_trace = [];
393 393
 		}
394 394
 		if (count($_trace) < 3) {
395
-			$_trace" . '[] = $t0;
395
+			$_trace".'[] = $t0;
396 396
 		}';
397 397
 	}
398 398
 
@@ -426,7 +426,7 @@  discard block
 block discarded – undo
426 426
 	return
427 427
 		// Numrows[$nom] peut ne pas être encore defini
428 428
 		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
429
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ';'
429
+		. "\n\t\$t0 = ".$boucles[$id_boucle]->return.';'
430 430
 		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
431 431
 		. $trace
432 432
 		. "\n\treturn \$t0;";
@@ -494,7 +494,7 @@  discard block
 block discarded – undo
494 494
 	// faudrait expanser le foreach a la compil, car y en a souvent qu'un
495 495
 	// et puis faire un [] plutot qu'un "','."
496 496
 	if ($boucle->doublons) {
497
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
497
+		$corps .= "\n\t\t\tforeach(".$boucle->doublons.' as $k) $doublons[$k] .= "," . '.
498 498
 			index_pile($id_boucle, $primary, $boucles)
499 499
 			. "; // doublons\n";
500 500
 	}
@@ -522,13 +522,13 @@  discard block
 block discarded – undo
522 522
 		$corps .=
523 523
 			"\n\t\tlang_select_public("
524 524
 			. index_pile($id_boucle, 'lang', $boucles)
525
-			. ", '" . $boucle->lang_select . "'"
525
+			. ", '".$boucle->lang_select."'"
526 526
 			. (in_array($type_boucle, [
527 527
 				'articles',
528 528
 				'rubriques',
529 529
 				'hierarchie',
530 530
 				'breves'
531
-			]) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
531
+			]) ? ', '.index_pile($id_boucle, 'titre', $boucles) : '')
532 532
 			. ');';
533 533
 	} else {
534 534
 		$init_lang = '';
@@ -550,20 +550,16 @@  discard block
 block discarded – undo
550 550
 
551 551
 	// gestion optimale des separateurs et des boucles constantes
552 552
 	if (is_countable($boucle->separateur) ? count($boucle->separateur) : 0) {
553
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
553
+		$code_sep = ("'".str_replace("'", "\'", join('', $boucle->separateur))."'");
554 554
 	}
555 555
 
556 556
 	$corps .=
557 557
 		((!$boucle->separateur) ?
558
-			(($constant && !$corps && !$flag_cpt) ? $return :
559
-				(($return === "''") ? '' :
560
-					("\n\t\t" . '$t0 .= ' . $return . ';'))) :
561
-			("\n\t\t\$t1 " .
558
+			(($constant && !$corps && !$flag_cpt) ? $return : (($return === "''") ? '' : ("\n\t\t".'$t0 .= '.$return.';'))) : ("\n\t\t\$t1 ".
562 559
 				((str_starts_with($return, '$t1.')) ?
563
-					('.=' . substr($return, 4)) :
564
-					('= ' . $return)) .
565
-				";\n\t\t" .
566
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
560
+					('.='.substr($return, 4)) : ('= '.$return)).
561
+				";\n\t\t".
562
+				'$t0 .= ((strlen($t1) && strlen($t0)) ? '.$code_sep." : '') . \$t1;"));
567 563
 
568 564
 	// Calculer les invalideurs si c'est une boucle non constante et si on
569 565
 	// souhaite invalider ces elements
@@ -645,7 +641,7 @@  discard block
 block discarded – undo
645 641
 		$corps,
646 642
 		$fin_lang,
647 643
 		$trace,
648
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
644
+		'BOUCLE'.$id_boucle.' @ '.($boucle->descr['sourcefile'])
649 645
 	);
650 646
 
651 647
 	return $a;
@@ -665,25 +661,24 @@  discard block
 block discarded – undo
665 661
  **/
666 662
 function calculer_requete_sql($boucle) {
667 663
 	$init = [];
668
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
669
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
664
+	$init[] = calculer_dec('table', "'".$boucle->id_table."'");
665
+	$init[] = calculer_dec('id', "'".$boucle->id_boucle."'");
670 666
 	# En absence de champ c'est un decompte :
671 667
 	$init[] = calculer_dec('from', calculer_from($boucle));
672 668
 	$init[] = calculer_dec('type', calculer_from_type($boucle));
673 669
 	$init[] = calculer_dec(
674 670
 		'groupby',
675
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ')'
671
+		'array('.(($g = join("\",\n\t\t\"", $boucle->group)) ? '"'.$g.'"' : '').')'
676 672
 	);
677
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . '")');
678
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ')');
673
+	$init[] = calculer_dec('select', 'array("'.join("\",\n\t\t\"", $boucle->select).'")');
674
+	$init[] = calculer_dec('orderby', 'array('.calculer_order($boucle).')');
679 675
 	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
680 676
 	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
681 677
 	$init[] = calculer_dec(
682 678
 		'limit',
683 679
 		(
684 680
 			!str_contains($boucle->limit, 'intval') ?
685
-			"'" . ($boucle->limit) . "'" :
686
-			$boucle->limit
681
+			"'".($boucle->limit)."'" : $boucle->limit
687 682
 		)
688 683
 	);
689 684
 	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
@@ -692,17 +687,17 @@  discard block
 block discarded – undo
692 687
 	// ou recalculée à chaque passage (vide)
693 688
 	foreach ($init as $i) {
694 689
 		if (reset($i)) {
695
-			$s .= "\n\t\t" . end($i);
690
+			$s .= "\n\t\t".end($i);
696 691
 		} # statique
697 692
 		else {
698
-			$d .= "\n\t" . end($i);
693
+			$d .= "\n\t".end($i);
699 694
 		} # dynamique
700 695
 	}
701 696
 
702 697
 	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
703 698
 	. $boucle->in
704 699
 	. $boucle->hash
705
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
700
+	. "\n\t".'if (!isset($command[\'table\'])) {'
706 701
 	. $s
707 702
 	. "\n\t}"
708 703
 	. $d;
@@ -757,7 +752,7 @@  discard block
 block discarded – undo
757 752
 	];
758 753
 
759 754
 	$p->id_boucle = $context_compil[2] ?? '';
760
-	$p->ligne = (int)($context_compil[3] ?? 0);
755
+	$p->ligne = (int) ($context_compil[3] ?? 0);
761 756
 	$p->lang = $context_compil[4] ?? '';
762 757
 
763 758
 	return $p;
@@ -786,7 +781,7 @@  discard block
 block discarded – undo
786 781
  *    - index 1 : Code de l'affectation
787 782
  **/
788 783
 function calculer_dec($nom, $val) {
789
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
784
+	$static = 'if (!isset($command[\''.$nom.'\'])) ';
790 785
 	// si une variable apparait dans le calcul de la clause
791 786
 	// il faut la re-evaluer a chaque passage
792 787
 	if (
@@ -803,7 +798,7 @@  discard block
 block discarded – undo
803 798
 		$static = '';
804 799
 	}
805 800
 
806
-	return [$static, '$command[\'' . $nom . '\'] = ' . $val . ';'];
801
+	return [$static, '$command[\''.$nom.'\'] = '.$val.';'];
807 802
 }
808 803
 
809 804
 /**
@@ -828,27 +823,27 @@  discard block
 block discarded – undo
828 823
 	}
829 824
 	$res = '';
830 825
 	if ($a && $a[0] == "'?'") {
831
-		return ('(' . calculer_dump_array($a[1]) .
832
-			' ? ' . calculer_dump_array($a[2]) .
833
-			' : ' . calculer_dump_array($a[3]) .
826
+		return ('('.calculer_dump_array($a[1]).
827
+			' ? '.calculer_dump_array($a[2]).
828
+			' : '.calculer_dump_array($a[3]).
834 829
 			')');
835 830
 	} else {
836 831
 		foreach ($a as $k => $v) {
837
-			$showk = (is_numeric($k) ? '' : sql_quote($k) . ' => ');
838
-			$res .= ', ' . $showk . calculer_dump_array($v);
832
+			$showk = (is_numeric($k) ? '' : sql_quote($k).' => ');
833
+			$res .= ', '.$showk.calculer_dump_array($v);
839 834
 		}
840 835
 
841
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
836
+		return "\n\t\t\tarray(".substr($res, 2).')';
842 837
 	}
843 838
 }
844 839
 
845 840
 function calculer_dump_join($a) {
846 841
 	$res = '';
847 842
 	foreach ($a as $k => $v) {
848
-		$res .= ", '$k' => array(" . implode(',', $v) . ')';
843
+		$res .= ", '$k' => array(".implode(',', $v).')';
849 844
 	}
850 845
 
851
-	return 'array(' . substr($res, 2) . ')';
846
+	return 'array('.substr($res, 2).')';
852 847
 }
853 848
 
854 849
 /**
@@ -865,7 +860,7 @@  discard block
 block discarded – undo
865 860
 		$res .= ",'$k' => '$v'";
866 861
 	}
867 862
 
868
-	return 'array(' . substr($res, 1) . ')';
863
+	return 'array('.substr($res, 1).')';
869 864
 }
870 865
 
871 866
 /**
@@ -883,7 +878,7 @@  discard block
 block discarded – undo
883 878
 		$res .= ",'$k' => '$v'";
884 879
 	}
885 880
 
886
-	return 'array(' . substr($res, 1) . ')';
881
+	return 'array('.substr($res, 1).')';
887 882
 }
888 883
 
889 884
 function calculer_order(&$boucle) {
@@ -952,19 +947,19 @@  discard block
 block discarded – undo
952 947
 				) {
953 948
 					$res .= " .\n$tab$code";
954 949
 				} else {
955
-					$res = substr($res, 0, -1) . substr($code, 1);
950
+					$res = substr($res, 0, -1).substr($code, 1);
956 951
 				}
957 952
 			}
958 953
 
959
-			return '(' . substr($res, 2 + $descr['niv']) . ')';
954
+			return '('.substr($res, 2 + $descr['niv']).')';
960 955
 		}
961 956
 	} else {
962
-		$nom = $descr['nom'] . $id_boucle . ($descr['niv'] ?: '');
957
+		$nom = $descr['nom'].$id_boucle.($descr['niv'] ?: '');
963 958
 
964
-		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(
959
+		return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(".join(
965 960
 			" ,\n$tab",
966 961
 			$codes
967
-		) . ')))';
962
+		).')))';
968 963
 	}
969 964
 }
970 965
 
@@ -1000,7 +995,7 @@  discard block
 block discarded – undo
1000 995
 			// texte seul
1001 996
 			case 'texte':
1002 997
 				$code = sandbox_composer_texte($p->texte, $p);
1003
-				$commentaire = strlen($p->texte) . ' signes';
998
+				$commentaire = strlen($p->texte).' signes';
1004 999
 				$avant = '';
1005 1000
 				$apres = '';
1006 1001
 				$altern = "''";
@@ -1009,14 +1004,14 @@  discard block
 block discarded – undo
1009 1004
 			case 'polyglotte':
1010 1005
 				$code = '';
1011 1006
 				foreach ($p->traductions as $k => $v) {
1012
-					$code .= ",'" .
1013
-						str_replace(['\\', "'"], ['\\\\', "\\'"], $k) .
1014
-						"' => '" .
1015
-						str_replace(['\\', "'"], ['\\\\', "\\'"], $v) .
1007
+					$code .= ",'".
1008
+						str_replace(['\\', "'"], ['\\\\', "\\'"], $k).
1009
+						"' => '".
1010
+						str_replace(['\\', "'"], ['\\\\', "\\'"], $v).
1016 1011
 						"'";
1017 1012
 				}
1018
-				$code = 'choisir_traduction(array(' .
1019
-					substr($code, 1) .
1013
+				$code = 'choisir_traduction(array('.
1014
+					substr($code, 1).
1020 1015
 					'))';
1021 1016
 				$commentaire = '&';
1022 1017
 				$avant = '';
@@ -1032,7 +1027,7 @@  discard block
 block discarded – undo
1032 1027
 					$err_e_c = true;
1033 1028
 					$code = "''";
1034 1029
 				} else {
1035
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1030
+					$commentaire = '<INCLURE '.addslashes(str_replace("\n", ' ', $code)).'>';
1036 1031
 					$avant = '';
1037 1032
 					$apres = '';
1038 1033
 					$altern = "''";
@@ -1061,8 +1056,8 @@  discard block
 block discarded – undo
1061 1056
 					$err_e_c = true;
1062 1057
 					$code = "''";
1063 1058
 				} else {
1064
-					$code = 'BOUCLE' .
1065
-						str_replace('-', '_', $nom) . $descr['nom'] .
1059
+					$code = 'BOUCLE'.
1060
+						str_replace('-', '_', $nom).$descr['nom'].
1066 1061
 						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1067 1062
 					$commentaire = "?$nom";
1068 1063
 					if (
@@ -1104,24 +1099,22 @@  discard block
 block discarded – undo
1104 1099
 				foreach ($p->arg as $k => $v) {
1105 1100
 					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1106 1101
 					if ($k) {
1107
-						$l[] = _q($k) . ' => ' . $_v;
1102
+						$l[] = _q($k).' => '.$_v;
1108 1103
 					} else {
1109 1104
 						$code = $_v;
1110 1105
 					}
1111 1106
 				}
1112 1107
 				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1113 1108
 				if ($p->module) {
1114
-					$m = $p->module . ':' . $p->nom_champ;
1109
+					$m = $p->module.':'.$p->nom_champ;
1115 1110
 				} elseif ($p->nom_champ) {
1116
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1111
+					$m = MODULES_IDIOMES.':'.$p->nom_champ;
1117 1112
 				} else {
1118 1113
 					$m = '';
1119 1114
 				}
1120 1115
 
1121
-				$code = (!$code ? "'$m'" :
1122
-						($m ? "'$m' . $code" :
1123
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1124
-					. (!$l ? '' : (', array(' . implode(",\n", $l) . ')'));
1116
+				$code = (!$code ? "'$m'" : ($m ? "'$m' . $code" : ("(strpos(\$x=$code, ':') ? \$x : ('".MODULES_IDIOMES.":' . \$x))")))
1117
+					. (!$l ? '' : (', array('.implode(",\n", $l).')'));
1125 1118
 				$code = "_T($code)";
1126 1119
 				if ($p->param) {
1127 1120
 					$p->id_boucle = $id_boucle;
@@ -1143,7 +1136,7 @@  discard block
 block discarded – undo
1143 1136
 				$p->type_requete = $type;
1144 1137
 
1145 1138
 				$code = calculer_champ($p);
1146
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1139
+				$commentaire = '#'.$p->nom_champ.$p->etoile;
1147 1140
 				$avant = calculer_liste(
1148 1141
 					$p->avant,
1149 1142
 					$descr,
@@ -1182,10 +1175,9 @@  discard block
 block discarded – undo
1182 1175
 		if ($code != "''") {
1183 1176
 			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1184 1177
 			$codes[] = (($mode == 'validation') ?
1185
-				"array($code, '$commentaire', " . $p->ligne . ')'
1178
+				"array($code, '$commentaire', ".$p->ligne.')'
1186 1179
 				: (($mode == 'code') ?
1187
-					"\n// $commentaire\n$code" :
1188
-					$code));
1180
+					"\n// $commentaire\n$code" : $code));
1189 1181
 		}
1190 1182
 	} // foreach
1191 1183
 
@@ -1241,19 +1233,19 @@  discard block
 block discarded – undo
1241 1233
 			$cond = '';
1242 1234
 		} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1243 1235
 			$t = $r[2];
1244
-			$cond = '!' . $r[1];
1236
+			$cond = '!'.$r[1];
1245 1237
 		} else {
1246 1238
 			if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1247 1239
 				$t = $r[2];
1248 1240
 				$cond = $r[1];
1249 1241
 			} else {
1250
-				$t = '$t' . $n;
1242
+				$t = '$t'.$n;
1251 1243
 				$cond = "($t = $code)!==''";
1252 1244
 			}
1253 1245
 		}
1254 1246
 
1255
-		$res = (!$avant ? '' : "$avant . ") .
1256
-			$t .
1247
+		$res = (!$avant ? '' : "$avant . ").
1248
+			$t.
1257 1249
 			(!$apres ? '' : " . $apres");
1258 1250
 
1259 1251
 		if ($res !== $t) {
@@ -1304,12 +1296,12 @@  discard block
 block discarded – undo
1304 1296
 
1305 1297
 	// rendre inertes les echappements de #[](){}<>
1306 1298
 	$i = 0;
1307
-	while (str_contains($squelette, $inerte = '-INERTE' . $i)) {
1299
+	while (str_contains($squelette, $inerte = '-INERTE'.$i)) {
1308 1300
 		$i++;
1309 1301
 	}
1310 1302
 	$squelette = preg_replace_callback(
1311 1303
 		',\\\\([#[()\]{}<>]),',
1312
-		fn($a) => "$inerte-" . ord($a[1]) . '-',
1304
+		fn($a) => "$inerte-".ord($a[1]).'-',
1313 1305
 		$squelette,
1314 1306
 		-1,
1315 1307
 		$esc
@@ -1325,7 +1317,7 @@  discard block
 block discarded – undo
1325 1317
 	// Phraser le squelette, selon sa grammaire
1326 1318
 
1327 1319
 	$boucles = [];
1328
-	$f = charger_fonction('phraser_' . $gram, 'public');
1320
+	$f = charger_fonction('phraser_'.$gram, 'public');
1329 1321
 
1330 1322
 	$squelette = $f($squelette, '', $boucles, $descr);
1331 1323
 
@@ -1341,7 +1333,7 @@  discard block
 block discarded – undo
1341 1333
 			);
1342 1334
 			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1343 1335
 				",$inerte-(\d+)-,",
1344
-				fn ($a) => '\\\\' . chr($a[1]),
1336
+				fn ($a) => '\\\\'.chr($a[1]),
1345 1337
 				$boucle->descr['squelette']
1346 1338
 			);
1347 1339
 		}
@@ -1352,19 +1344,19 @@  discard block
 block discarded – undo
1352 1344
 		include_spip('public/decompiler');
1353 1345
 		foreach ($boucles as $id => $boucle) {
1354 1346
 			if ($id) {
1355
-				$decomp = "\n/* BOUCLE " .
1356
-					$boucle->type_requete .
1357
-					' ' .
1358
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1359
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1347
+				$decomp = "\n/* BOUCLE ".
1348
+					$boucle->type_requete.
1349
+					' '.
1350
+					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')).
1351
+					($boucle->debug ? "\n *\n * ".implode("\n * ", $boucle->debug)."\n" : '').
1360 1352
 					" */\n";
1361 1353
 			} else {
1362
-				$decomp = ("\n/*\n" .
1354
+				$decomp = ("\n/*\n".
1363 1355
 					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1364 1356
 					. "\n*/");
1365 1357
 			}
1366
-			$boucles[$id]->return = $decomp . $boucle->return;
1367
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1358
+			$boucles[$id]->return = $decomp.$boucle->return;
1359
+			$GLOBALS['debug_objets']['code'][$nom.$id] = $boucle->return;
1368 1360
 		}
1369 1361
 	}
1370 1362
 
@@ -1387,7 +1379,7 @@  discard block
 block discarded – undo
1387 1379
 		}
1388 1380
 	}
1389 1381
 	foreach ($boucles as $id => $boucle) {
1390
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1382
+		$GLOBALS['debug_objets']['boucle'][$nom.$id] = $boucle;
1391 1383
 	}
1392 1384
 	$descr['documents'] = compile_inclure_doublons($squelette);
1393 1385
 
@@ -1480,8 +1472,7 @@  discard block
 block discarded – undo
1480 1472
 						} else {
1481 1473
 							$boucles[$id]->type_requete = false;
1482 1474
 							$boucle = $boucles[$id];
1483
-							$x = (!$boucle->sql_serveur ? '' :
1484
-									($boucle->sql_serveur . ':')) .
1475
+							$x = (!$boucle->sql_serveur ? '' : ($boucle->sql_serveur.':')).
1485 1476
 								$type;
1486 1477
 							$msg = [
1487 1478
 								'zbug_table_inconnue',
@@ -1572,11 +1563,11 @@  discard block
 block discarded – undo
1572 1563
 				// fonction de boucle avec serveur & table
1573 1564
 				(
1574 1565
 					!$serveur
1575
-					|| !function_exists($f = 'boucle_' . $serveur . '_' . $table) && !function_exists($f = $f . '_dist')
1566
+					|| !function_exists($f = 'boucle_'.$serveur.'_'.$table) && !function_exists($f = $f.'_dist')
1576 1567
 				)
1577 1568
 				// fonction de boucle avec table
1578
-				&& !function_exists($f = 'boucle_' . $table)
1579
-				&& !function_exists($f = $f . '_dist')
1569
+				&& !function_exists($f = 'boucle_'.$table)
1570
+				&& !function_exists($f = $f.'_dist')
1580 1571
 			) {
1581 1572
 				// fonction de boucle standard
1582 1573
 				if (!function_exists($f = 'boucle_DEFAUT')) {
@@ -1584,20 +1575,20 @@  discard block
 block discarded – undo
1584 1575
 				}
1585 1576
 			}
1586 1577
 
1587
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1588
-				"static \$connect;\n\t" .
1589
-				"\$command['connect'] = \$connect = " .
1590
-				_q($boucle->sql_serveur) .
1591
-				';' .
1578
+			$req = "\n\n\tstatic \$command = array();\n\t".
1579
+				"static \$connect;\n\t".
1580
+				"\$command['connect'] = \$connect = ".
1581
+				_q($boucle->sql_serveur).
1582
+				';'.
1592 1583
 				$f($id, $boucles);
1593 1584
 		} else {
1594 1585
 			$req = ("\n\treturn '';");
1595 1586
 		}
1596 1587
 
1597 1588
 		$boucles[$id]->return =
1598
-			"\n\nfunction BOUCLE" . strtr($id, '-', '_') . $nom .
1599
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1600
-			$req .
1589
+			"\n\nfunction BOUCLE".strtr($id, '-', '_').$nom.
1590
+			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {'.
1591
+			$req.
1601 1592
 			"\n}\n";
1602 1593
 	}
1603 1594
 
@@ -1607,7 +1598,7 @@  discard block
 block discarded – undo
1607 1598
 		return false;
1608 1599
 	}
1609 1600
 
1610
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1601
+	$principal = "\nfunction ".$nom.'($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1611 1602
 '
1612 1603
 		// reporter de maniere securisee les doublons inclus
1613 1604
 		. '
@@ -1615,15 +1606,15 @@  discard block
 block discarded – undo
1615 1606
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1616 1607
 
1617 1608
 	$connect = ' .
1618
-		_q($connect) . ';
1609
+		_q($connect).';
1619 1610
 	$page = ' .
1620 1611
 		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1621 1612
 		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1622 1613
 		// avant de referencer $Cache
1623
-		$corps . ';
1614
+		$corps.';
1624 1615
 
1625 1616
 	return analyse_resultat_skel(' . var_export($nom, true)
1626
-		. ', $Cache, $page, ' . var_export($sourcefile, true) . ');
1617
+		. ', $Cache, $page, '.var_export($sourcefile, true).');
1627 1618
 }';
1628 1619
 
1629 1620
 	$secondes = spip_timer('calcul_skel');
@@ -1637,10 +1628,10 @@  discard block
 block discarded – undo
1637 1628
 	$code->return = '
1638 1629
 //
1639 1630
 // Fonction principale du squelette ' .
1640
-		$sourcefile .
1641
-		($connect ? " pour $connect" : '') .
1642
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1643
-		"\n//\n" .
1631
+		$sourcefile.
1632
+		($connect ? " pour $connect" : '').
1633
+		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes").
1634
+		"\n//\n".
1644 1635
 		$principal;
1645 1636
 
1646 1637
 	$boucles[''] = $code;
@@ -1692,7 +1683,7 @@  discard block
 block discarded – undo
1692 1683
  **/
1693 1684
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1694 1685
 	include_spip('iterateur/data');
1695
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1686
+	if ($h = charger_fonction($boucle->type_requete.'_to_array', 'inc', true)) {
1696 1687
 		$g = charger_fonction('data', 'iterateur');
1697 1688
 		$boucles[$id] = $g($boucle);
1698 1689
 		// from[0] stocke le type de data (rss, yql, ...)
Please login to merge, or discard this patch.
Indentation   +1213 added lines, -1213 removed lines patch added patch discarded remove patch
@@ -20,7 +20,7 @@  discard block
 block discarded – undo
20 20
  **/
21 21
 
22 22
 if (!defined('_ECRIRE_INC_VERSION')) {
23
-	return;
23
+    return;
24 24
 }
25 25
 
26 26
 /** Repérer un code ne calculant rien, meme avec commentaire */
@@ -61,92 +61,92 @@  discard block
 block discarded – undo
61 61
 
62 62
 
63 63
 function argumenter_inclure(
64
-	$params,
65
-	$rejet_filtres,
66
-	$p,
67
-	&$boucles,
68
-	$id_boucle,
69
-	$echap = true,
70
-	$lang = '',
71
-	$fond1 = false
64
+    $params,
65
+    $rejet_filtres,
66
+    $p,
67
+    &$boucles,
68
+    $id_boucle,
69
+    $echap = true,
70
+    $lang = '',
71
+    $fond1 = false
72 72
 ) {
73
-	$l = [];
74
-	$erreur_p_i_i = '';
75
-	if (!is_array($params)) {
76
-		return $l;
77
-	}
78
-	foreach ($params as $k => $couple) {
79
-		// la liste d'arguments d'inclusion peut se terminer par un filtre
80
-		$filtre = array_shift($couple);
81
-		if ($filtre) {
82
-			break;
83
-		}
84
-		foreach ($couple as $n => $val) {
85
-			$var = $val[0];
86
-			if ($var->type != 'texte') {
87
-				if ($n || $k || $fond1) {
88
-					$erreur_p_i_i = [
89
-						'zbug_parametres_inclus_incorrects',
90
-						['param' => $var->nom_champ]
91
-					];
92
-					erreur_squelette($erreur_p_i_i, $p);
93
-					break;
94
-				} else {
95
-					$l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
96
-				}
97
-			} else {
98
-				preg_match(',^([^=]*)(=?)(.*)$,m', $var->texte, $m);
99
-				$m = array_pad($m, 3, null);
100
-				$var = $m[1];
101
-				$auto = false;
102
-
103
-				if ($m[2]) {
104
-					$v = $m[3];
105
-					if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
106
-						$v = $m[1];
107
-					}
108
-					$val[0] = new Texte();
109
-					$val[0]->texte = $v;
110
-				} elseif ($k || $n || $fond1) {
111
-					$auto = true;
112
-				} else {
113
-					$var = 1;
114
-				}
115
-
116
-				if ($var == 'lang') {
117
-					$lang = !$auto
118
-						? calculer_liste($val, $p->descr, $boucles, $id_boucle)
119
-						: '$GLOBALS["spip_lang"]';
120
-				} else {
121
-					$val = $auto
122
-						? index_pile($id_boucle, $var, $boucles)
123
-						: calculer_liste($val, $p->descr, $boucles, $id_boucle);
124
-					if ($var !== 1) {
125
-						$val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
126
-							. $val . ($echap ? ") . '" : ' ');
127
-					} else {
128
-						$val = $echap ? "'.$val.'" : $val;
129
-					}
130
-					$l[$var] = $val;
131
-				}
132
-			}
133
-		}
134
-	}
135
-	if ($erreur_p_i_i) {
136
-		return false;
137
-	}
138
-	// Cas particulier de la langue : si {lang=xx} est definie, on
139
-	// la passe, sinon on passe la langue courante au moment du calcul
140
-	// sauf si on n'en veut pas
141
-	if ($lang === false) {
142
-		return $l;
143
-	}
144
-	if (!$lang) {
145
-		$lang = '$GLOBALS["spip_lang"]';
146
-	}
147
-	$l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : ' ');
148
-
149
-	return $l;
73
+    $l = [];
74
+    $erreur_p_i_i = '';
75
+    if (!is_array($params)) {
76
+        return $l;
77
+    }
78
+    foreach ($params as $k => $couple) {
79
+        // la liste d'arguments d'inclusion peut se terminer par un filtre
80
+        $filtre = array_shift($couple);
81
+        if ($filtre) {
82
+            break;
83
+        }
84
+        foreach ($couple as $n => $val) {
85
+            $var = $val[0];
86
+            if ($var->type != 'texte') {
87
+                if ($n || $k || $fond1) {
88
+                    $erreur_p_i_i = [
89
+                        'zbug_parametres_inclus_incorrects',
90
+                        ['param' => $var->nom_champ]
91
+                    ];
92
+                    erreur_squelette($erreur_p_i_i, $p);
93
+                    break;
94
+                } else {
95
+                    $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle);
96
+                }
97
+            } else {
98
+                preg_match(',^([^=]*)(=?)(.*)$,m', $var->texte, $m);
99
+                $m = array_pad($m, 3, null);
100
+                $var = $m[1];
101
+                $auto = false;
102
+
103
+                if ($m[2]) {
104
+                    $v = $m[3];
105
+                    if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) {
106
+                        $v = $m[1];
107
+                    }
108
+                    $val[0] = new Texte();
109
+                    $val[0]->texte = $v;
110
+                } elseif ($k || $n || $fond1) {
111
+                    $auto = true;
112
+                } else {
113
+                    $var = 1;
114
+                }
115
+
116
+                if ($var == 'lang') {
117
+                    $lang = !$auto
118
+                        ? calculer_liste($val, $p->descr, $boucles, $id_boucle)
119
+                        : '$GLOBALS["spip_lang"]';
120
+                } else {
121
+                    $val = $auto
122
+                        ? index_pile($id_boucle, $var, $boucles)
123
+                        : calculer_liste($val, $p->descr, $boucles, $id_boucle);
124
+                    if ($var !== 1) {
125
+                        $val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ")
126
+                            . $val . ($echap ? ") . '" : ' ');
127
+                    } else {
128
+                        $val = $echap ? "'.$val.'" : $val;
129
+                    }
130
+                    $l[$var] = $val;
131
+                }
132
+            }
133
+        }
134
+    }
135
+    if ($erreur_p_i_i) {
136
+        return false;
137
+    }
138
+    // Cas particulier de la langue : si {lang=xx} est definie, on
139
+    // la passe, sinon on passe la langue courante au moment du calcul
140
+    // sauf si on n'en veut pas
141
+    if ($lang === false) {
142
+        return $l;
143
+    }
144
+    if (!$lang) {
145
+        $lang = '$GLOBALS["spip_lang"]';
146
+    }
147
+    $l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : ' ');
148
+
149
+    return $l;
150 150
 }
151 151
 
152 152
 /**
@@ -170,84 +170,84 @@  discard block
 block discarded – undo
170 170
  **/
171 171
 function calculer_inclure($p, &$boucles, $id_boucle) {
172 172
 
173
-	$_options = [];
174
-	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
175
-	if (is_string($p->texte)) {
176
-		$fichier = $p->texte;
177
-		$code = '"' . str_replace('"', '\"', $fichier) . '"';
178
-	} else {
179
-		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
180
-		if ($code && preg_match("/^'([^']*)'/s", $code, $r)) {
181
-			$fichier = $r[1];
182
-		} else {
183
-			$fichier = '';
184
-		}
185
-	}
186
-	if (!$code || $code === '""' || $code === "''") {
187
-		$trace = $p->fonctions;
188
-		while (
189
-			is_array($trace)
190
-			&& ($trace = array_filter($trace))
191
-			&& count($trace) == 1
192
-		) {
193
-			$trace = reset($trace);
194
-		}
195
-		$erreur_p_i_i = [
196
-			'zbug_parametres_inclus_incorrects',
197
-			['param' => print_r($trace, true)]
198
-		];
199
-		erreur_squelette($erreur_p_i_i, $p);
200
-
201
-		return "''";
202
-	}
203
-	$compil = texte_script(memoriser_contexte_compil($p));
204
-
205
-	if (is_array($_contexte)) {
206
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
207
-		if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
208
-			unset($_contexte['env']);
209
-		}
210
-
211
-		// noter les doublons dans l'appel a public.php
212
-		if (isset($_contexte['doublons'])) {
213
-			$_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
214
-		}
215
-
216
-		if ($ajax = isset($_contexte['ajax'])) {
217
-			$ajax = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
218
-			unset($_contexte['ajax']);
219
-		}
220
-
221
-		$_contexte = join(",\n\t", $_contexte);
222
-	} else {
223
-		return false;
224
-	} // j'aurais voulu toucher le fond ...
225
-
226
-	$contexte = 'array(' . $_contexte . ')';
227
-
228
-	if ($env) {
229
-		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
230
-	}
231
-
232
-	// s'il y a une extension .php, ce n'est pas un squelette
233
-	if ($fichier && preg_match('/^.+[.]php$/s', $fichier)) {
234
-		$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
235
-	} else {
236
-		$_options[] = "\"compil\"=>array($compil)";
237
-		if ($ajax) {
238
-			$_options[] = $ajax;
239
-		}
240
-		$code = " ' . argumenter_squelette($code) . '";
241
-		$code = 'echo ' . sprintf(
242
-			CODE_RECUPERER_FOND,
243
-			$code,
244
-			$contexte,
245
-			implode(',', $_options),
246
-			"_request(\\'connect\\') ?? \\'\\'"
247
-		) . ';';
248
-	}
249
-
250
-	return "\n'<'.'" . '?php ' . $code . "\n?'." . "'>'";
173
+    $_options = [];
174
+    $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
175
+    if (is_string($p->texte)) {
176
+        $fichier = $p->texte;
177
+        $code = '"' . str_replace('"', '\"', $fichier) . '"';
178
+    } else {
179
+        $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
180
+        if ($code && preg_match("/^'([^']*)'/s", $code, $r)) {
181
+            $fichier = $r[1];
182
+        } else {
183
+            $fichier = '';
184
+        }
185
+    }
186
+    if (!$code || $code === '""' || $code === "''") {
187
+        $trace = $p->fonctions;
188
+        while (
189
+            is_array($trace)
190
+            && ($trace = array_filter($trace))
191
+            && count($trace) == 1
192
+        ) {
193
+            $trace = reset($trace);
194
+        }
195
+        $erreur_p_i_i = [
196
+            'zbug_parametres_inclus_incorrects',
197
+            ['param' => print_r($trace, true)]
198
+        ];
199
+        erreur_squelette($erreur_p_i_i, $p);
200
+
201
+        return "''";
202
+    }
203
+    $compil = texte_script(memoriser_contexte_compil($p));
204
+
205
+    if (is_array($_contexte)) {
206
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
207
+        if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) {
208
+            unset($_contexte['env']);
209
+        }
210
+
211
+        // noter les doublons dans l'appel a public.php
212
+        if (isset($_contexte['doublons'])) {
213
+            $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
214
+        }
215
+
216
+        if ($ajax = isset($_contexte['ajax'])) {
217
+            $ajax = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
218
+            unset($_contexte['ajax']);
219
+        }
220
+
221
+        $_contexte = join(",\n\t", $_contexte);
222
+    } else {
223
+        return false;
224
+    } // j'aurais voulu toucher le fond ...
225
+
226
+    $contexte = 'array(' . $_contexte . ')';
227
+
228
+    if ($env) {
229
+        $contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
230
+    }
231
+
232
+    // s'il y a une extension .php, ce n'est pas un squelette
233
+    if ($fichier && preg_match('/^.+[.]php$/s', $fichier)) {
234
+        $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
235
+    } else {
236
+        $_options[] = "\"compil\"=>array($compil)";
237
+        if ($ajax) {
238
+            $_options[] = $ajax;
239
+        }
240
+        $code = " ' . argumenter_squelette($code) . '";
241
+        $code = 'echo ' . sprintf(
242
+            CODE_RECUPERER_FOND,
243
+            $code,
244
+            $contexte,
245
+            implode(',', $_options),
246
+            "_request(\\'connect\\') ?? \\'\\'"
247
+        ) . ';';
248
+    }
249
+
250
+    return "\n'<'.'" . '?php ' . $code . "\n?'." . "'>'";
251 251
 }
252 252
 
253 253
 
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
  *     true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
266 266
  */
267 267
 function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false) {
268
-	/*
268
+    /*
269 269
 	$show['statut'][] = array(
270 270
 		'champ'=>'statut',  // champ de la table sur lequel porte le filtrage par le statut
271 271
 		'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
@@ -289,75 +289,75 @@  discard block
 block discarded – undo
289 289
 	champstatut est alors le champ statut sur la tablen
290 290
 	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
291 291
 	*/
292
-	$id_table = $boucle->id_table;
293
-	$show = $boucle->show;
294
-	if (isset($show['statut']) && $show['statut']) {
295
-		foreach ($show['statut'] as $k => $s) {
296
-			// Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
297
-			$filtrer = true;
298
-			if (isset($s['exception'])) {
299
-				foreach (is_array($s['exception']) ? $s['exception'] : [$s['exception']] as $m) {
300
-					if (isset($boucle->modificateur[$m]) || isset($boucle->modificateur['criteres'][$m])) {
301
-						$filtrer = false;
302
-						break;
303
-					}
304
-				}
305
-			}
306
-
307
-			if ($filtrer) {
308
-				if (is_array($s['champ'])) {
309
-					$statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
310
-					$jointures = [];
311
-					// indiquer la description de chaque table dans le tableau de jointures,
312
-					// ce qui permet d'eviter certains GROUP BY inutiles.
313
-					$trouver_table = charger_fonction('trouver_table', 'base');
314
-					foreach ($s['champ'] as $j) {
315
-						$id = reset($j);
316
-						$def = $trouver_table($id);
317
-						$jointures[] = ['', [$id, $def], end($j)];
318
-					}
319
-					$jointures[0][0] = $id_table;
320
-					if (!array_search($id, $boucle->from)) {
321
-						include_spip('public/jointures');
322
-						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
323
-					}
324
-					// trouver l'alias de la table d'arrivee qui porte le statut
325
-					$id = array_search($id, $boucle->from);
326
-				} else {
327
-					$id = $id_table;
328
-					$statut = preg_replace(',\W,', '', $s['champ']); // securite
329
-				}
330
-				$mstatut = $id . '.' . $statut;
331
-
332
-				$arg_ignore_previsu = ($ignore_previsu ? ',true' : '');
333
-				include_spip('public/quete');
334
-				if (
335
-					isset($s['post_date'])
336
-					&& $s['post_date']
337
-					&& $GLOBALS['meta']['post_dates'] == 'non'
338
-				) {
339
-					$date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
340
-					array_unshift(
341
-						$boucle->where,
342
-						$echapper ?
343
-							"\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
344
-							:
345
-							quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
346
-					);
347
-				}
348
-				array_unshift(
349
-					$boucle->where,
350
-					$echapper ?
351
-						"\nquete_condition_statut('$mstatut',"
352
-						. _q($s['previsu']) . ','
353
-						. _q($s['publie']) . ','
354
-						. _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
355
-						:
356
-						quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
357
-				);
358
-			}
359
-		}
360
-	}
292
+    $id_table = $boucle->id_table;
293
+    $show = $boucle->show;
294
+    if (isset($show['statut']) && $show['statut']) {
295
+        foreach ($show['statut'] as $k => $s) {
296
+            // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
297
+            $filtrer = true;
298
+            if (isset($s['exception'])) {
299
+                foreach (is_array($s['exception']) ? $s['exception'] : [$s['exception']] as $m) {
300
+                    if (isset($boucle->modificateur[$m]) || isset($boucle->modificateur['criteres'][$m])) {
301
+                        $filtrer = false;
302
+                        break;
303
+                    }
304
+                }
305
+            }
306
+
307
+            if ($filtrer) {
308
+                if (is_array($s['champ'])) {
309
+                    $statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite
310
+                    $jointures = [];
311
+                    // indiquer la description de chaque table dans le tableau de jointures,
312
+                    // ce qui permet d'eviter certains GROUP BY inutiles.
313
+                    $trouver_table = charger_fonction('trouver_table', 'base');
314
+                    foreach ($s['champ'] as $j) {
315
+                        $id = reset($j);
316
+                        $def = $trouver_table($id);
317
+                        $jointures[] = ['', [$id, $def], end($j)];
318
+                    }
319
+                    $jointures[0][0] = $id_table;
320
+                    if (!array_search($id, $boucle->from)) {
321
+                        include_spip('public/jointures');
322
+                        fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
323
+                    }
324
+                    // trouver l'alias de la table d'arrivee qui porte le statut
325
+                    $id = array_search($id, $boucle->from);
326
+                } else {
327
+                    $id = $id_table;
328
+                    $statut = preg_replace(',\W,', '', $s['champ']); // securite
329
+                }
330
+                $mstatut = $id . '.' . $statut;
331
+
332
+                $arg_ignore_previsu = ($ignore_previsu ? ',true' : '');
333
+                include_spip('public/quete');
334
+                if (
335
+                    isset($s['post_date'])
336
+                    && $s['post_date']
337
+                    && $GLOBALS['meta']['post_dates'] == 'non'
338
+                ) {
339
+                    $date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite
340
+                    array_unshift(
341
+                        $boucle->where,
342
+                        $echapper ?
343
+                            "\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
344
+                            :
345
+                            quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu)
346
+                    );
347
+                }
348
+                array_unshift(
349
+                    $boucle->where,
350
+                    $echapper ?
351
+                        "\nquete_condition_statut('$mstatut',"
352
+                        . _q($s['previsu']) . ','
353
+                        . _q($s['publie']) . ','
354
+                        . _q($boucle->sql_serveur) . "$arg_ignore_previsu)"
355
+                        :
356
+                        quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu)
357
+                );
358
+            }
359
+        }
360
+    }
361 361
 }
362 362
 
363 363
 /**
@@ -376,29 +376,29 @@  discard block
 block discarded – undo
376 376
  */
377 377
 function calculer_boucle($id_boucle, &$boucles) {
378 378
 
379
-	$boucle = &$boucles[$id_boucle];
380
-	instituer_boucle($boucle);
381
-	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
382
-
383
-	// en mode debug memoriser les premiers passages dans la boucle,
384
-	// mais pas tous, sinon ca pete.
385
-	if (_request('var_mode_affiche') != 'resultat') {
386
-		$trace = '';
387
-	} else {
388
-		$_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
389
-		$_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
390
-		$trace = "
379
+    $boucle = &$boucles[$id_boucle];
380
+    instituer_boucle($boucle);
381
+    $boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
382
+
383
+    // en mode debug memoriser les premiers passages dans la boucle,
384
+    // mais pas tous, sinon ca pete.
385
+    if (_request('var_mode_affiche') != 'resultat') {
386
+        $trace = '';
387
+    } else {
388
+        $_trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
389
+        $_trace = "\$GLOBALS['debug_objets']['resultat']['$_trace']";
390
+        $trace = "
391 391
 		if (empty($_trace)) {
392 392
 			$_trace = [];
393 393
 		}
394 394
 		if (count($_trace) < 3) {
395 395
 			$_trace" . '[] = $t0;
396 396
 		}';
397
-	}
397
+    }
398 398
 
399
-	return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
400
-		? calculer_boucle_rec($id_boucle, $boucles, $trace)
401
-		: calculer_boucle_nonrec($id_boucle, $boucles, $trace);
399
+    return ($boucles[$id_boucle]->type_requete == TYPE_RECURSIF)
400
+        ? calculer_boucle_rec($id_boucle, $boucles, $trace)
401
+        : calculer_boucle_nonrec($id_boucle, $boucles, $trace);
402 402
 }
403 403
 
404 404
 
@@ -421,15 +421,15 @@  discard block
 block discarded – undo
421 421
  *    Code PHP compilé de la boucle récursive
422 422
  **/
423 423
 function calculer_boucle_rec($id_boucle, &$boucles, $trace) {
424
-	$nom = $boucles[$id_boucle]->param[0];
425
-
426
-	return
427
-		// Numrows[$nom] peut ne pas être encore defini
428
-		"\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
429
-		. "\n\t\$t0 = " . $boucles[$id_boucle]->return . ';'
430
-		. "\n\t\$Numrows['$nom'] = (\$save_numrows);"
431
-		. $trace
432
-		. "\n\treturn \$t0;";
424
+    $nom = $boucles[$id_boucle]->param[0];
425
+
426
+    return
427
+        // Numrows[$nom] peut ne pas être encore defini
428
+        "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());"
429
+        . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ';'
430
+        . "\n\t\$Numrows['$nom'] = (\$save_numrows);"
431
+        . $trace
432
+        . "\n\treturn \$t0;";
433 433
 }
434 434
 
435 435
 /**
@@ -482,173 +482,173 @@  discard block
 block discarded – undo
482 482
  **/
483 483
 function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) {
484 484
 
485
-	$code_sep = null;
486
-	$boucle = &$boucles[$id_boucle];
487
-	$return = $boucle->return;
488
-	$type_boucle = $boucle->type_requete;
489
-	$primary = $boucle->primary;
490
-	$constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
491
-	$flag_cpt = $boucle->mode_partie || $boucle->cptrows;
492
-	$corps = '';
493
-
494
-	// faudrait expanser le foreach a la compil, car y en a souvent qu'un
495
-	// et puis faire un [] plutot qu'un "','."
496
-	if ($boucle->doublons) {
497
-		$corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
498
-			index_pile($id_boucle, $primary, $boucles)
499
-			. "; // doublons\n";
500
-	}
501
-
502
-	// La boucle doit-elle selectionner la langue ?
503
-	// - par defaut, les boucles suivantes le font
504
-	//    (sauf si forcer_lang==true ou si le titre contient <multi>).
505
-	// - a moins d'une demande explicite via {!lang_select}
506
-	if (
507
-		!$constant && $boucle->lang_select != 'non' &&
508
-		(($boucle->lang_select == 'oui') ||
509
-			in_array($type_boucle, [
510
-				'articles',
511
-				'rubriques',
512
-				'hierarchie',
513
-				'breves'
514
-			]))
515
-	) {
516
-		// Memoriser la langue avant la boucle et la restituer apres
517
-		// afin que le corps de boucle affecte la globale directement
518
-		$init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
519
-		$fin_lang = "lang_select();\n\t";
520
-		$fin_lang_select_public = "\n\t\tlang_select();";
521
-
522
-		$corps .=
523
-			"\n\t\tlang_select_public("
524
-			. index_pile($id_boucle, 'lang', $boucles)
525
-			. ", '" . $boucle->lang_select . "'"
526
-			. (in_array($type_boucle, [
527
-				'articles',
528
-				'rubriques',
529
-				'hierarchie',
530
-				'breves'
531
-			]) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
532
-			. ');';
533
-	} else {
534
-		$init_lang = '';
535
-		$fin_lang = '';
536
-		$fin_lang_select_public = '';
537
-		// sortir les appels au traducteur (invariants de boucle)
538
-		if (
539
-			!str_contains($return, '?php')
540
-			&& preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
541
-		) {
542
-			$i = 1;
543
-			foreach ($r[1] as $t) {
544
-				$init_lang .= "\n\t\$l$i = $t;";
545
-				$return = str_replace($t, "\$l$i", $return);
546
-				$i++;
547
-			}
548
-		}
549
-	}
550
-
551
-	// gestion optimale des separateurs et des boucles constantes
552
-	if (is_countable($boucle->separateur) ? count($boucle->separateur) : 0) {
553
-		$code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
554
-	}
555
-
556
-	$corps .=
557
-		((!$boucle->separateur) ?
558
-			(($constant && !$corps && !$flag_cpt) ? $return :
559
-				(($return === "''") ? '' :
560
-					("\n\t\t" . '$t0 .= ' . $return . ';'))) :
561
-			("\n\t\t\$t1 " .
562
-				((str_starts_with($return, '$t1.')) ?
563
-					('.=' . substr($return, 4)) :
564
-					('= ' . $return)) .
565
-				";\n\t\t" .
566
-				'$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
567
-
568
-	// Calculer les invalideurs si c'est une boucle non constante et si on
569
-	// souhaite invalider ces elements
570
-	if (!$constant && $primary) {
571
-		include_spip('inc/invalideur');
572
-		$corps = calcul_invalideurs($corps, $primary, $boucles, $id_boucle);
573
-	}
574
-
575
-	// gerer le compteur de boucle
576
-	// avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
577
-
578
-	if ($boucle->partie || $boucle->cptrows) {
579
-		$corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
580
-			. $boucle->partie
581
-			. $corps;
582
-	}
583
-
584
-	// depiler la lang de la boucle si besoin
585
-	$corps .= $fin_lang_select_public;
586
-
587
-	// si le corps est une constante, ne pas appeler le serveur N fois!
588
-
589
-	if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
590
-		if (!isset($r[2]) || !$r[2]) {
591
-			if (!$boucle->numrows) {
592
-				return "\n\t\$t0 = '';";
593
-			} else {
594
-				$corps = '';
595
-			}
596
-		} else {
597
-			$boucle->numrows = true;
598
-			$corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
599
-		}
600
-	} else {
601
-		$corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
602
-	}
603
-
604
-	$count = '';
605
-	if (!$boucle->select) {
606
-		if (!$boucle->numrows || $boucle->limit || $boucle->mode_partie || $boucle->group) {
607
-			$count = '1';
608
-		} else {
609
-			$count = 'count(*)';
610
-		}
611
-		$boucles[$id_boucle]->select[] = $count;
612
-	}
613
-
614
-	if ($flag_cpt) {
615
-		$nums = "\n\t// COMPTEUR\n\t"
616
-			. "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
617
-	} else {
618
-		$nums = '';
619
-	}
620
-
621
-	if ($boucle->numrows || $boucle->mode_partie) {
622
-		$nums .= "\$Numrows['$id_boucle']['command'] = \$command;\n\t"
623
-			. "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
624
-			. $boucle->mode_partie
625
-			. "\n\t";
626
-	}
627
-
628
-	// Ne calculer la requete que maintenant
629
-	// car ce qui precede appelle index_pile qui influe dessus
630
-
631
-	$init = (($init = $boucles[$id_boucle]->doublons)
632
-			? ("\n\t$init = array();") : '')
633
-		. calculer_requete_sql($boucles[$id_boucle]);
634
-
635
-	$contexte = memoriser_contexte_compil($boucle);
636
-
637
-	$a = sprintf(
638
-		CODE_CORPS_BOUCLE,
639
-		$init,
640
-		$boucle->iterateur,
641
-		'$command',
642
-		$contexte,
643
-		$nums,
644
-		$init_lang,
645
-		$corps,
646
-		$fin_lang,
647
-		$trace,
648
-		'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
649
-	);
650
-
651
-	return $a;
485
+    $code_sep = null;
486
+    $boucle = &$boucles[$id_boucle];
487
+    $return = $boucle->return;
488
+    $type_boucle = $boucle->type_requete;
489
+    $primary = $boucle->primary;
490
+    $constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return));
491
+    $flag_cpt = $boucle->mode_partie || $boucle->cptrows;
492
+    $corps = '';
493
+
494
+    // faudrait expanser le foreach a la compil, car y en a souvent qu'un
495
+    // et puis faire un [] plutot qu'un "','."
496
+    if ($boucle->doublons) {
497
+        $corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' .
498
+            index_pile($id_boucle, $primary, $boucles)
499
+            . "; // doublons\n";
500
+    }
501
+
502
+    // La boucle doit-elle selectionner la langue ?
503
+    // - par defaut, les boucles suivantes le font
504
+    //    (sauf si forcer_lang==true ou si le titre contient <multi>).
505
+    // - a moins d'une demande explicite via {!lang_select}
506
+    if (
507
+        !$constant && $boucle->lang_select != 'non' &&
508
+        (($boucle->lang_select == 'oui') ||
509
+            in_array($type_boucle, [
510
+                'articles',
511
+                'rubriques',
512
+                'hierarchie',
513
+                'breves'
514
+            ]))
515
+    ) {
516
+        // Memoriser la langue avant la boucle et la restituer apres
517
+        // afin que le corps de boucle affecte la globale directement
518
+        $init_lang = "lang_select(\$GLOBALS['spip_lang']);\n\t";
519
+        $fin_lang = "lang_select();\n\t";
520
+        $fin_lang_select_public = "\n\t\tlang_select();";
521
+
522
+        $corps .=
523
+            "\n\t\tlang_select_public("
524
+            . index_pile($id_boucle, 'lang', $boucles)
525
+            . ", '" . $boucle->lang_select . "'"
526
+            . (in_array($type_boucle, [
527
+                'articles',
528
+                'rubriques',
529
+                'hierarchie',
530
+                'breves'
531
+            ]) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '')
532
+            . ');';
533
+    } else {
534
+        $init_lang = '';
535
+        $fin_lang = '';
536
+        $fin_lang_select_public = '';
537
+        // sortir les appels au traducteur (invariants de boucle)
538
+        if (
539
+            !str_contains($return, '?php')
540
+            && preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)
541
+        ) {
542
+            $i = 1;
543
+            foreach ($r[1] as $t) {
544
+                $init_lang .= "\n\t\$l$i = $t;";
545
+                $return = str_replace($t, "\$l$i", $return);
546
+                $i++;
547
+            }
548
+        }
549
+    }
550
+
551
+    // gestion optimale des separateurs et des boucles constantes
552
+    if (is_countable($boucle->separateur) ? count($boucle->separateur) : 0) {
553
+        $code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'");
554
+    }
555
+
556
+    $corps .=
557
+        ((!$boucle->separateur) ?
558
+            (($constant && !$corps && !$flag_cpt) ? $return :
559
+                (($return === "''") ? '' :
560
+                    ("\n\t\t" . '$t0 .= ' . $return . ';'))) :
561
+            ("\n\t\t\$t1 " .
562
+                ((str_starts_with($return, '$t1.')) ?
563
+                    ('.=' . substr($return, 4)) :
564
+                    ('= ' . $return)) .
565
+                ";\n\t\t" .
566
+                '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;"));
567
+
568
+    // Calculer les invalideurs si c'est une boucle non constante et si on
569
+    // souhaite invalider ces elements
570
+    if (!$constant && $primary) {
571
+        include_spip('inc/invalideur');
572
+        $corps = calcul_invalideurs($corps, $primary, $boucles, $id_boucle);
573
+    }
574
+
575
+    // gerer le compteur de boucle
576
+    // avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}...
577
+
578
+    if ($boucle->partie || $boucle->cptrows) {
579
+        $corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;"
580
+            . $boucle->partie
581
+            . $corps;
582
+    }
583
+
584
+    // depiler la lang de la boucle si besoin
585
+    $corps .= $fin_lang_select_public;
586
+
587
+    // si le corps est une constante, ne pas appeler le serveur N fois!
588
+
589
+    if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) {
590
+        if (!isset($r[2]) || !$r[2]) {
591
+            if (!$boucle->numrows) {
592
+                return "\n\t\$t0 = '';";
593
+            } else {
594
+                $corps = '';
595
+            }
596
+        } else {
597
+            $boucle->numrows = true;
598
+            $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);";
599
+        }
600
+    } else {
601
+        $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n	}";
602
+    }
603
+
604
+    $count = '';
605
+    if (!$boucle->select) {
606
+        if (!$boucle->numrows || $boucle->limit || $boucle->mode_partie || $boucle->group) {
607
+            $count = '1';
608
+        } else {
609
+            $count = 'count(*)';
610
+        }
611
+        $boucles[$id_boucle]->select[] = $count;
612
+    }
613
+
614
+    if ($flag_cpt) {
615
+        $nums = "\n\t// COMPTEUR\n\t"
616
+            . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t";
617
+    } else {
618
+        $nums = '';
619
+    }
620
+
621
+    if ($boucle->numrows || $boucle->mode_partie) {
622
+        $nums .= "\$Numrows['$id_boucle']['command'] = \$command;\n\t"
623
+            . "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());"
624
+            . $boucle->mode_partie
625
+            . "\n\t";
626
+    }
627
+
628
+    // Ne calculer la requete que maintenant
629
+    // car ce qui precede appelle index_pile qui influe dessus
630
+
631
+    $init = (($init = $boucles[$id_boucle]->doublons)
632
+            ? ("\n\t$init = array();") : '')
633
+        . calculer_requete_sql($boucles[$id_boucle]);
634
+
635
+    $contexte = memoriser_contexte_compil($boucle);
636
+
637
+    $a = sprintf(
638
+        CODE_CORPS_BOUCLE,
639
+        $init,
640
+        $boucle->iterateur,
641
+        '$command',
642
+        $contexte,
643
+        $nums,
644
+        $init_lang,
645
+        $corps,
646
+        $fin_lang,
647
+        $trace,
648
+        'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile'])
649
+    );
650
+
651
+    return $a;
652 652
 }
653 653
 
654 654
 
@@ -664,48 +664,48 @@  discard block
 block discarded – undo
664 664
  *     Code PHP compilé définissant les informations de requête
665 665
  **/
666 666
 function calculer_requete_sql($boucle) {
667
-	$init = [];
668
-	$init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
669
-	$init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
670
-	# En absence de champ c'est un decompte :
671
-	$init[] = calculer_dec('from', calculer_from($boucle));
672
-	$init[] = calculer_dec('type', calculer_from_type($boucle));
673
-	$init[] = calculer_dec(
674
-		'groupby',
675
-		'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ')'
676
-	);
677
-	$init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . '")');
678
-	$init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ')');
679
-	$init[] = calculer_dec('where', calculer_dump_array($boucle->where));
680
-	$init[] = calculer_dec('join', calculer_dump_join($boucle->join));
681
-	$init[] = calculer_dec(
682
-		'limit',
683
-		(
684
-			!str_contains($boucle->limit, 'intval') ?
685
-			"'" . ($boucle->limit) . "'" :
686
-			$boucle->limit
687
-		)
688
-	);
689
-	$init[] = calculer_dec('having', calculer_dump_array($boucle->having));
690
-	$s = $d = '';
691
-	// l'index 0 de $i indique si l'affectation est statique (contenu)
692
-	// ou recalculée à chaque passage (vide)
693
-	foreach ($init as $i) {
694
-		if (reset($i)) {
695
-			$s .= "\n\t\t" . end($i);
696
-		} # statique
697
-		else {
698
-			$d .= "\n\t" . end($i);
699
-		} # dynamique
700
-	}
701
-
702
-	return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
703
-	. $boucle->in
704
-	. $boucle->hash
705
-	. "\n\t" . 'if (!isset($command[\'table\'])) {'
706
-	. $s
707
-	. "\n\t}"
708
-	. $d;
667
+    $init = [];
668
+    $init[] = calculer_dec('table', "'" . $boucle->id_table . "'");
669
+    $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'");
670
+    # En absence de champ c'est un decompte :
671
+    $init[] = calculer_dec('from', calculer_from($boucle));
672
+    $init[] = calculer_dec('type', calculer_from_type($boucle));
673
+    $init[] = calculer_dec(
674
+        'groupby',
675
+        'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ')'
676
+    );
677
+    $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . '")');
678
+    $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ')');
679
+    $init[] = calculer_dec('where', calculer_dump_array($boucle->where));
680
+    $init[] = calculer_dec('join', calculer_dump_join($boucle->join));
681
+    $init[] = calculer_dec(
682
+        'limit',
683
+        (
684
+            !str_contains($boucle->limit, 'intval') ?
685
+            "'" . ($boucle->limit) . "'" :
686
+            $boucle->limit
687
+        )
688
+    );
689
+    $init[] = calculer_dec('having', calculer_dump_array($boucle->having));
690
+    $s = $d = '';
691
+    // l'index 0 de $i indique si l'affectation est statique (contenu)
692
+    // ou recalculée à chaque passage (vide)
693
+    foreach ($init as $i) {
694
+        if (reset($i)) {
695
+            $s .= "\n\t\t" . end($i);
696
+        } # statique
697
+        else {
698
+            $d .= "\n\t" . end($i);
699
+        } # dynamique
700
+    }
701
+
702
+    return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '')
703
+    . $boucle->in
704
+    . $boucle->hash
705
+    . "\n\t" . 'if (!isset($command[\'table\'])) {'
706
+    . $s
707
+    . "\n\t}"
708
+    . $d;
709 709
 }
710 710
 
711 711
 /**
@@ -723,13 +723,13 @@  discard block
 block discarded – undo
723 723
  *     qui peut être utilisé pour la production d'un tableau array()
724 724
  **/
725 725
 function memoriser_contexte_compil($p) {
726
-	return join(',', [
727
-		_q($p->descr['sourcefile'] ?? ''),
728
-		_q($p->descr['nom'] ?? ''),
729
-		_q($p->id_boucle ?? ''),
730
-		intval($p->ligne),
731
-		'$GLOBALS[\'spip_lang\']'
732
-	]);
726
+    return join(',', [
727
+        _q($p->descr['sourcefile'] ?? ''),
728
+        _q($p->descr['nom'] ?? ''),
729
+        _q($p->id_boucle ?? ''),
730
+        intval($p->ligne),
731
+        '$GLOBALS[\'spip_lang\']'
732
+    ]);
733 733
 }
734 734
 
735 735
 /**
@@ -747,20 +747,20 @@  discard block
 block discarded – undo
747 747
  *     Objet Contexte
748 748
  **/
749 749
 function reconstruire_contexte_compil($context_compil) {
750
-	if (!is_array($context_compil)) {
751
-		return $context_compil;
752
-	}
753
-	$p = new Contexte();
754
-	$p->descr = [
755
-		'sourcefile' => $context_compil[0] ?? '',
756
-		'nom' => $context_compil[1] ?? '',
757
-	];
758
-
759
-	$p->id_boucle = $context_compil[2] ?? '';
760
-	$p->ligne = (int)($context_compil[3] ?? 0);
761
-	$p->lang = $context_compil[4] ?? '';
762
-
763
-	return $p;
750
+    if (!is_array($context_compil)) {
751
+        return $context_compil;
752
+    }
753
+    $p = new Contexte();
754
+    $p->descr = [
755
+        'sourcefile' => $context_compil[0] ?? '',
756
+        'nom' => $context_compil[1] ?? '',
757
+    ];
758
+
759
+    $p->id_boucle = $context_compil[2] ?? '';
760
+    $p->ligne = (int)($context_compil[3] ?? 0);
761
+    $p->lang = $context_compil[4] ?? '';
762
+
763
+    return $p;
764 764
 }
765 765
 
766 766
 /**
@@ -786,12 +786,12 @@  discard block
 block discarded – undo
786 786
  *    - index 1 : Code de l'affectation
787 787
  **/
788 788
 function calculer_dec($nom, $val) {
789
-	$static = 'if (!isset($command[\'' . $nom . '\'])) ';
790
-	// si une variable apparait dans le calcul de la clause
791
-	// il faut la re-evaluer a chaque passage
792
-	if (
793
-		str_contains($val, '$')
794
-		/*
789
+    $static = 'if (!isset($command[\'' . $nom . '\'])) ';
790
+    // si une variable apparait dans le calcul de la clause
791
+    // il faut la re-evaluer a chaque passage
792
+    if (
793
+        str_contains($val, '$')
794
+        /*
795 795
 		OR str_contains($val, 'sql_')
796 796
 		OR (
797 797
 			$test = str_replace(array("array(",'\"',"\'"),array("","",""),$val) // supprimer les array( et les echappements de guillemets
@@ -799,11 +799,11 @@  discard block
 block discarded – undo
799 799
 			AND $test = preg_replace(",'[^']*',UimsS","",$test) // supprimer les chaines qui peuvent contenir des fonctions SQL qui ne genent pas
800 800
 			AND preg_match(",\w+\s*\(,UimsS",$test,$regs) // tester la presence de fonctions restantes
801 801
 		)*/
802
-	) {
803
-		$static = '';
804
-	}
802
+    ) {
803
+        $static = '';
804
+    }
805 805
 
806
-	return [$static, '$command[\'' . $nom . '\'] = ' . $val . ';'];
806
+    return [$static, '$command[\'' . $nom . '\'] = ' . $val . ';'];
807 807
 }
808 808
 
809 809
 /**
@@ -823,32 +823,32 @@  discard block
 block discarded – undo
823 823
  *     Expression PHP décrivant un texte ou un tableau
824 824
  **/
825 825
 function calculer_dump_array($a) {
826
-	if (!is_array($a)) {
827
-		return $a;
828
-	}
829
-	$res = '';
830
-	if ($a && $a[0] == "'?'") {
831
-		return ('(' . calculer_dump_array($a[1]) .
832
-			' ? ' . calculer_dump_array($a[2]) .
833
-			' : ' . calculer_dump_array($a[3]) .
834
-			')');
835
-	} else {
836
-		foreach ($a as $k => $v) {
837
-			$showk = (is_numeric($k) ? '' : sql_quote($k) . ' => ');
838
-			$res .= ', ' . $showk . calculer_dump_array($v);
839
-		}
840
-
841
-		return "\n\t\t\tarray(" . substr($res, 2) . ')';
842
-	}
826
+    if (!is_array($a)) {
827
+        return $a;
828
+    }
829
+    $res = '';
830
+    if ($a && $a[0] == "'?'") {
831
+        return ('(' . calculer_dump_array($a[1]) .
832
+            ' ? ' . calculer_dump_array($a[2]) .
833
+            ' : ' . calculer_dump_array($a[3]) .
834
+            ')');
835
+    } else {
836
+        foreach ($a as $k => $v) {
837
+            $showk = (is_numeric($k) ? '' : sql_quote($k) . ' => ');
838
+            $res .= ', ' . $showk . calculer_dump_array($v);
839
+        }
840
+
841
+        return "\n\t\t\tarray(" . substr($res, 2) . ')';
842
+    }
843 843
 }
844 844
 
845 845
 function calculer_dump_join($a) {
846
-	$res = '';
847
-	foreach ($a as $k => $v) {
848
-		$res .= ", '$k' => array(" . implode(',', $v) . ')';
849
-	}
846
+    $res = '';
847
+    foreach ($a as $k => $v) {
848
+        $res .= ", '$k' => array(" . implode(',', $v) . ')';
849
+    }
850 850
 
851
-	return 'array(' . substr($res, 2) . ')';
851
+    return 'array(' . substr($res, 2) . ')';
852 852
 }
853 853
 
854 854
 /**
@@ -860,12 +860,12 @@  discard block
 block discarded – undo
860 860
  *     Code PHP construisant un tableau des alias et noms des tables du FROM
861 861
  **/
862 862
 function calculer_from(&$boucle) {
863
-	$res = '';
864
-	foreach ($boucle->from as $k => $v) {
865
-		$res .= ",'$k' => '$v'";
866
-	}
863
+    $res = '';
864
+    foreach ($boucle->from as $k => $v) {
865
+        $res .= ",'$k' => '$v'";
866
+    }
867 867
 
868
-	return 'array(' . substr($res, 1) . ')';
868
+    return 'array(' . substr($res, 1) . ')';
869 869
 }
870 870
 
871 871
 /**
@@ -878,30 +878,30 @@  discard block
 block discarded – undo
878 878
  *     Code PHP construisant un tableau des alias et type de jointure du FROM
879 879
  **/
880 880
 function calculer_from_type(&$boucle) {
881
-	$res = '';
882
-	foreach ($boucle->from_type as $k => $v) {
883
-		$res .= ",'$k' => '$v'";
884
-	}
881
+    $res = '';
882
+    foreach ($boucle->from_type as $k => $v) {
883
+        $res .= ",'$k' => '$v'";
884
+    }
885 885
 
886
-	return 'array(' . substr($res, 1) . ')';
886
+    return 'array(' . substr($res, 1) . ')';
887 887
 }
888 888
 
889 889
 function calculer_order(&$boucle) {
890
-	if (
891
-		!($order = $boucle->order)
892
-		&& !($order = $boucle->default_order)
893
-	) {
894
-		$order = [];
895
-	}
896
-
897
-	/*if (isset($boucle->modificateur['collate'])){
890
+    if (
891
+        !($order = $boucle->order)
892
+        && !($order = $boucle->default_order)
893
+    ) {
894
+        $order = [];
895
+    }
896
+
897
+    /*if (isset($boucle->modificateur['collate'])){
898 898
 		$col = "." . $boucle->modificateur['collate'];
899 899
 		foreach($order as $k=>$o)
900 900
 			if (strpos($order[$k],'COLLATE')===false)
901 901
 				$order[$k].= $col;
902 902
 	}*/
903 903
 
904
-	return join(', ', $order);
904
+    return join(', ', $order);
905 905
 }
906 906
 
907 907
 // Production du code PHP a partir de la sequence livree par le phraseur
@@ -910,62 +910,62 @@  discard block
 block discarded – undo
910 910
 // (qui sera argument d'un Return ou la partie droite d'une affectation).
911 911
 
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
-					|| !str_ends_with($res, "'")
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
+                    || !str_ends_with($res, "'")
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
 
@@ -984,212 +984,212 @@  discard block
 block discarded – undo
984 984
  */
985 985
 function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
986 986
 
987
-	$codes = [];
988
-	// cas de la boucle recursive
989
-	if (is_array($id_boucle)) {
990
-		$id_boucle = $id_boucle[0];
991
-	}
992
-	$type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
993
-	$tab = str_repeat("\t", ++$descr['niv']);
994
-	$mode = _request('var_mode_affiche');
995
-	$err_e_c = '';
996
-	// chaque commentaire introduit dans le code doit commencer
997
-	// par un caractere distinguant le cas, pour exploitation par debug.
998
-	foreach ($tableau as $p) {
999
-		switch ($p->type) {
1000
-			// texte seul
1001
-			case 'texte':
1002
-				$code = sandbox_composer_texte($p->texte, $p);
1003
-				$commentaire = strlen($p->texte) . ' signes';
1004
-				$avant = '';
1005
-				$apres = '';
1006
-				$altern = "''";
1007
-				break;
1008
-
1009
-			case 'polyglotte':
1010
-				$code = '';
1011
-				foreach ($p->traductions as $k => $v) {
1012
-					$code .= ",'" .
1013
-						str_replace(['\\', "'"], ['\\\\', "\\'"], $k) .
1014
-						"' => '" .
1015
-						str_replace(['\\', "'"], ['\\\\', "\\'"], $v) .
1016
-						"'";
1017
-				}
1018
-				$code = 'choisir_traduction(array(' .
1019
-					substr($code, 1) .
1020
-					'))';
1021
-				$commentaire = '&';
1022
-				$avant = '';
1023
-				$apres = '';
1024
-				$altern = "''";
1025
-				break;
1026
-
1027
-			// inclure
1028
-			case 'include':
1029
-				$p->descr = $descr;
1030
-				$code = calculer_inclure($p, $boucles, $id_boucle);
1031
-				if ($code === false) {
1032
-					$err_e_c = true;
1033
-					$code = "''";
1034
-				} else {
1035
-					$commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1036
-					$avant = '';
1037
-					$apres = '';
1038
-					$altern = "''";
1039
-				}
1040
-				break;
1041
-
1042
-			// boucle
1043
-			case TYPE_RECURSIF:
1044
-				$nom = $p->id_boucle;
1045
-				$newdescr = $descr;
1046
-				$newdescr['id_mere'] = $nom;
1047
-				$newdescr['niv']++;
1048
-				$preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
1049
-				$avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
1050
-				$apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
1051
-				$postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
1052
-				$newdescr['niv']--;
1053
-				$altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
1054
-				if (
1055
-					$preaff === false
1056
-					|| $avant === false
1057
-					|| $apres === false
1058
-					|| $altern === false
1059
-					|| $postaff === false
1060
-				) {
1061
-					$err_e_c = true;
1062
-					$code = "''";
1063
-				} else {
1064
-					$code = 'BOUCLE' .
1065
-						str_replace('-', '_', $nom) . $descr['nom'] .
1066
-						'($Cache, $Pile, $doublons, $Numrows, $SP)';
1067
-					$commentaire = "?$nom";
1068
-					if (
1069
-						!$boucles[$nom]->milieu
1070
-						&& $boucles[$nom]->type_requete <> TYPE_RECURSIF
1071
-					) {
1072
-						if ($preaff != "''") {
1073
-							$code .= "\n. $preaff";
1074
-						}
1075
-						if ($altern != "''") {
1076
-							$code .= "\n. $altern";
1077
-						}
1078
-						if ($postaff != "''") {
1079
-							$code .= "\n. $postaff";
1080
-						}
1081
-						if ($avant <> "''" || $apres <> "''") {
1082
-							spip_logger()->info("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1083
-						}
1084
-						$avant = $apres = $altern = "''";
1085
-					} else {
1086
-						if ($preaff != "''") {
1087
-							$avant = compile_concatene_parties_codes($preaff, $avant);
1088
-							$altern = compile_concatene_parties_codes($preaff, $altern);
1089
-						}
1090
-						if ($postaff != "''") {
1091
-							$apres = compile_concatene_parties_codes($apres, $postaff);
1092
-							$altern = compile_concatene_parties_codes($altern, $postaff);
1093
-						}
1094
-						if ($altern != "''") {
1095
-							$altern = "($altern)";
1096
-						}
1097
-					}
1098
-				}
1099
-				break;
1100
-
1101
-			case 'idiome':
1102
-				$l = [];
1103
-				$code = '';
1104
-				foreach ($p->arg as $k => $v) {
1105
-					$_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1106
-					if ($k) {
1107
-						$l[] = _q($k) . ' => ' . $_v;
1108
-					} else {
1109
-						$code = $_v;
1110
-					}
1111
-				}
1112
-				// Si le module n'est pas fourni, l'expliciter sauf si calculé
1113
-				if ($p->module) {
1114
-					$m = $p->module . ':' . $p->nom_champ;
1115
-				} elseif ($p->nom_champ) {
1116
-					$m = MODULES_IDIOMES . ':' . $p->nom_champ;
1117
-				} else {
1118
-					$m = '';
1119
-				}
1120
-
1121
-				$code = (!$code ? "'$m'" :
1122
-						($m ? "'$m' . $code" :
1123
-							("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1124
-					. (!$l ? '' : (', array(' . implode(",\n", $l) . ')'));
1125
-				$code = "_T($code)";
1126
-				if ($p->param) {
1127
-					$p->id_boucle = $id_boucle;
1128
-					$p->boucles = &$boucles;
1129
-					$code = compose_filtres($p, $code);
1130
-				}
1131
-				$commentaire = ':';
1132
-				$avant = '';
1133
-				$apres = '';
1134
-				$altern = "''";
1135
-				break;
1136
-
1137
-			case 'champ':
1138
-				// cette structure pourrait etre completee des le phrase' (a faire)
1139
-				$p->id_boucle = $id_boucle;
1140
-				$p->boucles = &$boucles;
1141
-				$p->descr = $descr;
1142
-				#$p->interdire_scripts = true;
1143
-				$p->type_requete = $type;
1144
-
1145
-				$code = calculer_champ($p);
1146
-				$commentaire = '#' . $p->nom_champ . $p->etoile;
1147
-				$avant = calculer_liste(
1148
-					$p->avant,
1149
-					$descr,
1150
-					$boucles,
1151
-					$id_boucle
1152
-				);
1153
-				$apres = calculer_liste(
1154
-					$p->apres,
1155
-					$descr,
1156
-					$boucles,
1157
-					$id_boucle
1158
-				);
1159
-				$altern = "''";
1160
-				// Si la valeur est destinee a une comparaison a ''
1161
-				// forcer la conversion en une chaine par strval
1162
-				// si ca peut etre autre chose qu'une chaine
1163
-				if (
1164
-					($avant != "''" || $apres != "''")
1165
-					&& $code[0] != "'"
1166
-					&& !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1167
-					&& !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1168
-					&& !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1169
-				) {
1170
-					$code = "strval($code)";
1171
-				}
1172
-				break;
1173
-
1174
-			default:
1175
-				// Erreur de construction de l'arbre de syntaxe abstraite
1176
-				$code = "''";
1177
-				$p->descr = $descr;
1178
-				$err_e_c = _T('zbug_erreur_compilation');
1179
-				erreur_squelette($err_e_c, $p);
1180
-		} // switch
1181
-
1182
-		if ($code != "''") {
1183
-			$code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1184
-			$codes[] = (($mode == 'validation') ?
1185
-				"array($code, '$commentaire', " . $p->ligne . ')'
1186
-				: (($mode == 'code') ?
1187
-					"\n// $commentaire\n$code" :
1188
-					$code));
1189
-		}
1190
-	} // foreach
1191
-
1192
-	return $err_e_c ? false : $codes;
987
+    $codes = [];
988
+    // cas de la boucle recursive
989
+    if (is_array($id_boucle)) {
990
+        $id_boucle = $id_boucle[0];
991
+    }
992
+    $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete;
993
+    $tab = str_repeat("\t", ++$descr['niv']);
994
+    $mode = _request('var_mode_affiche');
995
+    $err_e_c = '';
996
+    // chaque commentaire introduit dans le code doit commencer
997
+    // par un caractere distinguant le cas, pour exploitation par debug.
998
+    foreach ($tableau as $p) {
999
+        switch ($p->type) {
1000
+            // texte seul
1001
+            case 'texte':
1002
+                $code = sandbox_composer_texte($p->texte, $p);
1003
+                $commentaire = strlen($p->texte) . ' signes';
1004
+                $avant = '';
1005
+                $apres = '';
1006
+                $altern = "''";
1007
+                break;
1008
+
1009
+            case 'polyglotte':
1010
+                $code = '';
1011
+                foreach ($p->traductions as $k => $v) {
1012
+                    $code .= ",'" .
1013
+                        str_replace(['\\', "'"], ['\\\\', "\\'"], $k) .
1014
+                        "' => '" .
1015
+                        str_replace(['\\', "'"], ['\\\\', "\\'"], $v) .
1016
+                        "'";
1017
+                }
1018
+                $code = 'choisir_traduction(array(' .
1019
+                    substr($code, 1) .
1020
+                    '))';
1021
+                $commentaire = '&';
1022
+                $avant = '';
1023
+                $apres = '';
1024
+                $altern = "''";
1025
+                break;
1026
+
1027
+            // inclure
1028
+            case 'include':
1029
+                $p->descr = $descr;
1030
+                $code = calculer_inclure($p, $boucles, $id_boucle);
1031
+                if ($code === false) {
1032
+                    $err_e_c = true;
1033
+                    $code = "''";
1034
+                } else {
1035
+                    $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>';
1036
+                    $avant = '';
1037
+                    $apres = '';
1038
+                    $altern = "''";
1039
+                }
1040
+                break;
1041
+
1042
+            // boucle
1043
+            case TYPE_RECURSIF:
1044
+                $nom = $p->id_boucle;
1045
+                $newdescr = $descr;
1046
+                $newdescr['id_mere'] = $nom;
1047
+                $newdescr['niv']++;
1048
+                $preaff = calculer_liste($p->preaff, $newdescr, $boucles, $id_boucle);
1049
+                $avant = calculer_liste($p->avant, $newdescr, $boucles, $id_boucle);
1050
+                $apres = calculer_liste($p->apres, $newdescr, $boucles, $id_boucle);
1051
+                $postaff = calculer_liste($p->postaff, $newdescr, $boucles, $id_boucle);
1052
+                $newdescr['niv']--;
1053
+                $altern = calculer_liste($p->altern, $newdescr, $boucles, $id_boucle);
1054
+                if (
1055
+                    $preaff === false
1056
+                    || $avant === false
1057
+                    || $apres === false
1058
+                    || $altern === false
1059
+                    || $postaff === false
1060
+                ) {
1061
+                    $err_e_c = true;
1062
+                    $code = "''";
1063
+                } else {
1064
+                    $code = 'BOUCLE' .
1065
+                        str_replace('-', '_', $nom) . $descr['nom'] .
1066
+                        '($Cache, $Pile, $doublons, $Numrows, $SP)';
1067
+                    $commentaire = "?$nom";
1068
+                    if (
1069
+                        !$boucles[$nom]->milieu
1070
+                        && $boucles[$nom]->type_requete <> TYPE_RECURSIF
1071
+                    ) {
1072
+                        if ($preaff != "''") {
1073
+                            $code .= "\n. $preaff";
1074
+                        }
1075
+                        if ($altern != "''") {
1076
+                            $code .= "\n. $altern";
1077
+                        }
1078
+                        if ($postaff != "''") {
1079
+                            $code .= "\n. $postaff";
1080
+                        }
1081
+                        if ($avant <> "''" || $apres <> "''") {
1082
+                            spip_logger()->info("boucle $nom toujours vide, code superflu dans $descr[sourcefile]");
1083
+                        }
1084
+                        $avant = $apres = $altern = "''";
1085
+                    } else {
1086
+                        if ($preaff != "''") {
1087
+                            $avant = compile_concatene_parties_codes($preaff, $avant);
1088
+                            $altern = compile_concatene_parties_codes($preaff, $altern);
1089
+                        }
1090
+                        if ($postaff != "''") {
1091
+                            $apres = compile_concatene_parties_codes($apres, $postaff);
1092
+                            $altern = compile_concatene_parties_codes($altern, $postaff);
1093
+                        }
1094
+                        if ($altern != "''") {
1095
+                            $altern = "($altern)";
1096
+                        }
1097
+                    }
1098
+                }
1099
+                break;
1100
+
1101
+            case 'idiome':
1102
+                $l = [];
1103
+                $code = '';
1104
+                foreach ($p->arg as $k => $v) {
1105
+                    $_v = calculer_liste($v, $descr, $boucles, $id_boucle);
1106
+                    if ($k) {
1107
+                        $l[] = _q($k) . ' => ' . $_v;
1108
+                    } else {
1109
+                        $code = $_v;
1110
+                    }
1111
+                }
1112
+                // Si le module n'est pas fourni, l'expliciter sauf si calculé
1113
+                if ($p->module) {
1114
+                    $m = $p->module . ':' . $p->nom_champ;
1115
+                } elseif ($p->nom_champ) {
1116
+                    $m = MODULES_IDIOMES . ':' . $p->nom_champ;
1117
+                } else {
1118
+                    $m = '';
1119
+                }
1120
+
1121
+                $code = (!$code ? "'$m'" :
1122
+                        ($m ? "'$m' . $code" :
1123
+                            ("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))")))
1124
+                    . (!$l ? '' : (', array(' . implode(",\n", $l) . ')'));
1125
+                $code = "_T($code)";
1126
+                if ($p->param) {
1127
+                    $p->id_boucle = $id_boucle;
1128
+                    $p->boucles = &$boucles;
1129
+                    $code = compose_filtres($p, $code);
1130
+                }
1131
+                $commentaire = ':';
1132
+                $avant = '';
1133
+                $apres = '';
1134
+                $altern = "''";
1135
+                break;
1136
+
1137
+            case 'champ':
1138
+                // cette structure pourrait etre completee des le phrase' (a faire)
1139
+                $p->id_boucle = $id_boucle;
1140
+                $p->boucles = &$boucles;
1141
+                $p->descr = $descr;
1142
+                #$p->interdire_scripts = true;
1143
+                $p->type_requete = $type;
1144
+
1145
+                $code = calculer_champ($p);
1146
+                $commentaire = '#' . $p->nom_champ . $p->etoile;
1147
+                $avant = calculer_liste(
1148
+                    $p->avant,
1149
+                    $descr,
1150
+                    $boucles,
1151
+                    $id_boucle
1152
+                );
1153
+                $apres = calculer_liste(
1154
+                    $p->apres,
1155
+                    $descr,
1156
+                    $boucles,
1157
+                    $id_boucle
1158
+                );
1159
+                $altern = "''";
1160
+                // Si la valeur est destinee a une comparaison a ''
1161
+                // forcer la conversion en une chaine par strval
1162
+                // si ca peut etre autre chose qu'une chaine
1163
+                if (
1164
+                    ($avant != "''" || $apres != "''")
1165
+                    && $code[0] != "'"
1166
+                    && !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code)
1167
+                    && !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code)
1168
+                    && !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)
1169
+                ) {
1170
+                    $code = "strval($code)";
1171
+                }
1172
+                break;
1173
+
1174
+            default:
1175
+                // Erreur de construction de l'arbre de syntaxe abstraite
1176
+                $code = "''";
1177
+                $p->descr = $descr;
1178
+                $err_e_c = _T('zbug_erreur_compilation');
1179
+                erreur_squelette($err_e_c, $p);
1180
+        } // switch
1181
+
1182
+        if ($code != "''") {
1183
+            $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']);
1184
+            $codes[] = (($mode == 'validation') ?
1185
+                "array($code, '$commentaire', " . $p->ligne . ')'
1186
+                : (($mode == 'code') ?
1187
+                    "\n// $commentaire\n$code" :
1188
+                    $code));
1189
+        }
1190
+    } // foreach
1191
+
1192
+    return $err_e_c ? false : $codes;
1193 1193
 }
1194 1194
 
1195 1195
 /**
@@ -1199,13 +1199,13 @@  discard block
 block discarded – undo
1199 1199
  * @return string
1200 1200
  */
1201 1201
 function compile_concatene_parties_codes($partie1, $partie2) {
1202
-	if ($partie1 === "''") {
1203
-		return $partie2;
1204
-	}
1205
-	if ($partie2 === "''") {
1206
-		return $partie1;
1207
-	}
1208
-	return "$partie1\n. $partie2";
1202
+    if ($partie1 === "''") {
1203
+        return $partie2;
1204
+    }
1205
+    if ($partie2 === "''") {
1206
+        return $partie1;
1207
+    }
1208
+    return "$partie1\n. $partie2";
1209 1209
 }
1210 1210
 
1211 1211
 
@@ -1229,56 +1229,56 @@  discard block
 block discarded – undo
1229 1229
  * @return mixed|string
1230 1230
  */
1231 1231
 function compile_retour($code, $avant, $apres, $altern, $tab, $n) {
1232
-	if ($avant === "''") {
1233
-		$avant = '';
1234
-	}
1235
-	if ($apres === "''") {
1236
-		$apres = '';
1237
-	}
1238
-	if ($avant || $apres || $altern !== "''") {
1239
-		if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1240
-			$t = $code;
1241
-			$cond = '';
1242
-		} elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1243
-			$t = $r[2];
1244
-			$cond = '!' . $r[1];
1245
-		} else {
1246
-			if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1247
-				$t = $r[2];
1248
-				$cond = $r[1];
1249
-			} else {
1250
-				$t = '$t' . $n;
1251
-				$cond = "($t = $code)!==''";
1252
-			}
1253
-		}
1254
-
1255
-		$res = (!$avant ? '' : "$avant . ") .
1256
-			$t .
1257
-			(!$apres ? '' : " . $apres");
1258
-
1259
-		if ($res !== $t) {
1260
-			$res = "($res)";
1261
-		}
1262
-
1263
-		$code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
1264
-	}
1265
-
1266
-	return $code;
1232
+    if ($avant === "''") {
1233
+        $avant = '';
1234
+    }
1235
+    if ($apres === "''") {
1236
+        $apres = '';
1237
+    }
1238
+    if ($avant || $apres || $altern !== "''") {
1239
+        if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) {
1240
+            $t = $code;
1241
+            $cond = '';
1242
+        } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) {
1243
+            $t = $r[2];
1244
+            $cond = '!' . $r[1];
1245
+        } else {
1246
+            if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) {
1247
+                $t = $r[2];
1248
+                $cond = $r[1];
1249
+            } else {
1250
+                $t = '$t' . $n;
1251
+                $cond = "($t = $code)!==''";
1252
+            }
1253
+        }
1254
+
1255
+        $res = (!$avant ? '' : "$avant . ") .
1256
+            $t .
1257
+            (!$apres ? '' : " . $apres");
1258
+
1259
+        if ($res !== $t) {
1260
+            $res = "($res)";
1261
+        }
1262
+
1263
+        $code = (!$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)");
1264
+    }
1265
+
1266
+    return $code;
1267 1267
 }
1268 1268
 
1269 1269
 
1270 1270
 function compile_inclure_doublons($lexemes) {
1271
-	foreach ($lexemes as $v) {
1272
-		if ($v->type === 'include' && $v->param) {
1273
-			foreach ($v->param as $r) {
1274
-				if (trim($r[0]) === 'doublons') {
1275
-					return true;
1276
-				}
1277
-			}
1278
-		}
1279
-	}
1280
-
1281
-	return false;
1271
+    foreach ($lexemes as $v) {
1272
+        if ($v->type === 'include' && $v->param) {
1273
+            foreach ($v->param as $r) {
1274
+                if (trim($r[0]) === 'doublons') {
1275
+                    return true;
1276
+                }
1277
+            }
1278
+        }
1279
+    }
1280
+
1281
+    return false;
1282 1282
 }
1283 1283
 
1284 1284
 // Prend en argument le texte d'un squelette, le nom de son fichier d'origine,
@@ -1297,355 +1297,355 @@  discard block
 block discarded – undo
1297 1297
 // En cas d'erreur, elle retournera un tableau des 2 premiers elements seulement
1298 1298
 
1299 1299
 function public_compiler_dist($squelette, $nom, $gram, $sourcefile, string $connect = '') {
1300
-	// Pre-traitement : reperer le charset du squelette, et le convertir
1301
-	// Bonus : supprime le BOM
1302
-	include_spip('inc/charsets');
1303
-	$squelette = transcoder_page($squelette);
1304
-
1305
-	// rendre inertes les echappements de #[](){}<>
1306
-	$i = 0;
1307
-	while (str_contains($squelette, $inerte = '-INERTE' . $i)) {
1308
-		$i++;
1309
-	}
1310
-	$squelette = preg_replace_callback(
1311
-		',\\\\([#[()\]{}<>]),',
1312
-		fn($a) => "$inerte-" . ord($a[1]) . '-',
1313
-		$squelette,
1314
-		-1,
1315
-		$esc
1316
-	);
1317
-
1318
-	$descr = [
1319
-		'nom' => $nom,
1320
-		'gram' => $gram,
1321
-		'sourcefile' => $sourcefile,
1322
-		'squelette' => $squelette
1323
-	];
1324
-
1325
-	// Phraser le squelette, selon sa grammaire
1326
-
1327
-	$boucles = [];
1328
-	$f = charger_fonction('phraser_' . $gram, 'public');
1329
-
1330
-	$squelette = $f($squelette, '', $boucles, $descr);
1331
-
1332
-	$boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1333
-
1334
-	// restituer les echappements
1335
-	if ($esc) {
1336
-		foreach ($boucles as $i => $boucle) {
1337
-			$boucles[$i]->return = preg_replace_callback(
1338
-				",$inerte-(\d+)-,",
1339
-				fn ($a) => chr((int) $a[1]),
1340
-				$boucle->return
1341
-			);
1342
-			$boucles[$i]->descr['squelette'] = preg_replace_callback(
1343
-				",$inerte-(\d+)-,",
1344
-				fn ($a) => '\\\\' . chr($a[1]),
1345
-				$boucle->descr['squelette']
1346
-			);
1347
-		}
1348
-	}
1349
-
1350
-	$debug = ($boucles && defined('_VAR_MODE') && _VAR_MODE == 'debug');
1351
-	if ($debug) {
1352
-		include_spip('public/decompiler');
1353
-		foreach ($boucles as $id => $boucle) {
1354
-			if ($id) {
1355
-				$decomp = "\n/* BOUCLE " .
1356
-					$boucle->type_requete .
1357
-					' ' .
1358
-					str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1359
-					($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1360
-					" */\n";
1361
-			} else {
1362
-				$decomp = ("\n/*\n" .
1363
-					str_replace('*/', '* /', public_decompiler($squelette, $gram))
1364
-					. "\n*/");
1365
-			}
1366
-			$boucles[$id]->return = $decomp . $boucle->return;
1367
-			$GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1368
-		}
1369
-	}
1370
-
1371
-	return $boucles;
1300
+    // Pre-traitement : reperer le charset du squelette, et le convertir
1301
+    // Bonus : supprime le BOM
1302
+    include_spip('inc/charsets');
1303
+    $squelette = transcoder_page($squelette);
1304
+
1305
+    // rendre inertes les echappements de #[](){}<>
1306
+    $i = 0;
1307
+    while (str_contains($squelette, $inerte = '-INERTE' . $i)) {
1308
+        $i++;
1309
+    }
1310
+    $squelette = preg_replace_callback(
1311
+        ',\\\\([#[()\]{}<>]),',
1312
+        fn($a) => "$inerte-" . ord($a[1]) . '-',
1313
+        $squelette,
1314
+        -1,
1315
+        $esc
1316
+    );
1317
+
1318
+    $descr = [
1319
+        'nom' => $nom,
1320
+        'gram' => $gram,
1321
+        'sourcefile' => $sourcefile,
1322
+        'squelette' => $squelette
1323
+    ];
1324
+
1325
+    // Phraser le squelette, selon sa grammaire
1326
+
1327
+    $boucles = [];
1328
+    $f = charger_fonction('phraser_' . $gram, 'public');
1329
+
1330
+    $squelette = $f($squelette, '', $boucles, $descr);
1331
+
1332
+    $boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect);
1333
+
1334
+    // restituer les echappements
1335
+    if ($esc) {
1336
+        foreach ($boucles as $i => $boucle) {
1337
+            $boucles[$i]->return = preg_replace_callback(
1338
+                ",$inerte-(\d+)-,",
1339
+                fn ($a) => chr((int) $a[1]),
1340
+                $boucle->return
1341
+            );
1342
+            $boucles[$i]->descr['squelette'] = preg_replace_callback(
1343
+                ",$inerte-(\d+)-,",
1344
+                fn ($a) => '\\\\' . chr($a[1]),
1345
+                $boucle->descr['squelette']
1346
+            );
1347
+        }
1348
+    }
1349
+
1350
+    $debug = ($boucles && defined('_VAR_MODE') && _VAR_MODE == 'debug');
1351
+    if ($debug) {
1352
+        include_spip('public/decompiler');
1353
+        foreach ($boucles as $id => $boucle) {
1354
+            if ($id) {
1355
+                $decomp = "\n/* BOUCLE " .
1356
+                    $boucle->type_requete .
1357
+                    ' ' .
1358
+                    str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) .
1359
+                    ($boucle->debug ? "\n *\n * " . implode("\n * ", $boucle->debug) . "\n" : '') .
1360
+                    " */\n";
1361
+            } else {
1362
+                $decomp = ("\n/*\n" .
1363
+                    str_replace('*/', '* /', public_decompiler($squelette, $gram))
1364
+                    . "\n*/");
1365
+            }
1366
+            $boucles[$id]->return = $decomp . $boucle->return;
1367
+            $GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return;
1368
+        }
1369
+    }
1370
+
1371
+    return $boucles;
1372 1372
 }
1373 1373
 
1374 1374
 // Point d'entree pour arbre de syntaxe abstraite fourni en premier argument
1375 1375
 // Autres specifications comme ci-dessus
1376 1376
 
1377 1377
 function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, string $connect = '') {
1378
-	static $trouver_table;
1379
-	spip_timer('calcul_skel');
1380
-
1381
-	if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
1382
-		$GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1383
-		$GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1384
-
1385
-		if (!isset($GLOBALS['debug_objets']['principal'])) {
1386
-			$GLOBALS['debug_objets']['principal'] = $nom;
1387
-		}
1388
-	}
1389
-	foreach ($boucles as $id => $boucle) {
1390
-		$GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1391
-	}
1392
-	$descr['documents'] = compile_inclure_doublons($squelette);
1393
-
1394
-	// Demander la description des tables une fois pour toutes
1395
-	if (!$trouver_table) {
1396
-		$trouver_table = charger_fonction('trouver_table', 'base');
1397
-	}
1398
-
1399
-	// reperer si les doublons sont demandes
1400
-	// pour un inclure ou une boucle document
1401
-	// c'est utile a la fonction champs_traitements
1402
-	foreach ($boucles as $id => $boucle) {
1403
-		if (!($type = $boucle->type_requete)) {
1404
-			continue;
1405
-		}
1406
-		if (
1407
-			!$descr['documents']
1408
-			&& (
1409
-				$type == 'documents' && $boucle->doublons
1410
-				|| compile_inclure_doublons($boucle->avant)
1411
-				|| compile_inclure_doublons($boucle->apres)
1412
-				|| compile_inclure_doublons($boucle->milieu)
1413
-				|| compile_inclure_doublons($boucle->altern)
1414
-			)
1415
-		) {
1416
-			$descr['documents'] = true;
1417
-		}
1418
-		if ($type != TYPE_RECURSIF) {
1419
-			if (!$boucles[$id]->sql_serveur && $connect) {
1420
-				$boucles[$id]->sql_serveur = $connect;
1421
-			}
1422
-
1423
-			// chercher dans les iterateurs du repertoire iterateur/
1424
-			if (
1425
-				$g = charger_fonction(
1426
-					preg_replace('/\W/', '_', $boucle->type_requete),
1427
-					'iterateur',
1428
-					true
1429
-				)
1430
-			) {
1431
-				$boucles[$id] = $g($boucle);
1432
-
1433
-				// sinon, en cas de requeteur d'un type predefini,
1434
-				// utiliser les informations donnees par le requeteur
1435
-				// cas "php:xx" et "data:xx".
1436
-			} else {
1437
-				if ($boucle->sql_serveur && ($requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true))) {
1438
-					$requeteur($boucles, $boucle, $id);
1439
-
1440
-					// utiliser la description des champs transmis
1441
-				} else {
1442
-					$show = $trouver_table($type, $boucles[$id]->sql_serveur);
1443
-					// si la table n'existe pas avec le connecteur par defaut,
1444
-					// c'est peut etre une table qui necessite son connecteur dedie fourni
1445
-					// permet une ecriture allegee (GEO) -> (geo:GEO)
1446
-					if (
1447
-						!$show
1448
-						&& ($show = $trouver_table($type, strtolower($type)))
1449
-					) {
1450
-						$boucles[$id]->sql_serveur = strtolower($type);
1451
-					}
1452
-					if ($show) {
1453
-						$boucles[$id]->show = $show;
1454
-						// recopie les infos les plus importantes
1455
-						$boucles[$id]->primary = $show['key']['PRIMARY KEY'] ?? '';
1456
-						$boucles[$id]->id_table = $x = preg_replace(',^spip_,', '', $show['id_table']);
1457
-						$boucles[$id]->from[$x] = $nom_table = $show['table'];
1458
-						$boucles[$id]->iterateur = 'SQL';
1459
-
1460
-						if (empty($boucles[$id]->descr)) {
1461
-							$boucles[$id]->descr = &$descr;
1462
-						}
1463
-						if (
1464
-							!$boucles[$id]->jointures
1465
-							&& is_array($show['tables_jointures'])
1466
-							&& count($x = $show['tables_jointures'])
1467
-						) {
1468
-							$boucles[$id]->jointures = $x;
1469
-						}
1470
-						if ($boucles[$id]->jointures_explicites) {
1471
-							$jointures = preg_split('/\s+/', $boucles[$id]->jointures_explicites);
1472
-							while ($j = array_pop($jointures)) {
1473
-								array_unshift($boucles[$id]->jointures, $j);
1474
-							}
1475
-						}
1476
-					} else {
1477
-						// Pas une erreur si la table est optionnelle
1478
-						if ($boucles[$id]->table_optionnelle) {
1479
-							$boucles[$id]->type_requete = '';
1480
-						} else {
1481
-							$boucles[$id]->type_requete = false;
1482
-							$boucle = $boucles[$id];
1483
-							$x = (!$boucle->sql_serveur ? '' :
1484
-									($boucle->sql_serveur . ':')) .
1485
-								$type;
1486
-							$msg = [
1487
-								'zbug_table_inconnue',
1488
-								['table' => $x]
1489
-							];
1490
-							erreur_squelette($msg, $boucle);
1491
-						}
1492
-					}
1493
-				}
1494
-			}
1495
-		}
1496
-	}
1497
-
1498
-	// Commencer par reperer les boucles appelees explicitement
1499
-	// car elles indexent les arguments de maniere derogatoire
1500
-	foreach ($boucles as $id => $boucle) {
1501
-		if ($boucle->type_requete == TYPE_RECURSIF && $boucle->param) {
1502
-			$boucles[$id]->descr = &$descr;
1503
-			$rec = &$boucles[$boucle->param[0]];
1504
-			if (!$rec) {
1505
-				$msg = [
1506
-					'zbug_boucle_recursive_undef',
1507
-					['nom' => $boucle->param[0]]
1508
-				];
1509
-				erreur_squelette($msg, $boucle);
1510
-				$boucles[$id]->type_requete = false;
1511
-			} else {
1512
-				$rec->externe = $id;
1513
-				$descr['id_mere'] = $id;
1514
-				$boucles[$id]->return =
1515
-					calculer_liste(
1516
-						[$rec],
1517
-						$descr,
1518
-						$boucles,
1519
-						$boucle->param
1520
-					);
1521
-			}
1522
-		}
1523
-	}
1524
-	foreach ($boucles as $id => $boucle) {
1525
-		$id = strval($id); // attention au type dans index_pile
1526
-		$type = $boucle->type_requete;
1527
-		if ($type && $type != TYPE_RECURSIF) {
1528
-			$res = '';
1529
-			if ($boucle->param) {
1530
-				// retourne un tableau en cas d'erreur
1531
-				$res = calculer_criteres($id, $boucles);
1532
-			}
1533
-			$descr['id_mere'] = $id;
1534
-			$boucles[$id]->return =
1535
-				calculer_liste(
1536
-					$boucle->milieu,
1537
-					$descr,
1538
-					$boucles,
1539
-					$id
1540
-				);
1541
-			// Si les criteres se sont mal compiles
1542
-			// ne pas tenter d'assembler le code final
1543
-			// (mais compiler le corps pour detection d'erreurs)
1544
-			if (is_array($res)) {
1545
-				$boucles[$id]->type_requete = false;
1546
-			}
1547
-		}
1548
-	}
1549
-
1550
-	// idem pour la racine
1551
-	$descr['id_mere'] = '';
1552
-	$corps = calculer_liste($squelette, $descr, $boucles);
1553
-
1554
-
1555
-	// Calcul du corps de toutes les fonctions PHP,
1556
-	// en particulier les requetes SQL et TOTAL_BOUCLE
1557
-	// de'terminables seulement maintenant
1558
-
1559
-	foreach ($boucles as $id => $boucle) {
1560
-		$boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1561
-		if ($boucle->return === false) {
1562
-			$corps = false;
1563
-			continue;
1564
-		}
1565
-		// appeler la fonction de definition de la boucle
1566
-
1567
-		if ($req = $boucle->type_requete) {
1568
-			// boucle personnalisée ?
1569
-			$table = strtoupper($boucle->type_requete);
1570
-			$serveur = strtolower($boucle->sql_serveur);
1571
-			if (
1572
-				// fonction de boucle avec serveur & table
1573
-				(
1574
-					!$serveur
1575
-					|| !function_exists($f = 'boucle_' . $serveur . '_' . $table) && !function_exists($f = $f . '_dist')
1576
-				)
1577
-				// fonction de boucle avec table
1578
-				&& !function_exists($f = 'boucle_' . $table)
1579
-				&& !function_exists($f = $f . '_dist')
1580
-			) {
1581
-				// fonction de boucle standard
1582
-				if (!function_exists($f = 'boucle_DEFAUT')) {
1583
-					$f = 'boucle_DEFAUT_dist';
1584
-				}
1585
-			}
1586
-
1587
-			$req = "\n\n\tstatic \$command = array();\n\t" .
1588
-				"static \$connect;\n\t" .
1589
-				"\$command['connect'] = \$connect = " .
1590
-				_q($boucle->sql_serveur) .
1591
-				';' .
1592
-				$f($id, $boucles);
1593
-		} else {
1594
-			$req = ("\n\treturn '';");
1595
-		}
1596
-
1597
-		$boucles[$id]->return =
1598
-			"\n\nfunction BOUCLE" . strtr($id, '-', '_') . $nom .
1599
-			'(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1600
-			$req .
1601
-			"\n}\n";
1602
-	}
1603
-
1604
-	// Au final, si le corps ou un critere au moins s'est mal compile
1605
-	// retourner False, sinon inserer leur decompilation
1606
-	if (is_bool($corps)) {
1607
-		return false;
1608
-	}
1609
-
1610
-	$principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1378
+    static $trouver_table;
1379
+    spip_timer('calcul_skel');
1380
+
1381
+    if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
1382
+        $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette'];
1383
+        $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile;
1384
+
1385
+        if (!isset($GLOBALS['debug_objets']['principal'])) {
1386
+            $GLOBALS['debug_objets']['principal'] = $nom;
1387
+        }
1388
+    }
1389
+    foreach ($boucles as $id => $boucle) {
1390
+        $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle;
1391
+    }
1392
+    $descr['documents'] = compile_inclure_doublons($squelette);
1393
+
1394
+    // Demander la description des tables une fois pour toutes
1395
+    if (!$trouver_table) {
1396
+        $trouver_table = charger_fonction('trouver_table', 'base');
1397
+    }
1398
+
1399
+    // reperer si les doublons sont demandes
1400
+    // pour un inclure ou une boucle document
1401
+    // c'est utile a la fonction champs_traitements
1402
+    foreach ($boucles as $id => $boucle) {
1403
+        if (!($type = $boucle->type_requete)) {
1404
+            continue;
1405
+        }
1406
+        if (
1407
+            !$descr['documents']
1408
+            && (
1409
+                $type == 'documents' && $boucle->doublons
1410
+                || compile_inclure_doublons($boucle->avant)
1411
+                || compile_inclure_doublons($boucle->apres)
1412
+                || compile_inclure_doublons($boucle->milieu)
1413
+                || compile_inclure_doublons($boucle->altern)
1414
+            )
1415
+        ) {
1416
+            $descr['documents'] = true;
1417
+        }
1418
+        if ($type != TYPE_RECURSIF) {
1419
+            if (!$boucles[$id]->sql_serveur && $connect) {
1420
+                $boucles[$id]->sql_serveur = $connect;
1421
+            }
1422
+
1423
+            // chercher dans les iterateurs du repertoire iterateur/
1424
+            if (
1425
+                $g = charger_fonction(
1426
+                    preg_replace('/\W/', '_', $boucle->type_requete),
1427
+                    'iterateur',
1428
+                    true
1429
+                )
1430
+            ) {
1431
+                $boucles[$id] = $g($boucle);
1432
+
1433
+                // sinon, en cas de requeteur d'un type predefini,
1434
+                // utiliser les informations donnees par le requeteur
1435
+                // cas "php:xx" et "data:xx".
1436
+            } else {
1437
+                if ($boucle->sql_serveur && ($requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true))) {
1438
+                    $requeteur($boucles, $boucle, $id);
1439
+
1440
+                    // utiliser la description des champs transmis
1441
+                } else {
1442
+                    $show = $trouver_table($type, $boucles[$id]->sql_serveur);
1443
+                    // si la table n'existe pas avec le connecteur par defaut,
1444
+                    // c'est peut etre une table qui necessite son connecteur dedie fourni
1445
+                    // permet une ecriture allegee (GEO) -> (geo:GEO)
1446
+                    if (
1447
+                        !$show
1448
+                        && ($show = $trouver_table($type, strtolower($type)))
1449
+                    ) {
1450
+                        $boucles[$id]->sql_serveur = strtolower($type);
1451
+                    }
1452
+                    if ($show) {
1453
+                        $boucles[$id]->show = $show;
1454
+                        // recopie les infos les plus importantes
1455
+                        $boucles[$id]->primary = $show['key']['PRIMARY KEY'] ?? '';
1456
+                        $boucles[$id]->id_table = $x = preg_replace(',^spip_,', '', $show['id_table']);
1457
+                        $boucles[$id]->from[$x] = $nom_table = $show['table'];
1458
+                        $boucles[$id]->iterateur = 'SQL';
1459
+
1460
+                        if (empty($boucles[$id]->descr)) {
1461
+                            $boucles[$id]->descr = &$descr;
1462
+                        }
1463
+                        if (
1464
+                            !$boucles[$id]->jointures
1465
+                            && is_array($show['tables_jointures'])
1466
+                            && count($x = $show['tables_jointures'])
1467
+                        ) {
1468
+                            $boucles[$id]->jointures = $x;
1469
+                        }
1470
+                        if ($boucles[$id]->jointures_explicites) {
1471
+                            $jointures = preg_split('/\s+/', $boucles[$id]->jointures_explicites);
1472
+                            while ($j = array_pop($jointures)) {
1473
+                                array_unshift($boucles[$id]->jointures, $j);
1474
+                            }
1475
+                        }
1476
+                    } else {
1477
+                        // Pas une erreur si la table est optionnelle
1478
+                        if ($boucles[$id]->table_optionnelle) {
1479
+                            $boucles[$id]->type_requete = '';
1480
+                        } else {
1481
+                            $boucles[$id]->type_requete = false;
1482
+                            $boucle = $boucles[$id];
1483
+                            $x = (!$boucle->sql_serveur ? '' :
1484
+                                    ($boucle->sql_serveur . ':')) .
1485
+                                $type;
1486
+                            $msg = [
1487
+                                'zbug_table_inconnue',
1488
+                                ['table' => $x]
1489
+                            ];
1490
+                            erreur_squelette($msg, $boucle);
1491
+                        }
1492
+                    }
1493
+                }
1494
+            }
1495
+        }
1496
+    }
1497
+
1498
+    // Commencer par reperer les boucles appelees explicitement
1499
+    // car elles indexent les arguments de maniere derogatoire
1500
+    foreach ($boucles as $id => $boucle) {
1501
+        if ($boucle->type_requete == TYPE_RECURSIF && $boucle->param) {
1502
+            $boucles[$id]->descr = &$descr;
1503
+            $rec = &$boucles[$boucle->param[0]];
1504
+            if (!$rec) {
1505
+                $msg = [
1506
+                    'zbug_boucle_recursive_undef',
1507
+                    ['nom' => $boucle->param[0]]
1508
+                ];
1509
+                erreur_squelette($msg, $boucle);
1510
+                $boucles[$id]->type_requete = false;
1511
+            } else {
1512
+                $rec->externe = $id;
1513
+                $descr['id_mere'] = $id;
1514
+                $boucles[$id]->return =
1515
+                    calculer_liste(
1516
+                        [$rec],
1517
+                        $descr,
1518
+                        $boucles,
1519
+                        $boucle->param
1520
+                    );
1521
+            }
1522
+        }
1523
+    }
1524
+    foreach ($boucles as $id => $boucle) {
1525
+        $id = strval($id); // attention au type dans index_pile
1526
+        $type = $boucle->type_requete;
1527
+        if ($type && $type != TYPE_RECURSIF) {
1528
+            $res = '';
1529
+            if ($boucle->param) {
1530
+                // retourne un tableau en cas d'erreur
1531
+                $res = calculer_criteres($id, $boucles);
1532
+            }
1533
+            $descr['id_mere'] = $id;
1534
+            $boucles[$id]->return =
1535
+                calculer_liste(
1536
+                    $boucle->milieu,
1537
+                    $descr,
1538
+                    $boucles,
1539
+                    $id
1540
+                );
1541
+            // Si les criteres se sont mal compiles
1542
+            // ne pas tenter d'assembler le code final
1543
+            // (mais compiler le corps pour detection d'erreurs)
1544
+            if (is_array($res)) {
1545
+                $boucles[$id]->type_requete = false;
1546
+            }
1547
+        }
1548
+    }
1549
+
1550
+    // idem pour la racine
1551
+    $descr['id_mere'] = '';
1552
+    $corps = calculer_liste($squelette, $descr, $boucles);
1553
+
1554
+
1555
+    // Calcul du corps de toutes les fonctions PHP,
1556
+    // en particulier les requetes SQL et TOTAL_BOUCLE
1557
+    // de'terminables seulement maintenant
1558
+
1559
+    foreach ($boucles as $id => $boucle) {
1560
+        $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle);
1561
+        if ($boucle->return === false) {
1562
+            $corps = false;
1563
+            continue;
1564
+        }
1565
+        // appeler la fonction de definition de la boucle
1566
+
1567
+        if ($req = $boucle->type_requete) {
1568
+            // boucle personnalisée ?
1569
+            $table = strtoupper($boucle->type_requete);
1570
+            $serveur = strtolower($boucle->sql_serveur);
1571
+            if (
1572
+                // fonction de boucle avec serveur & table
1573
+                (
1574
+                    !$serveur
1575
+                    || !function_exists($f = 'boucle_' . $serveur . '_' . $table) && !function_exists($f = $f . '_dist')
1576
+                )
1577
+                // fonction de boucle avec table
1578
+                && !function_exists($f = 'boucle_' . $table)
1579
+                && !function_exists($f = $f . '_dist')
1580
+            ) {
1581
+                // fonction de boucle standard
1582
+                if (!function_exists($f = 'boucle_DEFAUT')) {
1583
+                    $f = 'boucle_DEFAUT_dist';
1584
+                }
1585
+            }
1586
+
1587
+            $req = "\n\n\tstatic \$command = array();\n\t" .
1588
+                "static \$connect;\n\t" .
1589
+                "\$command['connect'] = \$connect = " .
1590
+                _q($boucle->sql_serveur) .
1591
+                ';' .
1592
+                $f($id, $boucles);
1593
+        } else {
1594
+            $req = ("\n\treturn '';");
1595
+        }
1596
+
1597
+        $boucles[$id]->return =
1598
+            "\n\nfunction BOUCLE" . strtr($id, '-', '_') . $nom .
1599
+            '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' .
1600
+            $req .
1601
+            "\n}\n";
1602
+    }
1603
+
1604
+    // Au final, si le corps ou un critere au moins s'est mal compile
1605
+    // retourner False, sinon inserer leur decompilation
1606
+    if (is_bool($corps)) {
1607
+        return false;
1608
+    }
1609
+
1610
+    $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) {
1611 1611
 '
1612
-		// reporter de maniere securisee les doublons inclus
1613
-		. '
1612
+        // reporter de maniere securisee les doublons inclus
1613
+        . '
1614 1614
 	if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"]))
1615 1615
 		$doublons = nettoyer_env_doublons($Pile[0]["doublons"]);
1616 1616
 
1617 1617
 	$connect = ' .
1618
-		_q($connect) . ';
1618
+        _q($connect) . ';
1619 1619
 	$page = ' .
1620
-		// ATTENTION, le calcul de l'expression $corps affectera $Cache
1621
-		// c'est pourquoi on l'affecte a la variable auxiliaire $page.
1622
-		// avant de referencer $Cache
1623
-		$corps . ';
1620
+        // ATTENTION, le calcul de l'expression $corps affectera $Cache
1621
+        // c'est pourquoi on l'affecte a la variable auxiliaire $page.
1622
+        // avant de referencer $Cache
1623
+        $corps . ';
1624 1624
 
1625 1625
 	return analyse_resultat_skel(' . var_export($nom, true)
1626
-		. ', $Cache, $page, ' . var_export($sourcefile, true) . ');
1626
+        . ', $Cache, $page, ' . var_export($sourcefile, true) . ');
1627 1627
 }';
1628 1628
 
1629
-	$secondes = spip_timer('calcul_skel');
1630
-	spip_logger()->info("COMPIL ($secondes) [$sourcefile] $nom.php");
1631
-	// $connect n'est pas sûr : on nettoie
1632
-	$connect = preg_replace(',[^\w],', '', $connect);
1629
+    $secondes = spip_timer('calcul_skel');
1630
+    spip_logger()->info("COMPIL ($secondes) [$sourcefile] $nom.php");
1631
+    // $connect n'est pas sûr : on nettoie
1632
+    $connect = preg_replace(',[^\w],', '', $connect);
1633 1633
 
1634
-	// Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1635
-	$code = new Boucle();
1636
-	$code->descr = $descr;
1637
-	$code->return = '
1634
+    // Assimiler la fct principale a une boucle anonyme, pour retourner un resultat simple
1635
+    $code = new Boucle();
1636
+    $code->descr = $descr;
1637
+    $code->return = '
1638 1638
 //
1639 1639
 // Fonction principale du squelette ' .
1640
-		$sourcefile .
1641
-		($connect ? " pour $connect" : '') .
1642
-		(!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1643
-		"\n//\n" .
1644
-		$principal;
1640
+        $sourcefile .
1641
+        ($connect ? " pour $connect" : '') .
1642
+        (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") .
1643
+        "\n//\n" .
1644
+        $principal;
1645 1645
 
1646
-	$boucles[''] = $code;
1646
+    $boucles[''] = $code;
1647 1647
 
1648
-	return $boucles;
1648
+    return $boucles;
1649 1649
 }
1650 1650
 
1651 1651
 
@@ -1662,18 +1662,18 @@  discard block
 block discarded – undo
1662 1662
  *
1663 1663
  **/
1664 1664
 function requeteur_php_dist(&$boucles, &$boucle, &$id) {
1665
-	if (class_exists($boucle->type_requete)) {
1666
-		$g = charger_fonction('php', 'iterateur');
1667
-		$boucles[$id] = $g($boucle, $boucle->type_requete);
1668
-	} else {
1669
-		$x = $boucle->type_requete;
1670
-		$boucle->type_requete = false;
1671
-		$msg = [
1672
-			'zbug_iterateur_inconnu',
1673
-			['iterateur' => $x]
1674
-		];
1675
-		erreur_squelette($msg, $boucle);
1676
-	}
1665
+    if (class_exists($boucle->type_requete)) {
1666
+        $g = charger_fonction('php', 'iterateur');
1667
+        $boucles[$id] = $g($boucle, $boucle->type_requete);
1668
+    } else {
1669
+        $x = $boucle->type_requete;
1670
+        $boucle->type_requete = false;
1671
+        $msg = [
1672
+            'zbug_iterateur_inconnu',
1673
+            ['iterateur' => $x]
1674
+        ];
1675
+        erreur_squelette($msg, $boucle);
1676
+    }
1677 1677
 }
1678 1678
 
1679 1679
 
@@ -1691,22 +1691,22 @@  discard block
 block discarded – undo
1691 1691
  *
1692 1692
  **/
1693 1693
 function requeteur_data_dist(&$boucles, &$boucle, &$id) {
1694
-	include_spip('iterateur/data');
1695
-	if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1696
-		$g = charger_fonction('data', 'iterateur');
1697
-		$boucles[$id] = $g($boucle);
1698
-		// from[0] stocke le type de data (rss, yql, ...)
1699
-		$boucles[$id]->from[] = $boucle->type_requete;
1700
-	} else {
1701
-		$x = $boucle->type_requete;
1702
-		$boucle->type_requete = false;
1703
-		$msg = [
1704
-			'zbug_requeteur_inconnu',
1705
-			[
1706
-				'requeteur' => 'data',
1707
-				'type' => $x
1708
-			]
1709
-		];
1710
-		erreur_squelette($msg, $boucle);
1711
-	}
1694
+    include_spip('iterateur/data');
1695
+    if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) {
1696
+        $g = charger_fonction('data', 'iterateur');
1697
+        $boucles[$id] = $g($boucle);
1698
+        // from[0] stocke le type de data (rss, yql, ...)
1699
+        $boucles[$id]->from[] = $boucle->type_requete;
1700
+    } else {
1701
+        $x = $boucle->type_requete;
1702
+        $boucle->type_requete = false;
1703
+        $msg = [
1704
+            'zbug_requeteur_inconnu',
1705
+            [
1706
+                'requeteur' => 'data',
1707
+                'type' => $x
1708
+            ]
1709
+        ];
1710
+        erreur_squelette($msg, $boucle);
1711
+    }
1712 1712
 }
Please login to merge, or discard this patch.