Completed
Push — master ( 51674a...9b54d2 )
by cam
01:35
created
prive/formulaires/editer_liens.php 1 patch
Indentation   +433 added lines, -433 removed lines patch added patch discarded remove patch
@@ -15,7 +15,7 @@  discard block
 block discarded – undo
15 15
  * @package SPIP\Core\Formulaires
16 16
  **/
17 17
 if (!defined('_ECRIRE_INC_VERSION')) {
18
-	return;
18
+    return;
19 19
 }
20 20
 
21 21
 
@@ -35,25 +35,25 @@  discard block
 block discarded – undo
35 35
  *   ($table_source,$objet,$id_objet,$objet_lien)
36 36
  */
37 37
 function determine_source_lien_objet($a, $b, $c) {
38
-	$table_source = $objet_lien = $objet = $id_objet = null;
39
-	// auteurs, article, 23 :
40
-	// associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens
41
-	if (is_numeric($c) && !is_numeric($b)) {
42
-		$table_source = table_objet($a);
43
-		$objet_lien = objet_type($a);
44
-		$objet = objet_type($b);
45
-		$id_objet = $c;
46
-	}
47
-	// article, 23, auteurs
48
-	// associer des auteurs à l'article 23, sur la table pivot spip_articles_liens
49
-	if (is_numeric($b) && !is_numeric($c)) {
50
-		$table_source = table_objet($c);
51
-		$objet_lien = objet_type($a);
52
-		$objet = objet_type($a);
53
-		$id_objet = $b;
54
-	}
55
-
56
-	return [$table_source, $objet, $id_objet, $objet_lien];
38
+    $table_source = $objet_lien = $objet = $id_objet = null;
39
+    // auteurs, article, 23 :
40
+    // associer des auteurs à l'article 23, sur la table pivot spip_auteurs_liens
41
+    if (is_numeric($c) && !is_numeric($b)) {
42
+        $table_source = table_objet($a);
43
+        $objet_lien = objet_type($a);
44
+        $objet = objet_type($b);
45
+        $id_objet = $c;
46
+    }
47
+    // article, 23, auteurs
48
+    // associer des auteurs à l'article 23, sur la table pivot spip_articles_liens
49
+    if (is_numeric($b) && !is_numeric($c)) {
50
+        $table_source = table_objet($c);
51
+        $objet_lien = objet_type($a);
52
+        $objet = objet_type($a);
53
+        $id_objet = $b;
54
+    }
55
+
56
+    return [$table_source, $objet, $id_objet, $objet_lien];
57 57
 }
58 58
 
59 59
 /**
@@ -79,87 +79,87 @@  discard block
 block discarded – undo
79 79
  */
80 80
 function formulaires_editer_liens_charger_dist($a, $b, $c, $options = []) {
81 81
 
82
-	// compat avec ancienne signature ou le 4eme argument est $editable
83
-	if (!is_array($options)) {
84
-		$options = ['editable' => $options];
85
-	} elseif (!isset($options['editable'])) {
86
-		$options['editable'] = true;
87
-	}
88
-
89
-	$editable = $options['editable'];
90
-
91
-	[$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
92
-	if (!$table_source || !$objet || !$objet_lien || !$id_objet) {
93
-		return false;
94
-	}
95
-
96
-	$objet_source = objet_type($table_source);
97
-	$table_sql_source = table_objet_sql($objet_source);
98
-
99
-	// verifier existence de la table xxx_liens
100
-	include_spip('action/editer_liens');
101
-	if (!objet_associable($objet_lien)) {
102
-		return false;
103
-	}
104
-
105
-	// L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
106
-	include_spip('inc/autoriser');
107
-	$editable = ($editable
108
-		&& autoriser('associer' . $table_source, $objet, $id_objet)
109
-		&& autoriser('modifier', $objet, $id_objet));
110
-
111
-	if (
112
-		!$editable && !count(objet_trouver_liens(
113
-			[$objet_lien => '*'],
114
-			[($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet]
115
-		))
116
-	) {
117
-		return false;
118
-	}
119
-
120
-	// squelettes de vue et de d'association
121
-	// ils sont différents si des rôles sont définis.
122
-	$skel_vue = $table_source . '_lies';
123
-	$skel_ajout = $table_source . '_associer';
124
-
125
-	// description des roles
126
-	include_spip('inc/roles');
127
-	if ($roles = roles_presents($objet_source, $objet)) {
128
-		// on demande de nouveaux squelettes en conséquence
129
-		$skel_vue = $table_source . '_roles_lies';
130
-		$skel_ajout = $table_source . '_roles_associer';
131
-	}
132
-
133
-	$oups = '';
134
-	if ($editable) {
135
-		$oups = lien_gerer__oups('editer_liens', 'hash');
136
-	}
137
-	$valeurs = [
138
-		'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
139
-		'_vue_liee' => $skel_vue,
140
-		'_vue_ajout' => $skel_ajout,
141
-		'_objet_lien' => $objet_lien,
142
-		'id_lien_ajoute' => _request('id_lien_ajoute'),
143
-		'objet' => $objet,
144
-		'id_objet' => $id_objet,
145
-		'objet_source' => $objet_source,
146
-		'table_source' => $table_source,
147
-		'recherche' => '',
148
-		'visible' => 0,
149
-		'ajouter_lien' => '',
150
-		'supprimer_lien' => '',
151
-		'qualifier_lien' => '',
152
-		'ordonner_lien' => '',
153
-		'desordonner_liens' => '',
154
-		'_roles' => $roles, # description des roles
155
-		'_oups' => entites_html($oups),
156
-		'editable' => $editable,
157
-	];
158
-
159
-	// les options non definies dans $valeurs sont passees telles quelles au formulaire html
160
-	$valeurs = array_merge($options, $valeurs);
161
-
162
-	return $valeurs;
82
+    // compat avec ancienne signature ou le 4eme argument est $editable
83
+    if (!is_array($options)) {
84
+        $options = ['editable' => $options];
85
+    } elseif (!isset($options['editable'])) {
86
+        $options['editable'] = true;
87
+    }
88
+
89
+    $editable = $options['editable'];
90
+
91
+    [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
92
+    if (!$table_source || !$objet || !$objet_lien || !$id_objet) {
93
+        return false;
94
+    }
95
+
96
+    $objet_source = objet_type($table_source);
97
+    $table_sql_source = table_objet_sql($objet_source);
98
+
99
+    // verifier existence de la table xxx_liens
100
+    include_spip('action/editer_liens');
101
+    if (!objet_associable($objet_lien)) {
102
+        return false;
103
+    }
104
+
105
+    // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
106
+    include_spip('inc/autoriser');
107
+    $editable = ($editable
108
+        && autoriser('associer' . $table_source, $objet, $id_objet)
109
+        && autoriser('modifier', $objet, $id_objet));
110
+
111
+    if (
112
+        !$editable && !count(objet_trouver_liens(
113
+            [$objet_lien => '*'],
114
+            [($objet_lien == $objet_source ? $objet : $objet_source) => $id_objet]
115
+        ))
116
+    ) {
117
+        return false;
118
+    }
119
+
120
+    // squelettes de vue et de d'association
121
+    // ils sont différents si des rôles sont définis.
122
+    $skel_vue = $table_source . '_lies';
123
+    $skel_ajout = $table_source . '_associer';
124
+
125
+    // description des roles
126
+    include_spip('inc/roles');
127
+    if ($roles = roles_presents($objet_source, $objet)) {
128
+        // on demande de nouveaux squelettes en conséquence
129
+        $skel_vue = $table_source . '_roles_lies';
130
+        $skel_ajout = $table_source . '_roles_associer';
131
+    }
132
+
133
+    $oups = '';
134
+    if ($editable) {
135
+        $oups = lien_gerer__oups('editer_liens', 'hash');
136
+    }
137
+    $valeurs = [
138
+        'id' => "$table_source-$objet-$id_objet-$objet_lien", // identifiant unique pour les id du form
139
+        '_vue_liee' => $skel_vue,
140
+        '_vue_ajout' => $skel_ajout,
141
+        '_objet_lien' => $objet_lien,
142
+        'id_lien_ajoute' => _request('id_lien_ajoute'),
143
+        'objet' => $objet,
144
+        'id_objet' => $id_objet,
145
+        'objet_source' => $objet_source,
146
+        'table_source' => $table_source,
147
+        'recherche' => '',
148
+        'visible' => 0,
149
+        'ajouter_lien' => '',
150
+        'supprimer_lien' => '',
151
+        'qualifier_lien' => '',
152
+        'ordonner_lien' => '',
153
+        'desordonner_liens' => '',
154
+        '_roles' => $roles, # description des roles
155
+        '_oups' => entites_html($oups),
156
+        'editable' => $editable,
157
+    ];
158
+
159
+    // les options non definies dans $valeurs sont passees telles quelles au formulaire html
160
+    $valeurs = array_merge($options, $valeurs);
161
+
162
+    return $valeurs;
163 163
 }
164 164
 
165 165
 /**
@@ -203,170 +203,170 @@  discard block
 block discarded – undo
203 203
  * @return array
204 204
  */
205 205
 function formulaires_editer_liens_traiter_dist($a, $b, $c, $options = []) {
206
-	// compat avec ancienne signature ou le 4eme argument est $editable
207
-	if (!is_array($options)) {
208
-		$options = ['editable' => $options];
209
-	} elseif (!isset($options['editable'])) {
210
-		$options['editable'] = true;
211
-	}
212
-
213
-	$editable = $options['editable'];
214
-
215
-	$res = ['editable' => (bool) $editable];
216
-	[$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
217
-	if (!$table_source || !$objet || !$objet_lien) {
218
-		return $res;
219
-	}
220
-
221
-
222
-	if (_request('tout_voir')) {
223
-		set_request('recherche', '');
224
-	}
225
-
226
-	include_spip('inc/autoriser');
227
-	if (autoriser('modifier', $objet, $id_objet)) {
228
-		// recuperer le oups du coup d'avant pour le propager à charger() si on ne fait rien par exemple
229
-		lien_gerer__oups('editer_liens', 'request');
230
-
231
-		// annuler les suppressions du coup d'avant ?
232
-		if (
233
-			_request('annuler_oups')
234
-			&& ($oups = lien_gerer__oups('editer_liens', 'get'))
235
-		) {
236
-			if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) {
237
-				$oups_objets($oups);
238
-			} else {
239
-				$objet_source = objet_type($table_source);
240
-				include_spip('action/editer_liens');
241
-				foreach ($oups as $oup) {
242
-					if ($objet_lien == $objet_source) {
243
-						objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup);
244
-					} else {
245
-						objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup);
246
-					}
247
-				}
248
-			}
249
-			# oups ne persiste que pour la derniere action, si suppression
250
-			lien_gerer__oups('editer_liens', 'reset');
251
-		}
252
-
253
-		$supprimer = _request('supprimer_lien');
254
-		$ajouter = _request('ajouter_lien');
255
-		$ordonner = _request('ordonner_lien');
256
-
257
-		if (_request('desordonner_liens')) {
258
-			include_spip('action/editer_liens');
259
-			objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]);
260
-		}
261
-
262
-		// il est possible de preciser dans une seule variable un remplacement :
263
-		// remplacer_lien[old][new]
264
-		if ($remplacer = _request('remplacer_lien')) {
265
-			foreach ($remplacer as $k => $v) {
266
-				if ($old = lien_verifier_action($k, '')) {
267
-					foreach (is_array($v) ? $v : [$v] as $kn => $vn) {
268
-						if ($new = lien_verifier_action($kn, $vn)) {
269
-							$supprimer[$old] = 'x';
270
-							$ajouter[$new] = '+';
271
-						}
272
-					}
273
-				}
274
-			}
275
-		}
276
-
277
-		if ($supprimer) {
278
-			if (
279
-				$supprimer_objets = charger_fonction(
280
-					"editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}",
281
-					'action',
282
-					true
283
-				)
284
-			) {
285
-				$oups = $supprimer_objets($supprimer);
286
-			} else {
287
-				include_spip('action/editer_liens');
288
-				$oups = [];
289
-
290
-				foreach ($supprimer as $k => $v) {
291
-					if ($lien = lien_verifier_action($k, $v)) {
292
-						$lien = explode('-', $lien);
293
-						[$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null);
294
-						// appliquer une condition sur le rôle si défini ('*' pour tous les roles)
295
-						$cond = (is_null($role) ? [] : ['role' => $role]);
296
-						if ($objet_lien == $objet_source) {
297
-							$oups = array_merge(
298
-								$oups,
299
-								objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond)
300
-							);
301
-							objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond);
302
-						} else {
303
-							$oups = array_merge(
304
-								$oups,
305
-								objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond)
306
-							);
307
-							objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond);
308
-						}
309
-					}
310
-				}
311
-			}
312
-			if (!empty($oups)) {
313
-				lien_gerer__oups('editer_liens', 'set', $oups);
314
-			} else {
315
-				lien_gerer__oups('editer_liens', 'reset');
316
-			}
317
-		}
318
-
319
-		if ($ajouter) {
320
-			if (
321
-				$ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true)
322
-			) {
323
-				$ajout_ok = $ajouter_objets($ajouter);
324
-			} else {
325
-				$ajout_ok = false;
326
-				include_spip('action/editer_liens');
327
-				foreach ($ajouter as $k => $v) {
328
-					if ($lien = lien_verifier_action($k, $v)) {
329
-						$ajout_ok = true;
330
-						[$objet1, $ids, $objet2, $idl] = explode('-', $lien);
331
-						$qualifs = lien_retrouver_qualif($objet_lien, $lien);
332
-						if ($objet_lien == $objet1) {
333
-							lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
334
-						} else {
335
-							lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
336
-						}
337
-						set_request('id_lien_ajoute', $ids);
338
-					}
339
-				}
340
-			}
341
-			# oups ne persiste que pour la derniere action, si suppression
342
-			# une suppression suivie d'un ajout dans le meme hit est un remplacement
343
-			# non annulable !
344
-			if ($ajout_ok) {
345
-				lien_gerer__oups('editer_liens', 'reset');
346
-			}
347
-		}
348
-
349
-		if ($ordonner) {
350
-			include_spip('action/editer_liens');
351
-			foreach ($ordonner as $k => $rang_lien) {
352
-				if ($lien = lien_verifier_action($k, '')) {
353
-					[$objet1, $ids, $objet2, $idl] = explode('-', $lien);
354
-					$qualif = ['rang_lien' => $rang_lien];
355
-
356
-					if ($objet_lien == $objet1) {
357
-						objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif);
358
-					} else {
359
-						objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif);
360
-					}
361
-					set_request('id_lien_ajoute', $ids);
362
-					lien_gerer__oups('editer_liens', 'reset');
363
-				}
364
-			}
365
-		}
366
-	}
367
-
368
-
369
-	return $res;
206
+    // compat avec ancienne signature ou le 4eme argument est $editable
207
+    if (!is_array($options)) {
208
+        $options = ['editable' => $options];
209
+    } elseif (!isset($options['editable'])) {
210
+        $options['editable'] = true;
211
+    }
212
+
213
+    $editable = $options['editable'];
214
+
215
+    $res = ['editable' => (bool) $editable];
216
+    [$table_source, $objet, $id_objet, $objet_lien] = determine_source_lien_objet($a, $b, $c);
217
+    if (!$table_source || !$objet || !$objet_lien) {
218
+        return $res;
219
+    }
220
+
221
+
222
+    if (_request('tout_voir')) {
223
+        set_request('recherche', '');
224
+    }
225
+
226
+    include_spip('inc/autoriser');
227
+    if (autoriser('modifier', $objet, $id_objet)) {
228
+        // recuperer le oups du coup d'avant pour le propager à charger() si on ne fait rien par exemple
229
+        lien_gerer__oups('editer_liens', 'request');
230
+
231
+        // annuler les suppressions du coup d'avant ?
232
+        if (
233
+            _request('annuler_oups')
234
+            && ($oups = lien_gerer__oups('editer_liens', 'get'))
235
+        ) {
236
+            if ($oups_objets = charger_fonction("editer_liens_oups_{$table_source}_{$objet}_{$objet_lien}", 'action', true)) {
237
+                $oups_objets($oups);
238
+            } else {
239
+                $objet_source = objet_type($table_source);
240
+                include_spip('action/editer_liens');
241
+                foreach ($oups as $oup) {
242
+                    if ($objet_lien == $objet_source) {
243
+                        objet_associer([$objet_source => $oup[$objet_source]], [$objet => $oup[$objet]], $oup);
244
+                    } else {
245
+                        objet_associer([$objet => $oup[$objet]], [$objet_source => $oup[$objet_source]], $oup);
246
+                    }
247
+                }
248
+            }
249
+            # oups ne persiste que pour la derniere action, si suppression
250
+            lien_gerer__oups('editer_liens', 'reset');
251
+        }
252
+
253
+        $supprimer = _request('supprimer_lien');
254
+        $ajouter = _request('ajouter_lien');
255
+        $ordonner = _request('ordonner_lien');
256
+
257
+        if (_request('desordonner_liens')) {
258
+            include_spip('action/editer_liens');
259
+            objet_qualifier_liens([$objet_lien => '*'], [$objet => $id_objet], ['rang_lien' => 0]);
260
+        }
261
+
262
+        // il est possible de preciser dans une seule variable un remplacement :
263
+        // remplacer_lien[old][new]
264
+        if ($remplacer = _request('remplacer_lien')) {
265
+            foreach ($remplacer as $k => $v) {
266
+                if ($old = lien_verifier_action($k, '')) {
267
+                    foreach (is_array($v) ? $v : [$v] as $kn => $vn) {
268
+                        if ($new = lien_verifier_action($kn, $vn)) {
269
+                            $supprimer[$old] = 'x';
270
+                            $ajouter[$new] = '+';
271
+                        }
272
+                    }
273
+                }
274
+            }
275
+        }
276
+
277
+        if ($supprimer) {
278
+            if (
279
+                $supprimer_objets = charger_fonction(
280
+                    "editer_liens_supprimer_{$table_source}_{$objet}_{$objet_lien}",
281
+                    'action',
282
+                    true
283
+                )
284
+            ) {
285
+                $oups = $supprimer_objets($supprimer);
286
+            } else {
287
+                include_spip('action/editer_liens');
288
+                $oups = [];
289
+
290
+                foreach ($supprimer as $k => $v) {
291
+                    if ($lien = lien_verifier_action($k, $v)) {
292
+                        $lien = explode('-', $lien);
293
+                        [$objet_source, $ids, $objet_lie, $idl, $role] = array_pad($lien, 5, null);
294
+                        // appliquer une condition sur le rôle si défini ('*' pour tous les roles)
295
+                        $cond = (is_null($role) ? [] : ['role' => $role]);
296
+                        if ($objet_lien == $objet_source) {
297
+                            $oups = array_merge(
298
+                                $oups,
299
+                                objet_trouver_liens([$objet_source => $ids], [$objet_lie => $idl], $cond)
300
+                            );
301
+                            objet_dissocier([$objet_source => $ids], [$objet_lie => $idl], $cond);
302
+                        } else {
303
+                            $oups = array_merge(
304
+                                $oups,
305
+                                objet_trouver_liens([$objet_lie => $idl], [$objet_source => $ids], $cond)
306
+                            );
307
+                            objet_dissocier([$objet_lie => $idl], [$objet_source => $ids], $cond);
308
+                        }
309
+                    }
310
+                }
311
+            }
312
+            if (!empty($oups)) {
313
+                lien_gerer__oups('editer_liens', 'set', $oups);
314
+            } else {
315
+                lien_gerer__oups('editer_liens', 'reset');
316
+            }
317
+        }
318
+
319
+        if ($ajouter) {
320
+            if (
321
+                $ajouter_objets = charger_fonction("editer_liens_ajouter_{$table_source}_{$objet}_{$objet_lien}", 'action', true)
322
+            ) {
323
+                $ajout_ok = $ajouter_objets($ajouter);
324
+            } else {
325
+                $ajout_ok = false;
326
+                include_spip('action/editer_liens');
327
+                foreach ($ajouter as $k => $v) {
328
+                    if ($lien = lien_verifier_action($k, $v)) {
329
+                        $ajout_ok = true;
330
+                        [$objet1, $ids, $objet2, $idl] = explode('-', $lien);
331
+                        $qualifs = lien_retrouver_qualif($objet_lien, $lien);
332
+                        if ($objet_lien == $objet1) {
333
+                            lien_ajouter_liaisons($objet1, $ids, $objet2, $idl, $qualifs);
334
+                        } else {
335
+                            lien_ajouter_liaisons($objet2, $idl, $objet1, $ids, $qualifs);
336
+                        }
337
+                        set_request('id_lien_ajoute', $ids);
338
+                    }
339
+                }
340
+            }
341
+            # oups ne persiste que pour la derniere action, si suppression
342
+            # une suppression suivie d'un ajout dans le meme hit est un remplacement
343
+            # non annulable !
344
+            if ($ajout_ok) {
345
+                lien_gerer__oups('editer_liens', 'reset');
346
+            }
347
+        }
348
+
349
+        if ($ordonner) {
350
+            include_spip('action/editer_liens');
351
+            foreach ($ordonner as $k => $rang_lien) {
352
+                if ($lien = lien_verifier_action($k, '')) {
353
+                    [$objet1, $ids, $objet2, $idl] = explode('-', $lien);
354
+                    $qualif = ['rang_lien' => $rang_lien];
355
+
356
+                    if ($objet_lien == $objet1) {
357
+                        objet_qualifier_liens([$objet1 => $ids], [$objet2 => $idl], $qualif);
358
+                    } else {
359
+                        objet_qualifier_liens([$objet2 => $idl], [$objet1 => $ids], $qualif);
360
+                    }
361
+                    set_request('id_lien_ajoute', $ids);
362
+                    lien_gerer__oups('editer_liens', 'reset');
363
+                }
364
+            }
365
+        }
366
+    }
367
+
368
+
369
+    return $res;
370 370
 }
371 371
 
372 372
 
@@ -389,24 +389,24 @@  discard block
 block discarded – undo
389 389
  * @return string Action demandée si trouvée, sinon ''
390 390
  */
391 391
 function lien_verifier_action($k, $v) {
392
-	$action = '';
393
-	if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
394
-		$action = $k;
395
-	}
396
-	if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
397
-		if (is_numeric($k)) {
398
-			$action = $v;
399
-		}
400
-		if (_request($k)) {
401
-			$action = $v;
402
-		}
403
-	}
404
-	// ajout un role null fictif (plus pratique) si pas défini
405
-	if ($action && count(explode('-', $action)) == 4) {
406
-		$action .= '-';
407
-	}
408
-
409
-	return $action;
392
+    $action = '';
393
+    if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $k)) {
394
+        $action = $k;
395
+    }
396
+    if (preg_match(',^\w+-[\w*]+-[\w*]+-[\w*]+(-[\w*])?,', $v)) {
397
+        if (is_numeric($k)) {
398
+            $action = $v;
399
+        }
400
+        if (_request($k)) {
401
+            $action = $v;
402
+        }
403
+    }
404
+    // ajout un role null fictif (plus pratique) si pas défini
405
+    if ($action && count(explode('-', $action)) == 4) {
406
+        $action .= '-';
407
+    }
408
+
409
+    return $action;
410 410
 }
411 411
 
412 412
 
@@ -422,62 +422,62 @@  discard block
 block discarded – undo
422 422
  *   Liste des qualifs pour chaque lien. Tableau vide s'il n'y en a pas.
423 423
  **/
424 424
 function lien_retrouver_qualif($objet_lien, $lien) {
425
-	// un role est défini dans la liaison
426
-	$defs = explode('-', $lien);
427
-	[$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
428
-	$colonne_role = $objet_lien == $objet1 ? roles_colonne($objet1, $objet2) : roles_colonne($objet2, $objet1);
429
-
430
-	// cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
431
-	if ($role) {
432
-		return [
433
-			// un seul lien avec ce role
434
-			[$colonne_role => $role]
435
-		];
436
-	}
437
-
438
-	// retrouver les rôles postés pour cette liaison, s'il y en a.
439
-	$qualifier_lien = _request('qualifier_lien');
440
-	if (!$qualifier_lien || !is_array($qualifier_lien)) {
441
-		return [];
442
-	}
443
-
444
-	// pas avec l'action complete (incluant le role)
445
-	$qualif = [];
446
-	if (
447
-		(!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien])
448
-		&& count($defs) == 5
449
-	) {
450
-		// on tente avec l'action sans le role
451
-		array_pop($defs);
452
-		$lien = implode('-', $defs);
453
-		if (!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien]) {
454
-			$qualif = [];
455
-		}
456
-	}
457
-
458
-	// $qualif de la forme array(role=>array(...),valeur=>array(...),....)
459
-	// on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
460
-	$qualifs = [];
461
-	while (is_countable($qualif) ? count($qualif) : 0) {
462
-		$q = [];
463
-		foreach ($qualif as $att => $values) {
464
-			if (is_array($values)) {
465
-				$q[$att] = array_shift($qualif[$att]);
466
-				if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) {
467
-					unset($qualif[$att]);
468
-				}
469
-			} else {
470
-				$q[$att] = $values;
471
-				unset($qualif[$att]);
472
-			}
473
-		}
474
-		// pas de rôle vide
475
-		if (!$colonne_role || !isset($q[$colonne_role]) || $q[$colonne_role]) {
476
-			$qualifs[] = $q;
477
-		}
478
-	}
479
-
480
-	return $qualifs;
425
+    // un role est défini dans la liaison
426
+    $defs = explode('-', $lien);
427
+    [$objet1, , $objet2, , $role] = array_pad($defs, 5, null);
428
+    $colonne_role = $objet_lien == $objet1 ? roles_colonne($objet1, $objet2) : roles_colonne($objet2, $objet1);
429
+
430
+    // cas ou le role est defini en 5e argument de l'action sur le lien (suppression, ajout rapide sans autre attribut)
431
+    if ($role) {
432
+        return [
433
+            // un seul lien avec ce role
434
+            [$colonne_role => $role]
435
+        ];
436
+    }
437
+
438
+    // retrouver les rôles postés pour cette liaison, s'il y en a.
439
+    $qualifier_lien = _request('qualifier_lien');
440
+    if (!$qualifier_lien || !is_array($qualifier_lien)) {
441
+        return [];
442
+    }
443
+
444
+    // pas avec l'action complete (incluant le role)
445
+    $qualif = [];
446
+    if (
447
+        (!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien])
448
+        && count($defs) == 5
449
+    ) {
450
+        // on tente avec l'action sans le role
451
+        array_pop($defs);
452
+        $lien = implode('-', $defs);
453
+        if (!isset($qualifier_lien[$lien]) || !$qualif = $qualifier_lien[$lien]) {
454
+            $qualif = [];
455
+        }
456
+    }
457
+
458
+    // $qualif de la forme array(role=>array(...),valeur=>array(...),....)
459
+    // on le reforme en array(array(role=>..,valeur=>..,..),array(role=>..,valeur=>..,..),...)
460
+    $qualifs = [];
461
+    while (is_countable($qualif) ? count($qualif) : 0) {
462
+        $q = [];
463
+        foreach ($qualif as $att => $values) {
464
+            if (is_array($values)) {
465
+                $q[$att] = array_shift($qualif[$att]);
466
+                if (!(is_countable($qualif[$att]) ? count($qualif[$att]) : 0)) {
467
+                    unset($qualif[$att]);
468
+                }
469
+            } else {
470
+                $q[$att] = $values;
471
+                unset($qualif[$att]);
472
+            }
473
+        }
474
+        // pas de rôle vide
475
+        if (!$colonne_role || !isset($q[$colonne_role]) || $q[$colonne_role]) {
476
+            $qualifs[] = $q;
477
+        }
478
+    }
479
+
480
+    return $qualifs;
481 481
 }
482 482
 
483 483
 /**
@@ -496,14 +496,14 @@  discard block
 block discarded – undo
496 496
  **/
497 497
 function lien_ajouter_liaisons($objet_source, $ids, $objet_lien, $idl, $qualifs) {
498 498
 
499
-	// retrouver la colonne de roles s'il y en a a lier
500
-	if (is_array($qualifs) && count($qualifs)) {
501
-		foreach ($qualifs as $qualif) {
502
-			objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif);
503
-		}
504
-	} else {
505
-		objet_associer([$objet_source => $ids], [$objet_lien => $idl]);
506
-	}
499
+    // retrouver la colonne de roles s'il y en a a lier
500
+    if (is_array($qualifs) && count($qualifs)) {
501
+        foreach ($qualifs as $qualif) {
502
+            objet_associer([$objet_source => $ids], [$objet_lien => $idl], $qualif);
503
+        }
504
+    } else {
505
+        objet_associer([$objet_source => $ids], [$objet_lien => $idl]);
506
+    }
507 507
 }
508 508
 
509 509
 
@@ -513,77 +513,77 @@  discard block
 block discarded – undo
513 513
  * @return array|string|null
514 514
  */
515 515
 function lien_gerer__oups(string $form, string $action, ?array $valeur = null) {
516
-	static $_oups_value;
517
-
518
-	switch ($action) {
519
-		case 'reset':
520
-			$res = !empty($_oups_value);
521
-			$_oups_value = null;
522
-			return $res;
523
-
524
-		case 'get':
525
-			return $_oups_value ?: null;
526
-
527
-		case 'set':
528
-			$_oups_value = $valeur;
529
-			return true;
530
-
531
-		case 'request':
532
-			$_oups_value = null;
533
-			if ($oups = _request('_oups')) {
534
-				include_spip('inc/filtres');
535
-				// on accepte uniquement une valeur signée
536
-				if ($oups = decoder_contexte_ajax($oups, $form)) {
537
-					if (
538
-						!is_array($oups)
539
-						|| empty($oups['id_auteur'])
540
-						|| $oups['id_auteur'] !== $GLOBALS['visiteur_session']['id_auteur']
541
-						|| empty($oups['time'])
542
-						|| $oups['time'] < $_SERVER['REQUEST_TIME'] - 86400
543
-						|| empty($oups['args'])
544
-						|| $oups['args'] !== lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5))
545
-						|| empty($oups['oups_value'])
546
-					) {
547
-						$oups = null;
548
-					}
549
-					else {
550
-						$oups = $oups['oups_value'];
551
-						// controler le contenu
552
-						foreach ($oups as $k => $oup) {
553
-							if (!is_array($oup)) {
554
-								unset($oups[$k]);
555
-							} else {
556
-								foreach ($oup as $champ => $valeur) {
557
-									if (!is_scalar($champ) || !is_scalar($valeur) || preg_match(',\W,', $champ)) {
558
-										unset($oups[$k][$champ]);
559
-									}
560
-								}
561
-								if (empty($oups[$k])) {
562
-									unset($oups[$k]);
563
-								}
564
-							}
565
-						}
566
-					}
567
-					$_oups_value = $oups;
568
-					return $_oups_value;
569
-				}
570
-			}
571
-			break;
572
-
573
-		case 'hash':
574
-			if (!$_oups_value) {
575
-				return '';
576
-			}
577
-
578
-			include_spip('inc/filtres');
579
-			$oups = [
580
-				'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'] ?? 0,
581
-				'time' => strtotime(date('Y-m-d H:00:00')),
582
-				'args' => lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5)),
583
-				'oups_value' => $_oups_value,
584
-			];
585
-			return encoder_contexte_ajax($oups, $form);
586
-	}
516
+    static $_oups_value;
517
+
518
+    switch ($action) {
519
+        case 'reset':
520
+            $res = !empty($_oups_value);
521
+            $_oups_value = null;
522
+            return $res;
523
+
524
+        case 'get':
525
+            return $_oups_value ?: null;
526
+
527
+        case 'set':
528
+            $_oups_value = $valeur;
529
+            return true;
530
+
531
+        case 'request':
532
+            $_oups_value = null;
533
+            if ($oups = _request('_oups')) {
534
+                include_spip('inc/filtres');
535
+                // on accepte uniquement une valeur signée
536
+                if ($oups = decoder_contexte_ajax($oups, $form)) {
537
+                    if (
538
+                        !is_array($oups)
539
+                        || empty($oups['id_auteur'])
540
+                        || $oups['id_auteur'] !== $GLOBALS['visiteur_session']['id_auteur']
541
+                        || empty($oups['time'])
542
+                        || $oups['time'] < $_SERVER['REQUEST_TIME'] - 86400
543
+                        || empty($oups['args'])
544
+                        || $oups['args'] !== lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5))
545
+                        || empty($oups['oups_value'])
546
+                    ) {
547
+                        $oups = null;
548
+                    }
549
+                    else {
550
+                        $oups = $oups['oups_value'];
551
+                        // controler le contenu
552
+                        foreach ($oups as $k => $oup) {
553
+                            if (!is_array($oup)) {
554
+                                unset($oups[$k]);
555
+                            } else {
556
+                                foreach ($oup as $champ => $valeur) {
557
+                                    if (!is_scalar($champ) || !is_scalar($valeur) || preg_match(',\W,', $champ)) {
558
+                                        unset($oups[$k][$champ]);
559
+                                    }
560
+                                }
561
+                                if (empty($oups[$k])) {
562
+                                    unset($oups[$k]);
563
+                                }
564
+                            }
565
+                        }
566
+                    }
567
+                    $_oups_value = $oups;
568
+                    return $_oups_value;
569
+                }
570
+            }
571
+            break;
572
+
573
+        case 'hash':
574
+            if (!$_oups_value) {
575
+                return '';
576
+            }
577
+
578
+            include_spip('inc/filtres');
579
+            $oups = [
580
+                'id_auteur' => $GLOBALS['visiteur_session']['id_auteur'] ?? 0,
581
+                'time' => strtotime(date('Y-m-d H:00:00')),
582
+                'args' => lien_gerer__oups_collecter_args($form, debug_backtrace(0, 5)),
583
+                'oups_value' => $_oups_value,
584
+            ];
585
+            return encoder_contexte_ajax($oups, $form);
586
+    }
587 587
 }
588 588
 
589 589
 /**
@@ -593,19 +593,19 @@  discard block
 block discarded – undo
593 593
  * @return string
594 594
  */
595 595
 function lien_gerer__oups_collecter_args($form, $trace) {
596
-	$args = '';
597
-	if (!empty($trace)) {
598
-		do {
599
-			$t = array_shift($trace);
600
-			$function = $t['function'] ?? '';
601
-			if (str_starts_with((string) $function, 'formulaires_' . $form)) {
602
-				if (isset($t['args'])) {
603
-					$args = json_encode($t['args'], JSON_THROW_ON_ERROR);
604
-				}
605
-				break;
606
-			}
607
-		}
608
-		while (count($trace));
609
-	}
610
-	return $args;
596
+    $args = '';
597
+    if (!empty($trace)) {
598
+        do {
599
+            $t = array_shift($trace);
600
+            $function = $t['function'] ?? '';
601
+            if (str_starts_with((string) $function, 'formulaires_' . $form)) {
602
+                if (isset($t['args'])) {
603
+                    $args = json_encode($t['args'], JSON_THROW_ON_ERROR);
604
+                }
605
+                break;
606
+            }
607
+        }
608
+        while (count($trace));
609
+    }
610
+    return $args;
611 611
 }
Please login to merge, or discard this patch.
prive/formulaires/rediriger_article.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -10,65 +10,65 @@
 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_rediriger_article_charger_dist($id_article, $retour = '') {
17 17
 
18
-	include_spip('inc/autoriser');
19
-	if (!autoriser('modifier', 'article', $id_article)) {
20
-		return false;
21
-	}
22
-
23
-	$row = sql_fetsel('id_article,virtuel', 'spip_articles', 'id_article=' . (int) $id_article);
24
-	if (!$row['id_article']) {
25
-		return false;
26
-	}
27
-	include_spip('inc/lien');
28
-	$redirection = virtuel_redirige($row['virtuel']);
29
-
30
-	if (
31
-		!$redirection
32
-		&& $GLOBALS['meta']['articles_redirection'] != 'oui'
33
-	) {
34
-		return false;
35
-	}
36
-
37
-
38
-	include_spip('inc/texte');
39
-	include_spip('inc/filtres_ecrire');
40
-
41
-	return [
42
-		'redirection' => $redirection,
43
-		'id' => $id_article,
44
-		'_afficher_url' => ($redirection ? lien_article_virtuel($redirection) : ''),
45
-	];
18
+    include_spip('inc/autoriser');
19
+    if (!autoriser('modifier', 'article', $id_article)) {
20
+        return false;
21
+    }
22
+
23
+    $row = sql_fetsel('id_article,virtuel', 'spip_articles', 'id_article=' . (int) $id_article);
24
+    if (!$row['id_article']) {
25
+        return false;
26
+    }
27
+    include_spip('inc/lien');
28
+    $redirection = virtuel_redirige($row['virtuel']);
29
+
30
+    if (
31
+        !$redirection
32
+        && $GLOBALS['meta']['articles_redirection'] != 'oui'
33
+    ) {
34
+        return false;
35
+    }
36
+
37
+
38
+    include_spip('inc/texte');
39
+    include_spip('inc/filtres_ecrire');
40
+
41
+    return [
42
+        'redirection' => $redirection,
43
+        'id' => $id_article,
44
+        '_afficher_url' => ($redirection ? lien_article_virtuel($redirection) : ''),
45
+    ];
46 46
 }
47 47
 
48 48
 function formulaires_rediriger_article_verifier_dist($id_article, $retour = '') {
49
-	$erreurs = [];
49
+    $erreurs = [];
50 50
 
51
-	if (($redirection = _request('redirection')) == $id_article || $redirection == 'art' . $id_article) {
52
-		$erreurs['redirection'] = _T('info_redirection_boucle');
53
-	}
51
+    if (($redirection = _request('redirection')) == $id_article || $redirection == 'art' . $id_article) {
52
+        $erreurs['redirection'] = _T('info_redirection_boucle');
53
+    }
54 54
 
55
-	return $erreurs;
55
+    return $erreurs;
56 56
 }
57 57
 
58 58
 function formulaires_rediriger_article_traiter_dist($id_article, $retour = '') {
59 59
 
60
-	$url = preg_replace(',^\s*https?://$,i', '', rtrim((string) _request('redirection')));
61
-	if ($url) {
62
-		$url = corriger_caracteres($url);
63
-	}
60
+    $url = preg_replace(',^\s*https?://$,i', '', rtrim((string) _request('redirection')));
61
+    if ($url) {
62
+        $url = corriger_caracteres($url);
63
+    }
64 64
 
65
-	include_spip('action/editer_article');
66
-	article_modifier($id_article, ['virtuel' => $url]);
65
+    include_spip('action/editer_article');
66
+    article_modifier($id_article, ['virtuel' => $url]);
67 67
 
68
-	$js = _AJAX ? '<script type="text/javascript">if (window.ajaxReload) ajaxReload("wysiwyg");</script>' : '';
68
+    $js = _AJAX ? '<script type="text/javascript">if (window.ajaxReload) ajaxReload("wysiwyg");</script>' : '';
69 69
 
70
-	return [
71
-		'message_ok' => ($url ? _T('info_redirection_activee') : _T('info_redirection_desactivee')) . $js,
72
-		'editable' => true
73
-	];
70
+    return [
71
+        'message_ok' => ($url ? _T('info_redirection_activee') : _T('info_redirection_desactivee')) . $js,
72
+        'editable' => true
73
+    ];
74 74
 }
Please login to merge, or discard this patch.
prive/formulaires/editer_auteur.php 1 patch
Indentation   +369 added lines, -369 removed lines patch added patch discarded remove patch
@@ -7,7 +7,7 @@  discard block
 block discarded – undo
7 7
  **/
8 8
 
9 9
 if (!defined('_ECRIRE_INC_VERSION')) {
10
-	return;
10
+    return;
11 11
 }
12 12
 
13 13
 include_spip('inc/actions');
@@ -38,24 +38,24 @@  discard block
 block discarded – undo
38 38
  *     Environnement du formulaire
39 39
  **/
40 40
 function formulaires_editer_auteur_charger_dist(
41
-	$id_auteur = 'new',
42
-	$retour = '',
43
-	$associer_objet = '',
44
-	$config_fonc = 'auteurs_edit_config',
45
-	$row = [],
46
-	$hidden = ''
41
+    $id_auteur = 'new',
42
+    $retour = '',
43
+    $associer_objet = '',
44
+    $config_fonc = 'auteurs_edit_config',
45
+    $row = [],
46
+    $hidden = ''
47 47
 ) {
48
-	$valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
49
-	$valeurs['new_login'] = $valeurs['login'];
48
+    $valeurs = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
49
+    $valeurs['new_login'] = $valeurs['login'];
50 50
 
51
-	// S'il n'y a pas la langue, on prend la langue du site
52
-	$valeurs['langue'] = $valeurs['langue'] ?: $GLOBALS['meta']['langue_site'];
51
+    // S'il n'y a pas la langue, on prend la langue du site
52
+    $valeurs['langue'] = $valeurs['langue'] ?: $GLOBALS['meta']['langue_site'];
53 53
 
54
-	if (!autoriser('modifier', 'auteur', (int) $id_auteur)) {
55
-		$valeurs['editable'] = '';
56
-	}
54
+    if (!autoriser('modifier', 'auteur', (int) $id_auteur)) {
55
+        $valeurs['editable'] = '';
56
+    }
57 57
 
58
-	return $valeurs;
58
+    return $valeurs;
59 59
 }
60 60
 
61 61
 /**
@@ -79,14 +79,14 @@  discard block
 block discarded – undo
79 79
  *     Hash du formulaire
80 80
  */
81 81
 function formulaires_editer_auteur_identifier_dist(
82
-	$id_auteur = 'new',
83
-	$retour = '',
84
-	$associer_objet = '',
85
-	$config_fonc = 'auteurs_edit_config',
86
-	$row = [],
87
-	$hidden = ''
82
+    $id_auteur = 'new',
83
+    $retour = '',
84
+    $associer_objet = '',
85
+    $config_fonc = 'auteurs_edit_config',
86
+    $row = [],
87
+    $hidden = ''
88 88
 ) {
89
-	return serialize([(int) $id_auteur, $associer_objet]);
89
+    return serialize([(int) $id_auteur, $associer_objet]);
90 90
 }
91 91
 
92 92
 
@@ -100,27 +100,27 @@  discard block
 block discarded – undo
100 100
  */
101 101
 function auteurs_edit_config(array $row): array {
102 102
 
103
-	$config = [];
104
-	$config['lignes'] = 8;
105
-	$config['langue'] = $GLOBALS['spip_lang'];
106
-
107
-	// pour instituer_auteur
108
-	$config['auteur'] = $row;
109
-
110
-	//$config['restreint'] = ($row['statut'] == 'publie');
111
-	$auth_methode = $row['source'];
112
-	include_spip('inc/auth');
113
-	$config['edit_login'] = (
114
-		auth_autoriser_modifier_login($auth_methode)
115
-		&& autoriser('modifier', 'auteur', $row['id_auteur'], null, ['login' => true])
116
-		&& autoriser('modifier', 'auteur', $row['id_auteur'], null, ['email' => true])
117
-	);
118
-	$config['edit_pass'] = (
119
-			auth_autoriser_modifier_pass($auth_methode)
120
-			&& autoriser('modifier', 'auteur', $row['id_auteur'])
121
-	);
122
-
123
-	return $config;
103
+    $config = [];
104
+    $config['lignes'] = 8;
105
+    $config['langue'] = $GLOBALS['spip_lang'];
106
+
107
+    // pour instituer_auteur
108
+    $config['auteur'] = $row;
109
+
110
+    //$config['restreint'] = ($row['statut'] == 'publie');
111
+    $auth_methode = $row['source'];
112
+    include_spip('inc/auth');
113
+    $config['edit_login'] = (
114
+        auth_autoriser_modifier_login($auth_methode)
115
+        && autoriser('modifier', 'auteur', $row['id_auteur'], null, ['login' => true])
116
+        && autoriser('modifier', 'auteur', $row['id_auteur'], null, ['email' => true])
117
+    );
118
+    $config['edit_pass'] = (
119
+            auth_autoriser_modifier_pass($auth_methode)
120
+            && autoriser('modifier', 'auteur', $row['id_auteur'])
121
+    );
122
+
123
+    return $config;
124 124
 }
125 125
 
126 126
 /**
@@ -150,145 +150,145 @@  discard block
 block discarded – undo
150 150
  *     Erreurs des saisies
151 151
  **/
152 152
 function formulaires_editer_auteur_verifier_dist(
153
-	$id_auteur = 'new',
154
-	$retour = '',
155
-	$associer_objet = '',
156
-	$config_fonc = 'auteurs_edit_config',
157
-	$row = [],
158
-	$hidden = ''
153
+    $id_auteur = 'new',
154
+    $retour = '',
155
+    $associer_objet = '',
156
+    $config_fonc = 'auteurs_edit_config',
157
+    $row = [],
158
+    $hidden = ''
159 159
 ) {
160
-	// auto-renseigner le nom si il n'existe pas, sans couper
161
-	titre_automatique('nom', ['email', 'login'], 255);
162
-
163
-	$oblis = ['nom'];
164
-	// si on veut renvoyer des identifiants il faut un email et un login
165
-	if (_request('reset_password')) {
166
-		$oblis[] = 'email';
167
-		$oblis[] = 'new_login';
168
-	}
169
-	// mais il reste obligatoire si on a rien trouve
170
-	$erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
171
-	if (isset($erreurs['new_login'])) {
172
-		$erreurs['login'] = $erreurs['new_login'];
173
-		unset($erreurs['new_login']);
174
-	}
175
-
176
-	$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
177
-	$auth_methode = ($auth_methode ?: 'spip');
178
-	include_spip('inc/auth');
179
-
180
-	if (!nom_acceptable(_request('nom'))) {
181
-		$erreurs['nom'] = _T('info_nom_pas_conforme');
182
-	}
183
-
184
-	if ($email = _request('email')) {
185
-		include_spip('inc/filtres');
186
-		include_spip('inc/autoriser');
187
-		// un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
188
-		if (
189
-			!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])
190
-			&& $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
191
-			&& !strlen(trim((string) $email))
192
-			&& $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
193
-		) {
194
-			$erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
195
-		} else {
196
-			if (!email_valide($email)) {
197
-				$erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
198
-			}
199
-		}
200
-		# Ne pas autoriser d'avoir deux auteurs avec le même email
201
-		# cette fonctionalité nécessite que la base soit clean à l'activation : pas de
202
-		# doublon sur la requête select email,count(*) from spip_auteurs group by email ;
203
-		if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
204
-			#Nouvel auteur
205
-			if ((int) $id_auteur == 0) {
206
-				#Un auteur existe deja avec cette adresse ?
207
-				if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
208
-					$erreurs['email'] = _T('erreur_email_deja_existant');
209
-				}
210
-			} else {
211
-				#Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
212
-				if (
213
-					sql_countsel(
214
-						'spip_auteurs',
215
-						'email=' . sql_quote($email)
216
-					) > 0
217
-					&& $id_auteur != ($id_auteur_ancien = sql_getfetsel(
218
-						'id_auteur',
219
-						'spip_auteurs',
220
-						'email=' . sql_quote($email)
221
-					))
222
-				) {
223
-					$erreurs['email'] = _T('erreur_email_deja_existant');
224
-				}
225
-			}
226
-		}
227
-	}
228
-
229
-	// quand c'est un auteur existant on fait le reset password ici
230
-	if (!(is_countable($erreurs) ? count($erreurs) : 0) && _request('reset_password') && (int) $id_auteur) {
231
-		return auteur_reset_password($id_auteur, $erreurs);
232
-	}
233
-
234
-	// corriger un cas si frequent : www.example.org sans le http:// qui precede
235
-	if (
236
-		($url = _request('url_site'))
237
-		&& !tester_url_absolue($url)
238
-		&& (!str_contains((string) $url, ':')
239
-		&& strncasecmp((string) $url, 'www.', 4) === 0)
240
-	) {
241
-		$url = 'http://' . $url;
242
-		set_request('url_site', $url);
243
-	}
244
-	// traiter les liens implicites avant de tester l'url
245
-	include_spip('inc/lien');
246
-	if (($url = calculer_url(_request('url_site'))) && !tester_url_absolue($url)) {
247
-		$erreurs['url_site'] = _T('info_url_site_pas_conforme');
248
-	}
249
-
250
-	$erreurs['message_erreur'] = '';
251
-	if (_request('login')) {
252
-		// on n'est jamais cense poster le name 'login'
253
-		$erreurs['login'] = _T('info_non_modifiable');
254
-	}
255
-	elseif (
256
-		($login = _request('new_login')) && $login !== sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur)
257
-	) {
258
-		// on verifie la meme chose que dans auteurs_edit_config()
259
-		if (
260
-			! auth_autoriser_modifier_login($auth_methode)
261
-			|| !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['login' => true])
262
-			// legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
263
-			|| !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['email' => true])
264
-		) {
265
-			$erreurs['login'] = _T('info_non_modifiable');
266
-		}
267
-	}
268
-
269
-	if (empty($erreurs['login'])) {
270
-		if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
271
-			$erreurs['login'] = $err;
272
-			$erreurs['message_erreur'] .= $err;
273
-		} else {
274
-			// pass trop court ou confirmation non identique
275
-			if ($p = _request('new_pass')) {
276
-				if ($p != _request('new_pass2')) {
277
-					$erreurs['new_pass'] = _T('info_passes_identiques');
278
-					$erreurs['message_erreur'] .= _T('info_passes_identiques');
279
-				} elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
280
-					$erreurs['new_pass'] = $err;
281
-					$erreurs['message_erreur'] .= $err;
282
-				}
283
-			}
284
-		}
285
-	}
286
-
287
-	if (!$erreurs['message_erreur']) {
288
-		unset($erreurs['message_erreur']);
289
-	}
290
-
291
-	return $erreurs;
160
+    // auto-renseigner le nom si il n'existe pas, sans couper
161
+    titre_automatique('nom', ['email', 'login'], 255);
162
+
163
+    $oblis = ['nom'];
164
+    // si on veut renvoyer des identifiants il faut un email et un login
165
+    if (_request('reset_password')) {
166
+        $oblis[] = 'email';
167
+        $oblis[] = 'new_login';
168
+    }
169
+    // mais il reste obligatoire si on a rien trouve
170
+    $erreurs = formulaires_editer_objet_verifier('auteur', $id_auteur, $oblis);
171
+    if (isset($erreurs['new_login'])) {
172
+        $erreurs['login'] = $erreurs['new_login'];
173
+        unset($erreurs['new_login']);
174
+    }
175
+
176
+    $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
177
+    $auth_methode = ($auth_methode ?: 'spip');
178
+    include_spip('inc/auth');
179
+
180
+    if (!nom_acceptable(_request('nom'))) {
181
+        $erreurs['nom'] = _T('info_nom_pas_conforme');
182
+    }
183
+
184
+    if ($email = _request('email')) {
185
+        include_spip('inc/filtres');
186
+        include_spip('inc/autoriser');
187
+        // un redacteur qui modifie son email n'a pas le droit de le vider si il y en avait un
188
+        if (
189
+            !autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])
190
+            && $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
191
+            && !strlen(trim((string) $email))
192
+            && $email != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
193
+        ) {
194
+            $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
195
+        } else {
196
+            if (!email_valide($email)) {
197
+                $erreurs['email'] = (($id_auteur == $GLOBALS['visiteur_session']['id_auteur']) ? _T('form_email_non_valide') : _T('form_prop_indiquer_email'));
198
+            }
199
+        }
200
+        # Ne pas autoriser d'avoir deux auteurs avec le même email
201
+        # cette fonctionalité nécessite que la base soit clean à l'activation : pas de
202
+        # doublon sur la requête select email,count(*) from spip_auteurs group by email ;
203
+        if (defined('_INTERDIRE_AUTEUR_MEME_EMAIL')) {
204
+            #Nouvel auteur
205
+            if ((int) $id_auteur == 0) {
206
+                #Un auteur existe deja avec cette adresse ?
207
+                if (sql_countsel('spip_auteurs', 'email=' . sql_quote($email)) > 0) {
208
+                    $erreurs['email'] = _T('erreur_email_deja_existant');
209
+                }
210
+            } else {
211
+                #Un auteur existe deja avec cette adresse ? et n'est pas le user courant.
212
+                if (
213
+                    sql_countsel(
214
+                        'spip_auteurs',
215
+                        'email=' . sql_quote($email)
216
+                    ) > 0
217
+                    && $id_auteur != ($id_auteur_ancien = sql_getfetsel(
218
+                        'id_auteur',
219
+                        'spip_auteurs',
220
+                        'email=' . sql_quote($email)
221
+                    ))
222
+                ) {
223
+                    $erreurs['email'] = _T('erreur_email_deja_existant');
224
+                }
225
+            }
226
+        }
227
+    }
228
+
229
+    // quand c'est un auteur existant on fait le reset password ici
230
+    if (!(is_countable($erreurs) ? count($erreurs) : 0) && _request('reset_password') && (int) $id_auteur) {
231
+        return auteur_reset_password($id_auteur, $erreurs);
232
+    }
233
+
234
+    // corriger un cas si frequent : www.example.org sans le http:// qui precede
235
+    if (
236
+        ($url = _request('url_site'))
237
+        && !tester_url_absolue($url)
238
+        && (!str_contains((string) $url, ':')
239
+        && strncasecmp((string) $url, 'www.', 4) === 0)
240
+    ) {
241
+        $url = 'http://' . $url;
242
+        set_request('url_site', $url);
243
+    }
244
+    // traiter les liens implicites avant de tester l'url
245
+    include_spip('inc/lien');
246
+    if (($url = calculer_url(_request('url_site'))) && !tester_url_absolue($url)) {
247
+        $erreurs['url_site'] = _T('info_url_site_pas_conforme');
248
+    }
249
+
250
+    $erreurs['message_erreur'] = '';
251
+    if (_request('login')) {
252
+        // on n'est jamais cense poster le name 'login'
253
+        $erreurs['login'] = _T('info_non_modifiable');
254
+    }
255
+    elseif (
256
+        ($login = _request('new_login')) && $login !== sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur)
257
+    ) {
258
+        // on verifie la meme chose que dans auteurs_edit_config()
259
+        if (
260
+            ! auth_autoriser_modifier_login($auth_methode)
261
+            || !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['login' => true])
262
+            // legacy : ne pas risquer d'autoriser la modif login si fonction d'autorisation pas mise a jour et ne teste que l'option email
263
+            || !autoriser('modifier', 'auteur', (int) $id_auteur, null, ['email' => true])
264
+        ) {
265
+            $erreurs['login'] = _T('info_non_modifiable');
266
+        }
267
+    }
268
+
269
+    if (empty($erreurs['login'])) {
270
+        if ($err = auth_verifier_login($auth_methode, _request('new_login'), $id_auteur)) {
271
+            $erreurs['login'] = $err;
272
+            $erreurs['message_erreur'] .= $err;
273
+        } else {
274
+            // pass trop court ou confirmation non identique
275
+            if ($p = _request('new_pass')) {
276
+                if ($p != _request('new_pass2')) {
277
+                    $erreurs['new_pass'] = _T('info_passes_identiques');
278
+                    $erreurs['message_erreur'] .= _T('info_passes_identiques');
279
+                } elseif ($err = auth_verifier_pass($auth_methode, _request('new_login'), $p, $id_auteur)) {
280
+                    $erreurs['new_pass'] = $err;
281
+                    $erreurs['message_erreur'] .= $err;
282
+                }
283
+            }
284
+        }
285
+    }
286
+
287
+    if (!$erreurs['message_erreur']) {
288
+        unset($erreurs['message_erreur']);
289
+    }
290
+
291
+    return $erreurs;
292 292
 }
293 293
 
294 294
 
@@ -325,153 +325,153 @@  discard block
 block discarded – undo
325 325
  *     Retour des traitements
326 326
  **/
327 327
 function formulaires_editer_auteur_traiter_dist(
328
-	$id_auteur = 'new',
329
-	$retour = '',
330
-	$associer_objet = '',
331
-	$config_fonc = 'auteurs_edit_config',
332
-	$row = [],
333
-	$hidden = ''
328
+    $id_auteur = 'new',
329
+    $retour = '',
330
+    $associer_objet = '',
331
+    $config_fonc = 'auteurs_edit_config',
332
+    $row = [],
333
+    $hidden = ''
334 334
 ) {
335
-	if (_request('saisie_webmestre') || _request('webmestre')) {
336
-		set_request('webmestre', _request('webmestre') ?: 'non');
337
-	}
338
-
339
-	// si il y a des modifs sensibles (statut, mot de passe), on refuse le traitement en ajax
340
-	// le formulaire ne peut être traité depuis une XMLHttpRequest
341
-	$prev = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
342
-	if (
343
-		_request('new_pass') // nouveau mot de passe
344
-		|| empty($prev['statut']) // creation auteur
345
-		|| _request('email') && $prev['email'] !== _request('email') // modification email
346
-		|| _request('statut') === '0minirezo' && $prev['statut'] !== '0minirezo' // promotion 0minirezo
347
-		|| _request('statut') && (int) _request('statut') < (int) $prev['statut'] // promotion de statut
348
-		|| _request('webmestre') && _request('webmestre') !== 'non' && $prev['webmestre'] !== 'oui' // promotion webmestre
349
-	) {
350
-		refuser_traiter_formulaire_ajax();
351
-		// si on arrive là encore en ajax c'est pas OK, on genere une erreur
352
-		if (_AJAX || !empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
353
-			return [
354
-				'message_erreur' => _T('erreur_technique_ajaxform')
355
-			];
356
-		}
357
-	}
358
-
359
-	$id_objet = null;
360
-	$retour = parametre_url($retour, 'email_confirm', '');
361
-
362
-	if ($restreintes = _request('restreintes')) {
363
-		foreach ($restreintes as $k => $v) {
364
-			if (str_starts_with((string) $v, 'rubrique|')) {
365
-				$restreintes[$k] = substr((string) $v, 9);
366
-			}
367
-		}
368
-		set_request('restreintes', $restreintes);
369
-	}
370
-
371
-	set_request(
372
-		'email',
373
-		email_valide(_request('email'))
374
-	); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
375
-	// "[email protected]  " ou encore "Marie Toto <[email protected]>"
376
-
377
-	include_spip('inc/autoriser');
378
-	if (!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])) {
379
-		$email_nouveau = _request('email');
380
-		set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
381
-		// mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
382
-		// pour qu'il confirme qu'il possede bien cette adresse
383
-		// son clic sur l'url du message permettre de confirmer le changement
384
-		// et de revenir sur son profil
385
-		if (
386
-			$GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
387
-			&& $email_nouveau != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
388
-		) {
389
-			$envoyer_mail = charger_fonction('envoyer_mail', 'inc');
390
-			$texte = _T(
391
-				'form_auteur_mail_confirmation',
392
-				[
393
-					'url' => generer_action_auteur(
394
-						'confirmer_email',
395
-						$email_nouveau,
396
-						parametre_url($retour, 'email_modif', 'ok')
397
-					)
398
-				]
399
-			);
400
-			$envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
401
-			set_request('email_confirm', $email_nouveau);
402
-			if ($email_ancien) {
403
-				$envoyer_mail(
404
-					$email_ancien,
405
-					_T('form_auteur_confirmation'),
406
-					_T('form_auteur_envoi_mail_confirmation', ['email' => $email_nouveau])
407
-				);
408
-			}
409
-			$retour = parametre_url($retour, 'email_confirm', $email_nouveau);
410
-		}
411
-	}
412
-
413
-	// Trafic de langue pour enregistrer la bonne
414
-	if ($langue = _request('langue')) {
415
-		set_request('lang', $langue);
416
-	}
417
-
418
-	$res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
419
-
420
-	if (_request('reset_password') && !(int) $id_auteur && (int) $res['id_auteur']) {
421
-		$erreurs = [];
422
-		$erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
423
-		if (isset($erreurs['message_ok'])) {
424
-			if (!isset($res['message_ok'])) { $res['message_ok'] = '';
425
-			}
426
-			$res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
427
-		}
428
-		if (isset($erreurs['message_erreur']) && $erreurs['message_erreur']) {
429
-			if (!isset($res['message_erreur'])) { $res['message_erreur'] = '';
430
-			}
431
-			$res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
432
-		}
433
-	}
434
-
435
-	// Un lien auteur a prendre en compte ?
436
-	if ($associer_objet && ($id_auteur = $res['id_auteur'])) {
437
-		$objet = '';
438
-		if ((int) $associer_objet) {
439
-			$objet = 'article';
440
-			$id_objet = (int) $associer_objet;
441
-		} elseif (preg_match(',^\w+\|\d+$,', $associer_objet)) {
442
-			[$objet, $id_objet] = explode('|', $associer_objet);
443
-		}
444
-		if ((bool) $objet && (bool) $id_objet && autoriser('modifier', $objet, $id_objet)) {
445
-			include_spip('action/editer_auteur');
446
-			auteur_associer($id_auteur, [$objet => $id_objet]);
447
-			if (isset($res['redirect'])) {
448
-				$res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
449
-			}
450
-		}
451
-	}
452
-
453
-	return $res;
335
+    if (_request('saisie_webmestre') || _request('webmestre')) {
336
+        set_request('webmestre', _request('webmestre') ?: 'non');
337
+    }
338
+
339
+    // si il y a des modifs sensibles (statut, mot de passe), on refuse le traitement en ajax
340
+    // le formulaire ne peut être traité depuis une XMLHttpRequest
341
+    $prev = formulaires_editer_objet_charger('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
342
+    if (
343
+        _request('new_pass') // nouveau mot de passe
344
+        || empty($prev['statut']) // creation auteur
345
+        || _request('email') && $prev['email'] !== _request('email') // modification email
346
+        || _request('statut') === '0minirezo' && $prev['statut'] !== '0minirezo' // promotion 0minirezo
347
+        || _request('statut') && (int) _request('statut') < (int) $prev['statut'] // promotion de statut
348
+        || _request('webmestre') && _request('webmestre') !== 'non' && $prev['webmestre'] !== 'oui' // promotion webmestre
349
+    ) {
350
+        refuser_traiter_formulaire_ajax();
351
+        // si on arrive là encore en ajax c'est pas OK, on genere une erreur
352
+        if (_AJAX || !empty($_SERVER['HTTP_X_REQUESTED_WITH'])) {
353
+            return [
354
+                'message_erreur' => _T('erreur_technique_ajaxform')
355
+            ];
356
+        }
357
+    }
358
+
359
+    $id_objet = null;
360
+    $retour = parametre_url($retour, 'email_confirm', '');
361
+
362
+    if ($restreintes = _request('restreintes')) {
363
+        foreach ($restreintes as $k => $v) {
364
+            if (str_starts_with((string) $v, 'rubrique|')) {
365
+                $restreintes[$k] = substr((string) $v, 9);
366
+            }
367
+        }
368
+        set_request('restreintes', $restreintes);
369
+    }
370
+
371
+    set_request(
372
+        'email',
373
+        email_valide(_request('email'))
374
+    ); // eviter d'enregistrer les cas qui sont acceptés par email_valide dans le verifier :
375
+    // "[email protected]  " ou encore "Marie Toto <[email protected]>"
376
+
377
+    include_spip('inc/autoriser');
378
+    if (!autoriser('modifier', 'auteur', $id_auteur, null, ['email' => '?'])) {
379
+        $email_nouveau = _request('email');
380
+        set_request('email'); // vider la saisie car l'auteur n'a pas le droit de modifier cet email
381
+        // mais si c'est son propre profil on lui envoie un email à l'adresse qu'il a indique
382
+        // pour qu'il confirme qu'il possede bien cette adresse
383
+        // son clic sur l'url du message permettre de confirmer le changement
384
+        // et de revenir sur son profil
385
+        if (
386
+            $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur
387
+            && $email_nouveau != ($email_ancien = sql_getfetsel('email', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur))
388
+        ) {
389
+            $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
390
+            $texte = _T(
391
+                'form_auteur_mail_confirmation',
392
+                [
393
+                    'url' => generer_action_auteur(
394
+                        'confirmer_email',
395
+                        $email_nouveau,
396
+                        parametre_url($retour, 'email_modif', 'ok')
397
+                    )
398
+                ]
399
+            );
400
+            $envoyer_mail($email_nouveau, _T('form_auteur_confirmation'), $texte);
401
+            set_request('email_confirm', $email_nouveau);
402
+            if ($email_ancien) {
403
+                $envoyer_mail(
404
+                    $email_ancien,
405
+                    _T('form_auteur_confirmation'),
406
+                    _T('form_auteur_envoi_mail_confirmation', ['email' => $email_nouveau])
407
+                );
408
+            }
409
+            $retour = parametre_url($retour, 'email_confirm', $email_nouveau);
410
+        }
411
+    }
412
+
413
+    // Trafic de langue pour enregistrer la bonne
414
+    if ($langue = _request('langue')) {
415
+        set_request('lang', $langue);
416
+    }
417
+
418
+    $res = formulaires_editer_objet_traiter('auteur', $id_auteur, 0, 0, $retour, $config_fonc, $row, $hidden);
419
+
420
+    if (_request('reset_password') && !(int) $id_auteur && (int) $res['id_auteur']) {
421
+        $erreurs = [];
422
+        $erreurs = auteur_reset_password($res['id_auteur'], $erreurs);
423
+        if (isset($erreurs['message_ok'])) {
424
+            if (!isset($res['message_ok'])) { $res['message_ok'] = '';
425
+            }
426
+            $res['message_ok'] = trim($res['message_ok'] . ' ' . $erreurs['message_ok']);
427
+        }
428
+        if (isset($erreurs['message_erreur']) && $erreurs['message_erreur']) {
429
+            if (!isset($res['message_erreur'])) { $res['message_erreur'] = '';
430
+            }
431
+            $res['message_erreur'] = trim($res['message_erreur'] . ' ' . $erreurs['message_erreur']);
432
+        }
433
+    }
434
+
435
+    // Un lien auteur a prendre en compte ?
436
+    if ($associer_objet && ($id_auteur = $res['id_auteur'])) {
437
+        $objet = '';
438
+        if ((int) $associer_objet) {
439
+            $objet = 'article';
440
+            $id_objet = (int) $associer_objet;
441
+        } elseif (preg_match(',^\w+\|\d+$,', $associer_objet)) {
442
+            [$objet, $id_objet] = explode('|', $associer_objet);
443
+        }
444
+        if ((bool) $objet && (bool) $id_objet && autoriser('modifier', $objet, $id_objet)) {
445
+            include_spip('action/editer_auteur');
446
+            auteur_associer($id_auteur, [$objet => $id_objet]);
447
+            if (isset($res['redirect'])) {
448
+                $res['redirect'] = parametre_url($res['redirect'], 'id_lien_ajoute', $id_auteur, '&');
449
+            }
450
+        }
451
+    }
452
+
453
+    return $res;
454 454
 }
455 455
 
456 456
 
457 457
 function auteur_reset_password($id_auteur, $erreurs = []) {
458
-	$auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
459
-	$config = auteurs_edit_config($auteur);
460
-
461
-	if ($config['edit_pass']) {
462
-		if ($email = auteur_regenerer_identifiants($id_auteur)) {
463
-			$erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', ['email' => $email]);
464
-			$erreurs['message_erreur'] = '';
465
-		} elseif ($email === false) {
466
-			$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
467
-		} else {
468
-			$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
469
-		}
470
-	} else {
471
-		$erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
472
-	}
473
-
474
-	return $erreurs;
458
+    $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
459
+    $config = auteurs_edit_config($auteur);
460
+
461
+    if ($config['edit_pass']) {
462
+        if ($email = auteur_regenerer_identifiants($id_auteur)) {
463
+            $erreurs['message_ok'] = _T('message_nouveaux_identifiants_ok', ['email' => $email]);
464
+            $erreurs['message_erreur'] = '';
465
+        } elseif ($email === false) {
466
+            $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec_envoi');
467
+        } else {
468
+            $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
469
+        }
470
+    } else {
471
+        $erreurs['message_erreur'] = _T('message_nouveaux_identifiants_echec');
472
+    }
473
+
474
+    return $erreurs;
475 475
 }
476 476
 
477 477
 /**
@@ -482,50 +482,50 @@  discard block
 block discarded – undo
482 482
  * @return string
483 483
  */
484 484
 function auteur_regenerer_identifiants($id_auteur, $notifier = true, $contexte = []) {
485
-	if ($id_auteur) {
486
-		$set = [];
487
-		include_spip('inc/access');
488
-		$set['pass'] = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16));
489
-
490
-		include_spip('action/editer_auteur');
491
-		auteur_modifier($id_auteur, $set);
492
-
493
-		$row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
494
-		include_spip('inc/filtres');
495
-		if (
496
-			$notifier
497
-			&& $row['email']
498
-			&& email_valide($row['email'])
499
-			&& trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')
500
-		) {
501
-			// envoyer l'email avec login/pass
502
-			$c = [
503
-				'id_auteur' => $id_auteur,
504
-				'nom' => $row['nom'],
505
-				'mode' => $row['statut'],
506
-				'email' => $row['email'],
507
-				'pass' => $set['pass'],
508
-			];
509
-			// on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
510
-			$contexte = array_merge($contexte, $c);
511
-			// si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
512
-			// plutot que celle de l'admin qui vient de cliquer sur le bouton
513
-			if (!isset($contexte['lang']) || !$contexte['lang']) {
514
-				$contexte['lang'] = isset($row['lang']) && $row['lang']
515
-					? $row['lang']
516
-					: $GLOBALS['meta']['langue_site'];
517
-			}
518
-			lang_select($contexte['lang']);
519
-			$message = recuperer_fond($fond, $contexte);
520
-			include_spip('inc/notifications');
521
-			notifications_envoyer_mails($row['email'], $message);
522
-			lang_select();
523
-
524
-			return $row['email'];
525
-		}
526
-
527
-		return false;
528
-	}
529
-
530
-	return '';
485
+    if ($id_auteur) {
486
+        $set = [];
487
+        include_spip('inc/access');
488
+        $set['pass'] = creer_pass_aleatoire(max(_PASS_LONGUEUR_MINI, 16));
489
+
490
+        include_spip('action/editer_auteur');
491
+        auteur_modifier($id_auteur, $set);
492
+
493
+        $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . (int) $id_auteur);
494
+        include_spip('inc/filtres');
495
+        if (
496
+            $notifier
497
+            && $row['email']
498
+            && email_valide($row['email'])
499
+            && trouver_fond($fond = 'modeles/mail_nouveaux_identifiants')
500
+        ) {
501
+            // envoyer l'email avec login/pass
502
+            $c = [
503
+                'id_auteur' => $id_auteur,
504
+                'nom' => $row['nom'],
505
+                'mode' => $row['statut'],
506
+                'email' => $row['email'],
507
+                'pass' => $set['pass'],
508
+            ];
509
+            // on merge avec les champs fournit en appel, qui sont passes au modele de notification donc
510
+            $contexte = array_merge($contexte, $c);
511
+            // si pas de langue explicitement demandee, prendre celle de l'auteur si on la connait, ou a defaut celle du site
512
+            // plutot que celle de l'admin qui vient de cliquer sur le bouton
513
+            if (!isset($contexte['lang']) || !$contexte['lang']) {
514
+                $contexte['lang'] = isset($row['lang']) && $row['lang']
515
+                    ? $row['lang']
516
+                    : $GLOBALS['meta']['langue_site'];
517
+            }
518
+            lang_select($contexte['lang']);
519
+            $message = recuperer_fond($fond, $contexte);
520
+            include_spip('inc/notifications');
521
+            notifications_envoyer_mails($row['email'], $message);
522
+            lang_select();
523
+
524
+            return $row['email'];
525
+        }
526
+
527
+        return false;
528
+    }
529
+
530
+    return '';
531 531
 }
Please login to merge, or discard this patch.
rector.php 1 patch
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -17,16 +17,16 @@
 block discarded – undo
17 17
         __DIR__ . '/index.php',
18 18
     ]);
19 19
 
20
-	$rectorConfig->sets([
21
-		LevelSetList::UP_TO_PHP_81
22
-	]);
20
+    $rectorConfig->sets([
21
+        LevelSetList::UP_TO_PHP_81
22
+    ]);
23 23
 
24 24
     $rectorConfig->skip([
25 25
         __DIR__ . '/ecrire/lang',
26
-		FinalizePublicClassConstantRector::class,
27
-		NullToStrictStringFuncCallArgRector::class,
28
-		CountOnNullRector::class,
29
-		MixedTypeRector::class,
26
+        FinalizePublicClassConstantRector::class,
27
+        NullToStrictStringFuncCallArgRector::class,
28
+        CountOnNullRector::class,
29
+        MixedTypeRector::class,
30 30
     ]);
31 31
 
32 32
 };
Please login to merge, or discard this patch.
ecrire/public/fonctions.php 1 patch
Indentation   +373 added lines, -373 removed lines patch added patch discarded remove patch
@@ -22,7 +22,7 @@  discard block
 block discarded – undo
22 22
  **/
23 23
 
24 24
 if (!defined('_ECRIRE_INC_VERSION')) {
25
-	return;
25
+    return;
26 26
 }
27 27
 
28 28
 // public/interfaces definit des traitements sur les champs qui utilisent des fonctions de inc/texte
@@ -54,75 +54,75 @@  discard block
 block discarded – undo
54 54
  *     Introduction calculée
55 55
  **/
56 56
 function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) {
57
-	// Si un descriptif est envoye, on l'utilise directement
58
-	if (strlen($descriptif)) {
59
-		return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect);
60
-	}
61
-
62
-	// De preference ce qui est marque <intro>...</intro>
63
-	$intro = '';
64
-	$texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules
65
-	while ($fin = strpos($texte, '</intro>')) {
66
-		$zone = substr($texte, 0, $fin);
67
-		$texte = substr($texte, $fin + strlen('</intro>'));
68
-		if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) {
69
-			$zone = substr($zone, $deb + 7);
70
-		}
71
-		$intro .= $zone;
72
-	}
73
-
74
-	// [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
75
-	// qui inclus raccourcis et modeles
76
-	// un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
77
-	// par ailleurs le nettoyage des raccourcis ne tient pas compte
78
-	// des surcharges et enrichissement de propre
79
-	// couper doit se faire apres propre
80
-	//$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
81
-
82
-	// Cependant pour des questions de perfs on coupe quand meme, en prenant
83
-	// large et en se mefiant des tableaux #1323
84
-
85
-	if (strlen($intro)) {
86
-		$texte = $intro;
87
-	} else {
88
-		if (
89
-			!str_contains("\n" . $texte, "\n|")
90
-			&& strlen($texte) > 2.5 * $longueur
91
-		) {
92
-			if (str_contains($texte, '<multi')) {
93
-				$texte = extraire_multi($texte);
94
-			}
95
-			$texte = couper($texte, 2 * $longueur);
96
-		}
97
-	}
98
-
99
-	// ne pas tenir compte des notes
100
-	if ($notes = charger_fonction('notes', 'inc', true)) {
101
-		$notes('', 'empiler');
102
-	}
103
-	// Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
104
-	// dans l'introduction.
105
-	$texte = supprime_img($texte, '');
106
-	$texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect);
107
-
108
-	if ($notes) {
109
-		$notes('', 'depiler');
110
-	}
111
-
112
-	if (is_null($suite) && defined('_INTRODUCTION_SUITE')) {
113
-		$suite = _INTRODUCTION_SUITE;
114
-	}
115
-	$texte = couper($texte, $longueur, $suite);
116
-	// comme on a coupe il faut repasser la typo (on a perdu les insecables)
117
-	$texte = typo($texte, true, $connect, []);
118
-
119
-	// et reparagrapher si necessaire (coherence avec le cas descriptif)
120
-	// une introduction a tojours un <p>
121
-	if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes
122
-	$texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
123
-	}
124
-
125
-	return $texte;
57
+    // Si un descriptif est envoye, on l'utilise directement
58
+    if (strlen($descriptif)) {
59
+        return appliquer_traitement_champ($descriptif, 'introduction', '', [], $connect);
60
+    }
61
+
62
+    // De preference ce qui est marque <intro>...</intro>
63
+    $intro = '';
64
+    $texte = preg_replace(',(</?)intro>,i', "\\1intro>", $texte); // minuscules
65
+    while ($fin = strpos($texte, '</intro>')) {
66
+        $zone = substr($texte, 0, $fin);
67
+        $texte = substr($texte, $fin + strlen('</intro>'));
68
+        if (($deb = strpos($zone, '<intro>')) || str_starts_with($zone, '<intro>')) {
69
+            $zone = substr($zone, $deb + 7);
70
+        }
71
+        $intro .= $zone;
72
+    }
73
+
74
+    // [12025] On ne *PEUT* pas couper simplement ici car c'est du texte brut,
75
+    // qui inclus raccourcis et modeles
76
+    // un simple <articlexx> peut etre ensuite transforme en 1000 lignes ...
77
+    // par ailleurs le nettoyage des raccourcis ne tient pas compte
78
+    // des surcharges et enrichissement de propre
79
+    // couper doit se faire apres propre
80
+    //$texte = nettoyer_raccourcis_typo($intro ? $intro : $texte, $connect);
81
+
82
+    // Cependant pour des questions de perfs on coupe quand meme, en prenant
83
+    // large et en se mefiant des tableaux #1323
84
+
85
+    if (strlen($intro)) {
86
+        $texte = $intro;
87
+    } else {
88
+        if (
89
+            !str_contains("\n" . $texte, "\n|")
90
+            && strlen($texte) > 2.5 * $longueur
91
+        ) {
92
+            if (str_contains($texte, '<multi')) {
93
+                $texte = extraire_multi($texte);
94
+            }
95
+            $texte = couper($texte, 2 * $longueur);
96
+        }
97
+    }
98
+
99
+    // ne pas tenir compte des notes
100
+    if ($notes = charger_fonction('notes', 'inc', true)) {
101
+        $notes('', 'empiler');
102
+    }
103
+    // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
104
+    // dans l'introduction.
105
+    $texte = supprime_img($texte, '');
106
+    $texte = appliquer_traitement_champ($texte, 'introduction', '', [], $connect);
107
+
108
+    if ($notes) {
109
+        $notes('', 'depiler');
110
+    }
111
+
112
+    if (is_null($suite) && defined('_INTRODUCTION_SUITE')) {
113
+        $suite = _INTRODUCTION_SUITE;
114
+    }
115
+    $texte = couper($texte, $longueur, $suite);
116
+    // comme on a coupe il faut repasser la typo (on a perdu les insecables)
117
+    $texte = typo($texte, true, $connect, []);
118
+
119
+    // et reparagrapher si necessaire (coherence avec le cas descriptif)
120
+    // une introduction a tojours un <p>
121
+    if ($GLOBALS['toujours_paragrapher']) { // Fermer les paragraphes
122
+    $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
123
+    }
124
+
125
+    return $texte;
126 126
 }
127 127
 
128 128
 
@@ -157,64 +157,64 @@  discard block
 block discarded – undo
157 157
  *     Code HTML de la pagination
158 158
  **/
159 159
 function filtre_pagination_dist(
160
-	$total,
161
-	$nom,
162
-	$position,
163
-	$pas,
164
-	$liste = true,
165
-	$modele = '',
166
-	string $connect = '',
167
-	$env = []
160
+    $total,
161
+    $nom,
162
+    $position,
163
+    $pas,
164
+    $liste = true,
165
+    $modele = '',
166
+    string $connect = '',
167
+    $env = []
168 168
 ) {
169
-	static $ancres = [];
170
-	if ($pas < 1) {
171
-		return '';
172
-	}
173
-	$ancre = 'pagination' . $nom; // #pagination_articles
174
-	$debut = 'debut' . $nom; // 'debut_articles'
175
-
176
-	// n'afficher l'ancre qu'une fois
177
-	$bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>");
178
-	// liste = false : on ne veut que l'ancre
179
-	if (!$liste) {
180
-		return $ancres[$ancre];
181
-	}
182
-
183
-	$self = (empty($env['self']) ? self() : $env['self']);
184
-	$pagination = [
185
-		'debut' => $debut,
186
-		'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
187
-		'total' => $total,
188
-		'position' => (int) $position,
189
-		'pas' => $pas,
190
-		'nombre_pages' => floor(($total - 1) / $pas) + 1,
191
-		'page_courante' => floor((int) $position / $pas) + 1,
192
-		'ancre' => $ancre,
193
-		'bloc_ancre' => $bloc_ancre
194
-	];
195
-	if (is_array($env)) {
196
-		$pagination = array_merge($env, $pagination);
197
-	}
198
-
199
-	// Pas de pagination
200
-	if ($pagination['nombre_pages'] <= 1) {
201
-		return '';
202
-	}
203
-
204
-	if ($modele) {
205
-		$pagination['type_pagination'] = $modele;
206
-		$modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : '';
207
-	}
208
-
209
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
210
-		define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
211
-	}
212
-	if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
213
-		define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
214
-	}
215
-
216
-
217
-	return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect);
169
+    static $ancres = [];
170
+    if ($pas < 1) {
171
+        return '';
172
+    }
173
+    $ancre = 'pagination' . $nom; // #pagination_articles
174
+    $debut = 'debut' . $nom; // 'debut_articles'
175
+
176
+    // n'afficher l'ancre qu'une fois
177
+    $bloc_ancre = isset($ancres[$ancre]) ? '' : ($ancres[$ancre] = "<a id='" . $ancre . "' class='pagination_ancre'></a>");
178
+    // liste = false : on ne veut que l'ancre
179
+    if (!$liste) {
180
+        return $ancres[$ancre];
181
+    }
182
+
183
+    $self = (empty($env['self']) ? self() : $env['self']);
184
+    $pagination = [
185
+        'debut' => $debut,
186
+        'url' => parametre_url($self, 'fragment', ''), // nettoyer l'id ahah eventuel
187
+        'total' => $total,
188
+        'position' => (int) $position,
189
+        'pas' => $pas,
190
+        'nombre_pages' => floor(($total - 1) / $pas) + 1,
191
+        'page_courante' => floor((int) $position / $pas) + 1,
192
+        'ancre' => $ancre,
193
+        'bloc_ancre' => $bloc_ancre
194
+    ];
195
+    if (is_array($env)) {
196
+        $pagination = array_merge($env, $pagination);
197
+    }
198
+
199
+    // Pas de pagination
200
+    if ($pagination['nombre_pages'] <= 1) {
201
+        return '';
202
+    }
203
+
204
+    if ($modele) {
205
+        $pagination['type_pagination'] = $modele;
206
+        $modele = trouver_fond('pagination_' . $modele, 'modeles') ? '_' . $modele : '';
207
+    }
208
+
209
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX')) {
210
+        define('_PAGINATION_NOMBRE_LIENS_MAX', 10);
211
+    }
212
+    if (!defined('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE')) {
213
+        define('_PAGINATION_NOMBRE_LIENS_MAX_ECRIRE', 5);
214
+    }
215
+
216
+
217
+    return recuperer_fond("modeles/pagination$modele", $pagination, ['trim' => true], $connect);
218 218
 }
219 219
 
220 220
 
@@ -233,38 +233,38 @@  discard block
 block discarded – undo
233 233
  *     Liste (première page, dernière page).
234 234
  **/
235 235
 function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) {
236
-	if ($max <= 0 || $max >= $nombre) {
237
-		return [1, $nombre];
238
-	}
239
-	if ($max <= 1) {
240
-		return [$courante, $courante];
241
-	}
242
-
243
-	$premiere = max(1, $courante - floor(($max - 1) / 2));
244
-	$derniere = min($nombre, $premiere + $max - 2);
245
-	$premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
246
-
247
-	return [$premiere, $derniere];
236
+    if ($max <= 0 || $max >= $nombre) {
237
+        return [1, $nombre];
238
+    }
239
+    if ($max <= 1) {
240
+        return [$courante, $courante];
241
+    }
242
+
243
+    $premiere = max(1, $courante - floor(($max - 1) / 2));
244
+    $derniere = min($nombre, $premiere + $max - 2);
245
+    $premiere = $derniere == $nombre ? $derniere - $max + 1 : $premiere;
246
+
247
+    return [$premiere, $derniere];
248 248
 }
249 249
 
250 250
 function filtre_pagination_affiche_texte_lien_page_dist($type_pagination, $numero_page, $rang_item) {
251
-	if ($numero_page === 'tous') {
252
-		return '&#8734;';
253
-	}
254
-	if ($numero_page === 'prev') {
255
-		return '&lt;';
256
-	}
257
-	if ($numero_page === 'next') {
258
-		return '&gt;';
259
-	}
260
-
261
-	return match ($type_pagination) {
262
-		'resultats' => $rang_item + 1, // 1 11 21 31...
263
-		'naturel' => $rang_item ?: 1, // 1 10 20 30...
264
-		'rang' => $rang_item, // 0 10 20 30...
265
-		'page', 'prive' => $numero_page, // 1 2 3 4 5...
266
-		default => $numero_page, // 1 2 3 4 5...
267
-	};
251
+    if ($numero_page === 'tous') {
252
+        return '&#8734;';
253
+    }
254
+    if ($numero_page === 'prev') {
255
+        return '&lt;';
256
+    }
257
+    if ($numero_page === 'next') {
258
+        return '&gt;';
259
+    }
260
+
261
+    return match ($type_pagination) {
262
+        'resultats' => $rang_item + 1, // 1 11 21 31...
263
+        'naturel' => $rang_item ?: 1, // 1 10 20 30...
264
+        'rang' => $rang_item, // 0 10 20 30...
265
+        'page', 'prive' => $numero_page, // 1 2 3 4 5...
266
+        default => $numero_page, // 1 2 3 4 5...
267
+    };
268 268
 }
269 269
 
270 270
 /**
@@ -277,15 +277,15 @@  discard block
 block discarded – undo
277 277
  **/
278 278
 function lister_objets_avec_logos($type) {
279 279
 
280
-	$objet = objet_type($type);
281
-	$ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet));
282
-	if ($ids) {
283
-		$ids = array_column($ids, 'id_objet');
284
-		return implode(',', $ids);
285
-	}
286
-	else {
287
-		return '0';
288
-	}
280
+    $objet = objet_type($type);
281
+    $ids = sql_allfetsel('L.id_objet', 'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document', 'D.mode=' . sql_quote('logoon') . ' AND L.objet=' . sql_quote($objet));
282
+    if ($ids) {
283
+        $ids = array_column($ids, 'id_objet');
284
+        return implode(',', $ids);
285
+    }
286
+    else {
287
+        return '0';
288
+    }
289 289
 }
290 290
 
291 291
 
@@ -301,14 +301,14 @@  discard block
 block discarded – undo
301 301
  *     Code HTML des notes
302 302
  **/
303 303
 function calculer_notes() {
304
-	$r = '';
305
-	if ($notes = charger_fonction('notes', 'inc', true)) {
306
-		$r = $notes([]);
307
-		$notes('', 'depiler');
308
-		$notes('', 'empiler');
309
-	}
310
-
311
-	return $r;
304
+    $r = '';
305
+    if ($notes = charger_fonction('notes', 'inc', true)) {
306
+        $r = $notes([]);
307
+        $notes('', 'depiler');
308
+        $notes('', 'empiler');
309
+    }
310
+
311
+    return $r;
312 312
 }
313 313
 
314 314
 
@@ -325,10 +325,10 @@  discard block
 block discarded – undo
325 325
  * @return string
326 326
  */
327 327
 function retrouver_rang_lien($objet_source, $ids, $objet_lie, $idl, $objet_lien) {
328
-	$res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
329
-	$res = array_column($res, 'rang_lien', $objet_source);
328
+    $res = lister_objets_liens($objet_source, $objet_lie, $idl, $objet_lien);
329
+    $res = array_column($res, 'rang_lien', $objet_source);
330 330
 
331
-	return ($res[$ids] ?? '');
331
+    return ($res[$ids] ?? '');
332 332
 }
333 333
 
334 334
 
@@ -345,19 +345,19 @@  discard block
 block discarded – undo
345 345
  * @private
346 346
  */
347 347
 function lister_objets_liens($objet_source, $objet, $id_objet, $objet_lien) {
348
-	static $liens = [];
349
-	if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
350
-		include_spip('action/editer_liens');
351
-		// quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
352
-		if ($objet_lien == $objet && $objet_lien !== $objet_source) {
353
-			$res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
354
-		} else {
355
-			$res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
356
-		}
357
-
358
-		$liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
359
-	}
360
-	return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
348
+    static $liens = [];
349
+    if (!isset($liens["$objet_source-$objet-$id_objet-$objet_lien"])) {
350
+        include_spip('action/editer_liens');
351
+        // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source
352
+        if ($objet_lien == $objet && $objet_lien !== $objet_source) {
353
+            $res = objet_trouver_liens([$objet => $id_objet], [$objet_source => '*']);
354
+        } else {
355
+            $res = objet_trouver_liens([$objet_source => '*'], [$objet => $id_objet]);
356
+        }
357
+
358
+        $liens["$objet_source-$objet-$id_objet-$objet_lien"] = $res;
359
+    }
360
+    return $liens["$objet_source-$objet-$id_objet-$objet_lien"];
361 361
 }
362 362
 
363 363
 /**
@@ -371,24 +371,24 @@  discard block
 block discarded – undo
371 371
  * @return int|string
372 372
  */
373 373
 function calculer_rang_smart($titre, $objet_source, $id, $env) {
374
-	// Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
375
-	// permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
376
-	if (
377
-		isset($env['form']) && $env['form']
378
-		&& isset($env['_objet_lien']) && $env['_objet_lien']
379
-		&& (function_exists('lien_triables') || include_spip('action/editer_liens'))
380
-		&& ($r = objet_associable($env['_objet_lien']))
381
-		&& ([$p, $table_lien] = $r)
382
-		&& lien_triables($table_lien)
383
-		&& isset($env['objet']) && $env['objet']
384
-		&& isset($env['id_objet']) && $env['id_objet']
385
-		&& $objet_source
386
-		&& ($id = (int) $id)
387
-	) {
388
-		$rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
389
-		return ($rang ?: '');
390
-	}
391
-	return recuperer_numero($titre);
374
+    // Cas du #RANG utilisé dans #FORMULAIRE_EDITER_LIENS -> attraper le rang du lien
375
+    // permet de voir le rang du lien si il y en a un en base, meme avant un squelette xxxx-lies.html ne gerant pas les liens
376
+    if (
377
+        isset($env['form']) && $env['form']
378
+        && isset($env['_objet_lien']) && $env['_objet_lien']
379
+        && (function_exists('lien_triables') || include_spip('action/editer_liens'))
380
+        && ($r = objet_associable($env['_objet_lien']))
381
+        && ([$p, $table_lien] = $r)
382
+        && lien_triables($table_lien)
383
+        && isset($env['objet']) && $env['objet']
384
+        && isset($env['id_objet']) && $env['id_objet']
385
+        && $objet_source
386
+        && ($id = (int) $id)
387
+    ) {
388
+        $rang = retrouver_rang_lien($objet_source, $id, $env['objet'], $env['id_objet'], $env['_objet_lien']);
389
+        return ($rang ?: '');
390
+    }
391
+    return recuperer_numero($titre);
392 392
 }
393 393
 
394 394
 /**
@@ -417,78 +417,78 @@  discard block
 block discarded – undo
417 417
  */
418 418
 function calculer_balise_tri(string $champ_ou_sens, string $libelle, string $classe, string $tri_nom, string $tri_champ, string $tri_sens, $liste_tri_sens_defaut, string $nom_pagination = ''): string {
419 419
 
420
-	$url = self('&');
421
-	$tri_sens = (int) $tri_sens;
422
-	$alias_sens = [
423
-		'<' => -1,
424
-		'>' => 1,
425
-		'inverse' => -1,
426
-	];
427
-
428
-	// Normaliser la liste des sens de tri par défaut
429
-	// On ajoute un jocker pour les champs non présents dans la liste
430
-	// avec la valeur du 1er item de la liste, idem critère {tri}
431
-	if (is_array($liste_tri_sens_defaut)) {
432
-		$liste_tri_sens_defaut['*'] = array_values($liste_tri_sens_defaut)[0];
433
-	} else {
434
-		$liste_tri_sens_defaut = [
435
-			'*' => (int) ($alias_sens[$liste_tri_sens_defaut] ?? $liste_tri_sens_defaut),
436
-		];
437
-	}
438
-
439
-	// Les sens de tri actuel et nouveau :
440
-	// Soit c'est un sens fixe donné en paramètre (< ou >)
441
-	$is_sens_fixe = array_key_exists($champ_ou_sens, $alias_sens);
442
-	if ($is_sens_fixe) {
443
-		$tri_sens_actuel = $tri_sens;
444
-		$tri_sens_nouveau = $alias_sens[$champ_ou_sens];
445
-	// Soit c'est le champ utilisé actuellement pour le tri → on inverse le sens
446
-	} elseif ($champ_ou_sens === $tri_champ) {
447
-		$tri_sens_actuel = $tri_sens;
448
-		$tri_sens_nouveau = $tri_sens * -1;
449
-	// Sinon c'est un nouveau champ, et on prend son tri par défaut
450
-	} else {
451
-		$tri_sens_actuel = $tri_sens_nouveau = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
452
-	}
453
-
454
-	// URL : ajouter le champ sur lequel porte le tri
455
-	if (!$is_sens_fixe) {
456
-		$param_tri = "tri$tri_nom";
457
-		$url = parametre_url($url, $param_tri, $champ_ou_sens);
458
-	}
459
-
460
-	// URL : n'ajouter le sens de tri que si nécessaire,
461
-	// c.à.d différent du sens par défaut pour le champ
462
-	$param_sens = "sens$tri_nom";
463
-	$tri_sens_defaut_champ = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
464
-	if ($tri_sens_nouveau !== $tri_sens_defaut_champ) {
465
-		$url = parametre_url($url, $param_sens, $tri_sens_nouveau);
466
-	} else {
467
-		$url = parametre_url($url, $param_sens, '');
468
-	}
469
-
470
-	// Drapeau pour garder en session ?
471
-	$param_memo = ($is_sens_fixe ? $param_sens : $param_tri);
472
-	$url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : '');
473
-
474
-	// Classes : on indique le sens de tri et l'item exposé
475
-	if (!$is_sens_fixe) {
476
-		$classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc');
477
-	}
478
-	if ($champ_ou_sens === $tri_champ) {
479
-		$classe .= ' item-tri_actif';
480
-	}
481
-
482
-	// Si on n'est pas en mode "Tout afficher" de la pagination
483
-	if ($nom_pagination && parametre_url($url, 'debut' . $nom_pagination) !== '-1') {
484
-		// reset la pagination quand on change de mode ou de sens de tri
485
-		$url = parametre_url($url, 'debut' . $nom_pagination, '');
486
-	}
487
-
488
-	// Lien
489
-	$balise = lien_ou_expose($url, $libelle, false, $classe);
490
-
491
-	return $balise;
420
+    $url = self('&');
421
+    $tri_sens = (int) $tri_sens;
422
+    $alias_sens = [
423
+        '<' => -1,
424
+        '>' => 1,
425
+        'inverse' => -1,
426
+    ];
427
+
428
+    // Normaliser la liste des sens de tri par défaut
429
+    // On ajoute un jocker pour les champs non présents dans la liste
430
+    // avec la valeur du 1er item de la liste, idem critère {tri}
431
+    if (is_array($liste_tri_sens_defaut)) {
432
+        $liste_tri_sens_defaut['*'] = array_values($liste_tri_sens_defaut)[0];
433
+    } else {
434
+        $liste_tri_sens_defaut = [
435
+            '*' => (int) ($alias_sens[$liste_tri_sens_defaut] ?? $liste_tri_sens_defaut),
436
+        ];
437
+    }
438
+
439
+    // Les sens de tri actuel et nouveau :
440
+    // Soit c'est un sens fixe donné en paramètre (< ou >)
441
+    $is_sens_fixe = array_key_exists($champ_ou_sens, $alias_sens);
442
+    if ($is_sens_fixe) {
443
+        $tri_sens_actuel = $tri_sens;
444
+        $tri_sens_nouveau = $alias_sens[$champ_ou_sens];
445
+    // Soit c'est le champ utilisé actuellement pour le tri → on inverse le sens
446
+    } elseif ($champ_ou_sens === $tri_champ) {
447
+        $tri_sens_actuel = $tri_sens;
448
+        $tri_sens_nouveau = $tri_sens * -1;
449
+    // Sinon c'est un nouveau champ, et on prend son tri par défaut
450
+    } else {
451
+        $tri_sens_actuel = $tri_sens_nouveau = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
452
+    }
453
+
454
+    // URL : ajouter le champ sur lequel porte le tri
455
+    if (!$is_sens_fixe) {
456
+        $param_tri = "tri$tri_nom";
457
+        $url = parametre_url($url, $param_tri, $champ_ou_sens);
458
+    }
459
+
460
+    // URL : n'ajouter le sens de tri que si nécessaire,
461
+    // c.à.d différent du sens par défaut pour le champ
462
+    $param_sens = "sens$tri_nom";
463
+    $tri_sens_defaut_champ = (int) ($liste_tri_sens_defaut[$champ_ou_sens] ?? $liste_tri_sens_defaut['*']);
464
+    if ($tri_sens_nouveau !== $tri_sens_defaut_champ) {
465
+        $url = parametre_url($url, $param_sens, $tri_sens_nouveau);
466
+    } else {
467
+        $url = parametre_url($url, $param_sens, '');
468
+    }
469
+
470
+    // Drapeau pour garder en session ?
471
+    $param_memo = ($is_sens_fixe ? $param_sens : $param_tri);
472
+    $url = parametre_url($url, 'var_memotri', str_starts_with($tri_nom, 'session') ? $param_memo : '');
473
+
474
+    // Classes : on indique le sens de tri et l'item exposé
475
+    if (!$is_sens_fixe) {
476
+        $classe .= ' item-tri item-tri_' . ($tri_sens_actuel === 1 ? 'asc' : 'desc');
477
+    }
478
+    if ($champ_ou_sens === $tri_champ) {
479
+        $classe .= ' item-tri_actif';
480
+    }
481
+
482
+    // Si on n'est pas en mode "Tout afficher" de la pagination
483
+    if ($nom_pagination && parametre_url($url, 'debut' . $nom_pagination) !== '-1') {
484
+        // reset la pagination quand on change de mode ou de sens de tri
485
+        $url = parametre_url($url, 'debut' . $nom_pagination, '');
486
+    }
487
+
488
+    // Lien
489
+    $balise = lien_ou_expose($url, $libelle, false, $classe);
490
+
491
+    return $balise;
492 492
 }
493 493
 
494 494
 
@@ -504,7 +504,7 @@  discard block
 block discarded – undo
504 504
  * @return string
505 505
  */
506 506
 function tri_protege_champ($t) {
507
-	return preg_replace(',[^\s\w.+\[\]],', '', $t);
507
+    return preg_replace(',[^\s\w.+\[\]],', '', $t);
508 508
 }
509 509
 
510 510
 /**
@@ -517,39 +517,39 @@  discard block
 block discarded – undo
517 517
  * @return string
518 518
  */
519 519
 function tri_champ_order($t, $from = null, $senstri = '') {
520
-	if (str_starts_with($t, 'multi ')) {
521
-		return 'multi' . $senstri;
522
-	}
523
-
524
-	$champ = $t;
525
-
526
-	$prefixe = '';
527
-	foreach (['num ', 'sinum '] as $p) {
528
-		if (str_starts_with($t, $p)) {
529
-			$champ = substr($t, strlen($p));
530
-			$prefixe = $p;
531
-		}
532
-	}
533
-
534
-	// enlever les autres espaces non evacues par tri_protege_champ
535
-	$champ = preg_replace(',\s,', '', $champ);
536
-
537
-	if (is_array($from)) {
538
-		$trouver_table = charger_fonction('trouver_table', 'base');
539
-		foreach ($from as $idt => $table_sql) {
540
-			if (
541
-				($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ])
542
-			) {
543
-				$champ = "$idt.$champ";
544
-				break;
545
-			}
546
-		}
547
-	}
548
-	return match ($prefixe) {
549
-		'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}",
550
-		'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}",
551
-		default => $champ . $senstri,
552
-	};
520
+    if (str_starts_with($t, 'multi ')) {
521
+        return 'multi' . $senstri;
522
+    }
523
+
524
+    $champ = $t;
525
+
526
+    $prefixe = '';
527
+    foreach (['num ', 'sinum '] as $p) {
528
+        if (str_starts_with($t, $p)) {
529
+            $champ = substr($t, strlen($p));
530
+            $prefixe = $p;
531
+        }
532
+    }
533
+
534
+    // enlever les autres espaces non evacues par tri_protege_champ
535
+    $champ = preg_replace(',\s,', '', $champ);
536
+
537
+    if (is_array($from)) {
538
+        $trouver_table = charger_fonction('trouver_table', 'base');
539
+        foreach ($from as $idt => $table_sql) {
540
+            if (
541
+                ($desc = $trouver_table($table_sql)) && isset($desc['field'][$champ])
542
+            ) {
543
+                $champ = "$idt.$champ";
544
+                break;
545
+            }
546
+        }
547
+    }
548
+    return match ($prefixe) {
549
+        'num ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}, 0+$champ{$senstri}",
550
+        'sinum ' => "CASE( 0+$champ ) WHEN 0 THEN 1 ELSE 0 END{$senstri}",
551
+        default => $champ . $senstri,
552
+    };
553 553
 }
554 554
 
555 555
 /**
@@ -563,17 +563,17 @@  discard block
 block discarded – undo
563 563
  * @return string
564 564
  */
565 565
 function tri_champ_select($t) {
566
-	if (str_starts_with($t, 'multi ')) {
567
-		$t = substr($t, 6);
568
-		$t = preg_replace(',\s,', '', $t);
566
+    if (str_starts_with($t, 'multi ')) {
567
+        $t = substr($t, 6);
568
+        $t = preg_replace(',\s,', '', $t);
569 569
 
570
-		return sql_multi($t, $GLOBALS['spip_lang']);
571
-	}
572
-	if (trim($t) == 'hasard') {
573
-		return 'rand() AS hasard';
574
-	}
570
+        return sql_multi($t, $GLOBALS['spip_lang']);
571
+    }
572
+    if (trim($t) == 'hasard') {
573
+        return 'rand() AS hasard';
574
+    }
575 575
 
576
-	return "''";
576
+    return "''";
577 577
 }
578 578
 
579 579
 /**
@@ -585,15 +585,15 @@  discard block
 block discarded – undo
585 585
  * @return string
586 586
  */
587 587
 function formate_liste_critere_par_ordre_liste($valeurs, $serveur = '') {
588
-	if (!is_array($valeurs)) {
589
-		return '';
590
-	}
591
-	$f = sql_serveur('quote', $serveur, true);
592
-	if (!is_string($f) || !$f) {
593
-		return '';
594
-	}
595
-
596
-	return implode(',', array_map($f, array_unique($valeurs)));
588
+    if (!is_array($valeurs)) {
589
+        return '';
590
+    }
591
+    $f = sql_serveur('quote', $serveur, true);
592
+    if (!is_string($f) || !$f) {
593
+        return '';
594
+    }
595
+
596
+    return implode(',', array_map($f, array_unique($valeurs)));
597 597
 }
598 598
 
599 599
 /**
@@ -616,22 +616,22 @@  discard block
 block discarded – undo
616 616
  *     Valeur $defaut sinon.
617 617
  **/
618 618
 function appliquer_filtre_sinon($arg, $filtre, $args, mixed $defaut = '') {
619
-	// Si c'est un filtre d'image, on utilise image_filtrer()
620
-	// Attention : les 2 premiers arguments sont inversés dans ce cas
621
-	if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) {
622
-		include_spip('inc/filtres_images_lib_mini');
623
-		$args[1] = $args[0];
624
-		$args[0] = $filtre;
625
-		return image_graver(image_filtrer($args));
626
-	}
627
-
628
-	$f = chercher_filtre($filtre);
629
-	if (!$f) {
630
-		return $defaut;
631
-	}
632
-	array_shift($args); // enlever $arg
633
-	array_shift($args); // enlever $filtre
634
-	return $f($arg, ...$args);
619
+    // Si c'est un filtre d'image, on utilise image_filtrer()
620
+    // Attention : les 2 premiers arguments sont inversés dans ce cas
621
+    if (trouver_filtre_matrice($filtre) && str_starts_with($filtre, 'image_')) {
622
+        include_spip('inc/filtres_images_lib_mini');
623
+        $args[1] = $args[0];
624
+        $args[0] = $filtre;
625
+        return image_graver(image_filtrer($args));
626
+    }
627
+
628
+    $f = chercher_filtre($filtre);
629
+    if (!$f) {
630
+        return $defaut;
631
+    }
632
+    array_shift($args); // enlever $arg
633
+    array_shift($args); // enlever $filtre
634
+    return $f($arg, ...$args);
635 635
 }
636 636
 
637 637
 /**
@@ -641,30 +641,30 @@  discard block
 block discarded – undo
641 641
  * @return string
642 642
  */
643 643
 function filtre_styles_inline_page_login_pass_dist(&$Pile, ...$dummy) {
644
-	$styles = '';
645
-	include_spip('inc/config');
646
-	if ($couleur = lire_config('couleur_login')) {
647
-		include_spip('inc/filtres_images_mini');
648
-		$hs = couleur_hex_to_hsl($couleur, 'h, s');
649
-		$l = couleur_hex_to_hsl($couleur, 'l');
650
-		$styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n";
651
-	}
652
-	$logo_bg = _DIR_IMG . 'spip_fond_login.jpg';
653
-	if (file_exists($logo_bg)) {
654
-		include_spip('inc/filtres_images_mini');
655
-		$logo_mini = image_reduire($logo_bg, 64, 64);
656
-		$logo_mini = extraire_attribut($logo_mini, 'src');
657
-		$embarque_fichier = charger_filtre('embarque_fichier');
658
-		$logo_mini = $embarque_fichier($logo_mini);
659
-		$logo_bg = timestamp($logo_bg);
660
-		$styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n";
661
-		$Pile[0]['body_class'] = 'fond_image';
662
-	}
663
-	else {
664
-		$Pile[0]['body_class'] = 'sans_fond';
665
-	}
666
-	if ($styles) {
667
-		$styles = "<style type='text/css'>$styles</style>";
668
-	}
669
-	return $styles;
644
+    $styles = '';
645
+    include_spip('inc/config');
646
+    if ($couleur = lire_config('couleur_login')) {
647
+        include_spip('inc/filtres_images_mini');
648
+        $hs = couleur_hex_to_hsl($couleur, 'h, s');
649
+        $l = couleur_hex_to_hsl($couleur, 'l');
650
+        $styles .= ":root {--spip-login-color-theme--hs: {$hs};--spip-login-color-theme--l: {$l};}\n";
651
+    }
652
+    $logo_bg = _DIR_IMG . 'spip_fond_login.jpg';
653
+    if (file_exists($logo_bg)) {
654
+        include_spip('inc/filtres_images_mini');
655
+        $logo_mini = image_reduire($logo_bg, 64, 64);
656
+        $logo_mini = extraire_attribut($logo_mini, 'src');
657
+        $embarque_fichier = charger_filtre('embarque_fichier');
658
+        $logo_mini = $embarque_fichier($logo_mini);
659
+        $logo_bg = timestamp($logo_bg);
660
+        $styles .= ".page_login, .page_spip_pass {background-image:url($logo_bg), url($logo_mini);}\n";
661
+        $Pile[0]['body_class'] = 'fond_image';
662
+    }
663
+    else {
664
+        $Pile[0]['body_class'] = 'sans_fond';
665
+    }
666
+    if ($styles) {
667
+        $styles = "<style type='text/css'>$styles</style>";
668
+    }
669
+    return $styles;
670 670
 }
Please login to merge, or discard this patch.
ecrire/public/assembler.php 1 patch
Indentation   +634 added lines, -634 removed lines patch added patch discarded remove patch
@@ -19,175 +19,175 @@  discard block
 block discarded – undo
19 19
  **/
20 20
 
21 21
 if (!defined('_ECRIRE_INC_VERSION')) {
22
-	return;
22
+    return;
23 23
 }
24 24
 
25 25
 // En cas de modification, il faut aussi actualiser la regexp de nettoyer_uri_var() dans inc/utils.php
26 26
 if (!defined('_CONTEXTE_IGNORE_VARIABLES')) {
27
-	define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
27
+    define('_CONTEXTE_IGNORE_VARIABLES', '/(^var_|^PHPSESSID$|^fbclid$|^utm_)/');
28 28
 }
29 29
 
30 30
 function assembler($fond, string $connect = '') {
31 31
 
32
-	$chemin_cache = null;
33
-	$lastmodified = null;
34
-	$res = null;
35
-	// flag_preserver est modifie ici, et utilise en globale
36
-	// use_cache sert a informer le bouton d'admin pr savoir s'il met un *
37
-	// contexte est utilise en globale dans le formulaire d'admin
38
-
39
-	$GLOBALS['contexte'] = calculer_contexte();
40
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
41
-	$page['contexte_implicite']['cache'] = $fond . preg_replace(
42
-		',\.[a-zA-Z0-9]*$,',
43
-		'',
44
-		preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
45
-	);
46
-	// Cette fonction est utilisee deux fois
47
-	$cacher = charger_fonction('cacher', 'public', true);
48
-	// Les quatre derniers parametres sont modifies par la fonction:
49
-	// emplacement, validite, et, s'il est valide, contenu & age
50
-	if ($cacher) {
51
-		$res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
52
-	} else {
53
-		$GLOBALS['use_cache'] = -1;
54
-	}
55
-	// Si un resultat est retourne, c'est un message d'impossibilite
56
-	if ($res) {
57
-		return ['texte' => $res];
58
-	}
59
-
60
-	if (!$chemin_cache || !$lastmodified) {
61
-		$lastmodified = time();
62
-	}
63
-
64
-	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
65
-	$calculer_page = true;
66
-
67
-	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
68
-	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
69
-	// pages sont dynamiques)
70
-	if (
71
-		isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
72
-		&& (!defined('_VAR_MODE') || !_VAR_MODE)
73
-		&& $chemin_cache && isset($page['entetes'])
74
-		&& isset($page['entetes']['Cache-Control'])
75
-		&& strstr($page['entetes']['Cache-Control'], 'max-age=')
76
-		&& !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
77
-	) {
78
-		$since = preg_replace(
79
-			'/;.*/',
80
-			'',
81
-			$_SERVER['HTTP_IF_MODIFIED_SINCE']
82
-		);
83
-		$since = str_replace('GMT', '', $since);
84
-		if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
85
-			$page['status'] = 304;
86
-			$headers_only = true;
87
-			$calculer_page = false;
88
-		}
89
-	}
90
-
91
-	// Si requete HEAD ou Last-modified compatible, ignorer le texte
92
-	// et pas de content-type (pour contrer le bouton admin de inc-public)
93
-	if (!$calculer_page) {
94
-		$page['texte'] = '';
95
-	} else {
96
-		// si la page est prise dans le cache
97
-		if (!$GLOBALS['use_cache']) {
98
-			// Informer les boutons d'admin du contexte
99
-			// (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
100
-			$GLOBALS['contexte'] = $page['contexte'];
101
-
102
-			// vider les globales url propres qui ne doivent plus etre utilisees en cas
103
-			// d'inversion url => objet
104
-			// plus necessaire si on utilise bien la fonction urls_decoder_url
105
-			#unset($_SERVER['REDIRECT_url_propre']);
106
-			#unset($_ENV['url_propre']);
107
-		} else {
108
-			// Compat ascendante :
109
-			// 1. $contexte est global
110
-			// (a evacuer car urls_decoder_url gere ce probleme ?)
111
-			// et calculer la page
112
-			if (!test_espace_prive()) {
113
-				include_spip('inc/urls');
114
-				[$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
115
-					nettoyer_uri(),
116
-					$fond,
117
-					$GLOBALS['contexte'],
118
-					true
119
-				);
120
-			}
121
-			// squelette par defaut
122
-			if (!strlen($fond ?? '')) {
123
-				$fond = 'sommaire';
124
-			}
125
-
126
-			// produire la page : peut mettre a jour $lastmodified
127
-			$produire_page = charger_fonction('produire_page', 'public');
128
-			$page = $produire_page(
129
-				$fond,
130
-				$GLOBALS['contexte'],
131
-				$GLOBALS['use_cache'],
132
-				$chemin_cache,
133
-				null,
134
-				$page,
135
-				$lastmodified,
136
-				$connect
137
-			);
138
-			if ($page === '') {
139
-				$erreur = _T(
140
-					'info_erreur_squelette2',
141
-					['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
142
-				);
143
-				erreur_squelette($erreur);
144
-				// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
145
-				$page = ['texte' => '', 'erreur' => $erreur];
146
-			}
147
-		}
148
-
149
-		if ($page && $chemin_cache) {
150
-			$page['cache'] = $chemin_cache;
151
-		}
152
-
153
-		auto_content_type($page);
154
-
155
-		$GLOBALS['flag_preserver'] |= headers_sent();
156
-
157
-		// Definir les entetes si ce n'est fait
158
-		if (!$GLOBALS['flag_preserver']) {
159
-			// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
160
-			if (
161
-				trim($page['texte']) === ''
162
-				&& _VAR_MODE !== 'debug'
163
-				&& !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
164
-			) {
165
-				$GLOBALS['contexte']['fond_erreur'] = $fond;
166
-				$page = message_page_indisponible($page, $GLOBALS['contexte']);
167
-			}
168
-			// pas de cache client en mode 'observation'
169
-			if (defined('_VAR_MODE') && _VAR_MODE) {
170
-				$page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
171
-				$page['entetes']['Pragma'] = 'no-cache';
172
-			}
173
-		}
174
-	}
175
-
176
-	// Entete Last-Modified:
177
-	// eviter d'etre incoherent en envoyant un lastmodified identique
178
-	// a celui qu'on a refuse d'honorer plus haut (cf. #655)
179
-	if (
180
-		$lastmodified && !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && !isset($page['entetes']['Last-Modified'])
181
-	) {
182
-		$page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
183
-	}
184
-
185
-	// fermer la connexion apres les headers si requete HEAD
186
-	if ($headers_only) {
187
-		$page['entetes']['Connection'] = 'close';
188
-	}
189
-
190
-	return $page;
32
+    $chemin_cache = null;
33
+    $lastmodified = null;
34
+    $res = null;
35
+    // flag_preserver est modifie ici, et utilise en globale
36
+    // use_cache sert a informer le bouton d'admin pr savoir s'il met un *
37
+    // contexte est utilise en globale dans le formulaire d'admin
38
+
39
+    $GLOBALS['contexte'] = calculer_contexte();
40
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
41
+    $page['contexte_implicite']['cache'] = $fond . preg_replace(
42
+        ',\.[a-zA-Z0-9]*$,',
43
+        '',
44
+        preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])
45
+    );
46
+    // Cette fonction est utilisee deux fois
47
+    $cacher = charger_fonction('cacher', 'public', true);
48
+    // Les quatre derniers parametres sont modifies par la fonction:
49
+    // emplacement, validite, et, s'il est valide, contenu & age
50
+    if ($cacher) {
51
+        $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified);
52
+    } else {
53
+        $GLOBALS['use_cache'] = -1;
54
+    }
55
+    // Si un resultat est retourne, c'est un message d'impossibilite
56
+    if ($res) {
57
+        return ['texte' => $res];
58
+    }
59
+
60
+    if (!$chemin_cache || !$lastmodified) {
61
+        $lastmodified = time();
62
+    }
63
+
64
+    $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
65
+    $calculer_page = true;
66
+
67
+    // Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
68
+    // une perennite valide a meme reponse qu'une requete HEAD (par defaut les
69
+    // pages sont dynamiques)
70
+    if (
71
+        isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
72
+        && (!defined('_VAR_MODE') || !_VAR_MODE)
73
+        && $chemin_cache && isset($page['entetes'])
74
+        && isset($page['entetes']['Cache-Control'])
75
+        && strstr($page['entetes']['Cache-Control'], 'max-age=')
76
+        && !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/')
77
+    ) {
78
+        $since = preg_replace(
79
+            '/;.*/',
80
+            '',
81
+            $_SERVER['HTTP_IF_MODIFIED_SINCE']
82
+        );
83
+        $since = str_replace('GMT', '', $since);
84
+        if (trim($since) == gmdate('D, d M Y H:i:s', $lastmodified)) {
85
+            $page['status'] = 304;
86
+            $headers_only = true;
87
+            $calculer_page = false;
88
+        }
89
+    }
90
+
91
+    // Si requete HEAD ou Last-modified compatible, ignorer le texte
92
+    // et pas de content-type (pour contrer le bouton admin de inc-public)
93
+    if (!$calculer_page) {
94
+        $page['texte'] = '';
95
+    } else {
96
+        // si la page est prise dans le cache
97
+        if (!$GLOBALS['use_cache']) {
98
+            // Informer les boutons d'admin du contexte
99
+            // (fourni par urls_decoder_url ci-dessous lors de la mise en cache)
100
+            $GLOBALS['contexte'] = $page['contexte'];
101
+
102
+            // vider les globales url propres qui ne doivent plus etre utilisees en cas
103
+            // d'inversion url => objet
104
+            // plus necessaire si on utilise bien la fonction urls_decoder_url
105
+            #unset($_SERVER['REDIRECT_url_propre']);
106
+            #unset($_ENV['url_propre']);
107
+        } else {
108
+            // Compat ascendante :
109
+            // 1. $contexte est global
110
+            // (a evacuer car urls_decoder_url gere ce probleme ?)
111
+            // et calculer la page
112
+            if (!test_espace_prive()) {
113
+                include_spip('inc/urls');
114
+                [$fond, $GLOBALS['contexte'], $url_redirect] = urls_decoder_url(
115
+                    nettoyer_uri(),
116
+                    $fond,
117
+                    $GLOBALS['contexte'],
118
+                    true
119
+                );
120
+            }
121
+            // squelette par defaut
122
+            if (!strlen($fond ?? '')) {
123
+                $fond = 'sommaire';
124
+            }
125
+
126
+            // produire la page : peut mettre a jour $lastmodified
127
+            $produire_page = charger_fonction('produire_page', 'public');
128
+            $page = $produire_page(
129
+                $fond,
130
+                $GLOBALS['contexte'],
131
+                $GLOBALS['use_cache'],
132
+                $chemin_cache,
133
+                null,
134
+                $page,
135
+                $lastmodified,
136
+                $connect
137
+            );
138
+            if ($page === '') {
139
+                $erreur = _T(
140
+                    'info_erreur_squelette2',
141
+                    ['fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES]
142
+                );
143
+                erreur_squelette($erreur);
144
+                // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
145
+                $page = ['texte' => '', 'erreur' => $erreur];
146
+            }
147
+        }
148
+
149
+        if ($page && $chemin_cache) {
150
+            $page['cache'] = $chemin_cache;
151
+        }
152
+
153
+        auto_content_type($page);
154
+
155
+        $GLOBALS['flag_preserver'] |= headers_sent();
156
+
157
+        // Definir les entetes si ce n'est fait
158
+        if (!$GLOBALS['flag_preserver']) {
159
+            // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
160
+            if (
161
+                trim($page['texte']) === ''
162
+                && _VAR_MODE !== 'debug'
163
+                && !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur
164
+            ) {
165
+                $GLOBALS['contexte']['fond_erreur'] = $fond;
166
+                $page = message_page_indisponible($page, $GLOBALS['contexte']);
167
+            }
168
+            // pas de cache client en mode 'observation'
169
+            if (defined('_VAR_MODE') && _VAR_MODE) {
170
+                $page['entetes']['Cache-Control'] = 'no-cache,must-revalidate';
171
+                $page['entetes']['Pragma'] = 'no-cache';
172
+            }
173
+        }
174
+    }
175
+
176
+    // Entete Last-Modified:
177
+    // eviter d'etre incoherent en envoyant un lastmodified identique
178
+    // a celui qu'on a refuse d'honorer plus haut (cf. #655)
179
+    if (
180
+        $lastmodified && !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && !isset($page['entetes']['Last-Modified'])
181
+    ) {
182
+        $page['entetes']['Last-Modified'] = gmdate('D, d M Y H:i:s', $lastmodified) . ' GMT';
183
+    }
184
+
185
+    // fermer la connexion apres les headers si requete HEAD
186
+    if ($headers_only) {
187
+        $page['entetes']['Connection'] = 'close';
188
+    }
189
+
190
+    return $page;
191 191
 }
192 192
 
193 193
 /**
@@ -204,19 +204,19 @@  discard block
 block discarded – undo
204 204
  */
205 205
 function calculer_contexte() {
206 206
 
207
-	$contexte = [];
208
-	foreach ($_GET as $var => $val) {
209
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
210
-			$contexte[$var] = $val;
211
-		}
212
-	}
213
-	foreach ($_POST as $var => $val) {
214
-		if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
215
-			$contexte[$var] = $val;
216
-		}
217
-	}
218
-
219
-	return $contexte;
207
+    $contexte = [];
208
+    foreach ($_GET as $var => $val) {
209
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
210
+            $contexte[$var] = $val;
211
+        }
212
+    }
213
+    foreach ($_POST as $var => $val) {
214
+        if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) {
215
+            $contexte[$var] = $val;
216
+        }
217
+    }
218
+
219
+    return $contexte;
220 220
 }
221 221
 
222 222
 /**
@@ -227,25 +227,25 @@  discard block
 block discarded – undo
227 227
  * @return array
228 228
  */
229 229
 function calculer_contexte_implicite() {
230
-	static $notes = null;
231
-	if (is_null($notes)) {
232
-		$notes = charger_fonction('notes', 'inc', true);
233
-	}
234
-	$contexte_implicite = [
235
-		'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
236
-		'host' => ($_SERVER['HTTP_HOST'] ?? null),
237
-		'https' => ($_SERVER['HTTPS'] ?? ''),
238
-		'espace' => test_espace_prive(),
239
-		'marqueur' => ($GLOBALS['marqueur'] ?? ''),
240
-		'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
241
-		'notes' => $notes ? $notes('', 'contexter_cache') : '',
242
-		'spip_version_code' => $GLOBALS['spip_version_code'],
243
-	];
244
-	if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
245
-		$contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
246
-	}
247
-
248
-	return $contexte_implicite;
230
+    static $notes = null;
231
+    if (is_null($notes)) {
232
+        $notes = charger_fonction('notes', 'inc', true);
233
+    }
234
+    $contexte_implicite = [
235
+        'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ?
236
+        'host' => ($_SERVER['HTTP_HOST'] ?? null),
237
+        'https' => ($_SERVER['HTTPS'] ?? ''),
238
+        'espace' => test_espace_prive(),
239
+        'marqueur' => ($GLOBALS['marqueur'] ?? ''),
240
+        'marqueur_skel' => ($GLOBALS['marqueur_skel'] ?? ''),
241
+        'notes' => $notes ? $notes('', 'contexter_cache') : '',
242
+        'spip_version_code' => $GLOBALS['spip_version_code'],
243
+    ];
244
+    if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
245
+        $contexte_implicite['host'] .= '|' . $_SERVER['HTTP_X_FORWARDED_HOST'];
246
+    }
247
+
248
+    return $contexte_implicite;
249 249
 }
250 250
 
251 251
 //
@@ -254,56 +254,56 @@  discard block
 block discarded – undo
254 254
 
255 255
 function auto_content_type($page) {
256 256
 
257
-	if (!isset($GLOBALS['flag_preserver'])) {
258
-		$GLOBALS['flag_preserver'] = ($page && preg_match(
259
-			'/header\s*\(\s*.content\-type:/isx',
260
-			$page['texte']
261
-		) || (isset($page['entetes']['Content-Type'])));
262
-	}
257
+    if (!isset($GLOBALS['flag_preserver'])) {
258
+        $GLOBALS['flag_preserver'] = ($page && preg_match(
259
+            '/header\s*\(\s*.content\-type:/isx',
260
+            $page['texte']
261
+        ) || (isset($page['entetes']['Content-Type'])));
262
+    }
263 263
 }
264 264
 
265 265
 function inclure_page($fond, $contexte, string $connect = '') {
266
-	$use_cache = null;
267
-	$chemin_cache = null;
268
-	$lastinclude = null;
269
-	$res = null;
270
-	static $cacher, $produire_page;
271
-
272
-	// enlever le fond de contexte inclus car sinon il prend la main
273
-	// dans les sous inclusions -> boucle infinie d'inclusion identique
274
-	// (cette precaution n'est probablement plus utile)
275
-	unset($contexte['fond']);
276
-	$page = ['contexte_implicite' => calculer_contexte_implicite()];
277
-	$page['contexte_implicite']['cache'] = $fond;
278
-	if (is_null($cacher)) {
279
-		$cacher = charger_fonction('cacher', 'public', true);
280
-	}
281
-	// Les quatre derniers parametres sont modifies par la fonction:
282
-	// emplacement, validite, et, s'il est valide, contenu & age
283
-	if ($cacher) {
284
-		$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
285
-	} else {
286
-		$use_cache = -1;
287
-	}
288
-
289
-	// $res = message d'erreur : on sort de la
290
-	if ($res) {
291
-		return ['texte' => $res];
292
-	}
293
-
294
-	// Si use_cache ne vaut pas 0, la page doit etre calculee
295
-	// produire la page : peut mettre a jour $lastinclude
296
-	// le contexte_cache envoye a cacher() a ete conserve et est passe a produire
297
-	if ($use_cache) {
298
-		if (is_null($produire_page)) {
299
-			$produire_page = charger_fonction('produire_page', 'public');
300
-		}
301
-		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
302
-	}
303
-	// dans tous les cas, mettre a jour $GLOBALS['lastmodified']
304
-	$GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
305
-
306
-	return $page;
266
+    $use_cache = null;
267
+    $chemin_cache = null;
268
+    $lastinclude = null;
269
+    $res = null;
270
+    static $cacher, $produire_page;
271
+
272
+    // enlever le fond de contexte inclus car sinon il prend la main
273
+    // dans les sous inclusions -> boucle infinie d'inclusion identique
274
+    // (cette precaution n'est probablement plus utile)
275
+    unset($contexte['fond']);
276
+    $page = ['contexte_implicite' => calculer_contexte_implicite()];
277
+    $page['contexte_implicite']['cache'] = $fond;
278
+    if (is_null($cacher)) {
279
+        $cacher = charger_fonction('cacher', 'public', true);
280
+    }
281
+    // Les quatre derniers parametres sont modifies par la fonction:
282
+    // emplacement, validite, et, s'il est valide, contenu & age
283
+    if ($cacher) {
284
+        $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
285
+    } else {
286
+        $use_cache = -1;
287
+    }
288
+
289
+    // $res = message d'erreur : on sort de la
290
+    if ($res) {
291
+        return ['texte' => $res];
292
+    }
293
+
294
+    // Si use_cache ne vaut pas 0, la page doit etre calculee
295
+    // produire la page : peut mettre a jour $lastinclude
296
+    // le contexte_cache envoye a cacher() a ete conserve et est passe a produire
297
+    if ($use_cache) {
298
+        if (is_null($produire_page)) {
299
+            $produire_page = charger_fonction('produire_page', 'public');
300
+        }
301
+        $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
302
+    }
303
+    // dans tous les cas, mettre a jour $GLOBALS['lastmodified']
304
+    $GLOBALS['lastmodified'] = max(($GLOBALS['lastmodified'] ?? 0), $lastinclude);
305
+
306
+    return $page;
307 307
 }
308 308
 
309 309
 /**
@@ -321,41 +321,41 @@  discard block
 block discarded – undo
321 321
  * @return array
322 322
  */
323 323
 function public_produire_page_dist(
324
-	$fond,
325
-	$contexte,
326
-	$use_cache,
327
-	$chemin_cache,
328
-	$contexte_cache,
329
-	&$page,
330
-	&$lastinclude,
331
-	$connect = ''
324
+    $fond,
325
+    $contexte,
326
+    $use_cache,
327
+    $chemin_cache,
328
+    $contexte_cache,
329
+    &$page,
330
+    &$lastinclude,
331
+    $connect = ''
332 332
 ) {
333
-	static $parametrer, $cacher;
334
-	if (!$parametrer) {
335
-		$parametrer = charger_fonction('parametrer', 'public');
336
-	}
337
-	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
338
-	// et on l'enregistre sur le disque
339
-	if (
340
-		$chemin_cache
341
-		&& $use_cache > -1
342
-		&& is_array($page)
343
-		&& count($page)
344
-		&& isset($page['entetes']['X-Spip-Cache'])
345
-		&& $page['entetes']['X-Spip-Cache'] > 0
346
-	) {
347
-		if (is_null($cacher)) {
348
-			$cacher = charger_fonction('cacher', 'public', true);
349
-		}
350
-		$lastinclude = time();
351
-		if ($cacher) {
352
-			$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
353
-		} else {
354
-			$use_cache = -1;
355
-		}
356
-	}
357
-
358
-	return $page;
333
+    static $parametrer, $cacher;
334
+    if (!$parametrer) {
335
+        $parametrer = charger_fonction('parametrer', 'public');
336
+    }
337
+    $page = $parametrer($fond, $contexte, $chemin_cache, $connect);
338
+    // et on l'enregistre sur le disque
339
+    if (
340
+        $chemin_cache
341
+        && $use_cache > -1
342
+        && is_array($page)
343
+        && count($page)
344
+        && isset($page['entetes']['X-Spip-Cache'])
345
+        && $page['entetes']['X-Spip-Cache'] > 0
346
+    ) {
347
+        if (is_null($cacher)) {
348
+            $cacher = charger_fonction('cacher', 'public', true);
349
+        }
350
+        $lastinclude = time();
351
+        if ($cacher) {
352
+            $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
353
+        } else {
354
+            $use_cache = -1;
355
+        }
356
+    }
357
+
358
+    return $page;
359 359
 }
360 360
 
361 361
 // Fonction inseree par le compilateur dans le code compile.
@@ -369,14 +369,14 @@  discard block
 block discarded – undo
369 369
 // 4: langue
370 370
 
371 371
 function inserer_balise_dynamique($contexte_exec, $contexte_compil) {
372
-	arguments_balise_dyn_depuis_modele(null, 'reset');
373
-
374
-	if (!is_array($contexte_exec)) {
375
-		echo $contexte_exec;
376
-	} // message d'erreur etc
377
-	else {
378
-		inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
379
-	}
372
+    arguments_balise_dyn_depuis_modele(null, 'reset');
373
+
374
+    if (!is_array($contexte_exec)) {
375
+        echo $contexte_exec;
376
+    } // message d'erreur etc
377
+    else {
378
+        inclure_balise_dynamique($contexte_exec, true, $contexte_compil);
379
+    }
380 380
 }
381 381
 
382 382
 /**
@@ -389,101 +389,101 @@  discard block
 block discarded – undo
389 389
  * @return string|void
390 390
  */
391 391
 function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = []) {
392
-	if (is_array($texte)) {
393
-		[$fond, $delainc, $contexte_inclus] = $texte;
394
-
395
-		// delais a l'ancienne, c'est pratiquement mort
396
-		$d = $GLOBALS['delais'] ?? null;
397
-		$GLOBALS['delais'] = $delainc;
398
-
399
-		$page = recuperer_fond(
400
-			$fond,
401
-			$contexte_inclus,
402
-			['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
403
-		);
404
-
405
-		$texte = $page['texte'];
406
-
407
-		$GLOBALS['delais'] = $d;
408
-		// Faire remonter les entetes
409
-		if (
410
-			isset($page['entetes'])
411
-			&& is_array($page['entetes'])
412
-		) {
413
-			// mais pas toutes
414
-			unset($page['entetes']['X-Spip-Cache']);
415
-			unset($page['entetes']['Content-Type']);
416
-			if (isset($GLOBALS['page']) && is_array($GLOBALS['page'])) {
417
-				if (!is_array($GLOBALS['page']['entetes'])) {
418
-					$GLOBALS['page']['entetes'] = [];
419
-				}
420
-				$GLOBALS['page']['entetes'] =
421
-					array_merge($GLOBALS['page']['entetes'], $page['entetes']);
422
-			}
423
-		}
424
-		// _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
425
-		if (
426
-			isset($page['contexte']['_pipelines'])
427
-			&& is_array($page['contexte']['_pipelines'])
428
-			&& count($page['contexte']['_pipelines'])
429
-		) {
430
-			foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
431
-				$args['contexte'] = $page['contexte'];
432
-				unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
433
-				$texte = pipeline(
434
-					$pipe,
435
-					[
436
-						'data' => $texte,
437
-						'args' => $args
438
-					]
439
-				);
440
-			}
441
-		}
442
-	}
443
-
444
-	if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
445
-		// compatibilite : avant on donnait le numero de ligne ou rien.
446
-		$ligne = intval($contexte_compil[3] ?? $contexte_compil);
447
-		$GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
448
-	}
449
-	if ($echo) {
450
-		echo $texte;
451
-	} else {
452
-		return $texte;
453
-	}
392
+    if (is_array($texte)) {
393
+        [$fond, $delainc, $contexte_inclus] = $texte;
394
+
395
+        // delais a l'ancienne, c'est pratiquement mort
396
+        $d = $GLOBALS['delais'] ?? null;
397
+        $GLOBALS['delais'] = $delainc;
398
+
399
+        $page = recuperer_fond(
400
+            $fond,
401
+            $contexte_inclus,
402
+            ['trim' => false, 'raw' => true, 'compil' => $contexte_compil]
403
+        );
404
+
405
+        $texte = $page['texte'];
406
+
407
+        $GLOBALS['delais'] = $d;
408
+        // Faire remonter les entetes
409
+        if (
410
+            isset($page['entetes'])
411
+            && is_array($page['entetes'])
412
+        ) {
413
+            // mais pas toutes
414
+            unset($page['entetes']['X-Spip-Cache']);
415
+            unset($page['entetes']['Content-Type']);
416
+            if (isset($GLOBALS['page']) && is_array($GLOBALS['page'])) {
417
+                if (!is_array($GLOBALS['page']['entetes'])) {
418
+                    $GLOBALS['page']['entetes'] = [];
419
+                }
420
+                $GLOBALS['page']['entetes'] =
421
+                    array_merge($GLOBALS['page']['entetes'], $page['entetes']);
422
+            }
423
+        }
424
+        // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines
425
+        if (
426
+            isset($page['contexte']['_pipelines'])
427
+            && is_array($page['contexte']['_pipelines'])
428
+            && count($page['contexte']['_pipelines'])
429
+        ) {
430
+            foreach ($page['contexte']['_pipelines'] as $pipe => $args) {
431
+                $args['contexte'] = $page['contexte'];
432
+                unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul
433
+                $texte = pipeline(
434
+                    $pipe,
435
+                    [
436
+                        'data' => $texte,
437
+                        'args' => $args
438
+                    ]
439
+                );
440
+            }
441
+        }
442
+    }
443
+
444
+    if (defined('_VAR_MODE') && _VAR_MODE == 'debug') {
445
+        // compatibilite : avant on donnait le numero de ligne ou rien.
446
+        $ligne = intval($contexte_compil[3] ?? $contexte_compil);
447
+        $GLOBALS['debug_objets']['resultat'][$ligne] = $texte;
448
+    }
449
+    if ($echo) {
450
+        echo $texte;
451
+    } else {
452
+        return $texte;
453
+    }
454 454
 }
455 455
 
456 456
 function message_page_indisponible($page, $contexte) {
457
-	static $deja = false;
458
-	if ($deja) {
459
-		return 'erreur';
460
-	}
461
-	$codes = [
462
-		'404' => '404 Not Found',
463
-		'503' => '503 Service Unavailable',
464
-	];
465
-
466
-	$contexte['status'] = ($page !== false) ? '404' : '503';
467
-	$contexte['code'] = $codes[$contexte['status']];
468
-	$contexte['fond'] = '404'; // gere les 2 erreurs
469
-	if (!isset($contexte['lang'])) {
470
-		include_spip('inc/lang');
471
-		$contexte['lang'] = $GLOBALS['spip_lang'];
472
-	}
473
-
474
-	$deja = true;
475
-	// passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
476
-	// ex restriction d'acces => 401
477
-	$contexte = pipeline('page_indisponible', $contexte);
478
-
479
-	// produire la page d'erreur
480
-	$page = inclure_page($contexte['fond'], $contexte);
481
-	if (!$page) {
482
-		$page = inclure_page('404', $contexte);
483
-	}
484
-	$page['status'] = $contexte['status'];
485
-
486
-	return $page;
457
+    static $deja = false;
458
+    if ($deja) {
459
+        return 'erreur';
460
+    }
461
+    $codes = [
462
+        '404' => '404 Not Found',
463
+        '503' => '503 Service Unavailable',
464
+    ];
465
+
466
+    $contexte['status'] = ($page !== false) ? '404' : '503';
467
+    $contexte['code'] = $codes[$contexte['status']];
468
+    $contexte['fond'] = '404'; // gere les 2 erreurs
469
+    if (!isset($contexte['lang'])) {
470
+        include_spip('inc/lang');
471
+        $contexte['lang'] = $GLOBALS['spip_lang'];
472
+    }
473
+
474
+    $deja = true;
475
+    // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent
476
+    // ex restriction d'acces => 401
477
+    $contexte = pipeline('page_indisponible', $contexte);
478
+
479
+    // produire la page d'erreur
480
+    $page = inclure_page($contexte['fond'], $contexte);
481
+    if (!$page) {
482
+        $page = inclure_page('404', $contexte);
483
+    }
484
+    $page['status'] = $contexte['status'];
485
+
486
+    return $page;
487 487
 }
488 488
 
489 489
 /**
@@ -495,44 +495,44 @@  discard block
 block discarded – undo
495 495
  * @return mixed
496 496
  */
497 497
 function arguments_balise_dyn_depuis_modele($arg, $operation = 'set') {
498
-	static $balise_dyn_appellee_par_modele = null;
499
-	switch ($operation) {
500
-		case 'read':
501
-			return $balise_dyn_appellee_par_modele;
502
-		case 'reset':
503
-			$balise_dyn_appellee_par_modele = null;
504
-			return null;
505
-		case 'set':
506
-		default:
507
-			$balise_dyn_appellee_par_modele = $arg;
508
-			return $arg;
509
-	}
498
+    static $balise_dyn_appellee_par_modele = null;
499
+    switch ($operation) {
500
+        case 'read':
501
+            return $balise_dyn_appellee_par_modele;
502
+        case 'reset':
503
+            $balise_dyn_appellee_par_modele = null;
504
+            return null;
505
+        case 'set':
506
+        default:
507
+            $balise_dyn_appellee_par_modele = $arg;
508
+            return $arg;
509
+    }
510 510
 }
511 511
 
512 512
 // temporairement ici : a mettre dans le futur inc/modeles
513 513
 // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array()
514 514
 function creer_contexte_de_modele($args) {
515
-	$contexte = [];
516
-	foreach ($args as $var => $val) {
517
-		if (is_int($var)) { // argument pas formate
518
-			if (in_array($val, ['left', 'right', 'center'])) {
519
-				$var = 'align';
520
-				$contexte[$var] = $val;
521
-			} else {
522
-				$args = explode('=', $val);
523
-				if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
524
-				$contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
525
-				} else // notation abregee
526
-				{
527
-					$contexte[trim($val)] = trim($val);
528
-				}
529
-			}
530
-		} else {
531
-			$contexte[$var] = $val;
532
-		}
533
-	}
534
-
535
-	return $contexte;
515
+    $contexte = [];
516
+    foreach ($args as $var => $val) {
517
+        if (is_int($var)) { // argument pas formate
518
+            if (in_array($val, ['left', 'right', 'center'])) {
519
+                $var = 'align';
520
+                $contexte[$var] = $val;
521
+            } else {
522
+                $args = explode('=', $val);
523
+                if (count($args) >= 2) { // Flashvars=arg1=machin&arg2=truc genere plus de deux args
524
+                $contexte[trim($args[0])] = substr($val, strlen($args[0]) + 1);
525
+                } else // notation abregee
526
+                {
527
+                    $contexte[trim($val)] = trim($val);
528
+                }
529
+            }
530
+        } else {
531
+            $contexte[$var] = $val;
532
+        }
533
+    }
534
+
535
+    return $contexte;
536 536
 }
537 537
 
538 538
 /**
@@ -547,45 +547,45 @@  discard block
 block discarded – undo
547 547
  * @return string
548 548
  */
549 549
 function styliser_modele($modele, $id, $contexte = null) {
550
-	static $styliseurs = null;
551
-	if (is_null($styliseurs)) {
552
-		$tables_objet = lister_tables_objets_sql();
553
-		foreach ($tables_objet as $table => $desc) {
554
-			if (
555
-				isset($desc['modeles'])
556
-				&& $desc['modeles']
557
-				&& isset($desc['modeles_styliser'])
558
-				&& $desc['modeles_styliser']
559
-				&& function_exists($desc['modeles_styliser'])
560
-			) {
561
-				$primary = id_table_objet($table);
562
-				foreach ($desc['modeles'] as $m) {
563
-					$styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
564
-				}
565
-			}
566
-		}
567
-	}
568
-
569
-	if (isset($styliseurs[$modele])) {
570
-		$styliseur = $styliseurs[$modele]['callback'];
571
-		$primary = $styliseurs[$modele]['primary'];
572
-		if (is_null($id) && $contexte) {
573
-			if (isset($contexte['id'])) {
574
-				$id = $contexte['id'];
575
-			} elseif (isset($contexte[$primary])) {
576
-				$id = $contexte[$primary];
577
-			}
578
-		}
579
-		if (is_null($id)) {
580
-			$msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
581
-			erreur_squelette($msg);
582
-			// on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
583
-			$id = 0;
584
-		}
585
-		$modele = $styliseur($modele, $id);
586
-	}
587
-
588
-	return $modele;
550
+    static $styliseurs = null;
551
+    if (is_null($styliseurs)) {
552
+        $tables_objet = lister_tables_objets_sql();
553
+        foreach ($tables_objet as $table => $desc) {
554
+            if (
555
+                isset($desc['modeles'])
556
+                && $desc['modeles']
557
+                && isset($desc['modeles_styliser'])
558
+                && $desc['modeles_styliser']
559
+                && function_exists($desc['modeles_styliser'])
560
+            ) {
561
+                $primary = id_table_objet($table);
562
+                foreach ($desc['modeles'] as $m) {
563
+                    $styliseurs[$m] = ['primary' => $primary, 'callback' => $desc['modeles_styliser']];
564
+                }
565
+            }
566
+        }
567
+    }
568
+
569
+    if (isset($styliseurs[$modele])) {
570
+        $styliseur = $styliseurs[$modele]['callback'];
571
+        $primary = $styliseurs[$modele]['primary'];
572
+        if (is_null($id) && $contexte) {
573
+            if (isset($contexte['id'])) {
574
+                $id = $contexte['id'];
575
+            } elseif (isset($contexte[$primary])) {
576
+                $id = $contexte[$primary];
577
+            }
578
+        }
579
+        if (is_null($id)) {
580
+            $msg = "modeles/$modele : " . _T('zbug_parametres_inclus_incorrects', ['param' => "id/$primary"]);
581
+            erreur_squelette($msg);
582
+            // on passe id=0 au routeur pour tomber sur le modele par defaut et eviter une seconde erreur sur un modele inexistant
583
+            $id = 0;
584
+        }
585
+        $modele = $styliseur($modele, $id);
586
+    }
587
+
588
+    return $modele;
589 589
 }
590 590
 
591 591
 /**
@@ -600,102 +600,102 @@  discard block
 block discarded – undo
600 600
  */
601 601
 function inclure_modele($type, $id, $params, $lien, string $connect = '', $env = []) {
602 602
 
603
-	static $compteur;
604
-	if (++$compteur > 10) {
605
-		return '';
606
-	} # ne pas boucler indefiniment
607
-
608
-	$type = strtolower($type);
609
-	$type = styliser_modele($type, $id);
610
-
611
-	$fond = $class = '';
612
-
613
-	$params = array_filter(explode('|', $params));
614
-	if ($params) {
615
-		$soustype = current($params);
616
-		$soustype = strtolower(trim($soustype));
617
-		if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
618
-			$soustype = next($params);
619
-			$soustype = strtolower($soustype);
620
-		}
621
-
622
-		if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
623
-			if (!trouve_modele($fond = ($type . '_' . $soustype))) {
624
-				$fond = '';
625
-				$class = $soustype;
626
-			}
627
-			// enlever le sous type des params
628
-			$params = array_diff($params, [$soustype]);
629
-		}
630
-	}
631
-
632
-	// Si ca marche pas en precisant le sous-type, prendre le type
633
-	if (!$fond && !trouve_modele($fond = $type)) {
634
-		spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
635
-
636
-		return false;
637
-	}
638
-	$fond = 'modeles/' . $fond;
639
-	// Creer le contexte
640
-	$contexte = $env;
641
-	$contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
642
-
643
-	// Le numero du modele est mis dans l'environnement
644
-	// d'une part sous l'identifiant "id"
645
-	// et d'autre part sous l'identifiant de la cle primaire
646
-	// par la fonction id_table_objet,
647
-	// (<article1> =>> article =>> id_article =>> id_article=1)
648
-	$_id = id_table_objet($type);
649
-	$contexte['id'] = $contexte[$_id] = $id;
650
-
651
-	if (isset($class)) {
652
-		$contexte['class'] = $class;
653
-	}
654
-
655
-	// Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
656
-	if ($lien) {
657
-		# un eventuel guillemet (") sera reechappe par #ENV
658
-		$contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
659
-		$contexte['lien_class'] = $lien['class'];
660
-		$contexte['lien_mime'] = $lien['mime'];
661
-		$contexte['lien_title'] = $lien['title'];
662
-		$contexte['lien_hreflang'] = $lien['hreflang'];
663
-	}
664
-
665
-	// Traiter les parametres
666
-	// par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
667
-	$arg_list = creer_contexte_de_modele($params);
668
-	$contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
669
-	$contexte = array_merge($contexte, $arg_list);
670
-
671
-	// Appliquer le modele avec le contexte
672
-	$retour = recuperer_fond($fond, $contexte, [], $connect);
673
-
674
-	// Regarder si le modele tient compte des liens (il *doit* alors indiquer
675
-	// spip_lien_ok dans les classes de son conteneur de premier niveau ;
676
-	// sinon, s'il y a un lien, on l'ajoute classiquement
677
-	if (
678
-		strstr(
679
-			' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
680
-			'spip_lien_ok'
681
-		)
682
-	) {
683
-		$retour = inserer_attribut(
684
-			$retour,
685
-			'class',
686
-			trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
687
-		);
688
-	} else {
689
-		if ($lien) {
690
-			$retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>';
691
-		}
692
-	}
693
-
694
-	$compteur--;
695
-
696
-	return (isset($arg_list['ajax']) && $arg_list['ajax'] == 'ajax')
697
-		? encoder_contexte_ajax($contexte, '', $retour)
698
-		: $retour;
603
+    static $compteur;
604
+    if (++$compteur > 10) {
605
+        return '';
606
+    } # ne pas boucler indefiniment
607
+
608
+    $type = strtolower($type);
609
+    $type = styliser_modele($type, $id);
610
+
611
+    $fond = $class = '';
612
+
613
+    $params = array_filter(explode('|', $params));
614
+    if ($params) {
615
+        $soustype = current($params);
616
+        $soustype = strtolower(trim($soustype));
617
+        if (in_array($soustype, ['left', 'right', 'center', 'ajax'])) {
618
+            $soustype = next($params);
619
+            $soustype = strtolower($soustype);
620
+        }
621
+
622
+        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
623
+            if (!trouve_modele($fond = ($type . '_' . $soustype))) {
624
+                $fond = '';
625
+                $class = $soustype;
626
+            }
627
+            // enlever le sous type des params
628
+            $params = array_diff($params, [$soustype]);
629
+        }
630
+    }
631
+
632
+    // Si ca marche pas en precisant le sous-type, prendre le type
633
+    if (!$fond && !trouve_modele($fond = $type)) {
634
+        spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE);
635
+
636
+        return false;
637
+    }
638
+    $fond = 'modeles/' . $fond;
639
+    // Creer le contexte
640
+    $contexte = $env;
641
+    $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
642
+
643
+    // Le numero du modele est mis dans l'environnement
644
+    // d'une part sous l'identifiant "id"
645
+    // et d'autre part sous l'identifiant de la cle primaire
646
+    // par la fonction id_table_objet,
647
+    // (<article1> =>> article =>> id_article =>> id_article=1)
648
+    $_id = id_table_objet($type);
649
+    $contexte['id'] = $contexte[$_id] = $id;
650
+
651
+    if (isset($class)) {
652
+        $contexte['class'] = $class;
653
+    }
654
+
655
+    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
656
+    if ($lien) {
657
+        # un eventuel guillemet (") sera reechappe par #ENV
658
+        $contexte['lien'] = str_replace('&quot;', '"', $lien['href']);
659
+        $contexte['lien_class'] = $lien['class'];
660
+        $contexte['lien_mime'] = $lien['mime'];
661
+        $contexte['lien_title'] = $lien['title'];
662
+        $contexte['lien_hreflang'] = $lien['hreflang'];
663
+    }
664
+
665
+    // Traiter les parametres
666
+    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
667
+    $arg_list = creer_contexte_de_modele($params);
668
+    $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args
669
+    $contexte = array_merge($contexte, $arg_list);
670
+
671
+    // Appliquer le modele avec le contexte
672
+    $retour = recuperer_fond($fond, $contexte, [], $connect);
673
+
674
+    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
675
+    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
676
+    // sinon, s'il y a un lien, on l'ajoute classiquement
677
+    if (
678
+        strstr(
679
+            ' ' . ($classes = extraire_attribut($retour, 'class')) . ' ',
680
+            'spip_lien_ok'
681
+        )
682
+    ) {
683
+        $retour = inserer_attribut(
684
+            $retour,
685
+            'class',
686
+            trim(str_replace(' spip_lien_ok ', ' ', " $classes "))
687
+        );
688
+    } else {
689
+        if ($lien) {
690
+            $retour = '<a href="' . $lien['href'] . '" class="' . $lien['class'] . '">' . $retour . '</a>';
691
+        }
692
+    }
693
+
694
+    $compteur--;
695
+
696
+    return (isset($arg_list['ajax']) && $arg_list['ajax'] == 'ajax')
697
+        ? encoder_contexte_ajax($contexte, '', $retour)
698
+        : $retour;
699 699
 }
700 700
 
701 701
 // Un inclure_page qui marche aussi pour l'espace prive
@@ -704,99 +704,99 @@  discard block
 block discarded – undo
704 704
 // 	recuperer_fond($fond,$contexte,array('raw'=>true))
705 705
 function evaluer_fond($fond, $contexte = [], string $connect = '') {
706 706
 
707
-	$page = inclure_page($fond, $contexte, $connect);
708
-
709
-	if (!$page) {
710
-		return $page;
711
-	}
712
-	// eval $page et affecte $res
713
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
714
-
715
-	// Lever un drapeau (global) si le fond utilise #SESSION
716
-	// a destination de public/parametrer
717
-	// pour remonter vers les inclusions appelantes
718
-	// il faut bien lever ce drapeau apres avoir evalue le fond
719
-	// pour ne pas faire descendre le flag vers les inclusions appelees
720
-	if (
721
-		isset($page['invalideurs'])
722
-		&& isset($page['invalideurs']['session'])
723
-	) {
724
-		$GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
725
-	}
726
-
727
-	return $page;
707
+    $page = inclure_page($fond, $contexte, $connect);
708
+
709
+    if (!$page) {
710
+        return $page;
711
+    }
712
+    // eval $page et affecte $res
713
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
714
+
715
+    // Lever un drapeau (global) si le fond utilise #SESSION
716
+    // a destination de public/parametrer
717
+    // pour remonter vers les inclusions appelantes
718
+    // il faut bien lever ce drapeau apres avoir evalue le fond
719
+    // pour ne pas faire descendre le flag vers les inclusions appelees
720
+    if (
721
+        isset($page['invalideurs'])
722
+        && isset($page['invalideurs']['session'])
723
+    ) {
724
+        $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session'];
725
+    }
726
+
727
+    return $page;
728 728
 }
729 729
 
730 730
 
731 731
 function page_base_href(&$texte) {
732
-	static $set_html_base = null;
733
-	if (is_null($set_html_base)) {
734
-		if (!defined('_SET_HTML_BASE')) {
735
-			// si la profondeur est superieure a 1
736
-			// est que ce n'est pas une url page ni une url action
737
-			// activer par defaut
738
-			$set_html_base =
739
-				$GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
740
-				&& _request(_SPIP_PAGE) !== 'login'
741
-				&& !_request('action');
742
-		} else {
743
-			$set_html_base = _SET_HTML_BASE;
744
-		}
745
-	}
746
-
747
-	if (
748
-		$set_html_base
749
-		&& isset($GLOBALS['html'])
750
-		&& $GLOBALS['html']
751
-		&& $GLOBALS['profondeur_url'] > 0
752
-		&& ($poshead = strpos($texte, '</head>')) !== false
753
-	) {
754
-		$head = substr($texte, 0, $poshead);
755
-		$insert = false;
756
-		$href_base = false;
757
-		if (!str_contains($head, '<base')) {
758
-			$insert = true;
759
-		} else {
760
-			// si aucun <base ...> n'a de href il faut en inserer un
761
-			// sinon juste re-ecrire les ancres si besoin
762
-			$insert = true;
763
-			include_spip('inc/filtres');
764
-			$bases = extraire_balises($head, 'base');
765
-			foreach ($bases as $base) {
766
-				if ($href_base = extraire_attribut($base, 'href')) {
767
-					$insert = false;
768
-					break;
769
-				}
770
-			}
771
-		}
772
-
773
-		if ($insert) {
774
-			include_spip('inc/filtres_mini');
775
-			// ajouter un base qui reglera tous les liens relatifs
776
-			$href_base = url_absolue('./');
777
-			$base = "\n<base href=\"$href_base\" />";
778
-			if (($pos = strpos($head, '<head>')) !== false) {
779
-				$head = substr_replace($head, $base, $pos + 6, 0);
780
-			} elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
781
-				$head = str_replace($r[0], $r[0] . $base, $head);
782
-			}
783
-			$texte = $head . substr($texte, $poshead);
784
-		}
785
-		if ($href_base) {
786
-			// gerer les ancres
787
-			$base = $_SERVER['REQUEST_URI'];
788
-			// pas de guillemets ni < dans l'URL qu'on insere dans le HTML
789
-			if (str_contains($base, "'") || str_contains($base, '"') || str_contains($base, '<')) {
790
-				$base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
791
-			}
792
-			if (str_contains($texte, "href='#")) {
793
-				$texte = str_replace("href='#", "href='$base#", $texte);
794
-			}
795
-			if (str_contains($texte, 'href="#')) {
796
-				$texte = str_replace('href="#', "href=\"$base#", $texte);
797
-			}
798
-		}
799
-	}
732
+    static $set_html_base = null;
733
+    if (is_null($set_html_base)) {
734
+        if (!defined('_SET_HTML_BASE')) {
735
+            // si la profondeur est superieure a 1
736
+            // est que ce n'est pas une url page ni une url action
737
+            // activer par defaut
738
+            $set_html_base =
739
+                $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2)
740
+                && _request(_SPIP_PAGE) !== 'login'
741
+                && !_request('action');
742
+        } else {
743
+            $set_html_base = _SET_HTML_BASE;
744
+        }
745
+    }
746
+
747
+    if (
748
+        $set_html_base
749
+        && isset($GLOBALS['html'])
750
+        && $GLOBALS['html']
751
+        && $GLOBALS['profondeur_url'] > 0
752
+        && ($poshead = strpos($texte, '</head>')) !== false
753
+    ) {
754
+        $head = substr($texte, 0, $poshead);
755
+        $insert = false;
756
+        $href_base = false;
757
+        if (!str_contains($head, '<base')) {
758
+            $insert = true;
759
+        } else {
760
+            // si aucun <base ...> n'a de href il faut en inserer un
761
+            // sinon juste re-ecrire les ancres si besoin
762
+            $insert = true;
763
+            include_spip('inc/filtres');
764
+            $bases = extraire_balises($head, 'base');
765
+            foreach ($bases as $base) {
766
+                if ($href_base = extraire_attribut($base, 'href')) {
767
+                    $insert = false;
768
+                    break;
769
+                }
770
+            }
771
+        }
772
+
773
+        if ($insert) {
774
+            include_spip('inc/filtres_mini');
775
+            // ajouter un base qui reglera tous les liens relatifs
776
+            $href_base = url_absolue('./');
777
+            $base = "\n<base href=\"$href_base\" />";
778
+            if (($pos = strpos($head, '<head>')) !== false) {
779
+                $head = substr_replace($head, $base, $pos + 6, 0);
780
+            } elseif (preg_match(',<head[^>]*>,i', $head, $r)) {
781
+                $head = str_replace($r[0], $r[0] . $base, $head);
782
+            }
783
+            $texte = $head . substr($texte, $poshead);
784
+        }
785
+        if ($href_base) {
786
+            // gerer les ancres
787
+            $base = $_SERVER['REQUEST_URI'];
788
+            // pas de guillemets ni < dans l'URL qu'on insere dans le HTML
789
+            if (str_contains($base, "'") || str_contains($base, '"') || str_contains($base, '<')) {
790
+                $base = str_replace(["'",'"','<'], ['%27','%22','%3C'], $base);
791
+            }
792
+            if (str_contains($texte, "href='#")) {
793
+                $texte = str_replace("href='#", "href='$base#", $texte);
794
+            }
795
+            if (str_contains($texte, 'href="#')) {
796
+                $texte = str_replace('href="#', "href=\"$base#", $texte);
797
+            }
798
+        }
799
+    }
800 800
 }
801 801
 
802 802
 
@@ -806,7 +806,7 @@  discard block
 block discarded – undo
806 806
  * Ceux spécifiques à SPIP commencent par X-Spip
807 807
  */
808 808
 function envoyer_entetes($entetes) {
809
-	foreach ($entetes as $k => $v) {
810
-		@header(strlen((string) $v) ? "$k: $v" : $k);
811
-	}
809
+    foreach ($entetes as $k => $v) {
810
+        @header(strlen((string) $v) ? "$k: $v" : $k);
811
+    }
812 812
 }
Please login to merge, or discard this patch.
ecrire/public/balises.php 1 patch
Indentation   +943 added lines, -943 removed lines patch added patch discarded remove patch
@@ -27,7 +27,7 @@  discard block
 block discarded – undo
27 27
  **/
28 28
 
29 29
 if (!defined('_ECRIRE_INC_VERSION')) {
30
-	return;
30
+    return;
31 31
 }
32 32
 
33 33
 /**
@@ -47,16 +47,16 @@  discard block
 block discarded – undo
47 47
  *     Code PHP si cet argument est présent, sinon null
48 48
  **/
49 49
 function interprete_argument_balise(int $n, Champ $p): ?string {
50
-	if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
51
-		return calculer_liste(
52
-			$p->param[0][$n],
53
-			$p->descr,
54
-			$p->boucles,
55
-			$p->id_boucle
56
-		);
57
-	}
50
+    if (($p->param) && (!$p->param[0][0]) && ((is_countable($p->param[0]) ? count($p->param[0]) : 0) > $n)) {
51
+        return calculer_liste(
52
+            $p->param[0][$n],
53
+            $p->descr,
54
+            $p->boucles,
55
+            $p->id_boucle
56
+        );
57
+    }
58 58
 
59
-	return null;
59
+    return null;
60 60
 }
61 61
 
62 62
 
@@ -76,10 +76,10 @@  discard block
 block discarded – undo
76 76
  *     Pile complétée par le code à générer
77 77
  **/
78 78
 function balise_NOM_SITE_SPIP_dist($p) {
79
-	$p->code = "\$GLOBALS['meta']['nom_site']";
79
+    $p->code = "\$GLOBALS['meta']['nom_site']";
80 80
 
81
-	#$p->interdire_scripts = true;
82
-	return $p;
81
+    #$p->interdire_scripts = true;
82
+    return $p;
83 83
 }
84 84
 
85 85
 /**
@@ -95,10 +95,10 @@  discard block
 block discarded – undo
95 95
  *     Pile complétée par le code à générer
96 96
  **/
97 97
 function balise_EMAIL_WEBMASTER_dist($p) {
98
-	$p->code = "\$GLOBALS['meta']['email_webmaster']";
98
+    $p->code = "\$GLOBALS['meta']['email_webmaster']";
99 99
 
100
-	#$p->interdire_scripts = true;
101
-	return $p;
100
+    #$p->interdire_scripts = true;
101
+    return $p;
102 102
 }
103 103
 
104 104
 /**
@@ -114,10 +114,10 @@  discard block
 block discarded – undo
114 114
  *     Pile complétée par le code à générer
115 115
  **/
116 116
 function balise_DESCRIPTIF_SITE_SPIP_dist($p) {
117
-	$p->code = "\$GLOBALS['meta']['descriptif_site']";
117
+    $p->code = "\$GLOBALS['meta']['descriptif_site']";
118 118
 
119
-	#$p->interdire_scripts = true;
120
-	return $p;
119
+    #$p->interdire_scripts = true;
120
+    return $p;
121 121
 }
122 122
 
123 123
 
@@ -138,10 +138,10 @@  discard block
 block discarded – undo
138 138
  *     Pile complétée par le code à générer
139 139
  **/
140 140
 function balise_CHARSET_dist($p) {
141
-	$p->code = "\$GLOBALS['meta']['charset']";
141
+    $p->code = "\$GLOBALS['meta']['charset']";
142 142
 
143
-	#$p->interdire_scripts = true;
144
-	return $p;
143
+    #$p->interdire_scripts = true;
144
+    return $p;
145 145
 }
146 146
 
147 147
 /**
@@ -166,11 +166,11 @@  discard block
 block discarded – undo
166 166
  *     Pile complétée par le code à générer
167 167
  **/
168 168
 function balise_LANG_LEFT_dist($p) {
169
-	$_lang = champ_sql('lang', $p);
170
-	$p->code = "lang_dir($_lang, 'left','right')";
171
-	$p->interdire_scripts = false;
169
+    $_lang = champ_sql('lang', $p);
170
+    $p->code = "lang_dir($_lang, 'left','right')";
171
+    $p->interdire_scripts = false;
172 172
 
173
-	return $p;
173
+    return $p;
174 174
 }
175 175
 
176 176
 /**
@@ -190,11 +190,11 @@  discard block
 block discarded – undo
190 190
  *     Pile complétée par le code à générer
191 191
  **/
192 192
 function balise_LANG_RIGHT_dist($p) {
193
-	$_lang = champ_sql('lang', $p);
194
-	$p->code = "lang_dir($_lang, 'right','left')";
195
-	$p->interdire_scripts = false;
193
+    $_lang = champ_sql('lang', $p);
194
+    $p->code = "lang_dir($_lang, 'right','left')";
195
+    $p->interdire_scripts = false;
196 196
 
197
-	return $p;
197
+    return $p;
198 198
 }
199 199
 
200 200
 /**
@@ -219,11 +219,11 @@  discard block
 block discarded – undo
219 219
  *     Pile complétée par le code à générer
220 220
  **/
221 221
 function balise_LANG_DIR_dist($p) {
222
-	$_lang = champ_sql('lang', $p);
223
-	$p->code = "lang_dir($_lang, 'ltr','rtl')";
224
-	$p->interdire_scripts = false;
222
+    $_lang = champ_sql('lang', $p);
223
+    $p->code = "lang_dir($_lang, 'ltr','rtl')";
224
+    $p->interdire_scripts = false;
225 225
 
226
-	return $p;
226
+    return $p;
227 227
 }
228 228
 
229 229
 
@@ -240,10 +240,10 @@  discard block
 block discarded – undo
240 240
  *     Pile complétée par le code à générer
241 241
  **/
242 242
 function balise_PUCE_dist($p) {
243
-	$p->code = 'definir_puce()';
244
-	$p->interdire_scripts = false;
243
+    $p->code = 'definir_puce()';
244
+    $p->interdire_scripts = false;
245 245
 
246
-	return $p;
246
+    return $p;
247 247
 }
248 248
 
249 249
 
@@ -267,9 +267,9 @@  discard block
 block discarded – undo
267 267
  *     Pile completée du code PHP d'exécution de la balise
268 268
  */
269 269
 function balise_DATE_dist($p) {
270
-	$p->code = champ_sql('date', $p);
270
+    $p->code = champ_sql('date', $p);
271 271
 
272
-	return $p;
272
+    return $p;
273 273
 }
274 274
 
275 275
 
@@ -289,10 +289,10 @@  discard block
 block discarded – undo
289 289
  *     Pile completée du code PHP d'exécution de la balise
290 290
  */
291 291
 function balise_DATE_REDAC_dist($p) {
292
-	$p->code = champ_sql('date_redac', $p);
293
-	$p->interdire_scripts = false;
292
+    $p->code = champ_sql('date_redac', $p);
293
+    $p->interdire_scripts = false;
294 294
 
295
-	return $p;
295
+    return $p;
296 296
 }
297 297
 
298 298
 /**
@@ -311,10 +311,10 @@  discard block
 block discarded – undo
311 311
  *     Pile completée du code PHP d'exécution de la balise
312 312
  */
313 313
 function balise_DATE_MODIF_dist($p) {
314
-	$p->code = champ_sql('date_modif', $p);
315
-	$p->interdire_scripts = false;
314
+    $p->code = champ_sql('date_modif', $p);
315
+    $p->interdire_scripts = false;
316 316
 
317
-	return $p;
317
+    return $p;
318 318
 }
319 319
 
320 320
 /**
@@ -332,13 +332,13 @@  discard block
 block discarded – undo
332 332
  *     Pile completée du code PHP d'exécution de la balise
333 333
  */
334 334
 function balise_DATE_NOUVEAUTES_dist($p) {
335
-	$p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
335
+    $p->code = "((\$GLOBALS['meta']['quoi_de_neuf'] == 'oui'
336 336
 	AND isset(\$GLOBALS['meta']['dernier_envoi_neuf'])) ?
337 337
 	\$GLOBALS['meta']['dernier_envoi_neuf'] :
338 338
 	\"'0000-00-00'\")";
339
-	$p->interdire_scripts = false;
339
+    $p->interdire_scripts = false;
340 340
 
341
-	return $p;
341
+    return $p;
342 342
 }
343 343
 
344 344
 
@@ -356,11 +356,11 @@  discard block
 block discarded – undo
356 356
  *     Pile completée du code PHP d'exécution de la balise
357 357
  */
358 358
 function balise_DOSSIER_SQUELETTE_dist($p) {
359
-	$code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
360
-	$p->code = "_DIR_RACINE . '$code'" .
361
-		$p->interdire_scripts = false;
359
+    $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE));
360
+    $p->code = "_DIR_RACINE . '$code'" .
361
+        $p->interdire_scripts = false;
362 362
 
363
-	return $p;
363
+    return $p;
364 364
 }
365 365
 
366 366
 /**
@@ -375,11 +375,11 @@  discard block
 block discarded – undo
375 375
  *     Pile completée du code PHP d'exécution de la balise
376 376
  */
377 377
 function balise_SQUELETTE_dist($p) {
378
-	$code = addslashes($p->descr['sourcefile']);
379
-	$p->code = "'$code'" .
380
-		$p->interdire_scripts = false;
378
+    $code = addslashes($p->descr['sourcefile']);
379
+    $p->code = "'$code'" .
380
+        $p->interdire_scripts = false;
381 381
 
382
-	return $p;
382
+    return $p;
383 383
 }
384 384
 
385 385
 /**
@@ -398,10 +398,10 @@  discard block
 block discarded – undo
398 398
  *     Pile completée du code PHP d'exécution de la balise
399 399
  */
400 400
 function balise_SPIP_VERSION_dist($p) {
401
-	$p->code = 'spip_version()';
402
-	$p->interdire_scripts = false;
401
+    $p->code = 'spip_version()';
402
+    $p->interdire_scripts = false;
403 403
 
404
-	return $p;
404
+    return $p;
405 405
 }
406 406
 
407 407
 
@@ -427,18 +427,18 @@  discard block
 block discarded – undo
427 427
  *     Pile complétée par le code à générer
428 428
  **/
429 429
 function balise_NOM_SITE_dist($p) {
430
-	if (!$p->etoile) {
431
-		$p->code = 'supprimer_numero(calculer_url(' .
432
-			champ_sql('url_site', $p) . ',' .
433
-			champ_sql('nom_site', $p) .
434
-			", 'titre', \$connect, false))";
435
-	} else {
436
-		$p->code = champ_sql('nom_site', $p);
437
-	}
430
+    if (!$p->etoile) {
431
+        $p->code = 'supprimer_numero(calculer_url(' .
432
+            champ_sql('url_site', $p) . ',' .
433
+            champ_sql('nom_site', $p) .
434
+            ", 'titre', \$connect, false))";
435
+    } else {
436
+        $p->code = champ_sql('nom_site', $p);
437
+    }
438 438
 
439
-	$p->interdire_scripts = true;
439
+    $p->interdire_scripts = true;
440 440
 
441
-	return $p;
441
+    return $p;
442 442
 }
443 443
 
444 444
 
@@ -455,11 +455,11 @@  discard block
 block discarded – undo
455 455
  *     Pile complétée par le code à générer
456 456
  **/
457 457
 function balise_NOTES_dist($p) {
458
-	// Recuperer les notes
459
-	$p->code = 'calculer_notes()';
458
+    // Recuperer les notes
459
+    $p->code = 'calculer_notes()';
460 460
 
461
-	#$p->interdire_scripts = true;
462
-	return $p;
461
+    #$p->interdire_scripts = true;
462
+    return $p;
463 463
 }
464 464
 
465 465
 
@@ -481,10 +481,10 @@  discard block
 block discarded – undo
481 481
  *     Pile complétée par le code à générer
482 482
  **/
483 483
 function balise_RECHERCHE_dist($p) {
484
-	$p->code = 'entites_html(_request("recherche"))';
485
-	$p->interdire_scripts = false;
484
+    $p->code = 'entites_html(_request("recherche"))';
485
+    $p->interdire_scripts = false;
486 486
 
487
-	return $p;
487
+    return $p;
488 488
 }
489 489
 
490 490
 
@@ -502,18 +502,18 @@  discard block
 block discarded – undo
502 502
  *     Pile complétée par le code à générer
503 503
  **/
504 504
 function balise_COMPTEUR_BOUCLE_dist($p) {
505
-	$b = index_boucle_mere($p);
506
-	if ($b === '') {
507
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
508
-		erreur_squelette($msg, $p);
509
-		return null;
510
-	} else {
511
-		$p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
-		$p->boucles[$b]->cptrows = true;
513
-		$p->interdire_scripts = false;
505
+    $b = index_boucle_mere($p);
506
+    if ($b === '') {
507
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
508
+        erreur_squelette($msg, $p);
509
+        return null;
510
+    } else {
511
+        $p->code = "(\$Numrows['$b']['compteur_boucle'] ?? 0)";
512
+        $p->boucles[$b]->cptrows = true;
513
+        $p->interdire_scripts = false;
514 514
 
515
-		return $p;
516
-	}
515
+        return $p;
516
+    }
517 517
 }
518 518
 
519 519
 /**
@@ -531,17 +531,17 @@  discard block
 block discarded – undo
531 531
  *     Pile complétée par le code à générer
532 532
  **/
533 533
 function balise_TOTAL_BOUCLE_dist($p) {
534
-	$b = index_boucle_mere($p);
535
-	if ($b === '') {
536
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
-		erreur_squelette($msg, $p);
538
-	} else {
539
-		$p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
-		$p->boucles[$b]->numrows = true;
541
-		$p->interdire_scripts = false;
542
-	}
534
+    $b = index_boucle_mere($p);
535
+    if ($b === '') {
536
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
537
+        erreur_squelette($msg, $p);
538
+    } else {
539
+        $p->code = "(\$Numrows['$b']['total'] ?? 0)";
540
+        $p->boucles[$b]->numrows = true;
541
+        $p->interdire_scripts = false;
542
+    }
543 543
 
544
-	return $p;
544
+    return $p;
545 545
 }
546 546
 
547 547
 
@@ -561,7 +561,7 @@  discard block
 block discarded – undo
561 561
  *     Pile complétée par le code à générer
562 562
  **/
563 563
 function balise_POINTS_dist($p) {
564
-	return rindex_pile($p, 'points', 'recherche');
564
+    return rindex_pile($p, 'points', 'recherche');
565 565
 }
566 566
 
567 567
 
@@ -582,12 +582,12 @@  discard block
 block discarded – undo
582 582
  *     Pile complétée par le code à générer
583 583
  **/
584 584
 function balise_POPULARITE_ABSOLUE_dist($p) {
585
-	$p->code = 'ceil(' .
586
-		champ_sql('popularite', $p) .
587
-		')';
588
-	$p->interdire_scripts = false;
585
+    $p->code = 'ceil(' .
586
+        champ_sql('popularite', $p) .
587
+        ')';
588
+    $p->interdire_scripts = false;
589 589
 
590
-	return $p;
590
+    return $p;
591 591
 }
592 592
 
593 593
 /**
@@ -607,10 +607,10 @@  discard block
 block discarded – undo
607 607
  *     Pile complétée par le code à générer
608 608
  **/
609 609
 function balise_POPULARITE_SITE_dist($p) {
610
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
-	$p->interdire_scripts = false;
610
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])';
611
+    $p->interdire_scripts = false;
612 612
 
613
-	return $p;
613
+    return $p;
614 614
 }
615 615
 
616 616
 /**
@@ -631,10 +631,10 @@  discard block
 block discarded – undo
631 631
  *     Pile complétée par le code à générer
632 632
  **/
633 633
 function balise_POPULARITE_MAX_dist($p) {
634
-	$p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
-	$p->interdire_scripts = false;
634
+    $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])';
635
+    $p->interdire_scripts = false;
636 636
 
637
-	return $p;
637
+    return $p;
638 638
 }
639 639
 
640 640
 
@@ -660,15 +660,15 @@  discard block
 block discarded – undo
660 660
  *     Pile complétée par le code à générer
661 661
  **/
662 662
 function balise_VALEUR_dist($p) {
663
-	$b = $p->nom_boucle ?: $p->id_boucle;
664
-	$p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
663
+    $b = $p->nom_boucle ?: $p->id_boucle;
664
+    $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);
665 665
 ;
666
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
667
-		$p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
-	}
669
-	$p->interdire_scripts = true;
666
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
667
+        $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')';
668
+    }
669
+    $p->interdire_scripts = true;
670 670
 
671
-	return $p;
671
+    return $p;
672 672
 }
673 673
 
674 674
 /**
@@ -697,16 +697,16 @@  discard block
 block discarded – undo
697 697
  *     Pile complétée par le code à générer
698 698
  **/
699 699
 function balise_EXPOSE_dist($p) {
700
-	$on = "'on'";
701
-	$off = "''";
702
-	if (($v = interprete_argument_balise(1, $p)) !== null) {
703
-		$on = $v;
704
-		if (($v = interprete_argument_balise(2, $p)) !== null) {
705
-			$off = $v;
706
-		}
707
-	}
700
+    $on = "'on'";
701
+    $off = "''";
702
+    if (($v = interprete_argument_balise(1, $p)) !== null) {
703
+        $on = $v;
704
+        if (($v = interprete_argument_balise(2, $p)) !== null) {
705
+            $off = $v;
706
+        }
707
+    }
708 708
 
709
-	return calculer_balise_expose($p, $on, $off);
709
+    return calculer_balise_expose($p, $on, $off);
710 710
 }
711 711
 
712 712
 /**
@@ -724,35 +724,35 @@  discard block
 block discarded – undo
724 724
  *     Pile complétée par le code à générer
725 725
  **/
726 726
 function calculer_balise_expose($p, $on, $off) {
727
-	$b = index_boucle($p);
728
-	if (empty($p->boucles[$b]->primary)) {
729
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
-		erreur_squelette($msg, $p);
731
-	} else {
732
-		$key = $p->boucles[$b]->primary;
733
-		$type = $p->boucles[$p->id_boucle]->primary;
734
-		$desc = $p->boucles[$b]->show;
735
-		$connect = sql_quote($p->boucles[$b]->sql_serveur);
727
+    $b = index_boucle($p);
728
+    if (empty($p->boucles[$b]->primary)) {
729
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
730
+        erreur_squelette($msg, $p);
731
+    } else {
732
+        $key = $p->boucles[$b]->primary;
733
+        $type = $p->boucles[$p->id_boucle]->primary;
734
+        $desc = $p->boucles[$b]->show;
735
+        $connect = sql_quote($p->boucles[$b]->sql_serveur);
736 736
 
737
-		// Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
-		$c = index_pile($p->id_boucle, $type, $p->boucles);
737
+        // Ne pas utiliser champ_sql, on jongle avec le nom boucle explicite
738
+        $c = index_pile($p->id_boucle, $type, $p->boucles);
739 739
 
740
-		if (isset($desc['field']['id_parent'])) {
741
-			$parent = 0; // pour if (!$parent) dans calculer_expose
742
-		} elseif (isset($desc['field']['id_rubrique'])) {
743
-			$parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
-		} elseif (isset($desc['field']['id_groupe'])) {
745
-			$parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
-		} else {
747
-			$parent = "''";
748
-		}
740
+        if (isset($desc['field']['id_parent'])) {
741
+            $parent = 0; // pour if (!$parent) dans calculer_expose
742
+        } elseif (isset($desc['field']['id_rubrique'])) {
743
+            $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b);
744
+        } elseif (isset($desc['field']['id_groupe'])) {
745
+            $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b);
746
+        } else {
747
+            $parent = "''";
748
+        }
749 749
 
750
-		$p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
-	}
750
+        $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)";
751
+    }
752 752
 
753
-	$p->interdire_scripts = false;
753
+    $p->interdire_scripts = false;
754 754
 
755
-	return $p;
755
+    return $p;
756 756
 }
757 757
 
758 758
 
@@ -793,46 +793,46 @@  discard block
 block discarded – undo
793 793
  **/
794 794
 function balise_INTRODUCTION_dist($p) {
795 795
 
796
-	$type_objet = $p->type_requete;
797
-	$cle_objet = id_table_objet($type_objet);
798
-	$_id_objet = champ_sql($cle_objet, $p);
799
-
800
-	// Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
801
-	// ainsi que le longueur d'introduction donnée dans la description de l'objet.
802
-	$_introduction_longueur = 'null';
803
-	$_ligne = 'array(';
804
-	$trouver_table = charger_fonction('trouver_table', 'base');
805
-	if ($desc = $trouver_table(table_objet_sql($type_objet))) {
806
-		if (isset($desc['field']['descriptif'])) {
807
-			$_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
808
-		}
809
-		if (isset($desc['field']['texte'])) {
810
-			$_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
811
-		}
812
-		if (isset($desc['field']['chapo'])) {
813
-			$_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
814
-		}
815
-		if (isset($desc['introduction_longueur'])) {
816
-			$_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
817
-		}
818
-	}
819
-	$_ligne .= ')';
820
-
821
-	// Récupérer la longueur et la suite passés en paramètres
822
-	$_longueur_ou_suite = 'null';
823
-	if (($v1 = interprete_argument_balise(1, $p)) !== null) {
824
-		$_longueur_ou_suite = $v1;
825
-	}
826
-	$_suite = 'null';
827
-	if (($v2 = interprete_argument_balise(2, $p)) !== null) {
828
-		$_suite = $v2;
829
-	}
830
-
831
-	$p->code = "generer_objet_introduction((int)$_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
832
-
833
-	#$p->interdire_scripts = true;
834
-	$p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
835
-	return $p;
796
+    $type_objet = $p->type_requete;
797
+    $cle_objet = id_table_objet($type_objet);
798
+    $_id_objet = champ_sql($cle_objet, $p);
799
+
800
+    // Récupérer les valeurs sql nécessaires : descriptif, texte et chapo
801
+    // ainsi que le longueur d'introduction donnée dans la description de l'objet.
802
+    $_introduction_longueur = 'null';
803
+    $_ligne = 'array(';
804
+    $trouver_table = charger_fonction('trouver_table', 'base');
805
+    if ($desc = $trouver_table(table_objet_sql($type_objet))) {
806
+        if (isset($desc['field']['descriptif'])) {
807
+            $_ligne .= "'descriptif' => " . champ_sql('descriptif', $p) . ',';
808
+        }
809
+        if (isset($desc['field']['texte'])) {
810
+            $_ligne .= "'texte' => " . champ_sql('texte', $p) . ',';
811
+        }
812
+        if (isset($desc['field']['chapo'])) {
813
+            $_ligne .= "'chapo' => " . champ_sql('chapo', $p) . ',';
814
+        }
815
+        if (isset($desc['introduction_longueur'])) {
816
+            $_introduction_longueur = "'" . $desc['introduction_longueur'] . "'";
817
+        }
818
+    }
819
+    $_ligne .= ')';
820
+
821
+    // Récupérer la longueur et la suite passés en paramètres
822
+    $_longueur_ou_suite = 'null';
823
+    if (($v1 = interprete_argument_balise(1, $p)) !== null) {
824
+        $_longueur_ou_suite = $v1;
825
+    }
826
+    $_suite = 'null';
827
+    if (($v2 = interprete_argument_balise(2, $p)) !== null) {
828
+        $_suite = $v2;
829
+    }
830
+
831
+    $p->code = "generer_objet_introduction((int)$_id_objet, '$type_objet', $_ligne, $_introduction_longueur, $_longueur_ou_suite, $_suite, \$connect)";
832
+
833
+    #$p->interdire_scripts = true;
834
+    $p->etoile = '*'; // propre est deja fait dans le calcul de l'intro
835
+    return $p;
836 836
 }
837 837
 
838 838
 
@@ -852,15 +852,15 @@  discard block
 block discarded – undo
852 852
  *     Pile complétée par le code à générer
853 853
  **/
854 854
 function balise_LANG_dist($p) {
855
-	$_lang = champ_sql('lang', $p);
856
-	if (!$p->etoile) {
857
-		$p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
858
-	} else {
859
-		$p->code = "spip_htmlentities($_lang)";
860
-	}
861
-	$p->interdire_scripts = false;
855
+    $_lang = champ_sql('lang', $p);
856
+    if (!$p->etoile) {
857
+        $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])";
858
+    } else {
859
+        $p->code = "spip_htmlentities($_lang)";
860
+    }
861
+    $p->interdire_scripts = false;
862 862
 
863
-	return $p;
863
+    return $p;
864 864
 }
865 865
 
866 866
 /**
@@ -882,45 +882,45 @@  discard block
 block discarded – undo
882 882
  *     Pile complétée par le code à générer
883 883
  */
884 884
 function balise_LESAUTEURS_dist($p) {
885
-	// Cherche le champ 'lesauteurs' dans la pile
886
-	$_lesauteurs = champ_sql('lesauteurs', $p, '');
887
-
888
-	// Si le champ n'existe pas (cas de spip_articles), on applique
889
-	// le modele lesauteurs.html en passant id_article dans le contexte;
890
-	// dans le cas contraire on prend le champ 'lesauteurs'
891
-	// (cf extension sites/)
892
-	if ($_lesauteurs) {
893
-		$p->code = "safehtml($_lesauteurs)";
894
-		// $p->interdire_scripts = true;
895
-	} else {
896
-		if (!$p->id_boucle) {
897
-			$connect = '';
898
-			$objet = 'article';
899
-			$id_table_objet = 'id_article';
900
-		} else {
901
-			$b = $p->nom_boucle ?: $p->id_boucle;
902
-			$connect = $p->boucles[$b]->sql_serveur;
903
-			$type_boucle = $p->boucles[$b]->type_requete;
904
-			$objet = objet_type($type_boucle);
905
-			$id_table_objet = id_table_objet($type_boucle);
906
-		}
907
-		$c = memoriser_contexte_compil($p);
908
-
909
-		$p->code = sprintf(
910
-			CODE_RECUPERER_FOND,
911
-			"'modeles/lesauteurs'",
912
-			"array('objet'=>'" . $objet .
913
-			"','id_objet' => " . champ_sql($id_table_objet, $p) .
914
-			",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
915
-			($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
916
-			')',
917
-			"'trim'=>true, 'compil'=>array($c)",
918
-			_q($connect)
919
-		);
920
-		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
921
-	}
922
-
923
-	return $p;
885
+    // Cherche le champ 'lesauteurs' dans la pile
886
+    $_lesauteurs = champ_sql('lesauteurs', $p, '');
887
+
888
+    // Si le champ n'existe pas (cas de spip_articles), on applique
889
+    // le modele lesauteurs.html en passant id_article dans le contexte;
890
+    // dans le cas contraire on prend le champ 'lesauteurs'
891
+    // (cf extension sites/)
892
+    if ($_lesauteurs) {
893
+        $p->code = "safehtml($_lesauteurs)";
894
+        // $p->interdire_scripts = true;
895
+    } else {
896
+        if (!$p->id_boucle) {
897
+            $connect = '';
898
+            $objet = 'article';
899
+            $id_table_objet = 'id_article';
900
+        } else {
901
+            $b = $p->nom_boucle ?: $p->id_boucle;
902
+            $connect = $p->boucles[$b]->sql_serveur;
903
+            $type_boucle = $p->boucles[$b]->type_requete;
904
+            $objet = objet_type($type_boucle);
905
+            $id_table_objet = id_table_objet($type_boucle);
906
+        }
907
+        $c = memoriser_contexte_compil($p);
908
+
909
+        $p->code = sprintf(
910
+            CODE_RECUPERER_FOND,
911
+            "'modeles/lesauteurs'",
912
+            "array('objet'=>'" . $objet .
913
+            "','id_objet' => " . champ_sql($id_table_objet, $p) .
914
+            ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) .
915
+            ($objet == 'article' ? '' : ",'id_article' => " . champ_sql('id_article', $p)) .
916
+            ')',
917
+            "'trim'=>true, 'compil'=>array($c)",
918
+            _q($connect)
919
+        );
920
+        $p->interdire_scripts = false; // securite apposee par recuperer_fond()
921
+    }
922
+
923
+    return $p;
924 924
 }
925 925
 
926 926
 
@@ -947,76 +947,76 @@  discard block
 block discarded – undo
947 947
  *     Pile complétée par le code à générer
948 948
  */
949 949
 function balise_RANG_dist($p) {
950
-	$b = index_boucle($p);
951
-	if ($b === '') {
952
-		$msg = [
953
-			'zbug_champ_hors_boucle',
954
-			['champ' => '#RANG']
955
-		];
956
-		erreur_squelette($msg, $p);
957
-	} else {
958
-		// chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
959
-		// dans la boucle immediatement englobante uniquement
960
-		// sinon on compose le champ calcule
961
-		$_rang = champ_sql('rang', $p, '', false);
962
-
963
-		// si pas trouve de champ sql rang :
964
-		if (!$_rang || $_rang == "''") {
965
-			$boucle = &$p->boucles[$b];
966
-
967
-			// on gere le cas ou #RANG est une extraction du numero dans le titre
968
-			$trouver_table = charger_fonction('trouver_table', 'base');
969
-			$desc = $trouver_table($boucle->id_table);
970
-			$_titre = ''; # où extraire le numero ?
971
-
972
-			if (isset($desc['titre'])) {
973
-				$t = $desc['titre'];
974
-				if (
975
-					// Soit on trouve avec la déclaration de la lang AVANT
976
-					preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
977
-					// Soit on prend depuis le début
978
-					|| preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
979
-				) {
980
-					$m = preg_replace(',as\s+titre$,i', '', $m[1]);
981
-					$m = trim($m);
982
-					if ($m != "''") {
983
-						if (!preg_match(',\W,', $m)) {
984
-							$m = $boucle->id_table . ".$m";
985
-						}
986
-
987
-						$m .= ' AS titre_rang';
988
-
989
-						$boucle->select[] = $m;
990
-						$_titre = '$Pile[$SP][\'titre_rang\']';
991
-					}
992
-				}
993
-			}
994
-
995
-			// si on n'a rien trouvé, on utilise le champ titre classique
996
-			if (!$_titre) {
997
-				$_titre = champ_sql('titre', $p);
998
-			}
999
-
1000
-			// et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1001
-			// cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1002
-			$type_boucle = $boucle->type_requete;
1003
-			$objet = objet_type($type_boucle);
1004
-			$id_table_objet = id_table_objet($type_boucle);
1005
-			$_primary = champ_sql($id_table_objet, $p, '', false);
1006
-			$_env = '$Pile[0]';
1007
-
1008
-			if (!$_titre) {$_titre = "''";
1009
-			}
1010
-			if (!$_primary) {$_primary = "''";
1011
-			}
1012
-			$_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1013
-		}
1014
-
1015
-		$p->code = $_rang;
1016
-		$p->interdire_scripts = false;
1017
-	}
1018
-
1019
-	return $p;
950
+    $b = index_boucle($p);
951
+    if ($b === '') {
952
+        $msg = [
953
+            'zbug_champ_hors_boucle',
954
+            ['champ' => '#RANG']
955
+        ];
956
+        erreur_squelette($msg, $p);
957
+    } else {
958
+        // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql)
959
+        // dans la boucle immediatement englobante uniquement
960
+        // sinon on compose le champ calcule
961
+        $_rang = champ_sql('rang', $p, '', false);
962
+
963
+        // si pas trouve de champ sql rang :
964
+        if (!$_rang || $_rang == "''") {
965
+            $boucle = &$p->boucles[$b];
966
+
967
+            // on gere le cas ou #RANG est une extraction du numero dans le titre
968
+            $trouver_table = charger_fonction('trouver_table', 'base');
969
+            $desc = $trouver_table($boucle->id_table);
970
+            $_titre = ''; # où extraire le numero ?
971
+
972
+            if (isset($desc['titre'])) {
973
+                $t = $desc['titre'];
974
+                if (
975
+                    // Soit on trouve avec la déclaration de la lang AVANT
976
+                    preg_match(';(?:lang\s*,)\s*(.*?titre)\s*(,|$);', $t, $m)
977
+                    // Soit on prend depuis le début
978
+                    || preg_match(';^(.*?titre)\s*(,|$);', $t, $m)
979
+                ) {
980
+                    $m = preg_replace(',as\s+titre$,i', '', $m[1]);
981
+                    $m = trim($m);
982
+                    if ($m != "''") {
983
+                        if (!preg_match(',\W,', $m)) {
984
+                            $m = $boucle->id_table . ".$m";
985
+                        }
986
+
987
+                        $m .= ' AS titre_rang';
988
+
989
+                        $boucle->select[] = $m;
990
+                        $_titre = '$Pile[$SP][\'titre_rang\']';
991
+                    }
992
+                }
993
+            }
994
+
995
+            // si on n'a rien trouvé, on utilise le champ titre classique
996
+            if (!$_titre) {
997
+                $_titre = champ_sql('titre', $p);
998
+            }
999
+
1000
+            // et on recupere aussi les infos de liaison si on est en train d'editer les liens justement
1001
+            // cas des formulaires xxx_lies utilises par #FORMULAIRE_EDITER_LIENS
1002
+            $type_boucle = $boucle->type_requete;
1003
+            $objet = objet_type($type_boucle);
1004
+            $id_table_objet = id_table_objet($type_boucle);
1005
+            $_primary = champ_sql($id_table_objet, $p, '', false);
1006
+            $_env = '$Pile[0]';
1007
+
1008
+            if (!$_titre) {$_titre = "''";
1009
+            }
1010
+            if (!$_primary) {$_primary = "''";
1011
+            }
1012
+            $_rang = "calculer_rang_smart($_titre, '$objet', $_primary, $_env)";
1013
+        }
1014
+
1015
+        $p->code = $_rang;
1016
+        $p->interdire_scripts = false;
1017
+    }
1018
+
1019
+    return $p;
1020 1020
 }
1021 1021
 
1022 1022
 
@@ -1038,12 +1038,12 @@  discard block
 block discarded – undo
1038 1038
  *     Pile complétée par le code à générer
1039 1039
  **/
1040 1040
 function balise_POPULARITE_dist($p) {
1041
-	$_popularite = champ_sql('popularite', $p);
1042
-	$p->code = "(ceil(min(100, 100 * $_popularite
1041
+    $_popularite = champ_sql('popularite', $p);
1042
+    $p->code = "(ceil(min(100, 100 * $_popularite
1043 1043
 	/ max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))";
1044
-	$p->interdire_scripts = false;
1044
+    $p->interdire_scripts = false;
1045 1045
 
1046
-	return $p;
1046
+    return $p;
1047 1047
 }
1048 1048
 
1049 1049
 /**
@@ -1054,8 +1054,8 @@  discard block
 block discarded – undo
1054 1054
  * l'absence peut-être due à une faute de frappe dans le contexte inclus.
1055 1055
  */
1056 1056
 define(
1057
-	'CODE_PAGINATION',
1058
-	'%s($Numrows["%s"]["grand_total"],
1057
+    'CODE_PAGINATION',
1058
+    '%s($Numrows["%s"]["grand_total"],
1059 1059
  		%s,
1060 1060
 		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
1061 1061
 		%5$s, %6$s, %7$s, %8$s, array(%9$s))'
@@ -1092,75 +1092,75 @@  discard block
 block discarded – undo
1092 1092
  *     Pile complétée par le code à générer
1093 1093
  */
1094 1094
 function balise_PAGINATION_dist($p, $liste = 'true') {
1095
-	$b = index_boucle_mere($p);
1096
-
1097
-	// s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
-	if ($b === '') {
1099
-		$msg = [
1100
-			'zbug_champ_hors_boucle',
1101
-			['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1102
-		];
1103
-		erreur_squelette($msg, $p);
1104
-
1105
-		return $p;
1106
-	}
1107
-
1108
-	// s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
-	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
-	if (!$p->boucles[$b]->mode_partie) {
1111
-		if (!$p->boucles[$b]->table_optionnelle) {
1112
-			$msg = [
1113
-				'zbug_pagination_sans_critere',
1114
-				['champ' => '#PAGINATION']
1115
-			];
1116
-			erreur_squelette($msg, $p);
1117
-		}
1118
-
1119
-		return $p;
1120
-	}
1121
-
1122
-	// a priori true
1123
-	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
-	// si true, les arguments simples (sans truc=chose) vont degager
1125
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1127
-		$key = key($_contexte);
1128
-		if (is_numeric($key)) {
1129
-			array_shift($_contexte);
1130
-			$__modele = interprete_argument_balise(1, $p);
1131
-		}
1132
-	}
1133
-
1134
-	if (is_countable($_contexte) ? count($_contexte) : 0) {
1135
-		$code_contexte = implode(',', $_contexte);
1136
-	} else {
1137
-		$code_contexte = '';
1138
-	}
1139
-
1140
-	$connect = $p->boucles[$b]->sql_serveur;
1141
-	$pas = $p->boucles[$b]->total_parties;
1142
-	$f_pagination = chercher_filtre('pagination');
1143
-	$type = $p->boucles[$b]->modificateur['debut_nom'];
1144
-	$modif = ($type[0] !== "'") ? "'debut'.$type"
1145
-		: ("'debut" . substr($type, 1));
1146
-
1147
-	$p->code = sprintf(
1148
-		CODE_PAGINATION,
1149
-		$f_pagination,
1150
-		$b,
1151
-		$type,
1152
-		$modif,
1153
-		$pas,
1154
-		$liste,
1155
-		((isset($__modele) && $__modele) ? $__modele : "''"),
1156
-		_q($connect),
1157
-		$code_contexte
1158
-	);
1159
-
1160
-	$p->boucles[$b]->numrows = true;
1161
-	$p->interdire_scripts = false;
1162
-
1163
-	return $p;
1095
+    $b = index_boucle_mere($p);
1096
+
1097
+    // s'il n'y a pas de nom de boucle, on ne peut pas paginer
1098
+    if ($b === '') {
1099
+        $msg = [
1100
+            'zbug_champ_hors_boucle',
1101
+            ['champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION']
1102
+        ];
1103
+        erreur_squelette($msg, $p);
1104
+
1105
+        return $p;
1106
+    }
1107
+
1108
+    // s'il n'y a pas de mode_partie, c'est qu'on se trouve
1109
+    // dans un boucle recursive ou qu'on a oublie le critere {pagination}
1110
+    if (!$p->boucles[$b]->mode_partie) {
1111
+        if (!$p->boucles[$b]->table_optionnelle) {
1112
+            $msg = [
1113
+                'zbug_pagination_sans_critere',
1114
+                ['champ' => '#PAGINATION']
1115
+            ];
1116
+            erreur_squelette($msg, $p);
1117
+        }
1118
+
1119
+        return $p;
1120
+    }
1121
+
1122
+    // a priori true
1123
+    // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
1124
+    // si true, les arguments simples (sans truc=chose) vont degager
1125
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false);
1126
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1127
+        $key = key($_contexte);
1128
+        if (is_numeric($key)) {
1129
+            array_shift($_contexte);
1130
+            $__modele = interprete_argument_balise(1, $p);
1131
+        }
1132
+    }
1133
+
1134
+    if (is_countable($_contexte) ? count($_contexte) : 0) {
1135
+        $code_contexte = implode(',', $_contexte);
1136
+    } else {
1137
+        $code_contexte = '';
1138
+    }
1139
+
1140
+    $connect = $p->boucles[$b]->sql_serveur;
1141
+    $pas = $p->boucles[$b]->total_parties;
1142
+    $f_pagination = chercher_filtre('pagination');
1143
+    $type = $p->boucles[$b]->modificateur['debut_nom'];
1144
+    $modif = ($type[0] !== "'") ? "'debut'.$type"
1145
+        : ("'debut" . substr($type, 1));
1146
+
1147
+    $p->code = sprintf(
1148
+        CODE_PAGINATION,
1149
+        $f_pagination,
1150
+        $b,
1151
+        $type,
1152
+        $modif,
1153
+        $pas,
1154
+        $liste,
1155
+        ((isset($__modele) && $__modele) ? $__modele : "''"),
1156
+        _q($connect),
1157
+        $code_contexte
1158
+    );
1159
+
1160
+    $p->boucles[$b]->numrows = true;
1161
+    $p->interdire_scripts = false;
1162
+
1163
+    return $p;
1164 1164
 }
1165 1165
 
1166 1166
 
@@ -1187,11 +1187,11 @@  discard block
 block discarded – undo
1187 1187
  *     Pile complétée par le code à générer
1188 1188
  **/
1189 1189
 function balise_ANCRE_PAGINATION_dist($p) {
1190
-	if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1191
-		return $f($p, $liste = 'false');
1192
-	} else {
1193
-		return null;
1194
-	} // ou une erreur ?
1190
+    if ($f = charger_fonction('PAGINATION', 'balise', true)) {
1191
+        return $f($p, $liste = 'false');
1192
+    } else {
1193
+        return null;
1194
+    } // ou une erreur ?
1195 1195
 }
1196 1196
 
1197 1197
 
@@ -1212,17 +1212,17 @@  discard block
 block discarded – undo
1212 1212
  *     Pile complétée par le code à générer
1213 1213
  **/
1214 1214
 function balise_GRAND_TOTAL_dist($p) {
1215
-	$b = index_boucle_mere($p);
1216
-	if ($b === '') {
1217
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1218
-		erreur_squelette($msg, $p);
1219
-	} else {
1220
-		$p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1221
-		$p->boucles[$b]->numrows = true;
1222
-		$p->interdire_scripts = false;
1223
-	}
1215
+    $b = index_boucle_mere($p);
1216
+    if ($b === '') {
1217
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
1218
+        erreur_squelette($msg, $p);
1219
+    } else {
1220
+        $p->code = "(\$Numrows['$b']['grand_total'] ?? \$Numrows['$b']['total'] ?? 0)";
1221
+        $p->boucles[$b]->numrows = true;
1222
+        $p->interdire_scripts = false;
1223
+    }
1224 1224
 
1225
-	return $p;
1225
+    return $p;
1226 1226
 }
1227 1227
 
1228 1228
 
@@ -1250,10 +1250,10 @@  discard block
 block discarded – undo
1250 1250
  *     Pile complétée par le code à générer
1251 1251
  **/
1252 1252
 function balise_SELF_dist($p) {
1253
-	$p->code = 'self()';
1254
-	$p->interdire_scripts = false;
1253
+    $p->code = 'self()';
1254
+    $p->interdire_scripts = false;
1255 1255
 
1256
-	return $p;
1256
+    return $p;
1257 1257
 }
1258 1258
 
1259 1259
 
@@ -1280,17 +1280,17 @@  discard block
 block discarded – undo
1280 1280
  *     Pile complétée par le code à générer
1281 1281
  **/
1282 1282
 function balise_CHEMIN_dist($p) {
1283
-	$arg = interprete_argument_balise(1, $p);
1284
-	if (!$arg) {
1285
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1286
-		erreur_squelette($msg, $p);
1287
-	} else {
1288
-		$p->code = 'find_in_path((string)' . $arg . ')';
1289
-	}
1283
+    $arg = interprete_argument_balise(1, $p);
1284
+    if (!$arg) {
1285
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN']];
1286
+        erreur_squelette($msg, $p);
1287
+    } else {
1288
+        $p->code = 'find_in_path((string)' . $arg . ')';
1289
+    }
1290 1290
 
1291
-	$p->interdire_scripts = false;
1291
+    $p->interdire_scripts = false;
1292 1292
 
1293
-	return $p;
1293
+    return $p;
1294 1294
 }
1295 1295
 
1296 1296
 /**
@@ -1315,16 +1315,16 @@  discard block
 block discarded – undo
1315 1315
  *     Pile complétée par le code à générer
1316 1316
  **/
1317 1317
 function balise_CHEMIN_IMAGE_dist($p) {
1318
-	$arg = interprete_argument_balise(1, $p);
1319
-	if (!$arg) {
1320
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1321
-		erreur_squelette($msg, $p);
1322
-	} else {
1323
-		$p->code = 'chemin_image((string)' . $arg . ')';
1324
-	}
1318
+    $arg = interprete_argument_balise(1, $p);
1319
+    if (!$arg) {
1320
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' CHEMIN_IMAGE']];
1321
+        erreur_squelette($msg, $p);
1322
+    } else {
1323
+        $p->code = 'chemin_image((string)' . $arg . ')';
1324
+    }
1325 1325
 
1326
-	$p->interdire_scripts = false;
1327
-	return $p;
1326
+    $p->interdire_scripts = false;
1327
+    return $p;
1328 1328
 }
1329 1329
 
1330 1330
 
@@ -1362,36 +1362,36 @@  discard block
 block discarded – undo
1362 1362
  **/
1363 1363
 function balise_ENV_dist($p, $src = null) {
1364 1364
 
1365
-	// cle du tableau desiree
1366
-	$_nom = interprete_argument_balise(1, $p);
1367
-	// valeur par defaut
1368
-	$_sinon = interprete_argument_balise(2, $p);
1365
+    // cle du tableau desiree
1366
+    $_nom = interprete_argument_balise(1, $p);
1367
+    // valeur par defaut
1368
+    $_sinon = interprete_argument_balise(2, $p);
1369 1369
 
1370
-	// $src est un tableau de donnees sources eventuellement transmis
1371
-	// en absence, on utilise l'environnement du squelette $Pile[0]
1370
+    // $src est un tableau de donnees sources eventuellement transmis
1371
+    // en absence, on utilise l'environnement du squelette $Pile[0]
1372 1372
 
1373
-	if (!$_nom) {
1374
-		// cas de #ENV sans argument : on retourne le serialize() du tableau
1375
-		// une belle fonction [(#ENV|affiche_env)] serait pratique
1376
-		if ($src) {
1377
-			$p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1378
-		} else {
1379
-			$p->code = 'serialize($Pile[0]??[])';
1380
-		}
1381
-	} else {
1382
-		if (!$src) {
1383
-			$src = '$Pile[0]??[]';
1384
-		}
1385
-		if ($_sinon) {
1386
-			$p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1387
-		} else {
1388
-			$p->code = "table_valeur($src, (string)$_nom, null)";
1389
-		}
1390
-	}
1373
+    if (!$_nom) {
1374
+        // cas de #ENV sans argument : on retourne le serialize() du tableau
1375
+        // une belle fonction [(#ENV|affiche_env)] serait pratique
1376
+        if ($src) {
1377
+            $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")';
1378
+        } else {
1379
+            $p->code = 'serialize($Pile[0]??[])';
1380
+        }
1381
+    } else {
1382
+        if (!$src) {
1383
+            $src = '$Pile[0]??[]';
1384
+        }
1385
+        if ($_sinon) {
1386
+            $p->code = "sinon(table_valeur($src, (string)$_nom, null), $_sinon)";
1387
+        } else {
1388
+            $p->code = "table_valeur($src, (string)$_nom, null)";
1389
+        }
1390
+    }
1391 1391
 
1392
-	#$p->interdire_scripts = true;
1392
+    #$p->interdire_scripts = true;
1393 1393
 
1394
-	return $p;
1394
+    return $p;
1395 1395
 }
1396 1396
 
1397 1397
 /**
@@ -1421,16 +1421,16 @@  discard block
 block discarded – undo
1421 1421
  *     Pile completée du code PHP d'exécution de la balise
1422 1422
  */
1423 1423
 function balise_CONFIG_dist($p) {
1424
-	if (!$arg = interprete_argument_balise(1, $p)) {
1425
-		$arg = "''";
1426
-	}
1427
-	$_sinon = interprete_argument_balise(2, $p);
1428
-	$_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1424
+    if (!$arg = interprete_argument_balise(1, $p)) {
1425
+        $arg = "''";
1426
+    }
1427
+    $_sinon = interprete_argument_balise(2, $p);
1428
+    $_unserialize = sinon(interprete_argument_balise(3, $p), 'false');
1429 1429
 
1430
-	$p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1431
-		($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1430
+    $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' .
1431
+        ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')";
1432 1432
 
1433
-	return $p;
1433
+    return $p;
1434 1434
 }
1435 1435
 
1436 1436
 
@@ -1453,10 +1453,10 @@  discard block
 block discarded – undo
1453 1453
  *     Pile completée du code PHP d'exécution de la balise
1454 1454
  */
1455 1455
 function balise_CONNECT_dist($p) {
1456
-	$p->code = '($connect ? $connect : NULL)';
1457
-	$p->interdire_scripts = false;
1456
+    $p->code = '($connect ? $connect : NULL)';
1457
+    $p->interdire_scripts = false;
1458 1458
 
1459
-	return $p;
1459
+    return $p;
1460 1460
 }
1461 1461
 
1462 1462
 
@@ -1484,15 +1484,15 @@  discard block
 block discarded – undo
1484 1484
  *     Pile completée du code PHP d'exécution de la balise
1485 1485
  **/
1486 1486
 function balise_SESSION_dist($p) {
1487
-	$p->descr['session'] = true;
1487
+    $p->descr['session'] = true;
1488 1488
 
1489
-	$f = function_exists('balise_ENV')
1490
-		? 'balise_ENV'
1491
-		: 'balise_ENV_dist';
1489
+    $f = function_exists('balise_ENV')
1490
+        ? 'balise_ENV'
1491
+        : 'balise_ENV_dist';
1492 1492
 
1493
-	$p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1493
+    $p = $f($p, '$GLOBALS["visiteur_session"]??[]');
1494 1494
 
1495
-	return $p;
1495
+    return $p;
1496 1496
 }
1497 1497
 
1498 1498
 
@@ -1515,18 +1515,18 @@  discard block
 block discarded – undo
1515 1515
  *     Pile completée du code PHP d'exécution de la balise
1516 1516
  **/
1517 1517
 function balise_SESSION_SET_dist($p) {
1518
-	$_nom = interprete_argument_balise(1, $p);
1519
-	$_val = interprete_argument_balise(2, $p);
1520
-	if (!$_nom || !$_val) {
1521
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1522
-		erreur_squelette($err_b_s_a, $p);
1523
-	} else {
1524
-		$p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1525
-	}
1518
+    $_nom = interprete_argument_balise(1, $p);
1519
+    $_val = interprete_argument_balise(2, $p);
1520
+    if (!$_nom || !$_val) {
1521
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SESSION_SET']];
1522
+        erreur_squelette($err_b_s_a, $p);
1523
+    } else {
1524
+        $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))';
1525
+    }
1526 1526
 
1527
-	$p->interdire_scripts = false;
1527
+    $p->interdire_scripts = false;
1528 1528
 
1529
-	return $p;
1529
+    return $p;
1530 1530
 }
1531 1531
 
1532 1532
 
@@ -1557,30 +1557,30 @@  discard block
 block discarded – undo
1557 1557
  *     Pile completée du code PHP d'exécution de la balise
1558 1558
  **/
1559 1559
 function balise_EVAL_dist($p) {
1560
-	$php = interprete_argument_balise(1, $p);
1561
-	if ($php) {
1562
-		# optimisation sur les #EVAL{une expression sans #BALISE}
1563
-		# attention au commentaire "// x signes" qui precede
1564
-		if (
1565
-			preg_match(
1566
-				",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1567
-				$php,
1568
-				$r
1569
-			)
1570
-		) {
1571
-			$p->code = /* $r[1]. */
1572
-				'(' . $r[2] . ')';
1573
-		} else {
1574
-			$p->code = "eval('return '.$php.';')";
1575
-		}
1576
-	} else {
1577
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1578
-		erreur_squelette($msg, $p);
1579
-	}
1580
-
1581
-	#$p->interdire_scripts = true;
1582
-
1583
-	return $p;
1560
+    $php = interprete_argument_balise(1, $p);
1561
+    if ($php) {
1562
+        # optimisation sur les #EVAL{une expression sans #BALISE}
1563
+        # attention au commentaire "// x signes" qui precede
1564
+        if (
1565
+            preg_match(
1566
+                ",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms",
1567
+                $php,
1568
+                $r
1569
+            )
1570
+        ) {
1571
+            $p->code = /* $r[1]. */
1572
+                '(' . $r[2] . ')';
1573
+        } else {
1574
+            $p->code = "eval('return '.$php.';')";
1575
+        }
1576
+    } else {
1577
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' EVAL']];
1578
+        erreur_squelette($msg, $p);
1579
+    }
1580
+
1581
+    #$p->interdire_scripts = true;
1582
+
1583
+    return $p;
1584 1584
 }
1585 1585
 
1586 1586
 
@@ -1610,19 +1610,19 @@  discard block
 block discarded – undo
1610 1610
  **/
1611 1611
 function balise_CHAMP_SQL_dist($p) {
1612 1612
 
1613
-	if (
1614
-		$p->param
1615
-		&& isset($p->param[0][1][0])
1616
-		&& ($champ = ($p->param[0][1][0]->texte))
1617
-	) {
1618
-		$p->code = champ_sql($champ, $p);
1619
-	} else {
1620
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1621
-		erreur_squelette($err_b_s_a, $p);
1622
-	}
1613
+    if (
1614
+        $p->param
1615
+        && isset($p->param[0][1][0])
1616
+        && ($champ = ($p->param[0][1][0]->texte))
1617
+    ) {
1618
+        $p->code = champ_sql($champ, $p);
1619
+    } else {
1620
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => ' CHAMP_SQL']];
1621
+        erreur_squelette($err_b_s_a, $p);
1622
+    }
1623 1623
 
1624
-	#$p->interdire_scripts = true;
1625
-	return $p;
1624
+    #$p->interdire_scripts = true;
1625
+    return $p;
1626 1626
 }
1627 1627
 
1628 1628
 /**
@@ -1648,13 +1648,13 @@  discard block
 block discarded – undo
1648 1648
  *     Pile complétée par le code à générer
1649 1649
  **/
1650 1650
 function balise_VAL_dist($p) {
1651
-	$p->code = interprete_argument_balise(1, $p) ?? '';
1652
-	if (!strlen($p->code)) {
1653
-		$p->code = "''";
1654
-	}
1655
-	$p->interdire_scripts = false;
1651
+    $p->code = interprete_argument_balise(1, $p) ?? '';
1652
+    if (!strlen($p->code)) {
1653
+        $p->code = "''";
1654
+    }
1655
+    $p->interdire_scripts = false;
1656 1656
 
1657
-	return $p;
1657
+    return $p;
1658 1658
 }
1659 1659
 
1660 1660
 /**
@@ -1683,10 +1683,10 @@  discard block
 block discarded – undo
1683 1683
  *     Pile complétée par le code à générer
1684 1684
  **/
1685 1685
 function balise_REM_dist($p) {
1686
-	$p->code = "''";
1687
-	$p->interdire_scripts = false;
1686
+    $p->code = "''";
1687
+    $p->interdire_scripts = false;
1688 1688
 
1689
-	return $p;
1689
+    return $p;
1690 1690
 }
1691 1691
 
1692 1692
 /**
@@ -1696,10 +1696,10 @@  discard block
 block discarded – undo
1696 1696
  * @return mixed
1697 1697
  */
1698 1698
 function balise_NULL_dist($p) {
1699
-	$p->code = 'null';
1700
-	$p->interdire_scripts = false;
1699
+    $p->code = 'null';
1700
+    $p->interdire_scripts = false;
1701 1701
 
1702
-	return $p;
1702
+    return $p;
1703 1703
 }
1704 1704
 
1705 1705
 
@@ -1723,18 +1723,18 @@  discard block
 block discarded – undo
1723 1723
  **/
1724 1724
 function balise_HTTP_HEADER_dist($p) {
1725 1725
 
1726
-	$header = interprete_argument_balise(1, $p);
1727
-	if (!$header) {
1728
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1729
-		erreur_squelette($err_b_s_a, $p);
1730
-	} else {
1731
-		$p->code = "'<'.'?php header(' . _q("
1732
-			. $header
1733
-			. ") . '); ?'.'>'";
1734
-	}
1735
-	$p->interdire_scripts = false;
1726
+    $header = interprete_argument_balise(1, $p);
1727
+    if (!$header) {
1728
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'HTTP_HEADER']];
1729
+        erreur_squelette($err_b_s_a, $p);
1730
+    } else {
1731
+        $p->code = "'<'.'?php header(' . _q("
1732
+            . $header
1733
+            . ") . '); ?'.'>'";
1734
+    }
1735
+    $p->interdire_scripts = false;
1736 1736
 
1737
-	return $p;
1737
+    return $p;
1738 1738
 }
1739 1739
 
1740 1740
 
@@ -1759,22 +1759,22 @@  discard block
 block discarded – undo
1759 1759
  *     Pile complétée par le code à générer
1760 1760
  **/
1761 1761
 function balise_FILTRE_dist($p) {
1762
-	if ($p->param) {
1763
-		$args = [];
1764
-		foreach ($p->param as $i => $ignore) {
1765
-			$args[] = interprete_argument_balise($i + 1, $p);
1766
-		}
1767
-		$p->code = "'<' . '"
1768
-			. '?php header("X-Spip-Filtre: \'.'
1769
-			. join('.\'|\'.', $args)
1770
-			. " . '\"); ?'.'>'";
1762
+    if ($p->param) {
1763
+        $args = [];
1764
+        foreach ($p->param as $i => $ignore) {
1765
+            $args[] = interprete_argument_balise($i + 1, $p);
1766
+        }
1767
+        $p->code = "'<' . '"
1768
+            . '?php header("X-Spip-Filtre: \'.'
1769
+            . join('.\'|\'.', $args)
1770
+            . " . '\"); ?'.'>'";
1771 1771
 
1772
-		$p->interdire_scripts = false;
1772
+        $p->interdire_scripts = false;
1773 1773
 
1774
-		return $p;
1775
-	}
1774
+        return $p;
1775
+    }
1776 1776
 
1777
-	return null;
1777
+    return null;
1778 1778
 }
1779 1779
 
1780 1780
 
@@ -1810,55 +1810,55 @@  discard block
 block discarded – undo
1810 1810
  **/
1811 1811
 function balise_CACHE_dist($p) {
1812 1812
 
1813
-	if ($p->param) {
1814
-		$duree = valeur_numerique($p->param[0][1][0]->texte);
1815
-
1816
-		// noter la duree du cache dans un entete proprietaire
1817
-
1818
-		$code = "'<'.'" . '?php header("X-Spip-Cache: '
1819
-			. $duree
1820
-			. '"); ?' . "'.'>'";
1821
-
1822
-		// Remplir le header Cache-Control
1823
-		// cas #CACHE{0}
1824
-		if ($duree == 0) {
1825
-			$code .= ".'<'.'"
1826
-				. '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1827
-				. "'.'><'.'"
1828
-				. '?php header("Pragma: no-cache"); ?'
1829
-				. "'.'>'";
1830
-		}
1831
-
1832
-		// recuperer les parametres suivants
1833
-		$i = 1;
1834
-		while (isset($p->param[0][++$i])) {
1835
-			$pa = ($p->param[0][$i][0]->texte);
1836
-
1837
-			if (
1838
-				$pa == 'cache-client'
1839
-				&& $duree > 0
1840
-			) {
1841
-				$code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1842
-					. $duree
1843
-					. '"); ?' . "'.'>'";
1844
-				// il semble logique, si on cache-client, de ne pas invalider
1845
-				$pa = 'statique';
1846
-			}
1847
-
1848
-			if (
1849
-				$pa == 'statique'
1850
-				&& $duree > 0
1851
-			) {
1852
-				$code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1853
-			}
1854
-		}
1855
-	} else {
1856
-		$code = "''";
1857
-	}
1858
-	$p->code = $code;
1859
-	$p->interdire_scripts = false;
1860
-
1861
-	return $p;
1813
+    if ($p->param) {
1814
+        $duree = valeur_numerique($p->param[0][1][0]->texte);
1815
+
1816
+        // noter la duree du cache dans un entete proprietaire
1817
+
1818
+        $code = "'<'.'" . '?php header("X-Spip-Cache: '
1819
+            . $duree
1820
+            . '"); ?' . "'.'>'";
1821
+
1822
+        // Remplir le header Cache-Control
1823
+        // cas #CACHE{0}
1824
+        if ($duree == 0) {
1825
+            $code .= ".'<'.'"
1826
+                . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
1827
+                . "'.'><'.'"
1828
+                . '?php header("Pragma: no-cache"); ?'
1829
+                . "'.'>'";
1830
+        }
1831
+
1832
+        // recuperer les parametres suivants
1833
+        $i = 1;
1834
+        while (isset($p->param[0][++$i])) {
1835
+            $pa = ($p->param[0][$i][0]->texte);
1836
+
1837
+            if (
1838
+                $pa == 'cache-client'
1839
+                && $duree > 0
1840
+            ) {
1841
+                $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
1842
+                    . $duree
1843
+                    . '"); ?' . "'.'>'";
1844
+                // il semble logique, si on cache-client, de ne pas invalider
1845
+                $pa = 'statique';
1846
+            }
1847
+
1848
+            if (
1849
+                $pa == 'statique'
1850
+                && $duree > 0
1851
+            ) {
1852
+                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
1853
+            }
1854
+        }
1855
+    } else {
1856
+        $code = "''";
1857
+    }
1858
+    $p->code = $code;
1859
+    $p->interdire_scripts = false;
1860
+
1861
+    return $p;
1862 1862
 }
1863 1863
 
1864 1864
 
@@ -1890,13 +1890,13 @@  discard block
 block discarded – undo
1890 1890
  *     Pile complétée par le code à générer
1891 1891
  */
1892 1892
 function balise_INSERT_HEAD_dist($p) {
1893
-	$p->code = "'<'.'"
1894
-		. '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1895
-		. "'.'>'";
1896
-	$p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1897
-	$p->interdire_scripts = false;
1893
+    $p->code = "'<'.'"
1894
+        . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?'
1895
+        . "'.'>'";
1896
+    $p->code .= ". pipeline('insert_head','<!-- insert_head -->')";
1897
+    $p->interdire_scripts = false;
1898 1898
 
1899
-	return $p;
1899
+    return $p;
1900 1900
 }
1901 1901
 
1902 1902
 /**
@@ -1914,10 +1914,10 @@  discard block
 block discarded – undo
1914 1914
  *     Pile complétée par le code à générer
1915 1915
  */
1916 1916
 function balise_INSERT_HEAD_CSS_dist($p) {
1917
-	$p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1918
-	$p->interdire_scripts = false;
1917
+    $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')";
1918
+    $p->interdire_scripts = false;
1919 1919
 
1920
-	return $p;
1920
+    return $p;
1921 1921
 }
1922 1922
 
1923 1923
 /**
@@ -1932,11 +1932,11 @@  discard block
 block discarded – undo
1932 1932
  *     Pile complétée par le code à générer
1933 1933
  **/
1934 1934
 function balise_INCLUDE_dist($p) {
1935
-	if (function_exists('balise_INCLURE')) {
1936
-		return balise_INCLURE($p);
1937
-	} else {
1938
-		return balise_INCLURE_dist($p);
1939
-	}
1935
+    if (function_exists('balise_INCLURE')) {
1936
+        return balise_INCLURE($p);
1937
+    } else {
1938
+        return balise_INCLURE_dist($p);
1939
+    }
1940 1940
 }
1941 1941
 
1942 1942
 /**
@@ -1970,66 +1970,66 @@  discard block
 block discarded – undo
1970 1970
  *     Pile complétée par le code à générer
1971 1971
  **/
1972 1972
 function balise_INCLURE_dist($p) {
1973
-	$id_boucle = $p->id_boucle;
1974
-	// la lang n'est pas passe de facon automatique par argumenter
1975
-	// mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1976
-	// en option
1977
-
1978
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1979
-
1980
-	// erreur de syntaxe = fond absent
1981
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1982
-	if (!$_contexte) {
1983
-		$_contexte = [];
1984
-	}
1985
-
1986
-	if (isset($_contexte['fond'])) {
1987
-		$f = $_contexte['fond'];
1988
-		// toujours vrai :
1989
-		if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1990
-			$f = $r[1];
1991
-			unset($_contexte['fond']);
1992
-		} else {
1993
-			spip_log('compilation de #INCLURE a revoir');
1994
-		}
1995
-
1996
-		// #INCLURE{doublons}
1997
-		if (isset($_contexte['doublons'])) {
1998
-			$_contexte['doublons'] = "'doublons' => \$doublons";
1999
-		}
2000
-
2001
-		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2002
-		$flag_env = false;
2003
-		if (isset($_contexte['env']) || isset($_contexte['self'])) {
2004
-			$flag_env = true;
2005
-			unset($_contexte['env']);
2006
-		}
2007
-
2008
-		$_options = [];
2009
-		if (isset($_contexte['ajax'])) {
2010
-			$_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2011
-			unset($_contexte['ajax']);
2012
-		}
2013
-		if ($p->etoile) {
2014
-			$_options[] = "'etoile'=>true";
2015
-		}
2016
-		$_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2017
-
2018
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2019
-		if ($flag_env) {
2020
-			$_l = "array_merge(\$Pile[0],$_l)";
2021
-		}
2022
-
2023
-		$p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2024
-	} elseif (!isset($_contexte[1])) {
2025
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2026
-		erreur_squelette($msg, $p);
2027
-	} else {
2028
-		$p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2029
-	}
2030
-
2031
-	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2032
-	return $p;
1973
+    $id_boucle = $p->id_boucle;
1974
+    // la lang n'est pas passe de facon automatique par argumenter
1975
+    // mais le sera pas recuperer_fond, sauf si etoile=>true est passe
1976
+    // en option
1977
+
1978
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $id_boucle, false, false);
1979
+
1980
+    // erreur de syntaxe = fond absent
1981
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
1982
+    if (!$_contexte) {
1983
+        $_contexte = [];
1984
+    }
1985
+
1986
+    if (isset($_contexte['fond'])) {
1987
+        $f = $_contexte['fond'];
1988
+        // toujours vrai :
1989
+        if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) {
1990
+            $f = $r[1];
1991
+            unset($_contexte['fond']);
1992
+        } else {
1993
+            spip_log('compilation de #INCLURE a revoir');
1994
+        }
1995
+
1996
+        // #INCLURE{doublons}
1997
+        if (isset($_contexte['doublons'])) {
1998
+            $_contexte['doublons'] = "'doublons' => \$doublons";
1999
+        }
2000
+
2001
+        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
2002
+        $flag_env = false;
2003
+        if (isset($_contexte['env']) || isset($_contexte['self'])) {
2004
+            $flag_env = true;
2005
+            unset($_contexte['env']);
2006
+        }
2007
+
2008
+        $_options = [];
2009
+        if (isset($_contexte['ajax'])) {
2010
+            $_options[] = preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2011
+            unset($_contexte['ajax']);
2012
+        }
2013
+        if ($p->etoile) {
2014
+            $_options[] = "'etoile'=>true";
2015
+        }
2016
+        $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ')';
2017
+
2018
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2019
+        if ($flag_env) {
2020
+            $_l = "array_merge(\$Pile[0],$_l)";
2021
+        }
2022
+
2023
+        $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect') ?? ''");
2024
+    } elseif (!isset($_contexte[1])) {
2025
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' INCLURE']];
2026
+        erreur_squelette($msg, $p);
2027
+    } else {
2028
+        $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
2029
+    }
2030
+
2031
+    $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
2032
+    return $p;
2033 2033
 }
2034 2034
 
2035 2035
 
@@ -2057,69 +2057,69 @@  discard block
 block discarded – undo
2057 2057
  **/
2058 2058
 function balise_MODELE_dist($p) {
2059 2059
 
2060
-	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2061
-
2062
-	// erreur de syntaxe = fond absent
2063
-	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2064
-	if (!$_contexte) {
2065
-		$_contexte = [];
2066
-	}
2067
-
2068
-	if (!isset($_contexte[1])) {
2069
-		$msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2070
-		erreur_squelette($msg, $p);
2071
-	} else {
2072
-		$nom = $_contexte[1];
2073
-		unset($_contexte[1]);
2074
-
2075
-		if (preg_match("/^\s*'[^']*'/s", $nom)) {
2076
-			$nom = "'modeles/" . substr($nom, 1);
2077
-		} else {
2078
-			$nom = "'modeles/' . $nom";
2079
-		}
2080
-
2081
-		$flag_env = false;
2082
-		if (isset($_contexte['env'])) {
2083
-			$flag_env = true;
2084
-			unset($_contexte['env']);
2085
-		}
2086
-
2087
-		// Incoherence dans la syntaxe du contexte. A revoir.
2088
-		// Reserver la cle primaire de la boucle courante si elle existe
2089
-		if (isset($p->boucles[$p->id_boucle]->primary)) {
2090
-			$primary = $p->boucles[$p->id_boucle]->primary;
2091
-			if (!strpos($primary, ',')) {
2092
-				$id = champ_sql($primary, $p);
2093
-				$_contexte[] = "'$primary'=>" . $id;
2094
-				$_contexte[] = "'id'=>" . $id;
2095
-			}
2096
-		}
2097
-		$_contexte[] = "'recurs'=>(++\$recurs)";
2098
-		$connect = '';
2099
-		if (isset($p->boucles[$p->id_boucle])) {
2100
-			$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2101
-		}
2102
-
2103
-		$_options = memoriser_contexte_compil($p);
2104
-		$_options = "'compil'=>array($_options), 'trim'=>true";
2105
-		if (isset($_contexte['ajax'])) {
2106
-			$_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2107
-			unset($_contexte['ajax']);
2108
-		}
2109
-
2110
-		$_l = 'array(' . join(",\n\t", $_contexte) . ')';
2111
-		if ($flag_env) {
2112
-			$_l = "array_merge(\$Pile[0],$_l)";
2113
-		}
2114
-
2115
-		$page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2116
-
2117
-		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2118
-
2119
-		$p->interdire_scripts = false; // securite assuree par le squelette
2120
-	}
2121
-
2122
-	return $p;
2060
+    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
2061
+
2062
+    // erreur de syntaxe = fond absent
2063
+    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
2064
+    if (!$_contexte) {
2065
+        $_contexte = [];
2066
+    }
2067
+
2068
+    if (!isset($_contexte[1])) {
2069
+        $msg = ['zbug_balise_sans_argument', ['balise' => ' MODELE']];
2070
+        erreur_squelette($msg, $p);
2071
+    } else {
2072
+        $nom = $_contexte[1];
2073
+        unset($_contexte[1]);
2074
+
2075
+        if (preg_match("/^\s*'[^']*'/s", $nom)) {
2076
+            $nom = "'modeles/" . substr($nom, 1);
2077
+        } else {
2078
+            $nom = "'modeles/' . $nom";
2079
+        }
2080
+
2081
+        $flag_env = false;
2082
+        if (isset($_contexte['env'])) {
2083
+            $flag_env = true;
2084
+            unset($_contexte['env']);
2085
+        }
2086
+
2087
+        // Incoherence dans la syntaxe du contexte. A revoir.
2088
+        // Reserver la cle primaire de la boucle courante si elle existe
2089
+        if (isset($p->boucles[$p->id_boucle]->primary)) {
2090
+            $primary = $p->boucles[$p->id_boucle]->primary;
2091
+            if (!strpos($primary, ',')) {
2092
+                $id = champ_sql($primary, $p);
2093
+                $_contexte[] = "'$primary'=>" . $id;
2094
+                $_contexte[] = "'id'=>" . $id;
2095
+            }
2096
+        }
2097
+        $_contexte[] = "'recurs'=>(++\$recurs)";
2098
+        $connect = '';
2099
+        if (isset($p->boucles[$p->id_boucle])) {
2100
+            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2101
+        }
2102
+
2103
+        $_options = memoriser_contexte_compil($p);
2104
+        $_options = "'compil'=>array($_options), 'trim'=>true";
2105
+        if (isset($_contexte['ajax'])) {
2106
+            $_options .= ', ' . preg_replace(',=>(.*)$,ims', '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
2107
+            unset($_contexte['ajax']);
2108
+        }
2109
+
2110
+        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
2111
+        if ($flag_env) {
2112
+            $_l = "array_merge(\$Pile[0],$_l)";
2113
+        }
2114
+
2115
+        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
2116
+
2117
+        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
2118
+
2119
+        $p->interdire_scripts = false; // securite assuree par le squelette
2120
+    }
2121
+
2122
+    return $p;
2123 2123
 }
2124 2124
 
2125 2125
 
@@ -2143,21 +2143,21 @@  discard block
 block discarded – undo
2143 2143
  *     Pile complétée par le code à générer
2144 2144
  **/
2145 2145
 function balise_SET_dist($p) {
2146
-	$_nom = interprete_argument_balise(1, $p);
2147
-	$_val = interprete_argument_balise(2, $p);
2146
+    $_nom = interprete_argument_balise(1, $p);
2147
+    $_val = interprete_argument_balise(2, $p);
2148 2148
 
2149
-	if (!$_nom || !$_val) {
2150
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2151
-		erreur_squelette($err_b_s_a, $p);
2152
-	}
2153
-	// affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2154
-	// cf https://bugs.php.net/bug.php?id=65845
2155
-	else {
2156
-		$p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2157
-	}
2149
+    if (!$_nom || !$_val) {
2150
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'SET']];
2151
+        erreur_squelette($err_b_s_a, $p);
2152
+    }
2153
+    // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4
2154
+    // cf https://bugs.php.net/bug.php?id=65845
2155
+    else {
2156
+        $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)";
2157
+    }
2158 2158
 
2159
-	$p->interdire_scripts = false; // la balise ne renvoie rien
2160
-	return $p;
2159
+    $p->interdire_scripts = false; // la balise ne renvoie rien
2160
+    return $p;
2161 2161
 }
2162 2162
 
2163 2163
 
@@ -2187,12 +2187,12 @@  discard block
 block discarded – undo
2187 2187
  *     Pile complétée par le code à générer
2188 2188
  **/
2189 2189
 function balise_GET_dist($p) {
2190
-	$p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2191
-	if (function_exists('balise_ENV')) {
2192
-		return balise_ENV($p, '$Pile["vars"]??[]');
2193
-	} else {
2194
-		return balise_ENV_dist($p, '$Pile["vars"]??[]');
2195
-	}
2190
+    $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance
2191
+    if (function_exists('balise_ENV')) {
2192
+        return balise_ENV($p, '$Pile["vars"]??[]');
2193
+    } else {
2194
+        return balise_ENV_dist($p, '$Pile["vars"]??[]');
2195
+    }
2196 2196
 }
2197 2197
 
2198 2198
 
@@ -2215,22 +2215,22 @@  discard block
 block discarded – undo
2215 2215
  *     Pile complétée par le code à générer
2216 2216
  **/
2217 2217
 function balise_DOUBLONS_dist($p) {
2218
-	if ($type = interprete_argument_balise(1, $p)) {
2219
-		if ($famille = interprete_argument_balise(2, $p)) {
2220
-			$type .= '.' . $famille;
2221
-		}
2222
-		$p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2223
-		if (!$p->etoile) {
2224
-			$p->code = 'array_filter(array_map("intval",explode(",",'
2225
-				. $p->code . ')))';
2226
-		}
2227
-	} else {
2228
-		$p->code = '$doublons';
2229
-	}
2218
+    if ($type = interprete_argument_balise(1, $p)) {
2219
+        if ($famille = interprete_argument_balise(2, $p)) {
2220
+            $type .= '.' . $famille;
2221
+        }
2222
+        $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")';
2223
+        if (!$p->etoile) {
2224
+            $p->code = 'array_filter(array_map("intval",explode(",",'
2225
+                . $p->code . ')))';
2226
+        }
2227
+    } else {
2228
+        $p->code = '$doublons';
2229
+    }
2230 2230
 
2231
-	$p->interdire_scripts = false;
2231
+    $p->interdire_scripts = false;
2232 2232
 
2233
-	return $p;
2233
+    return $p;
2234 2234
 }
2235 2235
 
2236 2236
 
@@ -2253,18 +2253,18 @@  discard block
 block discarded – undo
2253 2253
  *     Pile complétée par le code à générer
2254 2254
  **/
2255 2255
 function balise_PIPELINE_dist($p) {
2256
-	$_pipe = interprete_argument_balise(1, $p);
2257
-	if (!$_pipe) {
2258
-		$err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2259
-		erreur_squelette($err_b_s_a, $p);
2260
-	} else {
2261
-		$_flux = interprete_argument_balise(2, $p);
2262
-		$_flux = $_flux ?: "''";
2263
-		$p->code = "pipeline( $_pipe , $_flux )";
2264
-		$p->interdire_scripts = false;
2265
-	}
2256
+    $_pipe = interprete_argument_balise(1, $p);
2257
+    if (!$_pipe) {
2258
+        $err_b_s_a = ['zbug_balise_sans_argument', ['balise' => 'PIPELINE']];
2259
+        erreur_squelette($err_b_s_a, $p);
2260
+    } else {
2261
+        $_flux = interprete_argument_balise(2, $p);
2262
+        $_flux = $_flux ?: "''";
2263
+        $p->code = "pipeline( $_pipe , $_flux )";
2264
+        $p->interdire_scripts = false;
2265
+    }
2266 2266
 
2267
-	return $p;
2267
+    return $p;
2268 2268
 }
2269 2269
 
2270 2270
 
@@ -2289,10 +2289,10 @@  discard block
 block discarded – undo
2289 2289
  *     Pile complétée par le code à générer
2290 2290
  **/
2291 2291
 function balise_EDIT_dist($p) {
2292
-	$p->code = "''";
2293
-	$p->interdire_scripts = false;
2292
+    $p->code = "''";
2293
+    $p->interdire_scripts = false;
2294 2294
 
2295
-	return $p;
2295
+    return $p;
2296 2296
 }
2297 2297
 
2298 2298
 
@@ -2315,11 +2315,11 @@  discard block
 block discarded – undo
2315 2315
  *     Pile complétée par le code à générer
2316 2316
  **/
2317 2317
 function balise_TOTAL_UNIQUE_dist($p) {
2318
-	$_famille = interprete_argument_balise(1, $p);
2319
-	$_famille = $_famille ?: "''";
2320
-	$p->code = "unique('', $_famille, true)";
2318
+    $_famille = interprete_argument_balise(1, $p);
2319
+    $_famille = $_famille ?: "''";
2320
+    $p->code = "unique('', $_famille, true)";
2321 2321
 
2322
-	return $p;
2322
+    return $p;
2323 2323
 }
2324 2324
 
2325 2325
 /**
@@ -2342,19 +2342,19 @@  discard block
 block discarded – undo
2342 2342
  *     Pile complétée par le code à générer
2343 2343
  **/
2344 2344
 function balise_ARRAY_dist($p) {
2345
-	$_code = [];
2346
-	$n = 1;
2347
-	do {
2348
-		$_key = interprete_argument_balise($n++, $p);
2349
-		$_val = interprete_argument_balise($n++, $p);
2350
-		if ($_key && $_val) {
2351
-			$_code[] = "$_key => $_val";
2352
-		}
2353
-	} while ($_key && $_val);
2354
-	$p->code = 'array(' . join(', ', $_code) . ')';
2355
-	$p->interdire_scripts = false;
2345
+    $_code = [];
2346
+    $n = 1;
2347
+    do {
2348
+        $_key = interprete_argument_balise($n++, $p);
2349
+        $_val = interprete_argument_balise($n++, $p);
2350
+        if ($_key && $_val) {
2351
+            $_code[] = "$_key => $_val";
2352
+        }
2353
+    } while ($_key && $_val);
2354
+    $p->code = 'array(' . join(', ', $_code) . ')';
2355
+    $p->interdire_scripts = false;
2356 2356
 
2357
-	return $p;
2357
+    return $p;
2358 2358
 }
2359 2359
 
2360 2360
 /**
@@ -2373,15 +2373,15 @@  discard block
 block discarded – undo
2373 2373
  *     Pile complétée par le code à générer
2374 2374
  */
2375 2375
 function balise_LISTE_dist($p) {
2376
-	$_code = [];
2377
-	$n = 1;
2378
-	while ($_val = interprete_argument_balise($n++, $p)) {
2379
-		$_code[] = $_val;
2380
-	}
2381
-	$p->code = 'array(' . join(', ', $_code) . ')';
2382
-	$p->interdire_scripts = false;
2376
+    $_code = [];
2377
+    $n = 1;
2378
+    while ($_val = interprete_argument_balise($n++, $p)) {
2379
+        $_code[] = $_val;
2380
+    }
2381
+    $p->code = 'array(' . join(', ', $_code) . ')';
2382
+    $p->interdire_scripts = false;
2383 2383
 
2384
-	return $p;
2384
+    return $p;
2385 2385
 }
2386 2386
 
2387 2387
 
@@ -2415,21 +2415,21 @@  discard block
 block discarded – undo
2415 2415
  *     Pile complétée par le code à générer
2416 2416
  **/
2417 2417
 function balise_AUTORISER_dist($p) {
2418
-	$_code = [];
2419
-	$p->descr['session'] = true; // faire un cache par session
2418
+    $_code = [];
2419
+    $p->descr['session'] = true; // faire un cache par session
2420 2420
 
2421
-	$n = 1;
2422
-	while ($_v = interprete_argument_balise($n++, $p)) {
2423
-		$_code[] = $_v;
2424
-	}
2421
+    $n = 1;
2422
+    while ($_v = interprete_argument_balise($n++, $p)) {
2423
+        $_code[] = $_v;
2424
+    }
2425 2425
 
2426
-	$p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2427
-		', ',
2428
-		$_code
2429
-	) . ')?" ":"")';
2430
-	$p->interdire_scripts = false;
2426
+    $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(
2427
+        ', ',
2428
+        $_code
2429
+    ) . ')?" ":"")';
2430
+    $p->interdire_scripts = false;
2431 2431
 
2432
-	return $p;
2432
+    return $p;
2433 2433
 }
2434 2434
 
2435 2435
 
@@ -2453,15 +2453,15 @@  discard block
 block discarded – undo
2453 2453
  *     Pile complétée par le code à générer
2454 2454
  **/
2455 2455
 function balise_PLUGIN_dist($p) {
2456
-	$plugin = interprete_argument_balise(1, $p);
2457
-	$plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2458
-	$type_info = interprete_argument_balise(2, $p);
2459
-	$type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2456
+    $plugin = interprete_argument_balise(1, $p);
2457
+    $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""';
2458
+    $type_info = interprete_argument_balise(2, $p);
2459
+    $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"';
2460 2460
 
2461
-	$f = chercher_filtre('info_plugin');
2462
-	$p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2461
+    $f = chercher_filtre('info_plugin');
2462
+    $p->code = $f . '(' . $plugin . ', ' . $type_info . ')';
2463 2463
 
2464
-	return $p;
2464
+    return $p;
2465 2465
 }
2466 2466
 
2467 2467
 /**
@@ -2482,9 +2482,9 @@  discard block
 block discarded – undo
2482 2482
  *     Pile complétée par le code à générer
2483 2483
  **/
2484 2484
 function balise_AIDER_dist($p) {
2485
-	$_motif = interprete_argument_balise(1, $p);
2486
-	$p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2487
-	return $p;
2485
+    $_motif = interprete_argument_balise(1, $p);
2486
+    $p->code = "((\$aider=charger_fonction('aide','inc',true))?\$aider($_motif):'')";
2487
+    return $p;
2488 2488
 }
2489 2489
 
2490 2490
 /**
@@ -2510,16 +2510,16 @@  discard block
 block discarded – undo
2510 2510
  *     Pile complétée par le code à générer
2511 2511
  **/
2512 2512
 function balise_ACTION_FORMULAIRE($p) {
2513
-	if (!$_url = interprete_argument_balise(1, $p)) {
2514
-		$_url = "(\$Pile[0]['action'] ?? '')";
2515
-	}
2516
-	if (!$_form = interprete_argument_balise(2, $p)) {
2517
-		$_form = "(\$Pile[0]['form'] ?? '')";
2518
-	}
2519
-
2520
-	// envoyer le nom du formulaire que l'on traite
2521
-	// transmettre les eventuels args de la balise formulaire
2522
-	$p->code = "	'<span class=\"form-hidden\">' .
2513
+    if (!$_url = interprete_argument_balise(1, $p)) {
2514
+        $_url = "(\$Pile[0]['action'] ?? '')";
2515
+    }
2516
+    if (!$_form = interprete_argument_balise(2, $p)) {
2517
+        $_form = "(\$Pile[0]['form'] ?? '')";
2518
+    }
2519
+
2520
+    // envoyer le nom du formulaire que l'on traite
2521
+    // transmettre les eventuels args de la balise formulaire
2522
+    $p->code = "	'<span class=\"form-hidden\">' .
2523 2523
 	form_hidden($_url) .
2524 2524
 	'<input name=\'formulaire_action\' type=\'hidden\'
2525 2525
 		value=\'' . $_form . '\' />' .
@@ -2530,9 +2530,9 @@  discard block
 block discarded – undo
2530 2530
 	(\$Pile[0]['_hidden'] ?? '') .
2531 2531
 	'</span>'";
2532 2532
 
2533
-	$p->interdire_scripts = false;
2533
+    $p->interdire_scripts = false;
2534 2534
 
2535
-	return $p;
2535
+    return $p;
2536 2536
 }
2537 2537
 
2538 2538
 
@@ -2573,25 +2573,25 @@  discard block
 block discarded – undo
2573 2573
  */
2574 2574
 function balise_BOUTON_ACTION_dist($p) {
2575 2575
 
2576
-	$args = [];
2577
-	for ($k = 1; $k <= 6; $k++) {
2578
-		$_a = interprete_argument_balise($k, $p);
2579
-		if (!$_a) {
2580
-			$_a = "''";
2581
-		}
2582
-		$args[] = $_a;
2583
-	}
2584
-	// supprimer les args vides
2585
-	while (end($args) == "''" && count($args) > 2) {
2586
-		array_pop($args);
2587
-	}
2588
-	$args = implode(',', $args);
2576
+    $args = [];
2577
+    for ($k = 1; $k <= 6; $k++) {
2578
+        $_a = interprete_argument_balise($k, $p);
2579
+        if (!$_a) {
2580
+            $_a = "''";
2581
+        }
2582
+        $args[] = $_a;
2583
+    }
2584
+    // supprimer les args vides
2585
+    while (end($args) == "''" && count($args) > 2) {
2586
+        array_pop($args);
2587
+    }
2588
+    $args = implode(',', $args);
2589 2589
 
2590
-	$bouton_action = chercher_filtre('bouton_action');
2591
-	$p->code = "$bouton_action($args)";
2592
-	$p->interdire_scripts = false;
2590
+    $bouton_action = chercher_filtre('bouton_action');
2591
+    $p->code = "$bouton_action($args)";
2592
+    $p->interdire_scripts = false;
2593 2593
 
2594
-	return $p;
2594
+    return $p;
2595 2595
 }
2596 2596
 
2597 2597
 
@@ -2610,10 +2610,10 @@  discard block
 block discarded – undo
2610 2610
  *     Pile complétée par le code à générer
2611 2611
  */
2612 2612
 function balise_SLOGAN_SITE_SPIP_dist($p) {
2613
-	$p->code = "\$GLOBALS['meta']['slogan_site']";
2613
+    $p->code = "\$GLOBALS['meta']['slogan_site']";
2614 2614
 
2615
-	#$p->interdire_scripts = true;
2616
-	return $p;
2615
+    #$p->interdire_scripts = true;
2616
+    return $p;
2617 2617
 }
2618 2618
 
2619 2619
 
@@ -2637,10 +2637,10 @@  discard block
 block discarded – undo
2637 2637
  *     Pile complétée par le code à générer
2638 2638
  */
2639 2639
 function balise_HTML5_dist($p) {
2640
-	$p->code = html5_permis() ? "' '" : "''";
2641
-	$p->interdire_scripts = false;
2640
+    $p->code = html5_permis() ? "' '" : "''";
2641
+    $p->interdire_scripts = false;
2642 2642
 
2643
-	return $p;
2643
+    return $p;
2644 2644
 }
2645 2645
 
2646 2646
 
@@ -2666,60 +2666,60 @@  discard block
 block discarded – undo
2666 2666
  *     Pile complétée par le code à générer
2667 2667
  */
2668 2668
 function balise_TRI_dist($p, $liste = 'true') {
2669
-	$b = index_boucle_mere($p);
2670
-	// s'il n'y a pas de nom de boucle, on ne peut pas trier
2671
-	if ($b === '') {
2672
-		$msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2673
-		erreur_squelette($msg, $p);
2674
-		$p->code = "''";
2669
+    $b = index_boucle_mere($p);
2670
+    // s'il n'y a pas de nom de boucle, on ne peut pas trier
2671
+    if ($b === '') {
2672
+        $msg = ['zbug_champ_hors_boucle', ['champ' => zbug_presenter_champ($p)]];
2673
+        erreur_squelette($msg, $p);
2674
+        $p->code = "''";
2675 2675
 
2676
-		return $p;
2677
-	}
2678
-	$boucle = $p->boucles[$b];
2676
+        return $p;
2677
+    }
2678
+    $boucle = $p->boucles[$b];
2679 2679
 
2680
-	// s'il n'y a pas de tri_champ, c'est qu'on se trouve
2681
-	// dans un boucle recursive ou qu'on a oublie le critere {tri}
2682
-	if (!isset($boucle->modificateur['tri_champ'])) {
2683
-		$msg = ['zbug_champ_hors_critere', [
2684
-			'champ' => zbug_presenter_champ($p),
2685
-			'critere' => 'tri'
2686
-		]];
2687
-		erreur_squelette($msg, $p);
2688
-		$p->code = "''";
2680
+    // s'il n'y a pas de tri_champ, c'est qu'on se trouve
2681
+    // dans un boucle recursive ou qu'on a oublie le critere {tri}
2682
+    if (!isset($boucle->modificateur['tri_champ'])) {
2683
+        $msg = ['zbug_champ_hors_critere', [
2684
+            'champ' => zbug_presenter_champ($p),
2685
+            'critere' => 'tri'
2686
+        ]];
2687
+        erreur_squelette($msg, $p);
2688
+        $p->code = "''";
2689 2689
 
2690
-		return $p;
2691
-	}
2690
+        return $p;
2691
+    }
2692 2692
 
2693
-	// Différentes infos relatives au tri présentes dans les modificateurs
2694
-	$_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2695
-	$_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2696
-	$_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2697
-	$_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2693
+    // Différentes infos relatives au tri présentes dans les modificateurs
2694
+    $_tri_nom = $boucle->modificateur['tri_nom'] ; // nom du paramètre définissant le tri
2695
+    $_tri_champ = $boucle->modificateur['tri_champ']; // champ actuel utilisé le tri
2696
+    $_tri_sens = $boucle->modificateur['tri_sens']; // sens de tri actuel
2697
+    $_tri_liste_sens_defaut = $boucle->modificateur['tri_liste_sens_defaut']; // sens par défaut pour chaque champ
2698 2698
 
2699
-	$_champ_ou_sens = interprete_argument_balise(1, $p);
2700
-	// si pas de champ, renvoyer le critère de tri actuel
2701
-	if (!$_champ_ou_sens) {
2702
-		$p->code = $_tri_champ;
2699
+    $_champ_ou_sens = interprete_argument_balise(1, $p);
2700
+    // si pas de champ, renvoyer le critère de tri actuel
2701
+    if (!$_champ_ou_sens) {
2702
+        $p->code = $_tri_champ;
2703 2703
 
2704
-		return $p;
2705
-	}
2706
-	// forcer la jointure si besoin, et si le champ est statique
2707
-	if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2708
-		index_pile($b, $m[1], $p->boucles, '', null, true, false);
2709
-	}
2704
+        return $p;
2705
+    }
2706
+    // forcer la jointure si besoin, et si le champ est statique
2707
+    if (preg_match(",^'([\w.]+)'$,i", $_champ_ou_sens, $m)) {
2708
+        index_pile($b, $m[1], $p->boucles, '', null, true, false);
2709
+    }
2710 2710
 
2711
-	$_libelle = interprete_argument_balise(2, $p);
2712
-	$_libelle = $_libelle ?: $_champ_ou_sens;
2711
+    $_libelle = interprete_argument_balise(2, $p);
2712
+    $_libelle = $_libelle ?: $_champ_ou_sens;
2713 2713
 
2714
-	$_class = interprete_argument_balise(3, $p) ?? "''";
2714
+    $_class = interprete_argument_balise(3, $p) ?? "''";
2715 2715
 
2716
-	$nom_pagination = $boucle->modificateur['debut_nom'] ?? '';
2716
+    $nom_pagination = $boucle->modificateur['debut_nom'] ?? '';
2717 2717
 
2718
-	$p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut, $nom_pagination)";
2718
+    $p->code = "calculer_balise_tri($_champ_ou_sens, $_libelle, $_class, $_tri_nom, $_tri_champ, $_tri_sens, $_tri_liste_sens_defaut, $nom_pagination)";
2719 2719
 
2720
-	$p->interdire_scripts = false;
2720
+    $p->interdire_scripts = false;
2721 2721
 
2722
-	return $p;
2722
+    return $p;
2723 2723
 }
2724 2724
 
2725 2725
 
@@ -2740,21 +2740,21 @@  discard block
 block discarded – undo
2740 2740
  *     Pile complétée par le code à générer
2741 2741
  */
2742 2742
 function balise_SAUTER_dist($p) {
2743
-	$id_boucle = $p->id_boucle;
2743
+    $id_boucle = $p->id_boucle;
2744 2744
 
2745
-	if (empty($p->boucles[$id_boucle])) {
2746
-		$msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2747
-		erreur_squelette($msg, $p);
2748
-	} else {
2749
-		$_saut = interprete_argument_balise(1, $p);
2750
-		$_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2751
-		$_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2745
+    if (empty($p->boucles[$id_boucle])) {
2746
+        $msg = ['zbug_champ_hors_boucle', ['champ' => '#SAUTER']];
2747
+        erreur_squelette($msg, $p);
2748
+    } else {
2749
+        $_saut = interprete_argument_balise(1, $p);
2750
+        $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']";
2751
+        $_total = "(\$Numrows['$id_boucle']['total'] ?? null)";
2752 2752
 
2753
-		$p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2754
-	}
2755
-	$p->interdire_scripts = false;
2753
+        $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))";
2754
+    }
2755
+    $p->interdire_scripts = false;
2756 2756
 
2757
-	return $p;
2757
+    return $p;
2758 2758
 }
2759 2759
 
2760 2760
 
@@ -2776,22 +2776,22 @@  discard block
 block discarded – undo
2776 2776
  *     Pile complétée par le code à générer
2777 2777
  */
2778 2778
 function balise_PUBLIE_dist($p) {
2779
-	if (!$_type = interprete_argument_balise(1, $p)) {
2780
-		$_type = _q($p->type_requete);
2781
-		$_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2782
-	} else {
2783
-		$_id = interprete_argument_balise(2, $p);
2784
-	}
2779
+    if (!$_type = interprete_argument_balise(1, $p)) {
2780
+        $_type = _q($p->type_requete);
2781
+        $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p);
2782
+    } else {
2783
+        $_id = interprete_argument_balise(2, $p);
2784
+    }
2785 2785
 
2786
-	$connect = '';
2787
-	if (isset($p->boucles[$p->id_boucle])) {
2788
-		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
2789
-	}
2786
+    $connect = '';
2787
+    if (isset($p->boucles[$p->id_boucle])) {
2788
+        $connect = $p->boucles[$p->id_boucle]->sql_serveur;
2789
+    }
2790 2790
 
2791
-	$p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2792
-	$p->interdire_scripts = false;
2791
+    $p->code = '(objet_test_si_publie(' . $_type . ',intval(' . $_id . '),' . _q($connect) . ")?' ':'')";
2792
+    $p->interdire_scripts = false;
2793 2793
 
2794
-	return $p;
2794
+    return $p;
2795 2795
 }
2796 2796
 
2797 2797
 /**
@@ -2820,12 +2820,12 @@  discard block
 block discarded – undo
2820 2820
  *     Pile complétée par le code à générer
2821 2821
  */
2822 2822
 function balise_PRODUIRE_dist($p) {
2823
-	$balise_inclure = charger_fonction('INCLURE', 'balise');
2824
-	$p = $balise_inclure($p);
2823
+    $balise_inclure = charger_fonction('INCLURE', 'balise');
2824
+    $p = $balise_inclure($p);
2825 2825
 
2826
-	$p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2826
+    $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code);
2827 2827
 
2828
-	return $p;
2828
+    return $p;
2829 2829
 }
2830 2830
 
2831 2831
 /**
@@ -2844,13 +2844,13 @@  discard block
 block discarded – undo
2844 2844
  *     Pile complétée par le code à générer
2845 2845
  */
2846 2846
 function balise_LARGEUR_ECRAN_dist($p) {
2847
-	$_class = interprete_argument_balise(1, $p);
2848
-	if (!$_class) {
2849
-		$_class = 'null';
2850
-	}
2851
-	$p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2847
+    $_class = interprete_argument_balise(1, $p);
2848
+    if (!$_class) {
2849
+        $_class = 'null';
2850
+    }
2851
+    $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))";
2852 2852
 
2853
-	return $p;
2853
+    return $p;
2854 2854
 }
2855 2855
 
2856 2856
 
@@ -2866,14 +2866,14 @@  discard block
 block discarded – undo
2866 2866
  *     Pile complétée par le code à générer
2867 2867
  **/
2868 2868
 function balise_CONST_dist($p) {
2869
-	$_const = interprete_argument_balise(1, $p);
2870
-	if (!strlen($_const ?? '')) {
2871
-		$p->code = "''";
2872
-	}
2873
-	else {
2874
-		$p->code = "(defined($_const)?constant($_const):'')";
2875
-	}
2876
-	$p->interdire_scripts = false;
2877
-
2878
-	return $p;
2869
+    $_const = interprete_argument_balise(1, $p);
2870
+    if (!strlen($_const ?? '')) {
2871
+        $p->code = "''";
2872
+    }
2873
+    else {
2874
+        $p->code = "(defined($_const)?constant($_const):'')";
2875
+    }
2876
+    $p->interdire_scripts = false;
2877
+
2878
+    return $p;
2879 2879
 }
Please login to merge, or discard this patch.
ecrire/public/styliser_par_z.php 1 patch
Indentation   +305 added lines, -305 removed lines patch added patch discarded remove patch
@@ -18,7 +18,7 @@  discard block
 block discarded – undo
18 18
  * @package SPIP\Core\Public\Styliser
19 19
  **/
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 /**
@@ -28,190 +28,190 @@  discard block
 block discarded – undo
28 28
  * @return array Données modifiées du pipeline
29 29
  */
30 30
 function public_styliser_par_z_dist($flux) {
31
-	static $prefix_path = null;
32
-	static $prefix_length;
33
-	static $z_blocs;
34
-	static $apl_constant;
35
-	static $page;
36
-	static $disponible = [];
37
-	static $echafauder;
38
-	static $prepend = '';
39
-
40
-	if (!isset($prefix_path)) {
41
-		$z_blocs = z_blocs(test_espace_prive());
42
-		if (test_espace_prive()) {
43
-			$prefix_path = 'prive/squelettes/';
44
-			$prefix_length = strlen($prefix_path);
45
-			$apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
46
-			$page = 'exec';
47
-			$echafauder = charger_fonction('echafauder', 'prive', true);
48
-			define('_ZCORE_EXCLURE_PATH', '');
49
-		} else {
50
-			$prefix_path = '';
51
-			$prefix_length = 0;
52
-			$apl_constant = '_Z_AJAX_PARALLEL_LOAD';
53
-			$page = _SPIP_PAGE;
54
-			$echafauder = charger_fonction('echafauder', 'public', true);
55
-			define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
56
-				(string) _DIR_PLUGIN_DIST,
57
-				'/'
58
-			) : ''));
59
-		}
60
-		$prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
61
-	}
62
-	$z_contenu = reset($z_blocs); // contenu par defaut
63
-
64
-	$fond = $flux['args']['fond'];
65
-
66
-	if ($prepend || strncmp((string) $fond, (string) $prefix_path, $prefix_length) == 0) {
67
-		$fond = substr((string) $fond, $prefix_length);
68
-		$squelette = $flux['data'];
69
-		$ext = $flux['args']['ext'];
70
-		// Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
71
-		if (
72
-			defined('_Z_AJAX_PARALLEL_LOAD_OK')
73
-			&& ($dir = explode('/', $fond))
74
-			&& count($dir) == 2 // pas un sous repertoire
75
-			&& ($dir = reset($dir))
76
-			&& in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
77
-			&& defined($apl_constant)
78
-			&& in_array($dir, explode(',', (string) constant($apl_constant))) // et dans un demande en APL
79
-			&& ($pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
80
-		) {
81
-			$flux['data'] = $pipe;
82
-
83
-			return $flux;
84
-		}
85
-
86
-		// surcharger aussi les squelettes venant de squelettes-dist/
87
-		if ($squelette && !z_fond_valide($squelette)) {
88
-			$squelette = '';
89
-			$echafauder = '';
90
-		}
91
-		if ($prepend) {
92
-			$squelette = substr((string) find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
93
-			if ($squelette) {
94
-				$flux['data'] = $squelette;
95
-			}
96
-		}
97
-
98
-		// gerer les squelettes non trouves
99
-		// -> router vers les /dist.html
100
-		// ou scaffolding ou page automatique les contenus
101
-		if (!$squelette) {
102
-			// si on est sur un ?page=XX non trouve
103
-			if (
104
-				isset($flux['args']['contexte'][$page]) && $flux['args']['contexte'][$page] == $fond
105
-				|| isset($flux['args']['contexte']['type-page']) && $flux['args']['contexte']['type-page'] == $fond
106
-				|| $fond == 'sommaire' && (!isset($flux['args']['contexte'][$page]) || !$flux['args']['contexte'][$page])
107
-			) {
108
-				// si on est sur un ?page=XX non trouve
109
-				// se brancher sur contenu/xx si il existe
110
-				// ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
111
-				if (!isset($disponible[$fond])) {
112
-					$disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, (bool) $echafauder);
113
-				}
114
-
115
-				if ($disponible[$fond]) {
116
-					$flux['data'] = substr((string) find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
117
-				}
118
-			}
119
-
120
-			// echafaudage :
121
-			// si c'est un fond de contenu d'un objet en base
122
-			// generer un fond automatique a la volee pour les webmestres
123
-			elseif (strncmp($fond, "$z_contenu/", strlen((string) $z_contenu) + 1) == 0) {
124
-				$type = substr($fond, strlen((string) $z_contenu) + 1);
125
-				if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
126
-					$type = $flux['args']['contexte'][$page];
127
-				}
128
-				if (!isset($disponible[$type])) {
129
-					$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, (bool) $echafauder);
130
-				}
131
-				if (is_string($disponible[$type])) {
132
-					$flux['data'] = $disponible[$type];
133
-				} elseif (
134
-					$echafauder
135
-					&& include_spip('inc/autoriser')
136
-					&& isset($GLOBALS['visiteur_session']['statut'])
137
-					&& autoriser('echafauder', $type)
138
-					&& ($is = $disponible[$type])
139
-					&& is_array($is)
140
-				) {
141
-					$flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
142
-				} else {
143
-					$flux['data'] = ($disponible['404'] = z_contenu_disponible(
144
-						$prefix_path . $prepend,
145
-						$z_contenu,
146
-						'404',
147
-						$ext,
148
-						(bool) $echafauder
149
-					));
150
-				}
151
-			}
152
-
153
-			// sinon, si on demande un fond non trouve dans un des autres blocs
154
-			// et si il y a bien un contenu correspondant ou echafaudable
155
-			// se rabbatre sur le dist.html du bloc concerne
156
-			else {
157
-				if (
158
-					($dir = explode('/', $fond))
159
-					&& ($dir = reset($dir))
160
-					&& $dir !== $z_contenu
161
-					&& in_array($dir, $z_blocs)
162
-				) {
163
-					$type = substr($fond, strlen("$dir/"));
164
-					if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
165
-						$type = $flux['args']['contexte'][$page];
166
-					}
167
-					if ($type !== 'page' && !isset($disponible[$type])) {
168
-						$disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, (bool) $echafauder);
169
-					}
170
-					if ($type == 'page' || $disponible[$type]) {
171
-						$flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
172
-					}
173
-				}
174
-			}
175
-			$squelette = $flux['data'];
176
-		}
177
-
178
-		// layout specifiques par type et compositions :
179
-		// body-article.html
180
-		// body-sommaire.html
181
-		// pour des raisons de perfo, les declinaisons doivent etre dans le
182
-		// meme dossier que body.html
183
-		$f = null;
184
-		if ($fond == 'body' && str_ends_with((string) $squelette, $fond)) {
185
-			if (
186
-				isset($flux['args']['contexte']['type-page'])
187
-				&& (
188
-					isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")
189
-					|| file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
190
-				)
191
-			) {
192
-				$flux['data'] = $f;
193
-			}
194
-		} elseif (
195
-			$fond == 'structure'
196
-			&& z_sanitize_var_zajax()
197
-			&& ($f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext"))
198
-		) {
199
-			$flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
200
-		} elseif (
201
-			// chercher le fond correspondant a la composition
202
-			isset($flux['args']['contexte']['composition'])
203
-			&& (basename($fond) == 'page' || $squelette && str_ends_with((string) $squelette, $fond))
204
-			&& ($dir = substr($fond, $prefix_length))
205
-			&& ($dir = explode('/', $dir))
206
-			&& ($dir = reset($dir))
207
-			&& in_array($dir, $z_blocs)
208
-			&& ($f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext"))
209
-		) {
210
-			$flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
211
-		}
212
-	}
213
-
214
-	return $flux;
31
+    static $prefix_path = null;
32
+    static $prefix_length;
33
+    static $z_blocs;
34
+    static $apl_constant;
35
+    static $page;
36
+    static $disponible = [];
37
+    static $echafauder;
38
+    static $prepend = '';
39
+
40
+    if (!isset($prefix_path)) {
41
+        $z_blocs = z_blocs(test_espace_prive());
42
+        if (test_espace_prive()) {
43
+            $prefix_path = 'prive/squelettes/';
44
+            $prefix_length = strlen($prefix_path);
45
+            $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
46
+            $page = 'exec';
47
+            $echafauder = charger_fonction('echafauder', 'prive', true);
48
+            define('_ZCORE_EXCLURE_PATH', '');
49
+        } else {
50
+            $prefix_path = '';
51
+            $prefix_length = 0;
52
+            $apl_constant = '_Z_AJAX_PARALLEL_LOAD';
53
+            $page = _SPIP_PAGE;
54
+            $echafauder = charger_fonction('echafauder', 'public', true);
55
+            define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(
56
+                (string) _DIR_PLUGIN_DIST,
57
+                '/'
58
+            ) : ''));
59
+        }
60
+        $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : '');
61
+    }
62
+    $z_contenu = reset($z_blocs); // contenu par defaut
63
+
64
+    $fond = $flux['args']['fond'];
65
+
66
+    if ($prepend || strncmp((string) $fond, (string) $prefix_path, $prefix_length) == 0) {
67
+        $fond = substr((string) $fond, $prefix_length);
68
+        $squelette = $flux['data'];
69
+        $ext = $flux['args']['ext'];
70
+        // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax
71
+        if (
72
+            defined('_Z_AJAX_PARALLEL_LOAD_OK')
73
+            && ($dir = explode('/', $fond))
74
+            && count($dir) == 2 // pas un sous repertoire
75
+            && ($dir = reset($dir))
76
+            && in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z
77
+            && defined($apl_constant)
78
+            && in_array($dir, explode(',', (string) constant($apl_constant))) // et dans un demande en APL
79
+            && ($pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext)) // et qui contient le squelette APL
80
+        ) {
81
+            $flux['data'] = $pipe;
82
+
83
+            return $flux;
84
+        }
85
+
86
+        // surcharger aussi les squelettes venant de squelettes-dist/
87
+        if ($squelette && !z_fond_valide($squelette)) {
88
+            $squelette = '';
89
+            $echafauder = '';
90
+        }
91
+        if ($prepend) {
92
+            $squelette = substr((string) find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext"));
93
+            if ($squelette) {
94
+                $flux['data'] = $squelette;
95
+            }
96
+        }
97
+
98
+        // gerer les squelettes non trouves
99
+        // -> router vers les /dist.html
100
+        // ou scaffolding ou page automatique les contenus
101
+        if (!$squelette) {
102
+            // si on est sur un ?page=XX non trouve
103
+            if (
104
+                isset($flux['args']['contexte'][$page]) && $flux['args']['contexte'][$page] == $fond
105
+                || isset($flux['args']['contexte']['type-page']) && $flux['args']['contexte']['type-page'] == $fond
106
+                || $fond == 'sommaire' && (!isset($flux['args']['contexte'][$page]) || !$flux['args']['contexte'][$page])
107
+            ) {
108
+                // si on est sur un ?page=XX non trouve
109
+                // se brancher sur contenu/xx si il existe
110
+                // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme
111
+                if (!isset($disponible[$fond])) {
112
+                    $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, (bool) $echafauder);
113
+                }
114
+
115
+                if ($disponible[$fond]) {
116
+                    $flux['data'] = substr((string) find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext"));
117
+                }
118
+            }
119
+
120
+            // echafaudage :
121
+            // si c'est un fond de contenu d'un objet en base
122
+            // generer un fond automatique a la volee pour les webmestres
123
+            elseif (strncmp($fond, "$z_contenu/", strlen((string) $z_contenu) + 1) == 0) {
124
+                $type = substr($fond, strlen((string) $z_contenu) + 1);
125
+                if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
126
+                    $type = $flux['args']['contexte'][$page];
127
+                }
128
+                if (!isset($disponible[$type])) {
129
+                    $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, (bool) $echafauder);
130
+                }
131
+                if (is_string($disponible[$type])) {
132
+                    $flux['data'] = $disponible[$type];
133
+                } elseif (
134
+                    $echafauder
135
+                    && include_spip('inc/autoriser')
136
+                    && isset($GLOBALS['visiteur_session']['statut'])
137
+                    && autoriser('echafauder', $type)
138
+                    && ($is = $disponible[$type])
139
+                    && is_array($is)
140
+                ) {
141
+                    $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext);
142
+                } else {
143
+                    $flux['data'] = ($disponible['404'] = z_contenu_disponible(
144
+                        $prefix_path . $prepend,
145
+                        $z_contenu,
146
+                        '404',
147
+                        $ext,
148
+                        (bool) $echafauder
149
+                    ));
150
+                }
151
+            }
152
+
153
+            // sinon, si on demande un fond non trouve dans un des autres blocs
154
+            // et si il y a bien un contenu correspondant ou echafaudable
155
+            // se rabbatre sur le dist.html du bloc concerne
156
+            else {
157
+                if (
158
+                    ($dir = explode('/', $fond))
159
+                    && ($dir = reset($dir))
160
+                    && $dir !== $z_contenu
161
+                    && in_array($dir, $z_blocs)
162
+                ) {
163
+                    $type = substr($fond, strlen("$dir/"));
164
+                    if ($type == 'page' && isset($flux['args']['contexte'][$page])) {
165
+                        $type = $flux['args']['contexte'][$page];
166
+                    }
167
+                    if ($type !== 'page' && !isset($disponible[$type])) {
168
+                        $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, (bool) $echafauder);
169
+                    }
170
+                    if ($type == 'page' || $disponible[$type]) {
171
+                        $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext);
172
+                    }
173
+                }
174
+            }
175
+            $squelette = $flux['data'];
176
+        }
177
+
178
+        // layout specifiques par type et compositions :
179
+        // body-article.html
180
+        // body-sommaire.html
181
+        // pour des raisons de perfo, les declinaisons doivent etre dans le
182
+        // meme dossier que body.html
183
+        $f = null;
184
+        if ($fond == 'body' && str_ends_with((string) $squelette, $fond)) {
185
+            if (
186
+                isset($flux['args']['contexte']['type-page'])
187
+                && (
188
+                    isset($flux['args']['contexte']['composition']) && file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page'] . '-' . $flux['args']['contexte']['composition']) . ".$ext")
189
+                    || file_exists(($f = $squelette . '-' . $flux['args']['contexte']['type-page']) . ".$ext")
190
+                )
191
+            ) {
192
+                $flux['data'] = $f;
193
+            }
194
+        } elseif (
195
+            $fond == 'structure'
196
+            && z_sanitize_var_zajax()
197
+            && ($f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext"))
198
+        ) {
199
+            $flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
200
+        } elseif (
201
+            // chercher le fond correspondant a la composition
202
+            isset($flux['args']['contexte']['composition'])
203
+            && (basename($fond) == 'page' || $squelette && str_ends_with((string) $squelette, $fond))
204
+            && ($dir = substr($fond, $prefix_length))
205
+            && ($dir = explode('/', $dir))
206
+            && ($dir = reset($dir))
207
+            && in_array($dir, $z_blocs)
208
+            && ($f = find_in_path($prefix_path . $prepend . $fond . '-' . $flux['args']['contexte']['composition'] . ".$ext"))
209
+        ) {
210
+            $flux['data'] = substr((string) $f, 0, -strlen(".$ext"));
211
+        }
212
+    }
213
+
214
+    return $flux;
215 215
 }
216 216
 
217 217
 /**
@@ -221,18 +221,18 @@  discard block
 block discarded – undo
221 221
  * @return array
222 222
  */
223 223
 function z_blocs($espace_prive = false) {
224
-	if ($espace_prive) {
225
-		return ($GLOBALS['z_blocs_ecrire'] ?? [
226
-			'contenu',
227
-			'navigation',
228
-			'extra',
229
-			'head',
230
-			'hierarchie',
231
-			'top'
232
-		]);
233
-	}
234
-
235
-	return ($GLOBALS['z_blocs'] ?? ['contenu']);
224
+    if ($espace_prive) {
225
+        return ($GLOBALS['z_blocs_ecrire'] ?? [
226
+            'contenu',
227
+            'navigation',
228
+            'extra',
229
+            'head',
230
+            'hierarchie',
231
+            'top'
232
+        ]);
233
+    }
234
+
235
+    return ($GLOBALS['z_blocs'] ?? ['contenu']);
236 236
 }
237 237
 
238 238
 /**
@@ -247,11 +247,11 @@  discard block
 block discarded – undo
247 247
  * @return mixed
248 248
  */
249 249
 function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) {
250
-	if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
251
-		return $d;
252
-	}
250
+    if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) {
251
+        return $d;
252
+    }
253 253
 
254
-	return $echafauder ? z_echafaudable($type) : false;
254
+    return $echafauder ? z_echafaudable($type) : false;
255 255
 }
256 256
 
257 257
 /**
@@ -265,7 +265,7 @@  discard block
 block discarded – undo
265 265
  *   `true` si on peut l'utiliser, `false` sinon.
266 266
  **/
267 267
 function z_fond_valide($squelette) {
268
-	return !_ZCORE_EXCLURE_PATH || !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette);
268
+    return !_ZCORE_EXCLURE_PATH || !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette);
269 269
 }
270 270
 
271 271
 /**
@@ -283,14 +283,14 @@  discard block
 block discarded – undo
283 283
  * @return string
284 284
  */
285 285
 function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) {
286
-	if (
287
-		defined('_ZCORE_BLOC_PREFIX_SKEL') && ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext")) && z_fond_valide($f)
288
-		|| ($f = find_in_path("$prefix_path$bloc/$fond.$ext")) && z_fond_valide($f)
289
-	) {
290
-		return substr((string) $f, 0, -strlen(".$ext"));
291
-	}
292
-
293
-	return '';
286
+    if (
287
+        defined('_ZCORE_BLOC_PREFIX_SKEL') && ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext")) && z_fond_valide($f)
288
+        || ($f = find_in_path("$prefix_path$bloc/$fond.$ext")) && z_fond_valide($f)
289
+    ) {
290
+        return substr((string) $f, 0, -strlen(".$ext"));
291
+    }
292
+
293
+    return '';
294 294
 }
295 295
 
296 296
 /**
@@ -302,52 +302,52 @@  discard block
 block discarded – undo
302 302
  * @return bool
303 303
  */
304 304
 function z_echafaudable($type) {
305
-	static $pages = null;
306
-	static $echafaudable = [];
307
-	if (isset($echafaudable[$type])) {
308
-		return $echafaudable[$type];
309
-	}
310
-	if (preg_match(',[^\w],', $type)) {
311
-		return $echafaudable[$type] = false;
312
-	}
313
-
314
-	if (test_espace_prive()) {
315
-		if (!function_exists('trouver_objet_exec')) {
316
-			include_spip('inc/pipelines_ecrire');
317
-		}
318
-		if ($e = trouver_objet_exec($type)) {
319
-			return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
320
-		} else {
321
-			// peut etre c'est un exec=types qui liste tous les objets "type"
322
-			if (
323
-				($t = objet_type($type, false)) !== $type
324
-				&& ($e = trouver_objet_exec($t))
325
-			) {
326
-				return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
327
-			}
328
-		}
329
-	} else {
330
-		if (is_null($pages)) {
331
-			$pages = [];
332
-			$liste = lister_tables_objets_sql();
333
-			foreach ($liste as $t => $d) {
334
-				if ($d['page']) {
335
-					$pages[$d['page']] = [$d['table_objet'], $t];
336
-				}
337
-			}
338
-		}
339
-		if (!isset($pages[$type])) {
340
-			return $echafaudable[$type] = false;
341
-		}
342
-		if ((is_countable($pages[$type]) ? count($pages[$type]) : 0) == 2) {
343
-			$trouver_table = charger_fonction('trouver_table', 'base');
344
-			$pages[$type][] = $trouver_table(reset($pages[$type]));
345
-		}
346
-
347
-		return $echafaudable[$type] = $pages[$type];
348
-	}
349
-
350
-	return $echafaudable[$type] = false;
305
+    static $pages = null;
306
+    static $echafaudable = [];
307
+    if (isset($echafaudable[$type])) {
308
+        return $echafaudable[$type];
309
+    }
310
+    if (preg_match(',[^\w],', $type)) {
311
+        return $echafaudable[$type] = false;
312
+    }
313
+
314
+    if (test_espace_prive()) {
315
+        if (!function_exists('trouver_objet_exec')) {
316
+            include_spip('inc/pipelines_ecrire');
317
+        }
318
+        if ($e = trouver_objet_exec($type)) {
319
+            return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $e];
320
+        } else {
321
+            // peut etre c'est un exec=types qui liste tous les objets "type"
322
+            if (
323
+                ($t = objet_type($type, false)) !== $type
324
+                && ($e = trouver_objet_exec($t))
325
+            ) {
326
+                return $echafaudable[$type] = [$e['table'], $e['table_objet_sql'], $t];
327
+            }
328
+        }
329
+    } else {
330
+        if (is_null($pages)) {
331
+            $pages = [];
332
+            $liste = lister_tables_objets_sql();
333
+            foreach ($liste as $t => $d) {
334
+                if ($d['page']) {
335
+                    $pages[$d['page']] = [$d['table_objet'], $t];
336
+                }
337
+            }
338
+        }
339
+        if (!isset($pages[$type])) {
340
+            return $echafaudable[$type] = false;
341
+        }
342
+        if ((is_countable($pages[$type]) ? count($pages[$type]) : 0) == 2) {
343
+            $trouver_table = charger_fonction('trouver_table', 'base');
344
+            $pages[$type][] = $trouver_table(reset($pages[$type]));
345
+        }
346
+
347
+        return $echafaudable[$type] = $pages[$type];
348
+    }
349
+
350
+    return $echafaudable[$type] = false;
351 351
 }
352 352
 
353 353
 
@@ -364,42 +364,42 @@  discard block
 block discarded – undo
364 364
  * @return string
365 365
  */
366 366
 function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) {
367
-	$scaffold = '';
368
-
369
-	// page objet ou objet_edit
370
-	if (is_array($desc_exec)) {
371
-		$type = $desc_exec['type'];
372
-		$primary = $desc_exec['id_table_objet'];
373
-
374
-		if ($desc_exec['edition'] === false) {
375
-			$fond = 'objet';
376
-		} else {
377
-			$trouver_table = charger_fonction('trouver_table', 'base');
378
-			$desc = $trouver_table($table_sql);
379
-			$fond = isset($desc['field']['id_rubrique']) ? 'objet_edit' : 'objet_edit.sans_rubrique';
380
-		}
381
-		$dir = z_blocs(test_espace_prive());
382
-		$dir = reset($dir);
383
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper((string) $primary) . ',env}>';
384
-	} // page objets
385
-	elseif (($type = $desc_exec) && !str_contains($type, '/')) {
386
-		$dir = z_blocs(test_espace_prive());
387
-		$dir = reset($dir);
388
-		$scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
389
-	}
390
-	// morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
391
-	// et objet et tire de $table
392
-	elseif ($fond = $desc_exec) {
393
-		$dir = md5(dirname($fond));
394
-		$scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
395
-	}
396
-
397
-	$base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
398
-	$base_dir = sous_repertoire($base_dir, $dir, false);
399
-	$f = $base_dir . "$exec";
400
-	ecrire_fichier("$f.$ext", $scaffold);
401
-
402
-	return $f;
367
+    $scaffold = '';
368
+
369
+    // page objet ou objet_edit
370
+    if (is_array($desc_exec)) {
371
+        $type = $desc_exec['type'];
372
+        $primary = $desc_exec['id_table_objet'];
373
+
374
+        if ($desc_exec['edition'] === false) {
375
+            $fond = 'objet';
376
+        } else {
377
+            $trouver_table = charger_fonction('trouver_table', 'base');
378
+            $desc = $trouver_table($table_sql);
379
+            $fond = isset($desc['field']['id_rubrique']) ? 'objet_edit' : 'objet_edit.sans_rubrique';
380
+        }
381
+        $dir = z_blocs(test_espace_prive());
382
+        $dir = reset($dir);
383
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ',objet=' . $type . ',id_objet=#' . strtoupper((string) $primary) . ',env}>';
384
+    } // page objets
385
+    elseif (($type = $desc_exec) && !str_contains($type, '/')) {
386
+        $dir = z_blocs(test_espace_prive());
387
+        $dir = reset($dir);
388
+        $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ',env} />';
389
+    }
390
+    // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec
391
+    // et objet et tire de $table
392
+    elseif ($fond = $desc_exec) {
393
+        $dir = md5(dirname($fond));
394
+        $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ',env} />';
395
+    }
396
+
397
+    $base_dir = sous_repertoire(_DIR_CACHE, 'scaffold', false);
398
+    $base_dir = sous_repertoire($base_dir, $dir, false);
399
+    $f = $base_dir . "$exec";
400
+    ecrire_fichier("$f.$ext", $scaffold);
401
+
402
+    return $f;
403 403
 }
404 404
 
405 405
 /**
@@ -408,17 +408,17 @@  discard block
 block discarded – undo
408 408
  * @return bool|string
409 409
  */
410 410
 function z_sanitize_var_zajax() {
411
-	$z_ajax = _request('var_zajax');
412
-	if (!$z_ajax) {
413
-		return false;
414
-	}
415
-	if (
416
-		!($z_blocs = z_blocs(test_espace_prive()))
417
-		|| !in_array($z_ajax, $z_blocs)
418
-	) {
419
-		set_request('var_zajax'); // enlever cette demande incongrue
420
-		$z_ajax = false;
421
-	}
422
-
423
-	return $z_ajax;
411
+    $z_ajax = _request('var_zajax');
412
+    if (!$z_ajax) {
413
+        return false;
414
+    }
415
+    if (
416
+        !($z_blocs = z_blocs(test_espace_prive()))
417
+        || !in_array($z_ajax, $z_blocs)
418
+    ) {
419
+        set_request('var_zajax'); // enlever cette demande incongrue
420
+        $z_ajax = false;
421
+    }
422
+
423
+    return $z_ajax;
424 424
 }
Please login to merge, or discard this patch.
ecrire/public/criteres.php 1 patch
Indentation   +1711 added lines, -1711 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
 /**
@@ -46,12 +46,12 @@  discard block
 block discarded – undo
46 46
  **/
47 47
 function critere_racine_dist($idb, &$boucles, $crit) {
48 48
 
49
-	$not = $crit->not;
50
-	$boucle = &$boucles[$idb];
51
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
49
+    $not = $crit->not;
50
+    $boucle = &$boucles[$idb];
51
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
52 52
 
53
-	$c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
54
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
53
+    $c = ["'='", "'$boucle->id_table." . "$id_parent'", 0];
54
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
55 55
 }
56 56
 
57 57
 
@@ -68,15 +68,15 @@  discard block
 block discarded – undo
68 68
  * @return void|array
69 69
  **/
70 70
 function critere_exclus_dist($idb, &$boucles, $crit) {
71
-	$not = $crit->not;
72
-	$boucle = &$boucles[$idb];
73
-	$id = $boucle->primary;
74
-
75
-	if ($not || !$id) {
76
-		return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
77
-	}
78
-	$arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
79
-	$boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
71
+    $not = $crit->not;
72
+    $boucle = &$boucles[$idb];
73
+    $id = $boucle->primary;
74
+
75
+    if ($not || !$id) {
76
+        return ['zbug_critere_inconnu', ['critere' => $not . $crit->op]];
77
+    }
78
+    $arg = kwote(calculer_argument_precedent($idb, $id, $boucles));
79
+    $boucle->where[] = ["'!='", "'$boucle->id_table." . "$id'", $arg];
80 80
 }
81 81
 
82 82
 
@@ -96,73 +96,73 @@  discard block
 block discarded – undo
96 96
  * @return void|array
97 97
  **/
98 98
 function critere_doublons_dist($idb, &$boucles, $crit) {
99
-	$boucle = &$boucles[$idb];
100
-	$primary = $boucle->primary;
101
-
102
-	// la table nécessite une clé primaire, non composée
103
-	if (!$primary || strpos((string) $primary, ',')) {
104
-		return ['zbug_doublon_sur_table_sans_cle_primaire'];
105
-	}
106
-
107
-	$not = ($crit->not ? '' : 'NOT');
108
-
109
-	// le doublon s'applique sur un type de boucle (article)
110
-	$nom = "'" . $boucle->type_requete . "'";
111
-
112
-	// compléter le nom avec un nom précisé {doublons nom}
113
-	// on obtient $nom = "'article' . 'nom'"
114
-	if (isset($crit->param[0])) {
115
-		$nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
116
-	}
117
-
118
-	// code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
119
-	$init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
120
-	$init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
121
-
122
-	// on crée un sql_in avec la clé primaire de la table
123
-	// et la collection des doublons déjà emmagasinés dans le tableau
124
-	// $doublons et son index, ici $nom
125
-
126
-	// debut du code "sql_in('articles.id_article', "
127
-	$debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
128
-	// lecture des données du doublon "$doublons[$doublon_index[] = "
129
-	// Attention : boucle->doublons désigne une variable qu'on affecte
130
-	$debut_doub = '$doublons[' . ($not ? $boucle->doublons . '[]= ' : (''));
131
-
132
-	// le debut complet du code des doublons
133
-	$debut_doub = $debut_in . $debut_doub;
134
-
135
-	// nom du doublon "('article' . 'nom')]"
136
-	$fin_doub = "($nom)]";
137
-
138
-	// si on trouve un autre critère doublon,
139
-	// on fusionne pour avoir un seul IN, et on s'en va !
140
-	foreach ($boucle->where as $k => $w) {
141
-		if (str_starts_with((string) $w[0], $debut_doub)) {
142
-			// fusionner le sql_in (du where)
143
-			$boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr((string) $w[0], strlen($debut_in));
144
-			// fusionner l'initialisation (du hash) pour faire plus joli
145
-			$x = strpos((string) $boucle->hash, $init_comment);
146
-			$len = strlen($init_comment);
147
-			$boucle->hash =
148
-				substr((string) $boucle->hash, 0, $x + $len) . $init_code . substr((string) $boucle->hash, $x + $len);
149
-
150
-			return;
151
-		}
152
-	}
153
-
154
-	// mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
155
-	$boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
156
-
157
-	// déclarer le doublon s'il n'existe pas encore
158
-	$boucle->hash .= $init_comment . $init_code;
159
-
160
-
161
-	# la ligne suivante avait l'intention d'eviter une collecte deja faite
162
-	# mais elle fait planter une boucle a 2 critere doublons:
163
-	# {!doublons A}{doublons B}
164
-	# (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
165
-	#	if ($crit->not) $boucle->doublons = "";
99
+    $boucle = &$boucles[$idb];
100
+    $primary = $boucle->primary;
101
+
102
+    // la table nécessite une clé primaire, non composée
103
+    if (!$primary || strpos((string) $primary, ',')) {
104
+        return ['zbug_doublon_sur_table_sans_cle_primaire'];
105
+    }
106
+
107
+    $not = ($crit->not ? '' : 'NOT');
108
+
109
+    // le doublon s'applique sur un type de boucle (article)
110
+    $nom = "'" . $boucle->type_requete . "'";
111
+
112
+    // compléter le nom avec un nom précisé {doublons nom}
113
+    // on obtient $nom = "'article' . 'nom'"
114
+    if (isset($crit->param[0])) {
115
+        $nom .= '.' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
116
+    }
117
+
118
+    // code qui déclarera l'index du stockage de nos doublons (pour éviter une notice PHP)
119
+    $init_comment = "\n\n\t// Initialise le(s) critère(s) doublons\n";
120
+    $init_code = "\tif (!isset(\$doublons[\$d = $nom])) { \$doublons[\$d] = ''; }\n";
121
+
122
+    // on crée un sql_in avec la clé primaire de la table
123
+    // et la collection des doublons déjà emmagasinés dans le tableau
124
+    // $doublons et son index, ici $nom
125
+
126
+    // debut du code "sql_in('articles.id_article', "
127
+    $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', ";
128
+    // lecture des données du doublon "$doublons[$doublon_index[] = "
129
+    // Attention : boucle->doublons désigne une variable qu'on affecte
130
+    $debut_doub = '$doublons[' . ($not ? $boucle->doublons . '[]= ' : (''));
131
+
132
+    // le debut complet du code des doublons
133
+    $debut_doub = $debut_in . $debut_doub;
134
+
135
+    // nom du doublon "('article' . 'nom')]"
136
+    $fin_doub = "($nom)]";
137
+
138
+    // si on trouve un autre critère doublon,
139
+    // on fusionne pour avoir un seul IN, et on s'en va !
140
+    foreach ($boucle->where as $k => $w) {
141
+        if (str_starts_with((string) $w[0], $debut_doub)) {
142
+            // fusionner le sql_in (du where)
143
+            $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr((string) $w[0], strlen($debut_in));
144
+            // fusionner l'initialisation (du hash) pour faire plus joli
145
+            $x = strpos((string) $boucle->hash, $init_comment);
146
+            $len = strlen($init_comment);
147
+            $boucle->hash =
148
+                substr((string) $boucle->hash, 0, $x + $len) . $init_code . substr((string) $boucle->hash, $x + $len);
149
+
150
+            return;
151
+        }
152
+    }
153
+
154
+    // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante
155
+    $boucle->where[] = [$debut_doub . $fin_doub . ", '" . $not . "')"];
156
+
157
+    // déclarer le doublon s'il n'existe pas encore
158
+    $boucle->hash .= $init_comment . $init_code;
159
+
160
+
161
+    # la ligne suivante avait l'intention d'eviter une collecte deja faite
162
+    # mais elle fait planter une boucle a 2 critere doublons:
163
+    # {!doublons A}{doublons B}
164
+    # (de http://article.gmane.org/gmane.comp.web.spip.devel/31034)
165
+    #	if ($crit->not) $boucle->doublons = "";
166 166
 }
167 167
 
168 168
 
@@ -183,14 +183,14 @@  discard block
 block discarded – undo
183 183
  * @return void
184 184
  **/
185 185
 function critere_lang_select_dist($idb, &$boucles, $crit) {
186
-	if (!isset($crit->param[1][0]) || !($param = $crit->param[1][0]->texte)) {
187
-		$param = 'oui';
188
-	}
189
-	if ($crit->not) {
190
-		$param = ($param == 'oui') ? 'non' : 'oui';
191
-	}
192
-	$boucle = &$boucles[$idb];
193
-	$boucle->lang_select = $param;
186
+    if (!isset($crit->param[1][0]) || !($param = $crit->param[1][0]->texte)) {
187
+        $param = 'oui';
188
+    }
189
+    if ($crit->not) {
190
+        $param = ($param == 'oui') ? 'non' : 'oui';
191
+    }
192
+    $boucle = &$boucles[$idb];
193
+    $boucle->lang_select = $param;
194 194
 }
195 195
 
196 196
 
@@ -212,15 +212,15 @@  discard block
 block discarded – undo
212 212
  * @return void
213 213
  **/
214 214
 function critere_debut_dist($idb, &$boucles, $crit) {
215
-	[$un, $deux] = $crit->param;
216
-	$un = $un[0]->texte;
217
-	$deux = $deux[0]->texte;
218
-	if ($deux) {
219
-		$boucles[$idb]->limit =
220
-			'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
221
-	} else {
222
-		calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
223
-	}
215
+    [$un, $deux] = $crit->param;
216
+    $un = $un[0]->texte;
217
+    $deux = $deux[0]->texte;
218
+    if ($deux) {
219
+        $boucles[$idb]->limit =
220
+            'intval($Pile[0]["debut' . $un . '"]) . ",' . $deux . '"';
221
+    } else {
222
+        calculer_critere_DEFAUT_dist($idb, $boucles, $crit);
223
+    }
224 224
 }
225 225
 
226 226
 
@@ -254,59 +254,59 @@  discard block
 block discarded – undo
254 254
  **/
255 255
 function critere_pagination_dist($idb, &$boucles, $crit) {
256 256
 
257
-	$boucle = &$boucles[$idb];
258
-	// definition de la taille de la page
259
-	$pas = isset($crit->param[0][0])
260
-		? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
261
-		: "''";
262
-
263
-	if (!preg_match(_CODE_QUOTE, (string) $pas, $r)) {
264
-		$pas = "((\$a = intval($pas)) ? \$a : 10)";
265
-	} else {
266
-		$r = (int) $r[2];
267
-		$pas = (string) ($r ?: 10);
268
-	}
269
-
270
-	// Calcul du nommage de la pagination si il existe.
271
-	// La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
272
-	// compatible avec l'ancienne car certains cas fonctionnent correctement
273
-	$type = "'$idb'";
274
-	// Calcul d'un nommage spécifique de la pagination si précisé.
275
-	// Syntaxe {pagination 20, nom}
276
-	if (isset($crit->param[0][1])) {
277
-		$type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
278
-	} // Ancienne syntaxe {pagination 20 nom} pour compatibilité
279
-	elseif (isset($crit->param[1][0])) {
280
-		$type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281
-	}
282
-
283
-	$debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr((string) $type, 1));
284
-	$boucle->modificateur['debut_nom'] = $type;
285
-	$partie =
286
-		// tester si le numero de page demande est de la forme '@yyy'
287
-		'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
288
-		. "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
-		. "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
-		. "\t\t" . '$iter->seek(0);' . "\n"
291
-		. "\t}\n"
292
-		. "\t" . '$debut_boucle = intval($debut_boucle)';
293
-
294
-	$boucle->hash .= '
257
+    $boucle = &$boucles[$idb];
258
+    // definition de la taille de la page
259
+    $pas = isset($crit->param[0][0])
260
+        ? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
261
+        : "''";
262
+
263
+    if (!preg_match(_CODE_QUOTE, (string) $pas, $r)) {
264
+        $pas = "((\$a = intval($pas)) ? \$a : 10)";
265
+    } else {
266
+        $r = (int) $r[2];
267
+        $pas = (string) ($r ?: 10);
268
+    }
269
+
270
+    // Calcul du nommage de la pagination si il existe.
271
+    // La nouvelle syntaxe {pagination 20, nom} est prise en compte et privilégiée mais on reste
272
+    // compatible avec l'ancienne car certains cas fonctionnent correctement
273
+    $type = "'$idb'";
274
+    // Calcul d'un nommage spécifique de la pagination si précisé.
275
+    // Syntaxe {pagination 20, nom}
276
+    if (isset($crit->param[0][1])) {
277
+        $type = calculer_liste([$crit->param[0][1]], $idb, $boucles, $boucle->id_parent);
278
+    } // Ancienne syntaxe {pagination 20 nom} pour compatibilité
279
+    elseif (isset($crit->param[1][0])) {
280
+        $type = calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent);
281
+    }
282
+
283
+    $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr((string) $type, 1));
284
+    $boucle->modificateur['debut_nom'] = $type;
285
+    $partie =
286
+        // tester si le numero de page demande est de la forme '@yyy'
287
+        'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n"
288
+        . "\tif (\$debut_boucle && \$debut_boucle[0] === '@') {\n"
289
+        . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n"
290
+        . "\t\t" . '$iter->seek(0);' . "\n"
291
+        . "\t}\n"
292
+        . "\t" . '$debut_boucle = intval($debut_boucle)';
293
+
294
+    $boucle->hash .= '
295 295
 	$command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');';
296 296
 
297
-	$boucle->total_parties = $pas;
298
-	calculer_parties($boucles, $idb, $partie, 'p+');
299
-	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300
-	// sauf si pas de primaire, ou si primaire composee
301
-	// dans ce cas, on ne sait pas gerer une pagination indirecte
302
-	$t = $boucle->id_table . '.' . $boucle->primary;
303
-	if (
304
-		$boucle->primary
305
-		&& !preg_match('/[,\s]/', (string) $boucle->primary)
306
-		&& !in_array($t, $boucle->select)
307
-	) {
308
-		$boucle->select[] = $t;
309
-	}
297
+    $boucle->total_parties = $pas;
298
+    calculer_parties($boucles, $idb, $partie, 'p+');
299
+    // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
300
+    // sauf si pas de primaire, ou si primaire composee
301
+    // dans ce cas, on ne sait pas gerer une pagination indirecte
302
+    $t = $boucle->id_table . '.' . $boucle->primary;
303
+    if (
304
+        $boucle->primary
305
+        && !preg_match('/[,\s]/', (string) $boucle->primary)
306
+        && !in_array($t, $boucle->select)
307
+    ) {
308
+        $boucle->select[] = $t;
309
+    }
310 310
 }
311 311
 
312 312
 
@@ -328,24 +328,24 @@  discard block
 block discarded – undo
328 328
  **/
329 329
 function critere_recherche_dist($idb, &$boucles, $crit) {
330 330
 
331
-	$boucle = &$boucles[$idb];
331
+    $boucle = &$boucles[$idb];
332 332
 
333
-	if (!$boucle->primary || strpos((string) $boucle->primary, ',')) {
334
-		erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
333
+    if (!$boucle->primary || strpos((string) $boucle->primary, ',')) {
334
+        erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', ['critere' => 'recherche']), $boucle);
335 335
 
336
-		return;
337
-	}
336
+        return;
337
+    }
338 338
 
339
-	if (isset($crit->param[0])) {
340
-		$quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
-	} else {
342
-		$quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
-	}
339
+    if (isset($crit->param[0])) {
340
+        $quoi = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
341
+    } else {
342
+        $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))';
343
+    }
344 344
 
345
-	$_modificateur = var_export($boucle->modificateur, true);
346
-	$boucle->hash .= '
345
+    $_modificateur = var_export($boucle->modificateur, true);
346
+    $boucle->hash .= '
347 347
 	// RECHERCHE'
348
-		. ($crit->cond ? '
348
+        . ($crit->cond ? '
349 349
 	if (!strlen(' . $quoi . ')){
350 350
 		list($rech_select, $rech_where) = array("0 as points","");
351 351
 	} else' : '') . '
@@ -356,21 +356,21 @@  discard block
 block discarded – undo
356 356
 	';
357 357
 
358 358
 
359
-	$t = $boucle->id_table . '.' . $boucle->primary;
360
-	if (!in_array($t, $boucles[$idb]->select)) {
361
-		$boucle->select[] = $t;
362
-	} # pour postgres, neuneu ici
363
-	// jointure uniquement sur le serveur principal
364
-	// (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
-	if (!$boucle->sql_serveur) {
366
-		$boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
367
-		$boucle->from['resultats'] = 'spip_resultats';
368
-	}
369
-	$boucle->select[] = '$rech_select';
370
-	//$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
-
372
-	// et la recherche trouve
373
-	$boucle->where[] = '$rech_where?$rech_where:\'\'';
359
+    $t = $boucle->id_table . '.' . $boucle->primary;
360
+    if (!in_array($t, $boucles[$idb]->select)) {
361
+        $boucle->select[] = $t;
362
+    } # pour postgres, neuneu ici
363
+    // jointure uniquement sur le serveur principal
364
+    // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal)
365
+    if (!$boucle->sql_serveur) {
366
+        $boucle->join['resultats'] = ["'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"];
367
+        $boucle->from['resultats'] = 'spip_resultats';
368
+    }
369
+    $boucle->select[] = '$rech_select';
370
+    //$boucle->where[]= "\$rech_where?'resultats.id=".$boucle->id_table.".".$boucle->primary."':''";
371
+
372
+    // et la recherche trouve
373
+    $boucle->where[] = '$rech_where?$rech_where:\'\'';
374 374
 }
375 375
 
376 376
 /**
@@ -387,25 +387,25 @@  discard block
 block discarded – undo
387 387
  * @return void
388 388
  **/
389 389
 function critere_traduction_dist($idb, &$boucles, $crit) {
390
-	$boucle = &$boucles[$idb];
391
-	$prim = $boucle->primary;
392
-	$table = $boucle->id_table;
393
-	$arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
-	$dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
-	$boucle->where[] =
396
-		[
397
-			"'OR'",
398
-			[
399
-				"'AND'",
400
-				["'='", "'$table.id_trad'", 0],
401
-				["'='", "'$table.$prim'", $dprim]
402
-			],
403
-			[
404
-				"'AND'",
405
-				["'>'", "'$table.id_trad'", 0],
406
-				["'='", "'$table.id_trad'", $arg]
407
-			]
408
-		];
390
+    $boucle = &$boucles[$idb];
391
+    $prim = $boucle->primary;
392
+    $table = $boucle->id_table;
393
+    $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles));
394
+    $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles));
395
+    $boucle->where[] =
396
+        [
397
+            "'OR'",
398
+            [
399
+                "'AND'",
400
+                ["'='", "'$table.id_trad'", 0],
401
+                ["'='", "'$table.$prim'", $dprim]
402
+            ],
403
+            [
404
+                "'AND'",
405
+                ["'>'", "'$table.id_trad'", 0],
406
+                ["'='", "'$table.id_trad'", $arg]
407
+            ]
408
+        ];
409 409
 }
410 410
 
411 411
 
@@ -423,17 +423,17 @@  discard block
 block discarded – undo
423 423
  * @return void
424 424
  **/
425 425
 function critere_origine_traduction_dist($idb, &$boucles, $crit) {
426
-	$boucle = &$boucles[$idb];
427
-	$prim = $boucle->primary;
428
-	$table = $boucle->id_table;
429
-
430
-	$c =
431
-		[
432
-			"'OR'",
433
-			["'='", "'$table." . "id_trad'", "'$table.$prim'"],
434
-			["'='", "'$table.id_trad'", "'0'"]
435
-		];
436
-	$boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
426
+    $boucle = &$boucles[$idb];
427
+    $prim = $boucle->primary;
428
+    $table = $boucle->id_table;
429
+
430
+    $c =
431
+        [
432
+            "'OR'",
433
+            ["'='", "'$table." . "id_trad'", "'$table.$prim'"],
434
+            ["'='", "'$table.id_trad'", "'0'"]
435
+        ];
436
+    $boucle->where[] = ($crit->not ? ["'NOT'", $c] : $c);
437 437
 }
438 438
 
439 439
 
@@ -450,17 +450,17 @@  discard block
 block discarded – undo
450 450
  **/
451 451
 function critere_meme_parent_dist($idb, &$boucles, $crit) {
452 452
 
453
-	$boucle = &$boucles[$idb];
454
-	$arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
-	$mparent = $boucle->id_table . '.' . $id_parent;
457
-
458
-	if ($boucle->type_requete == 'rubriques' || isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459
-		$boucle->where[] = ["'='", "'$mparent'", $arg];
460
-	} // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461
-	else {
462
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
463
-	}
453
+    $boucle = &$boucles[$idb];
454
+    $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
455
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
456
+    $mparent = $boucle->id_table . '.' . $id_parent;
457
+
458
+    if ($boucle->type_requete == 'rubriques' || isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) {
459
+        $boucle->where[] = ["'='", "'$mparent'", $arg];
460
+    } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist()
461
+    else {
462
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $boucle->type_requete]];
463
+    }
464 464
 }
465 465
 
466 466
 
@@ -491,38 +491,38 @@  discard block
 block discarded – undo
491 491
  **/
492 492
 function critere_branche_dist($idb, &$boucles, $crit) {
493 493
 
494
-	$not = $crit->not;
495
-	$boucle = &$boucles[$idb];
496
-	// prendre en priorite un identifiant en parametre {branche XX}
497
-	if (isset($crit->param[0])) {
498
-		$arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
499
-		// sinon on le prend chez une boucle parente
500
-	} else {
501
-		$arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
502
-	}
503
-
504
-	//Trouver une jointure
505
-	$champ = 'id_rubrique';
506
-	$desc = $boucle->show;
507
-	//Seulement si necessaire
508
-	if (!array_key_exists($champ, $desc['field'])) {
509
-		$cle = trouver_jointure_champ($champ, $boucle);
510
-		$trouver_table = charger_fonction('trouver_table', 'base');
511
-		$desc = $trouver_table($boucle->from[$cle]);
512
-		if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513
-			$decompose = decompose_champ_id_objet($champ);
514
-			$champ = array_shift($decompose);
515
-			$boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
516
-		}
517
-	} else {
518
-		$cle = $boucle->id_table;
519
-	}
520
-
521
-	$c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
-		. ($not ? ", 'NOT'" : '') . ')';
523
-	$boucle->where[] = $crit->cond
524
-		? "($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'
525
-		: $c;
494
+    $not = $crit->not;
495
+    $boucle = &$boucles[$idb];
496
+    // prendre en priorite un identifiant en parametre {branche XX}
497
+    if (isset($crit->param[0])) {
498
+        $arg = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
499
+        // sinon on le prend chez une boucle parente
500
+    } else {
501
+        $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles), $boucle->sql_serveur, 'int NOT NULL');
502
+    }
503
+
504
+    //Trouver une jointure
505
+    $champ = 'id_rubrique';
506
+    $desc = $boucle->show;
507
+    //Seulement si necessaire
508
+    if (!array_key_exists($champ, $desc['field'])) {
509
+        $cle = trouver_jointure_champ($champ, $boucle);
510
+        $trouver_table = charger_fonction('trouver_table', 'base');
511
+        $desc = $trouver_table($boucle->from[$cle]);
512
+        if (count(trouver_champs_decomposes($champ, $desc)) > 1) {
513
+            $decompose = decompose_champ_id_objet($champ);
514
+            $champ = array_shift($decompose);
515
+            $boucle->where[] = ["'='", _q($cle . '.' . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'];
516
+        }
517
+    } else {
518
+        $cle = $boucle->id_table;
519
+    }
520
+
521
+    $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)"
522
+        . ($not ? ", 'NOT'" : '') . ')';
523
+    $boucle->where[] = $crit->cond
524
+        ? "($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'
525
+        : $c;
526 526
 }
527 527
 
528 528
 /**
@@ -538,15 +538,15 @@  discard block
 block discarded – undo
538 538
  **/
539 539
 function critere_logo_dist($idb, &$boucles, $crit) {
540 540
 
541
-	$boucle = &$boucles[$idb];
542
-	$not = ($crit->not ? 'NOT' : '');
543
-	$serveur = $boucle->sql_serveur;
541
+    $boucle = &$boucles[$idb];
542
+    $not = ($crit->not ? 'NOT' : '');
543
+    $serveur = $boucle->sql_serveur;
544 544
 
545
-	$c = "sql_in('" .
546
-		$boucle->id_table . '.' . $boucle->primary
547
-		. "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
545
+    $c = "sql_in('" .
546
+        $boucle->id_table . '.' . $boucle->primary
547
+        . "', lister_objets_avec_logos('" . $boucle->primary . "'), '$not', '$serveur')";
548 548
 
549
-	$boucle->where[] = $c;
549
+    $boucle->where[] = $c;
550 550
 }
551 551
 
552 552
 /**
@@ -569,31 +569,31 @@  discard block
 block discarded – undo
569 569
  * @return void|array
570 570
  */
571 571
 function critere_groupby_dist($idb, &$boucles, $crit) {
572
-	if ($t = isset($crit->param[0])) {
573
-		$t = $crit->param[0];
574
-		if ($t[0]->type == 'texte') {
575
-			$t = $t[0]->texte;
576
-			if (preg_match('/^(.*)\.(.*)$/', (string) $t, $r)) {
577
-				$t = table_objet_sql($r[1]);
578
-				$t = array_search($t, $boucles[$idb]->from);
579
-				if ($t) {
580
-					$t .= '.' . $r[2];
581
-				}
582
-			}
583
-		} else {
584
-			$t = '".'
585
-				. calculer_critere_arg_dynamique($idb, $boucles, $t)
586
-				. '."';
587
-		}
588
-	}
589
-	if ($t) {
590
-		$boucles[$idb]->group[] = $t;
591
-		if (!in_array($t, $boucles[$idb]->select)) {
592
-			$boucles[$idb]->select[] = $t;
593
-		}
594
-	} else {
595
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
596
-	}
572
+    if ($t = isset($crit->param[0])) {
573
+        $t = $crit->param[0];
574
+        if ($t[0]->type == 'texte') {
575
+            $t = $t[0]->texte;
576
+            if (preg_match('/^(.*)\.(.*)$/', (string) $t, $r)) {
577
+                $t = table_objet_sql($r[1]);
578
+                $t = array_search($t, $boucles[$idb]->from);
579
+                if ($t) {
580
+                    $t .= '.' . $r[2];
581
+                }
582
+            }
583
+        } else {
584
+            $t = '".'
585
+                . calculer_critere_arg_dynamique($idb, $boucles, $t)
586
+                . '."';
587
+        }
588
+    }
589
+    if ($t) {
590
+        $boucles[$idb]->group[] = $t;
591
+        if (!in_array($t, $boucles[$idb]->select)) {
592
+            $boucles[$idb]->select[] = $t;
593
+        }
594
+    } else {
595
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
596
+    }
597 597
 }
598 598
 
599 599
 /**
@@ -616,7 +616,7 @@  discard block
 block discarded – undo
616 616
  * @return void
617 617
  */
618 618
 function critere_groupby_supprimer_dist($idb, &$boucles, $crit): void {
619
-	$boucles[$idb]->group = [];
619
+    $boucles[$idb]->group = [];
620 620
 }
621 621
 
622 622
 /**
@@ -630,8 +630,8 @@  discard block
 block discarded – undo
630 630
  * @return void|array
631 631
  */
632 632
 function critere_fusion_dist(...$args) {
633
-	trigger_deprecation('spip', '5.0', 'Using "%s" criteria is deprecated, use "%s" criteria instead', 'fusion', 'groupby');
634
-	return critere_groupby_dist(...$args);
633
+    trigger_deprecation('spip', '5.0', 'Using "%s" criteria is deprecated, use "%s" criteria instead', 'fusion', 'groupby');
634
+    return critere_groupby_dist(...$args);
635 635
 }
636 636
 
637 637
 /**
@@ -644,8 +644,8 @@  discard block
 block discarded – undo
644 644
  * @param Critere $crit Paramètres du critère dans cette boucle
645 645
  */
646 646
 function critere_fusion_supprimer_dist(...$args): void {
647
-	trigger_deprecation('spip', '5.0', 'Using "%s" criteria is deprecated, use "%s" criteria instead', 'fusion_supprimer', 'groupby_supprimer');
648
-	critere_groupby_supprimer_dist(...$args);
647
+    trigger_deprecation('spip', '5.0', 'Using "%s" criteria is deprecated, use "%s" criteria instead', 'fusion_supprimer', 'groupby_supprimer');
648
+    critere_groupby_supprimer_dist(...$args);
649 649
 }
650 650
 
651 651
 /**
@@ -683,26 +683,26 @@  discard block
 block discarded – undo
683 683
  * @return void|array
684 684
  */
685 685
 function critere_collate_dist($idb, &$boucles, $crit) {
686
-	if (isset($crit->param[0])) {
687
-		$_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
688
-		$boucle = $boucles[$idb];
689
-		$boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
690
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
691
-		if ($n && (!str_contains((string) $boucle->order[$n - 1], 'COLLATE'))) {
692
-			// l'instruction COLLATE doit être placée avant ASC ou DESC
693
-			// notamment lors de l'utilisation `{!par xxx}{collate yyy}`
694
-			if (
695
-				(false !== $i = strpos((string) $boucle->order[$n - 1], 'ASC'))
696
-				|| (false !== $i = strpos((string) $boucle->order[$n - 1], 'DESC'))
697
-			) {
698
-				$boucle->order[$n - 1] = substr_replace((string) $boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
699
-			} else {
700
-				$boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
701
-			}
702
-		}
703
-	} else {
704
-		return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
705
-	}
686
+    if (isset($crit->param[0])) {
687
+        $_coll = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
688
+        $boucle = $boucles[$idb];
689
+        $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')";
690
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
691
+        if ($n && (!str_contains((string) $boucle->order[$n - 1], 'COLLATE'))) {
692
+            // l'instruction COLLATE doit être placée avant ASC ou DESC
693
+            // notamment lors de l'utilisation `{!par xxx}{collate yyy}`
694
+            if (
695
+                (false !== $i = strpos((string) $boucle->order[$n - 1], 'ASC'))
696
+                || (false !== $i = strpos((string) $boucle->order[$n - 1], 'DESC'))
697
+            ) {
698
+                $boucle->order[$n - 1] = substr_replace((string) $boucle->order[$n - 1], "' . " . $boucle->modificateur['collate'] . " . ' ", $i, 0);
699
+            } else {
700
+                $boucle->order[$n - 1] .= ' . ' . $boucle->modificateur['collate'];
701
+            }
702
+        }
703
+    } else {
704
+        return (['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . (is_countable($boucles[$idb]->order) ? count($boucles[$idb]->order) : 0)]]);
705
+    }
706 706
 }
707 707
 
708 708
 /**
@@ -717,26 +717,26 @@  discard block
 block discarded – undo
717 717
  * @return void|array
718 718
  */
719 719
 function critere_collecte_dist(...$args) {
720
-	trigger_deprecation('spip', '5.0', 'Using "%s" criteria is deprecated, use "%s" criteria instead', 'collecte', 'collate');
721
-	return critere_collate_dist(...$args);
720
+    trigger_deprecation('spip', '5.0', 'Using "%s" criteria is deprecated, use "%s" criteria instead', 'collecte', 'collate');
721
+    return critere_collate_dist(...$args);
722 722
 }
723 723
 
724 724
 function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') {
725
-	$boucle = $boucles[$idb];
726
-	$alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
727
-	$var = '$champs_' . $idb;
728
-	$desc = (str_contains((string) $boucle->in, (string) "static $var ="));
729
-	if (!$desc) {
730
-		$desc = $boucle->show['field'];
731
-		$desc = implode(',', array_map('_q', array_keys($desc)));
732
-		$boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
733
-	}
734
-	if ($desc) {
735
-		$alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
736
-	}
737
-	$arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
738
-
739
-	return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
725
+    $boucle = $boucles[$idb];
726
+    $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')';
727
+    $var = '$champs_' . $idb;
728
+    $desc = (str_contains((string) $boucle->in, (string) "static $var ="));
729
+    if (!$desc) {
730
+        $desc = $boucle->show['field'];
731
+        $desc = implode(',', array_map('_q', array_keys($desc)));
732
+        $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ');';
733
+    }
734
+    if ($desc) {
735
+        $alt = "(in_array(\$x, $var)  ? $alt :(\$x$suffix))";
736
+    }
737
+    $arg = calculer_liste($crit, $idb, $boucles, $boucle->id_parent);
738
+
739
+    return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')";
740 740
 }
741 741
 
742 742
 /**
@@ -775,7 +775,7 @@  discard block
 block discarded – undo
775 775
  * @param Critere $crit Paramètres du critère dans cette boucle
776 776
  */
777 777
 function critere_par_dist($idb, &$boucles, $crit) {
778
-	return critere_parinverse($idb, $boucles, $crit);
778
+    return critere_parinverse($idb, $boucles, $crit);
779 779
 }
780 780
 
781 781
 /**
@@ -797,91 +797,91 @@  discard block
 block discarded – undo
797 797
  * @param Critere $crit Paramètres du critère dans cette boucle
798 798
  */
799 799
 function critere_parinverse($idb, &$boucles, $crit) {
800
-	$boucle = &$boucles[$idb];
801
-
802
-	$sens = $collecte = '';
803
-	if ($crit->not) {
804
-		$sens = " . ' DESC'";
805
-	}
806
-	if (isset($boucle->modificateur['collate'])) {
807
-		$collecte = ' . ' . $boucle->modificateur['collate'];
808
-	}
809
-
810
-	// Pour chaque paramètre du critère
811
-	foreach ($crit->param as $tri) {
812
-		$order = $fct = '';
813
-		// tris specifiés dynamiquement {par #ENV{tri}}
814
-		if ($tri[0]->type != 'texte') {
815
-			// calculer le order dynamique qui verifie les champs
816
-			$order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
817
-			// ajouter 'hasard' comme possibilité de tri dynamique
818
-			calculer_critere_par_hasard($idb, $boucles, $crit);
819
-		}
820
-		// tris textuels {par titre}
821
-		else {
822
-			$par = array_shift($tri);
823
-			$par = $par->texte;
824
-
825
-			// tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
826
-			if (preg_match(',^(\w+)[\s]+(.*)$,', (string) $par, $m)) {
827
-				$expression = trim($m[1]);
828
-				$champ = trim($m[2]);
829
-				if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
830
-					$order = $f($idb, $boucles, $crit, $tri, $champ);
831
-				} else {
832
-					return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
833
-				}
834
-
835
-			// tris de la forme {par champ} ou {par FONCTION(champ)}
836
-			} elseif ($boucle->type_requete == 'DATA' || preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', (string) $par, $match)) {
837
-				// {par FONCTION(champ)}
838
-				if (isset($match) && count($match) > 2) {
839
-					$par = substr($match[2], 1, -1);
840
-					$fct = $match[1];
841
-				}
842
-				// quelques cas spécifiques {par hasard}, {par date}
843
-				if ($par == 'hasard') {
844
-					$order = calculer_critere_par_hasard($idb, $boucles, $crit);
845
-				} elseif ($par == 'date' && !empty($boucle->show['date'])) {
846
-					$order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
847
-				} else {
848
-					// cas général {par champ}, {par table.champ}, ...
849
-					$order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
850
-				}
851
-			}
852
-
853
-			// on ne sait pas traiter…
854
-			else {
855
-				return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
856
-			}
857
-
858
-			// En cas d'erreur de squelette retournée par une fonction
859
-			if (is_array($order)) {
860
-				return $order;
861
-			}
862
-		}
863
-
864
-		if (preg_match('/^\'([^"]*)\'$/', (string) $order, $m)) {
865
-			$t = $m[1];
866
-			if (strpos($t, '.') && !in_array($t, $boucle->select)) {
867
-				$boucle->select[] = $t;
868
-			}
869
-		} else {
870
-			$sens = '';
871
-		}
872
-
873
-		if ($fct) {
874
-			$order = preg_match("/^\s*'(.*)'\s*$/", (string) $order, $r)
875
-				? "'$fct(" . $r[1] . ")'"
876
-				: "'$fct(' . $order . ')'";
877
-		}
878
-		$t = $order . $collecte . $sens;
879
-		if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
880
-			$t = $r[1] . $r[2];
881
-		}
882
-
883
-		$boucle->order[] = $t;
884
-	}
800
+    $boucle = &$boucles[$idb];
801
+
802
+    $sens = $collecte = '';
803
+    if ($crit->not) {
804
+        $sens = " . ' DESC'";
805
+    }
806
+    if (isset($boucle->modificateur['collate'])) {
807
+        $collecte = ' . ' . $boucle->modificateur['collate'];
808
+    }
809
+
810
+    // Pour chaque paramètre du critère
811
+    foreach ($crit->param as $tri) {
812
+        $order = $fct = '';
813
+        // tris specifiés dynamiquement {par #ENV{tri}}
814
+        if ($tri[0]->type != 'texte') {
815
+            // calculer le order dynamique qui verifie les champs
816
+            $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
817
+            // ajouter 'hasard' comme possibilité de tri dynamique
818
+            calculer_critere_par_hasard($idb, $boucles, $crit);
819
+        }
820
+        // tris textuels {par titre}
821
+        else {
822
+            $par = array_shift($tri);
823
+            $par = $par->texte;
824
+
825
+            // tris de la forme {par expression champ} tel que {par num titre} ou {par multi titre}
826
+            if (preg_match(',^(\w+)[\s]+(.*)$,', (string) $par, $m)) {
827
+                $expression = trim($m[1]);
828
+                $champ = trim($m[2]);
829
+                if (function_exists($f = 'calculer_critere_par_expression_' . $expression)) {
830
+                    $order = $f($idb, $boucles, $crit, $tri, $champ);
831
+                } else {
832
+                    return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
833
+                }
834
+
835
+            // tris de la forme {par champ} ou {par FONCTION(champ)}
836
+            } elseif ($boucle->type_requete == 'DATA' || preg_match(',^' . CHAMP_SQL_PLUS_FONC . '$,is', (string) $par, $match)) {
837
+                // {par FONCTION(champ)}
838
+                if (isset($match) && count($match) > 2) {
839
+                    $par = substr($match[2], 1, -1);
840
+                    $fct = $match[1];
841
+                }
842
+                // quelques cas spécifiques {par hasard}, {par date}
843
+                if ($par == 'hasard') {
844
+                    $order = calculer_critere_par_hasard($idb, $boucles, $crit);
845
+                } elseif ($par == 'date' && !empty($boucle->show['date'])) {
846
+                    $order = "'" . $boucle->id_table . '.' . $boucle->show['date'] . "'";
847
+                } else {
848
+                    // cas général {par champ}, {par table.champ}, ...
849
+                    $order = calculer_critere_par_champ($idb, $boucles, $crit, $par);
850
+                }
851
+            }
852
+
853
+            // on ne sait pas traiter…
854
+            else {
855
+                return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
856
+            }
857
+
858
+            // En cas d'erreur de squelette retournée par une fonction
859
+            if (is_array($order)) {
860
+                return $order;
861
+            }
862
+        }
863
+
864
+        if (preg_match('/^\'([^"]*)\'$/', (string) $order, $m)) {
865
+            $t = $m[1];
866
+            if (strpos($t, '.') && !in_array($t, $boucle->select)) {
867
+                $boucle->select[] = $t;
868
+            }
869
+        } else {
870
+            $sens = '';
871
+        }
872
+
873
+        if ($fct) {
874
+            $order = preg_match("/^\s*'(.*)'\s*$/", (string) $order, $r)
875
+                ? "'$fct(" . $r[1] . ")'"
876
+                : "'$fct(' . $order . ')'";
877
+        }
878
+        $t = $order . $collecte . $sens;
879
+        if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
880
+            $t = $r[1] . $r[2];
881
+        }
882
+
883
+        $boucle->order[] = $t;
884
+    }
885 885
 }
886 886
 
887 887
 /**
@@ -895,13 +895,13 @@  discard block
 block discarded – undo
895 895
  * @return string Clause pour le Order by
896 896
  */
897 897
 function calculer_critere_par_hasard($idb, &$boucles, $crit) {
898
-	$boucle = &$boucles[$idb];
899
-	// Si ce n'est fait, ajouter un champ 'hasard' dans le select
900
-	$parha = 'rand() AS hasard';
901
-	if (!in_array($parha, $boucle->select)) {
902
-		$boucle->select[] = $parha;
903
-	}
904
-	return "'hasard'";
898
+    $boucle = &$boucles[$idb];
899
+    // Si ce n'est fait, ajouter un champ 'hasard' dans le select
900
+    $parha = 'rand() AS hasard';
901
+    if (!in_array($parha, $boucle->select)) {
902
+        $boucle->select[] = $parha;
903
+    }
904
+    return "'hasard'";
905 905
 }
906 906
 
907 907
 /**
@@ -925,22 +925,22 @@  discard block
 block discarded – undo
925 925
  * @return string|array Clause pour le Order by (array si erreur)
926 926
  */
927 927
 function calculer_critere_par_expression_num($idb, &$boucles, $crit, $tri, $champ) {
928
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
929
-	if (is_array($_champ)) {
930
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
931
-	}
932
-	$boucle = &$boucles[$idb];
933
-	$texte = '0+' . $_champ;
934
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
935
-	if ($suite !== "''") {
936
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
937
-	}
938
-	$asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
939
-	$boucle->select[] = $texte . " AS $asnum";
940
-
941
-	$orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
942
-	$orderassinum = trim($orderassinum, "'");
943
-	return "'$orderassinum, $asnum'";
928
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
929
+    if (is_array($_champ)) {
930
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " num $champ"]];
931
+    }
932
+    $boucle = &$boucles[$idb];
933
+    $texte = '0+' . $_champ;
934
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
935
+    if ($suite !== "''") {
936
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
937
+    }
938
+    $asnum = 'num' . ($boucle->order ? count($boucle->order) : '');
939
+    $boucle->select[] = $texte . " AS $asnum";
940
+
941
+    $orderassinum = calculer_critere_par_expression_sinum($idb, $boucles, $crit, $tri, $champ);
942
+    $orderassinum = trim($orderassinum, "'");
943
+    return "'$orderassinum, $asnum'";
944 944
 }
945 945
 
946 946
 /**
@@ -961,34 +961,34 @@  discard block
 block discarded – undo
961 961
  * @return string|array Clause pour le Order by (array si erreur)
962 962
  */
963 963
 function calculer_critere_par_expression_sinum($idb, &$boucles, $crit, $tri, $champ) {
964
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
965
-	if (is_array($_champ)) {
966
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
967
-	}
968
-	$boucle = &$boucles[$idb];
969
-	$texte = '0+' . $_champ;
970
-	$suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
971
-	if ($suite !== "''") {
972
-		$texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
973
-	}
974
-
975
-	$as = false;
976
-	$select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
977
-	foreach ($boucle->select as $s) {
978
-		if (str_starts_with((string) $s, $select)) {
979
-			$as = trim(substr((string) $s, strlen($select)));
980
-			if (!preg_match(',\W,', $as)) {
981
-				break;
982
-			}
983
-			$as = false;
984
-		}
985
-	}
986
-
987
-	if (!$as) {
988
-		$as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
989
-		$boucle->select[] = $select . $as;
990
-	}
991
-	return "'$as'";
964
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
965
+    if (is_array($_champ)) {
966
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " sinum $champ"]];
967
+    }
968
+    $boucle = &$boucles[$idb];
969
+    $texte = '0+' . $_champ;
970
+    $suite = calculer_liste($tri, $idb, $boucles, $boucle->id_parent);
971
+    if ($suite !== "''") {
972
+        $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . ' . "';
973
+    }
974
+
975
+    $as = false;
976
+    $select = "CASE ( $texte ) WHEN 0 THEN 1 ELSE 0 END AS ";
977
+    foreach ($boucle->select as $s) {
978
+        if (str_starts_with((string) $s, $select)) {
979
+            $as = trim(substr((string) $s, strlen($select)));
980
+            if (!preg_match(',\W,', $as)) {
981
+                break;
982
+            }
983
+            $as = false;
984
+        }
985
+    }
986
+
987
+    if (!$as) {
988
+        $as = 'sinum' . ($boucle->order ? count($boucle->order) : '');
989
+        $boucle->select[] = $select . $as;
990
+    }
991
+    return "'$as'";
992 992
 }
993 993
 
994 994
 
@@ -1008,13 +1008,13 @@  discard block
 block discarded – undo
1008 1008
  * @return string|array Clause pour le Order by (array si erreur)
1009 1009
  */
1010 1010
 function calculer_critere_par_expression_multi($idb, &$boucles, $crit, $tri, $champ) {
1011
-	$_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
1012
-	if (is_array($_champ)) {
1013
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
1014
-	}
1015
-	$boucle = &$boucles[$idb];
1016
-	$boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
1017
-	return "'multi'";
1011
+    $_champ = calculer_critere_par_champ($idb, $boucles, $crit, $champ, true);
1012
+    if (is_array($_champ)) {
1013
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . " multi $champ"]];
1014
+    }
1015
+    $boucle = &$boucles[$idb];
1016
+    $boucle->select[] = "\".sql_multi('" . $_champ . "', \$GLOBALS['spip_lang']).\"";
1017
+    return "'multi'";
1018 1018
 }
1019 1019
 
1020 1020
 /**
@@ -1033,56 +1033,56 @@  discard block
 block discarded – undo
1033 1033
  * @return array|string
1034 1034
  */
1035 1035
 function calculer_critere_par_champ($idb, &$boucles, $crit, $par, $raw = false) {
1036
-	$boucle = &$boucles[$idb];
1037
-	$desc = $boucle->show;
1038
-
1039
-	// le champ existe dans la table, pas de souci (le plus commun)
1040
-	if (isset($desc['field'][$par])) {
1041
-		$par = $boucle->id_table . '.' . $par;
1042
-	}
1043
-	// le champ est peut être une jointure
1044
-	else {
1045
-		$table = $table_alias = false; // toutes les tables de jointure possibles
1046
-		$champ = $par;
1047
-
1048
-		// le champ demandé est une exception de jointure {par titre_mot}
1049
-		if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1050
-			[$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1051
-		} // la table de jointure est explicitement indiquée {par truc.muche}
1052
-		elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1053
-			[, $table, $champ] = $r;
1054
-			$table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1055
-			$table = table_objet_sql($table);
1056
-		}
1057
-
1058
-		// Si on connait la table d'arrivée, on la demande donc explicitement
1059
-		// Sinon on cherche le champ dans les tables possibles de jointures
1060
-		// Si la table est déjà dans le from, on la réutilise.
1061
-		if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1062
-			$par = $infos['alias'] . '.' . $champ;
1063
-		} elseif (
1064
-			$boucle->jointures_explicites
1065
-			&& ($alias = trouver_jointure_champ($champ, $boucle, explode(' ', (string) $boucle->jointures_explicites), false, $table))
1066
-		) {
1067
-			$par = $alias . '.' . $champ;
1068
-		} elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1069
-			$par = $alias . '.' . $champ;
1070
-		// en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1071
-		} elseif (
1072
-			$table_alias
1073
-			&& isset($boucle->from[$table_alias])
1074
-			&& ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]))
1075
-		) {
1076
-			$par = $infos['alias'] . '.' . $champ;
1077
-		} elseif ($table) {
1078
-			// On avait table + champ, mais on ne les a pas trouvés
1079
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1080
-		} else {
1081
-			// Sinon tant pis, ca doit etre un champ synthetise (cf points)
1082
-		}
1083
-	}
1084
-
1085
-	return $raw ? $par : "'$par'";
1036
+    $boucle = &$boucles[$idb];
1037
+    $desc = $boucle->show;
1038
+
1039
+    // le champ existe dans la table, pas de souci (le plus commun)
1040
+    if (isset($desc['field'][$par])) {
1041
+        $par = $boucle->id_table . '.' . $par;
1042
+    }
1043
+    // le champ est peut être une jointure
1044
+    else {
1045
+        $table = $table_alias = false; // toutes les tables de jointure possibles
1046
+        $champ = $par;
1047
+
1048
+        // le champ demandé est une exception de jointure {par titre_mot}
1049
+        if (isset($GLOBALS['exceptions_des_jointures'][$par])) {
1050
+            [$table, $champ] = $GLOBALS['exceptions_des_jointures'][$par];
1051
+        } // la table de jointure est explicitement indiquée {par truc.muche}
1052
+        elseif (preg_match('/^([^,]*)\.(.*)$/', $par, $r)) {
1053
+            [, $table, $champ] = $r;
1054
+            $table_alias = $table; // c'est peut-être un alias de table {par L1.titre}
1055
+            $table = table_objet_sql($table);
1056
+        }
1057
+
1058
+        // Si on connait la table d'arrivée, on la demande donc explicitement
1059
+        // Sinon on cherche le champ dans les tables possibles de jointures
1060
+        // Si la table est déjà dans le from, on la réutilise.
1061
+        if ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $table)) {
1062
+            $par = $infos['alias'] . '.' . $champ;
1063
+        } elseif (
1064
+            $boucle->jointures_explicites
1065
+            && ($alias = trouver_jointure_champ($champ, $boucle, explode(' ', (string) $boucle->jointures_explicites), false, $table))
1066
+        ) {
1067
+            $par = $alias . '.' . $champ;
1068
+        } elseif ($alias = trouver_jointure_champ($champ, $boucle, $boucle->jointures, false, $table)) {
1069
+            $par = $alias . '.' . $champ;
1070
+        // en spécifiant directement l'alias {par L2.titre} (situation hasardeuse tout de même)
1071
+        } elseif (
1072
+            $table_alias
1073
+            && isset($boucle->from[$table_alias])
1074
+            && ($infos = chercher_champ_dans_tables($champ, $boucle->from, $boucle->sql_serveur, $boucle->from[$table_alias]))
1075
+        ) {
1076
+            $par = $infos['alias'] . '.' . $champ;
1077
+        } elseif ($table) {
1078
+            // On avait table + champ, mais on ne les a pas trouvés
1079
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . " $par"]];
1080
+        } else {
1081
+            // Sinon tant pis, ca doit etre un champ synthetise (cf points)
1082
+        }
1083
+    }
1084
+
1085
+    return $raw ? $par : "'$par'";
1086 1086
 }
1087 1087
 
1088 1088
 /**
@@ -1107,33 +1107,33 @@  discard block
 block discarded – undo
1107 1107
  */
1108 1108
 function critere_inverse_dist($idb, &$boucles, $crit) {
1109 1109
 
1110
-	$boucle = &$boucles[$idb];
1111
-	// Classement par ordre inverse
1112
-	if ($crit->not) {
1113
-		critere_parinverse($idb, $boucles, $crit);
1114
-	} else {
1115
-		$order = "' DESC'";
1116
-		// Classement par ordre inverse fonction eventuelle de #ENV{...}
1117
-		if (isset($crit->param[0])) {
1118
-			$critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1119
-			$order = "(($critere)?' DESC':'')";
1120
-		}
1121
-
1122
-		$n = is_countable($boucle->order) ? count($boucle->order) : 0;
1123
-		if (!$n) {
1124
-			if (isset($boucle->default_order[0])) {
1125
-				$boucle->default_order[0] .= ' . " DESC"';
1126
-			} else {
1127
-				$boucle->default_order[] = ' DESC';
1128
-			}
1129
-		} else {
1130
-			$t = $boucle->order[$n - 1] . " . $order";
1131
-			if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1132
-				$t = $r[1] . $r[2];
1133
-			}
1134
-			$boucle->order[$n - 1] = $t;
1135
-		}
1136
-	}
1110
+    $boucle = &$boucles[$idb];
1111
+    // Classement par ordre inverse
1112
+    if ($crit->not) {
1113
+        critere_parinverse($idb, $boucles, $crit);
1114
+    } else {
1115
+        $order = "' DESC'";
1116
+        // Classement par ordre inverse fonction eventuelle de #ENV{...}
1117
+        if (isset($crit->param[0])) {
1118
+            $critere = calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent);
1119
+            $order = "(($critere)?' DESC':'')";
1120
+        }
1121
+
1122
+        $n = is_countable($boucle->order) ? count($boucle->order) : 0;
1123
+        if (!$n) {
1124
+            if (isset($boucle->default_order[0])) {
1125
+                $boucle->default_order[0] .= ' . " DESC"';
1126
+            } else {
1127
+                $boucle->default_order[] = ' DESC';
1128
+            }
1129
+        } else {
1130
+            $t = $boucle->order[$n - 1] . " . $order";
1131
+            if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) {
1132
+                $t = $r[1] . $r[2];
1133
+            }
1134
+            $boucle->order[$n - 1] = $t;
1135
+        }
1136
+    }
1137 1137
 }
1138 1138
 
1139 1139
 /**
@@ -1145,139 +1145,139 @@  discard block
 block discarded – undo
1145 1145
  * @return void|array
1146 1146
  */
1147 1147
 function critere_par_ordre_liste_dist($idb, &$boucles, $crit) {
1148
-	$boucle = &$boucles[$idb];
1148
+    $boucle = &$boucles[$idb];
1149 1149
 
1150
-	$sens = $collecte = '';
1151
-	if ($crit->not) {
1152
-		$sens = " . ' DESC'";
1153
-	}
1150
+    $sens = $collecte = '';
1151
+    if ($crit->not) {
1152
+        $sens = " . ' DESC'";
1153
+    }
1154 1154
 
1155
-	$crit2 = clone $crit;
1156
-	$crit2->not = false;
1157
-	$crit2->param = [reset($crit->param)];
1158
-	$res = critere_parinverse($idb, $boucles, $crit2);
1155
+    $crit2 = clone $crit;
1156
+    $crit2->not = false;
1157
+    $crit2->param = [reset($crit->param)];
1158
+    $res = critere_parinverse($idb, $boucles, $crit2);
1159 1159
 
1160
-	// erreur ?
1161
-	if (is_array($res)) {
1162
-		return $res;
1163
-	}
1160
+    // erreur ?
1161
+    if (is_array($res)) {
1162
+        return $res;
1163
+    }
1164 1164
 
1165
-	$_order = array_pop($boucle->order);
1165
+    $_order = array_pop($boucle->order);
1166 1166
 
1167
-	$_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1167
+    $_liste = calculer_liste($crit->param[1], [], $boucles, $boucles[$idb]->id_parent);
1168 1168
 
1169
-	$order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1170
-	$boucle->order[] = $order;
1169
+    $order = "'-FIELD(' . $_order . ',' . ((\$zl=formate_liste_critere_par_ordre_liste(array_reverse($_liste),'" . $boucle->sql_serveur . "')) ? \$zl : '0').')'$sens";
1170
+    $boucle->order[] = $order;
1171 1171
 }
1172 1172
 
1173 1173
 
1174 1174
 function critere_agenda_dist($idb, &$boucles, $crit) {
1175
-	$params = $crit->param;
1176
-
1177
-	if ((is_countable($params) ? count($params) : 0) < 1) {
1178
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1179
-	}
1180
-
1181
-	$boucle = &$boucles[$idb];
1182
-	$parent = $boucle->id_parent;
1183
-	$fields = $boucle->show['field'];
1184
-
1185
-	$date = array_shift($params);
1186
-	$type = array_shift($params);
1187
-
1188
-	// la valeur $type doit etre connue a la compilation
1189
-	// donc etre forcement reduite a un litteral unique dans le source
1190
-	$type = is_object($type[0]) ? $type[0]->texte : null;
1191
-
1192
-	// La valeur date doit designer un champ de la table SQL.
1193
-	// Si c'est un litteral unique dans le source, verifier a la compil,
1194
-	// sinon synthetiser le test de verif pour execution ulterieure
1195
-	// On prendra arbitrairement le premier champ si test negatif.
1196
-	if ((is_countable($date) ? count($date) : 0) == 1 && $date[0]->type == 'texte') {
1197
-		$date = $date[0]->texte;
1198
-		if (!isset($fields[$date])) {
1199
-			return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1200
-		}
1201
-	} else {
1202
-		$a = calculer_liste($date, $idb, $boucles, $parent);
1203
-		$noms = array_keys($fields);
1204
-		$defaut = $noms[0];
1205
-		$noms = implode(' ', $noms);
1206
-		# bien laisser 2 espaces avant $nom pour que strpos<>0
1207
-		$cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1208
-		$date = "'.(($cond)\n?\$a:\"$defaut\").'";
1209
-	}
1210
-	$annee = $params ? array_shift($params) : '';
1211
-	$annee = "\n" . 'sprintf("%04d", ($x = ' .
1212
-		calculer_liste($annee, $idb, $boucles, $parent) .
1213
-		') ? $x : date("Y"))';
1214
-
1215
-	$mois = $params ? array_shift($params) : '';
1216
-	$mois = "\n" . 'sprintf("%02d", ($x = ' .
1217
-		calculer_liste($mois, $idb, $boucles, $parent) .
1218
-		') ? $x : date("m"))';
1219
-
1220
-	$jour = $params ? array_shift($params) : '';
1221
-	$jour = "\n" . 'sprintf("%02d", ($x = ' .
1222
-		calculer_liste($jour, $idb, $boucles, $parent) .
1223
-		') ? $x : date("d"))';
1224
-
1225
-	$annee2 = $params ? array_shift($params) : '';
1226
-	$annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1227
-		calculer_liste($annee2, $idb, $boucles, $parent) .
1228
-		') ? $x : date("Y"))';
1229
-
1230
-	$mois2 = $params ? array_shift($params) : '';
1231
-	$mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1232
-		calculer_liste($mois2, $idb, $boucles, $parent) .
1233
-		') ? $x : date("m"))';
1234
-
1235
-	$jour2 = $params ? array_shift($params) : '';
1236
-	$jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1237
-		calculer_liste($jour2, $idb, $boucles, $parent) .
1238
-		') ? $x : date("d"))';
1239
-
1240
-	$date = $boucle->id_table . ".$date";
1241
-
1242
-	$quote_end = ",'" . $boucle->sql_serveur . "','text'";
1243
-	if ($type == 'jour') {
1244
-		$boucle->where[] = [
1245
-			"'='",
1246
-			"'DATE_FORMAT($date, \'%Y%m%d\')'",
1247
-			("sql_quote($annee . $mois . $jour$quote_end)")
1248
-		];
1249
-	} elseif ($type == 'mois') {
1250
-		$boucle->where[] = [
1251
-			"'='",
1252
-			"'DATE_FORMAT($date, \'%Y%m\')'",
1253
-			("sql_quote($annee . $mois$quote_end)")
1254
-		];
1255
-	} elseif ($type == 'semaine') {
1256
-		$boucle->where[] = [
1257
-			"'AND'",
1258
-			[
1259
-				"'>='",
1260
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1261
-				("date_debut_semaine($annee, $mois, $jour)")
1262
-			],
1263
-			[
1264
-				"'<='",
1265
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1266
-				("date_fin_semaine($annee, $mois, $jour)")
1267
-			]
1268
-		];
1269
-	} elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1270
-		$boucle->where[] = [
1271
-			"'AND'",
1272
-			[
1273
-				"'>='",
1274
-				"'DATE_FORMAT($date, \'%Y%m%d\')'",
1275
-				("sql_quote($annee . $mois . $jour$quote_end)")
1276
-			],
1277
-			["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1278
-		];
1279
-	}
1280
-	// sinon on prend tout
1175
+    $params = $crit->param;
1176
+
1177
+    if ((is_countable($params) ? count($params) : 0) < 1) {
1178
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1179
+    }
1180
+
1181
+    $boucle = &$boucles[$idb];
1182
+    $parent = $boucle->id_parent;
1183
+    $fields = $boucle->show['field'];
1184
+
1185
+    $date = array_shift($params);
1186
+    $type = array_shift($params);
1187
+
1188
+    // la valeur $type doit etre connue a la compilation
1189
+    // donc etre forcement reduite a un litteral unique dans le source
1190
+    $type = is_object($type[0]) ? $type[0]->texte : null;
1191
+
1192
+    // La valeur date doit designer un champ de la table SQL.
1193
+    // Si c'est un litteral unique dans le source, verifier a la compil,
1194
+    // sinon synthetiser le test de verif pour execution ulterieure
1195
+    // On prendra arbitrairement le premier champ si test negatif.
1196
+    if ((is_countable($date) ? count($date) : 0) == 1 && $date[0]->type == 'texte') {
1197
+        $date = $date[0]->texte;
1198
+        if (!isset($fields[$date])) {
1199
+            return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ' . $date]];
1200
+        }
1201
+    } else {
1202
+        $a = calculer_liste($date, $idb, $boucles, $parent);
1203
+        $noms = array_keys($fields);
1204
+        $defaut = $noms[0];
1205
+        $noms = implode(' ', $noms);
1206
+        # bien laisser 2 espaces avant $nom pour que strpos<>0
1207
+        $cond = "(\$a=strval($a))AND\nstrpos(\"  $noms \",\" \$a \")";
1208
+        $date = "'.(($cond)\n?\$a:\"$defaut\").'";
1209
+    }
1210
+    $annee = $params ? array_shift($params) : '';
1211
+    $annee = "\n" . 'sprintf("%04d", ($x = ' .
1212
+        calculer_liste($annee, $idb, $boucles, $parent) .
1213
+        ') ? $x : date("Y"))';
1214
+
1215
+    $mois = $params ? array_shift($params) : '';
1216
+    $mois = "\n" . 'sprintf("%02d", ($x = ' .
1217
+        calculer_liste($mois, $idb, $boucles, $parent) .
1218
+        ') ? $x : date("m"))';
1219
+
1220
+    $jour = $params ? array_shift($params) : '';
1221
+    $jour = "\n" . 'sprintf("%02d", ($x = ' .
1222
+        calculer_liste($jour, $idb, $boucles, $parent) .
1223
+        ') ? $x : date("d"))';
1224
+
1225
+    $annee2 = $params ? array_shift($params) : '';
1226
+    $annee2 = "\n" . 'sprintf("%04d", ($x = ' .
1227
+        calculer_liste($annee2, $idb, $boucles, $parent) .
1228
+        ') ? $x : date("Y"))';
1229
+
1230
+    $mois2 = $params ? array_shift($params) : '';
1231
+    $mois2 = "\n" . 'sprintf("%02d", ($x = ' .
1232
+        calculer_liste($mois2, $idb, $boucles, $parent) .
1233
+        ') ? $x : date("m"))';
1234
+
1235
+    $jour2 = $params ? array_shift($params) : '';
1236
+    $jour2 = "\n" . 'sprintf("%02d", ($x = ' .
1237
+        calculer_liste($jour2, $idb, $boucles, $parent) .
1238
+        ') ? $x : date("d"))';
1239
+
1240
+    $date = $boucle->id_table . ".$date";
1241
+
1242
+    $quote_end = ",'" . $boucle->sql_serveur . "','text'";
1243
+    if ($type == 'jour') {
1244
+        $boucle->where[] = [
1245
+            "'='",
1246
+            "'DATE_FORMAT($date, \'%Y%m%d\')'",
1247
+            ("sql_quote($annee . $mois . $jour$quote_end)")
1248
+        ];
1249
+    } elseif ($type == 'mois') {
1250
+        $boucle->where[] = [
1251
+            "'='",
1252
+            "'DATE_FORMAT($date, \'%Y%m\')'",
1253
+            ("sql_quote($annee . $mois$quote_end)")
1254
+        ];
1255
+    } elseif ($type == 'semaine') {
1256
+        $boucle->where[] = [
1257
+            "'AND'",
1258
+            [
1259
+                "'>='",
1260
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1261
+                ("date_debut_semaine($annee, $mois, $jour)")
1262
+            ],
1263
+            [
1264
+                "'<='",
1265
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1266
+                ("date_fin_semaine($annee, $mois, $jour)")
1267
+            ]
1268
+        ];
1269
+    } elseif ((is_countable($crit->param) ? count($crit->param) : 0) > 2) {
1270
+        $boucle->where[] = [
1271
+            "'AND'",
1272
+            [
1273
+                "'>='",
1274
+                "'DATE_FORMAT($date, \'%Y%m%d\')'",
1275
+                ("sql_quote($annee . $mois . $jour$quote_end)")
1276
+            ],
1277
+            ["'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")]
1278
+        ];
1279
+    }
1280
+    // sinon on prend tout
1281 1281
 }
1282 1282
 
1283 1283
 
@@ -1302,33 +1302,33 @@  discard block
 block discarded – undo
1302 1302
  * @return void
1303 1303
  **/
1304 1304
 function calculer_critere_parties($idb, &$boucles, $crit) {
1305
-	$boucle = &$boucles[$idb];
1306
-	$a1 = $crit->param[0];
1307
-	$a2 = $crit->param[1];
1308
-	$op = $crit->op;
1309
-
1310
-	[$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1311
-	[$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1312
-
1313
-	if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1314
-		$boucle->limit = $a11 . ',' . $a21;
1315
-	} else {
1316
-		// 3 dans {1/3}, {2,3} ou {1,n-3}
1317
-		$boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1318
-		// 2 dans {2/3}, {2,5}, {n-2,1}
1319
-		$partie = ($a11 != 'n') ? $a11 : $a12;
1320
-		$mode = (($op == '/') ? '/' :
1321
-			(($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1322
-		// cas simple {0,#ENV{truc}} compilons le en LIMIT :
1323
-		if ($a11 !== 'n' && $a21 !== 'n' && $mode == '++' && $op == ',') {
1324
-			$boucle->limit =
1325
-				(is_numeric($a11) ? "'$a11'" : $a11)
1326
-				. ".','."
1327
-				. (is_numeric($a21) ? "'$a21'" : $a21);
1328
-		} else {
1329
-			calculer_parties($boucles, $idb, $partie, $mode);
1330
-		}
1331
-	}
1305
+    $boucle = &$boucles[$idb];
1306
+    $a1 = $crit->param[0];
1307
+    $a2 = $crit->param[1];
1308
+    $op = $crit->op;
1309
+
1310
+    [$a11, $a12] = calculer_critere_parties_aux($idb, $boucles, $a1);
1311
+    [$a21, $a22] = calculer_critere_parties_aux($idb, $boucles, $a2);
1312
+
1313
+    if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) {
1314
+        $boucle->limit = $a11 . ',' . $a21;
1315
+    } else {
1316
+        // 3 dans {1/3}, {2,3} ou {1,n-3}
1317
+        $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22;
1318
+        // 2 dans {2/3}, {2,5}, {n-2,1}
1319
+        $partie = ($a11 != 'n') ? $a11 : $a12;
1320
+        $mode = (($op == '/') ? '/' :
1321
+            (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+'));
1322
+        // cas simple {0,#ENV{truc}} compilons le en LIMIT :
1323
+        if ($a11 !== 'n' && $a21 !== 'n' && $mode == '++' && $op == ',') {
1324
+            $boucle->limit =
1325
+                (is_numeric($a11) ? "'$a11'" : $a11)
1326
+                . ".','."
1327
+                . (is_numeric($a21) ? "'$a21'" : $a21);
1328
+        } else {
1329
+            calculer_parties($boucles, $idb, $partie, $mode);
1330
+        }
1331
+    }
1332 1332
 }
1333 1333
 
1334 1334
 /**
@@ -1356,63 +1356,63 @@  discard block
 block discarded – undo
1356 1356
  * @return void
1357 1357
  **/
1358 1358
 function calculer_parties(&$boucles, $id_boucle, $debut, $mode) {
1359
-	$total_parties = $boucles[$id_boucle]->total_parties;
1360
-
1361
-	preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1362
-	[, $op1, $op2] = array_pad($regs, 3, null);
1363
-	$nombre_boucle = "\$Numrows['$id_boucle']['total']";
1364
-	// {1/3}
1365
-	if ($op1 == '/') {
1366
-		$pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1367
-		$totpos = is_numeric($total_parties) ? ($total_parties) :
1368
-			"($total_parties ? $total_parties : 1)";
1369
-		$fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1370
-		$debut = $pmoins1 ? "ceil(($nombre_boucle * $pmoins1)/$totpos);" : 0;
1371
-	} else {
1372
-		// cas {n-1,x}
1373
-		if ($op1 == '-') {
1374
-			$debut = "$nombre_boucle - $debut;";
1375
-		}
1376
-
1377
-		// cas {x,n-1}
1378
-		if ($op2 == '-') {
1379
-			$fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1380
-				. (is_numeric($total_parties) ? ($total_parties + 1) :
1381
-					($total_parties . ' - 1'));
1382
-		} else {
1383
-			// {x,1} ou {pagination}
1384
-			$fin = '$debut_boucle'
1385
-				. (is_numeric($total_parties) ?
1386
-					(($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1387
-					('+' . $total_parties . ' - 1'));
1388
-		}
1389
-
1390
-		// {pagination}, gerer le debut_xx=-1 pour tout voir
1391
-		if ($op1 == 'p') {
1392
-			$debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1393
-			$debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1394
-			$fin = "(\$tout ? $nombre_boucle : $fin)";
1395
-		}
1396
-	}
1397
-
1398
-	// Notes :
1399
-	// $debut_boucle et $fin_boucle sont les indices SQL du premier
1400
-	// et du dernier demandes dans la boucle : 0 pour le premier,
1401
-	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1402
-	// Utiliser min pour rabattre $fin_boucle sur total_boucle.
1403
-
1404
-	$boucles[$id_boucle]->mode_partie = "\n\t"
1405
-		. '$debut_boucle = ' . $debut . ";\n	"
1406
-		. "\$debut_boucle = intval(\$debut_boucle);\n	"
1407
-		. '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1408
-		. '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1409
-		. '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1410
-		. "\n\tif (\$debut_boucle>0"
1411
-		. " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1412
-		. " AND \$iter->seek(\$debut_boucle,'continue'))"
1413
-		. "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1414
-
1415
-	$boucles[$id_boucle]->partie = "
1359
+    $total_parties = $boucles[$id_boucle]->total_parties;
1360
+
1361
+    preg_match(',([+-/p])([+-/])?,', $mode, $regs);
1362
+    [, $op1, $op2] = array_pad($regs, 3, null);
1363
+    $nombre_boucle = "\$Numrows['$id_boucle']['total']";
1364
+    // {1/3}
1365
+    if ($op1 == '/') {
1366
+        $pmoins1 = is_numeric($debut) ? ($debut - 1) : "($debut-1)";
1367
+        $totpos = is_numeric($total_parties) ? ($total_parties) :
1368
+            "($total_parties ? $total_parties : 1)";
1369
+        $fin = "ceil(($nombre_boucle * $debut )/$totpos) - 1";
1370
+        $debut = $pmoins1 ? "ceil(($nombre_boucle * $pmoins1)/$totpos);" : 0;
1371
+    } else {
1372
+        // cas {n-1,x}
1373
+        if ($op1 == '-') {
1374
+            $debut = "$nombre_boucle - $debut;";
1375
+        }
1376
+
1377
+        // cas {x,n-1}
1378
+        if ($op2 == '-') {
1379
+            $fin = '$debut_boucle + ' . $nombre_boucle . ' - '
1380
+                . (is_numeric($total_parties) ? ($total_parties + 1) :
1381
+                    ($total_parties . ' - 1'));
1382
+        } else {
1383
+            // {x,1} ou {pagination}
1384
+            $fin = '$debut_boucle'
1385
+                . (is_numeric($total_parties) ?
1386
+                    (($total_parties == 1) ? '' : (' + ' . ($total_parties - 1))) :
1387
+                    ('+' . $total_parties . ' - 1'));
1388
+        }
1389
+
1390
+        // {pagination}, gerer le debut_xx=-1 pour tout voir
1391
+        if ($op1 == 'p') {
1392
+            $debut .= ";\n	\$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))";
1393
+            $debut .= ";\n	\$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))";
1394
+            $fin = "(\$tout ? $nombre_boucle : $fin)";
1395
+        }
1396
+    }
1397
+
1398
+    // Notes :
1399
+    // $debut_boucle et $fin_boucle sont les indices SQL du premier
1400
+    // et du dernier demandes dans la boucle : 0 pour le premier,
1401
+    // n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
1402
+    // Utiliser min pour rabattre $fin_boucle sur total_boucle.
1403
+
1404
+    $boucles[$id_boucle]->mode_partie = "\n\t"
1405
+        . '$debut_boucle = ' . $debut . ";\n	"
1406
+        . "\$debut_boucle = intval(\$debut_boucle);\n	"
1407
+        . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n	"
1408
+        . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n	"
1409
+        . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);'
1410
+        . "\n\tif (\$debut_boucle>0"
1411
+        . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']"
1412
+        . " AND \$iter->seek(\$debut_boucle,'continue'))"
1413
+        . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t";
1414
+
1415
+    $boucles[$id_boucle]->partie = "
1416 1416
 		if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue;
1417 1417
 		if (\$Numrows['$id_boucle']['compteur_boucle']-1 > \$fin_boucle) break;";
1418 1418
 }
@@ -1429,26 +1429,26 @@  discard block
 block discarded – undo
1429 1429
  * @return array          Valeur de l'élément (peut être une expression PHP), Nombre soustrait
1430 1430
  **/
1431 1431
 function calculer_critere_parties_aux($idb, &$boucles, $param) {
1432
-	if ($param[0]->type != 'texte') {
1433
-		$a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1434
-		if (isset($param[1]->texte)) {
1435
-			preg_match(',^\s*(-(\d+))?\s*$,', (string) $param[1]->texte, $m);
1436
-
1437
-			return ["intval($a1)", ((isset($m[2]) && $m[2]) ? $m[2] : 0)];
1438
-		} else {
1439
-			return ["intval($a1)", 0];
1440
-		}
1441
-	} else {
1442
-		preg_match(',^\s*((\d+)|n)\s*(-\s*(\d+)?\s*)?$,', (string) $param[0]->texte, $m);
1443
-		$a1 = $m[1];
1444
-		if (empty($m[3])) {
1445
-			return [$a1, 0];
1446
-		} elseif (!empty($m[4])) {
1447
-			return [$a1, $m[4]];
1448
-		} else {
1449
-			return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1450
-		}
1451
-	}
1432
+    if ($param[0]->type != 'texte') {
1433
+        $a1 = calculer_liste([$param[0]], $idb, $boucles, $boucles[$idb]->id_parent);
1434
+        if (isset($param[1]->texte)) {
1435
+            preg_match(',^\s*(-(\d+))?\s*$,', (string) $param[1]->texte, $m);
1436
+
1437
+            return ["intval($a1)", ((isset($m[2]) && $m[2]) ? $m[2] : 0)];
1438
+        } else {
1439
+            return ["intval($a1)", 0];
1440
+        }
1441
+    } else {
1442
+        preg_match(',^\s*((\d+)|n)\s*(-\s*(\d+)?\s*)?$,', (string) $param[0]->texte, $m);
1443
+        $a1 = $m[1];
1444
+        if (empty($m[3])) {
1445
+            return [$a1, 0];
1446
+        } elseif (!empty($m[4])) {
1447
+            return [$a1, $m[4]];
1448
+        } else {
1449
+            return [$a1, calculer_liste([$param[1]], $idb, $boucles, $boucles[$idb]->id_parent)];
1450
+        }
1451
+    }
1452 1452
 }
1453 1453
 
1454 1454
 
@@ -1475,46 +1475,46 @@  discard block
 block discarded – undo
1475 1475
  *     array : Erreur sur un des critères
1476 1476
  **/
1477 1477
 function calculer_criteres($idb, &$boucles) {
1478
-	$msg = '';
1479
-	$boucle = $boucles[$idb];
1480
-	$table = strtoupper((string) $boucle->type_requete);
1481
-	$serveur = strtolower((string) $boucle->sql_serveur);
1482
-
1483
-	$defaut = charger_fonction('DEFAUT', 'calculer_critere');
1484
-	// s'il y avait une erreur de syntaxe, propager cette info
1485
-	if (!is_array($boucle->criteres)) {
1486
-		return [];
1487
-	}
1488
-
1489
-	foreach ($boucle->criteres as $crit) {
1490
-		$critere = $crit->op;
1491
-		// critere personnalise ?
1492
-		if (
1493
-			(!$serveur
1494
-				|| !function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)
1495
-				&& !function_exists($f .= '_dist')
1496
-				&& !function_exists($f = 'critere_' . $serveur . '_' . $critere)
1497
-				&& !function_exists($f .= '_dist')
1498
-			)
1499
-			&& !function_exists($f = 'critere_' . $table . '_' . $critere)
1500
-			&& !function_exists($f .= '_dist')
1501
-			&& !function_exists($f = 'critere_' . $critere)
1502
-			&& !function_exists($f .= '_dist')
1503
-		) {
1504
-			// fonction critere standard
1505
-			$f = $defaut;
1506
-		}
1507
-		// compile le critere
1508
-		$res = $f($idb, $boucles, $crit);
1509
-
1510
-		// Gestion centralisee des erreurs pour pouvoir propager
1511
-		if (is_array($res)) {
1512
-			$msg = $res;
1513
-			erreur_squelette($msg, $boucle);
1514
-		}
1515
-	}
1516
-
1517
-	return $msg;
1478
+    $msg = '';
1479
+    $boucle = $boucles[$idb];
1480
+    $table = strtoupper((string) $boucle->type_requete);
1481
+    $serveur = strtolower((string) $boucle->sql_serveur);
1482
+
1483
+    $defaut = charger_fonction('DEFAUT', 'calculer_critere');
1484
+    // s'il y avait une erreur de syntaxe, propager cette info
1485
+    if (!is_array($boucle->criteres)) {
1486
+        return [];
1487
+    }
1488
+
1489
+    foreach ($boucle->criteres as $crit) {
1490
+        $critere = $crit->op;
1491
+        // critere personnalise ?
1492
+        if (
1493
+            (!$serveur
1494
+                || !function_exists($f = 'critere_' . $serveur . '_' . $table . '_' . $critere)
1495
+                && !function_exists($f .= '_dist')
1496
+                && !function_exists($f = 'critere_' . $serveur . '_' . $critere)
1497
+                && !function_exists($f .= '_dist')
1498
+            )
1499
+            && !function_exists($f = 'critere_' . $table . '_' . $critere)
1500
+            && !function_exists($f .= '_dist')
1501
+            && !function_exists($f = 'critere_' . $critere)
1502
+            && !function_exists($f .= '_dist')
1503
+        ) {
1504
+            // fonction critere standard
1505
+            $f = $defaut;
1506
+        }
1507
+        // compile le critere
1508
+        $res = $f($idb, $boucles, $crit);
1509
+
1510
+        // Gestion centralisee des erreurs pour pouvoir propager
1511
+        if (is_array($res)) {
1512
+            $msg = $res;
1513
+            erreur_squelette($msg, $boucle);
1514
+        }
1515
+    }
1516
+
1517
+    return $msg;
1518 1518
 }
1519 1519
 
1520 1520
 /**
@@ -1529,11 +1529,11 @@  discard block
 block discarded – undo
1529 1529
  * @return string         Code compilé rééchappé
1530 1530
  */
1531 1531
 function kwote($lisp, $serveur = '', $type = '') {
1532
-	if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1533
-		return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1534
-	} else {
1535
-		return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1536
-	}
1532
+    if (preg_match(_CODE_QUOTE, $lisp, $r)) {
1533
+        return $r[1] . '"' . sql_quote(str_replace(["\\'", '\\\\'], ["'", '\\'], $r[2]), $serveur, $type) . '"';
1534
+    } else {
1535
+        return "sql_quote($lisp, '$serveur', '" . str_replace("'", "\\'", $type) . "')";
1536
+    }
1537 1537
 }
1538 1538
 
1539 1539
 
@@ -1552,81 +1552,81 @@  discard block
 block discarded – undo
1552 1552
  * @return void|array
1553 1553
  **/
1554 1554
 function critere_IN_dist($idb, &$boucles, $crit) {
1555
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1556
-	if (!$r) {
1557
-		return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1558
-	}
1559
-	[$arg, $op, $val, $col, $where_complement] = $r;
1560
-
1561
-	$in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1562
-
1563
-	//	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1564
-	$where = $in;
1565
-	if ($crit->cond) {
1566
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1567
-		$where = ["'?'", $pred, $where, "''"];
1568
-		if ($where_complement) { // condition annexe du type "AND (objet='article')"
1569
-		$where_complement = ["'?'", $pred, $where_complement, "''"];
1570
-		}
1571
-	}
1572
-	if ($crit->exclus) {
1573
-		if (!preg_match(',^L\d+[.],', (string) $arg)) {
1574
-			$where = ["'NOT'", $where];
1575
-		} else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1576
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1577
-		{
1578
-			$where = [
1579
-				"'NOT'",
1580
-				[
1581
-					"'IN'",
1582
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1583
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1584
-				]
1585
-			];
1586
-		}
1587
-	}
1588
-
1589
-	$boucles[$idb]->where[] = $where;
1590
-	if ($where_complement) { // condition annexe du type "AND (objet='article')"
1591
-	$boucles[$idb]->where[] = $where_complement;
1592
-	}
1555
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1556
+    if (!$r) {
1557
+        return ['zbug_critere_inconnu', ['critere' => $crit->op . ' ?']];
1558
+    }
1559
+    [$arg, $op, $val, $col, $where_complement] = $r;
1560
+
1561
+    $in = critere_IN_cas($idb, $boucles, $crit->not ? 'NOT' : ($crit->exclus ? 'exclus' : ''), $arg, $op, $val, $col);
1562
+
1563
+    //	inserer la condition; exemple: {id_mot ?IN (66, 62, 64)}
1564
+    $where = $in;
1565
+    if ($crit->cond) {
1566
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1567
+        $where = ["'?'", $pred, $where, "''"];
1568
+        if ($where_complement) { // condition annexe du type "AND (objet='article')"
1569
+        $where_complement = ["'?'", $pred, $where_complement, "''"];
1570
+        }
1571
+    }
1572
+    if ($crit->exclus) {
1573
+        if (!preg_match(',^L\d+[.],', (string) $arg)) {
1574
+            $where = ["'NOT'", $where];
1575
+        } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1576
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1577
+        {
1578
+            $where = [
1579
+                "'NOT'",
1580
+                [
1581
+                    "'IN'",
1582
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1583
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1584
+                ]
1585
+            ];
1586
+        }
1587
+    }
1588
+
1589
+    $boucles[$idb]->where[] = $where;
1590
+    if ($where_complement) { // condition annexe du type "AND (objet='article')"
1591
+    $boucles[$idb]->where[] = $where_complement;
1592
+    }
1593 1593
 }
1594 1594
 
1595 1595
 function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) {
1596
-	static $num = [];
1597
-	$descr = $boucles[$idb]->descr;
1598
-	$cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1599
-
1600
-	$var = '$in' . $cpt++;
1601
-	$x = "\n\t$var = array();";
1602
-	foreach ($val as $k => $v) {
1603
-		if (preg_match(",^(\n//.*\n)?'(.*)'$,", (string) $v, $r)) {
1604
-			// optimiser le traitement des constantes
1605
-			if (is_numeric($r[2])) {
1606
-				$x .= "\n\t$var" . "[]= $r[2];";
1607
-			} else {
1608
-				$x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1609
-			}
1610
-		} else {
1611
-			// Pour permettre de passer des tableaux de valeurs
1612
-			// on repere l'utilisation brute de #ENV**{X},
1613
-			// c'est-a-dire sa  traduction en ($PILE[0][X]).
1614
-			// et on deballe mais en rajoutant l'anti XSS
1615
-			$x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1616
-		}
1617
-	}
1618
-
1619
-	$boucles[$idb]->in .= $x;
1620
-
1621
-	// inserer le tri par defaut selon les ordres du IN ...
1622
-	// avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1623
-	// et que l'on limite donc strictement aux cas necessaires :
1624
-	// si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1625
-	if (!$crit2) {
1626
-		$boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1627
-	}
1628
-
1629
-	return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1596
+    static $num = [];
1597
+    $descr = $boucles[$idb]->descr;
1598
+    $cpt = &$num[$descr['nom']][$descr['gram']][$idb];
1599
+
1600
+    $var = '$in' . $cpt++;
1601
+    $x = "\n\t$var = array();";
1602
+    foreach ($val as $k => $v) {
1603
+        if (preg_match(",^(\n//.*\n)?'(.*)'$,", (string) $v, $r)) {
1604
+            // optimiser le traitement des constantes
1605
+            if (is_numeric($r[2])) {
1606
+                $x .= "\n\t$var" . "[]= $r[2];";
1607
+            } else {
1608
+                $x .= "\n\t$var" . '[]= ' . sql_quote($r[2]) . ';';
1609
+            }
1610
+        } else {
1611
+            // Pour permettre de passer des tableaux de valeurs
1612
+            // on repere l'utilisation brute de #ENV**{X},
1613
+            // c'est-a-dire sa  traduction en ($PILE[0][X]).
1614
+            // et on deballe mais en rajoutant l'anti XSS
1615
+            $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);";
1616
+        }
1617
+    }
1618
+
1619
+    $boucles[$idb]->in .= $x;
1620
+
1621
+    // inserer le tri par defaut selon les ordres du IN ...
1622
+    // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp)
1623
+    // et que l'on limite donc strictement aux cas necessaires :
1624
+    // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle
1625
+    if (!$crit2) {
1626
+        $boucles[$idb]->default_order[] = "((!\$zqv=sql_quote($var) OR \$zqv===\"''\") ? 0 : ('FIELD($arg,' . \$zqv . ')'))";
1627
+    }
1628
+
1629
+    return "sql_in('$arg', $var" . ($crit2 == 'NOT' ? ",'NOT'" : '') . ')';
1630 1630
 }
1631 1631
 
1632 1632
 /**
@@ -1642,22 +1642,22 @@  discard block
 block discarded – undo
1642 1642
  * @return void
1643 1643
  */
1644 1644
 function critere_where_dist($idb, &$boucles, $crit) {
1645
-	$boucle = &$boucles[$idb];
1646
-	if (isset($crit->param[0])) {
1647
-		$_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1648
-	} else {
1649
-		$_where = "spip_sanitize_from_request(\$Pile[0]['where'] ?? null, 'where', 'vide')";
1650
-	}
1651
-
1652
-	if ($crit->cond) {
1653
-		$_where = "$_where ?: ''";
1654
-	}
1655
-
1656
-	if ($crit->not) {
1657
-		$_where = "['NOT', $_where]";
1658
-	}
1659
-
1660
-	$boucle->where[] = $_where;
1645
+    $boucle = &$boucles[$idb];
1646
+    if (isset($crit->param[0])) {
1647
+        $_where = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1648
+    } else {
1649
+        $_where = "spip_sanitize_from_request(\$Pile[0]['where'] ?? null, 'where', 'vide')";
1650
+    }
1651
+
1652
+    if ($crit->cond) {
1653
+        $_where = "$_where ?: ''";
1654
+    }
1655
+
1656
+    if ($crit->not) {
1657
+        $_where = "['NOT', $_where]";
1658
+    }
1659
+
1660
+    $boucle->where[] = $_where;
1661 1661
 }
1662 1662
 
1663 1663
 /**
@@ -1673,22 +1673,22 @@  discard block
 block discarded – undo
1673 1673
  * @return void
1674 1674
  */
1675 1675
 function critere_having_dist($idb, &$boucles, $crit) {
1676
-	$boucle = &$boucles[$idb];
1677
-	if (isset($crit->param[0])) {
1678
-		$_having = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1679
-	} else {
1680
-		$_having = "spip_sanitize_from_request(\$Pile[0]['having'] ?? null, 'having', 'vide')";
1681
-	}
1682
-
1683
-	if ($crit->cond) {
1684
-		$_having = "$_having ?: ''";
1685
-	}
1686
-
1687
-	if ($crit->not) {
1688
-		$_having = "['NOT', $_having]";
1689
-	}
1690
-
1691
-	$boucle->having[] = $_having;
1676
+    $boucle = &$boucles[$idb];
1677
+    if (isset($crit->param[0])) {
1678
+        $_having = calculer_liste($crit->param[0], $idb, $boucles, $boucle->id_parent);
1679
+    } else {
1680
+        $_having = "spip_sanitize_from_request(\$Pile[0]['having'] ?? null, 'having', 'vide')";
1681
+    }
1682
+
1683
+    if ($crit->cond) {
1684
+        $_having = "$_having ?: ''";
1685
+    }
1686
+
1687
+    if ($crit->not) {
1688
+        $_having = "['NOT', $_having]";
1689
+    }
1690
+
1691
+    $boucle->having[] = $_having;
1692 1692
 }
1693 1693
 
1694 1694
 /**
@@ -1716,31 +1716,31 @@  discard block
 block discarded – undo
1716 1716
  * @return void
1717 1717
  */
1718 1718
 function critere_id__dist($idb, &$boucles, $crit) {
1719
-	/** @var Boucle $boucle */
1720
-	$boucle = $boucles[$idb];
1721
-
1722
-	$champs = lister_champs_id_conditionnel(
1723
-		$boucle->show['table'],
1724
-		$boucle->show,
1725
-		$boucle->sql_serveur
1726
-	);
1727
-
1728
-	// ne pas tenir compte des critères identiques déjà présents.
1729
-	if (!empty($boucle->modificateur['criteres'])) {
1730
-		$champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1731
-	}
1732
-	// nous aider en mode debug.
1733
-	$boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1734
-	$boucle->modificateur['id_'] = $champs;
1735
-
1736
-	// créer un critère {id_xxx?} de chaque champ retenu
1737
-	foreach ($champs as $champ) {
1738
-		$critere_id_table = new Critere();
1739
-		$critere_id_table->op = $champ;
1740
-		$critere_id_table->cond = true;
1741
-		$critere_id_table->ligne = $crit->ligne;
1742
-		calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1743
-	}
1719
+    /** @var Boucle $boucle */
1720
+    $boucle = $boucles[$idb];
1721
+
1722
+    $champs = lister_champs_id_conditionnel(
1723
+        $boucle->show['table'],
1724
+        $boucle->show,
1725
+        $boucle->sql_serveur
1726
+    );
1727
+
1728
+    // ne pas tenir compte des critères identiques déjà présents.
1729
+    if (!empty($boucle->modificateur['criteres'])) {
1730
+        $champs = array_diff($champs, array_keys($boucle->modificateur['criteres']));
1731
+    }
1732
+    // nous aider en mode debug.
1733
+    $boucle->debug[] = 'id_ : ' . implode(', ', $champs);
1734
+    $boucle->modificateur['id_'] = $champs;
1735
+
1736
+    // créer un critère {id_xxx?} de chaque champ retenu
1737
+    foreach ($champs as $champ) {
1738
+        $critere_id_table = new Critere();
1739
+        $critere_id_table->op = $champ;
1740
+        $critere_id_table->cond = true;
1741
+        $critere_id_table->ligne = $crit->ligne;
1742
+        calculer_critere_DEFAUT_dist($idb, $boucles, $critere_id_table);
1743
+    }
1744 1744
 }
1745 1745
 
1746 1746
 /**
@@ -1760,74 +1760,74 @@  discard block
 block discarded – undo
1760 1760
  * @return array Liste de nom de champs (tel que id_article, id_mot, id_parent ...)
1761 1761
  */
1762 1762
 function lister_champs_id_conditionnel($table, $desc = null, $serveur = '') {
1763
-	// calculer la description de la table
1764
-	if (!is_array($desc)) {
1765
-		$desc = description_table($table, $serveur);
1766
-	}
1767
-	if (!$desc) {
1768
-		return [];
1769
-	}
1770
-
1771
-	// Les champs id_xx de la table demandée
1772
-	$champs = array_filter(
1773
-		array_keys($desc['field']),
1774
-		fn($champ) => str_starts_with($champ, 'id_') || $champ == 'objet'
1775
-	);
1776
-
1777
-	// Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1778
-	if (
1779
-		in_array('id_rubrique', $champs)
1780
-		&& !in_array('id_secteur', $champs)
1781
-	) {
1782
-		$champs[] = 'id_secteur';
1783
-	}
1784
-
1785
-	// On ne fera pas mieux pour les tables d’un autre serveur
1786
-	if ($serveur) {
1787
-		return $champs;
1788
-	}
1789
-
1790
-	$primary = false;
1791
-	$associable = false;
1792
-	include_spip('action/editer_liens');
1793
-
1794
-	if (isset($desc['type'])) {
1795
-		$primary = id_table_objet($desc['type']);
1796
-		$associable = objet_associable($desc['type']);
1797
-	}
1798
-	if (isset($desc['field']['id_objet']) && isset($desc['field']['objet'])) {
1799
-		$associable = true;
1800
-	}
1801
-
1802
-	// liste de toutes les tables principales, sauf la notre
1803
-	$tables = lister_tables_objets_sql();
1804
-	unset($tables[$table]);
1805
-
1806
-	foreach ($tables as $_table => $_desc) {
1807
-		if (
1808
-			$associable
1809
-			|| $primary && array_key_exists($primary, $_desc['field'])
1810
-			|| objet_associable($_desc['type'])
1811
-		) {
1812
-			$champs[] = id_table_objet($_table);
1813
-		}
1814
-	}
1815
-	$champs = array_values(array_unique($champs));
1816
-
1817
-	// Exclusions de certains id
1818
-	$exclusions = pipeline(
1819
-		'exclure_id_conditionnel',
1820
-		[
1821
-			'args' => [
1822
-				'table' => $table,
1823
-				'id_table_objet' => $primary,
1824
-				'associable' => $associable,
1825
-			],
1826
-			'data' => [],
1827
-		]
1828
-	);
1829
-
1830
-	return array_diff($champs, $exclusions);
1763
+    // calculer la description de la table
1764
+    if (!is_array($desc)) {
1765
+        $desc = description_table($table, $serveur);
1766
+    }
1767
+    if (!$desc) {
1768
+        return [];
1769
+    }
1770
+
1771
+    // Les champs id_xx de la table demandée
1772
+    $champs = array_filter(
1773
+        array_keys($desc['field']),
1774
+        fn($champ) => str_starts_with($champ, 'id_') || $champ == 'objet'
1775
+    );
1776
+
1777
+    // Si le champ id_rubrique appartient à la liste et si id_secteur n'est pas inclus on le rajoute.
1778
+    if (
1779
+        in_array('id_rubrique', $champs)
1780
+        && !in_array('id_secteur', $champs)
1781
+    ) {
1782
+        $champs[] = 'id_secteur';
1783
+    }
1784
+
1785
+    // On ne fera pas mieux pour les tables d’un autre serveur
1786
+    if ($serveur) {
1787
+        return $champs;
1788
+    }
1789
+
1790
+    $primary = false;
1791
+    $associable = false;
1792
+    include_spip('action/editer_liens');
1793
+
1794
+    if (isset($desc['type'])) {
1795
+        $primary = id_table_objet($desc['type']);
1796
+        $associable = objet_associable($desc['type']);
1797
+    }
1798
+    if (isset($desc['field']['id_objet']) && isset($desc['field']['objet'])) {
1799
+        $associable = true;
1800
+    }
1801
+
1802
+    // liste de toutes les tables principales, sauf la notre
1803
+    $tables = lister_tables_objets_sql();
1804
+    unset($tables[$table]);
1805
+
1806
+    foreach ($tables as $_table => $_desc) {
1807
+        if (
1808
+            $associable
1809
+            || $primary && array_key_exists($primary, $_desc['field'])
1810
+            || objet_associable($_desc['type'])
1811
+        ) {
1812
+            $champs[] = id_table_objet($_table);
1813
+        }
1814
+    }
1815
+    $champs = array_values(array_unique($champs));
1816
+
1817
+    // Exclusions de certains id
1818
+    $exclusions = pipeline(
1819
+        'exclure_id_conditionnel',
1820
+        [
1821
+            'args' => [
1822
+                'table' => $table,
1823
+                'id_table_objet' => $primary,
1824
+                'associable' => $associable,
1825
+            ],
1826
+            'data' => [],
1827
+        ]
1828
+    );
1829
+
1830
+    return array_diff($champs, $exclusions);
1831 1831
 }
1832 1832
 
1833 1833
 /**
@@ -1882,31 +1882,31 @@  discard block
 block discarded – undo
1882 1882
  * @return void
1883 1883
  */
1884 1884
 function critere_tri_dist($idb, &$boucles, $crit) {
1885
-	$boucle = &$boucles[$idb];
1886
-
1887
-	// definition du champ par defaut
1888
-	$_champ_defaut = isset($crit->param[0][0])
1889
-		? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
1890
-		: "''";
1891
-	$_liste_sens_defaut = isset($crit->param[1][0])
1892
-		? calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent)
1893
-		: '1';
1894
-	$_variable = isset($crit->param[2][0])
1895
-		? calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent)
1896
-		: "'$idb'";
1897
-
1898
-	$_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1899
-
1900
-	$_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1901
-	$_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1902
-
1903
-	$boucle->modificateur['tri_champ'] = $_tri;
1904
-	$boucle->modificateur['tri_sens'] = $_sens;
1905
-	$boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1906
-	$boucle->modificateur['tri_nom'] = $_variable;
1907
-	// faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1908
-	// evite des erreurs sql, mais peut empecher des tri sur jointure ...
1909
-	$boucle->hash .= "
1885
+    $boucle = &$boucles[$idb];
1886
+
1887
+    // definition du champ par defaut
1888
+    $_champ_defaut = isset($crit->param[0][0])
1889
+        ? calculer_liste([$crit->param[0][0]], $idb, $boucles, $boucle->id_parent)
1890
+        : "''";
1891
+    $_liste_sens_defaut = isset($crit->param[1][0])
1892
+        ? calculer_liste([$crit->param[1][0]], $idb, $boucles, $boucle->id_parent)
1893
+        : '1';
1894
+    $_variable = isset($crit->param[2][0])
1895
+        ? calculer_liste([$crit->param[2][0]], $idb, $boucles, $boucle->id_parent)
1896
+        : "'$idb'";
1897
+
1898
+    $_tri = "((\$t=(isset(\$Pile[0]['tri'.$_variable]))?\$Pile[0]['tri'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('tri'.$_variable))?session_get('tri'.$_variable):$_champ_defaut))?tri_protege_champ(\$t):'')";
1899
+
1900
+    $_sens_defaut = "(is_array(\$s=$_liste_sens_defaut)?(isset(\$s[\$st=$_tri])?\$s[\$st]:reset(\$s)):\$s)";
1901
+    $_sens = "((intval(\$t=(isset(\$Pile[0]['sens'.$_variable]))?\$Pile[0]['sens'.$_variable]:((strncmp($_variable,'session',7)==0 AND session_get('sens'.$_variable))?session_get('sens'.$_variable):$_sens_defaut))==-1 OR \$t=='inverse')?-1:1)";
1902
+
1903
+    $boucle->modificateur['tri_champ'] = $_tri;
1904
+    $boucle->modificateur['tri_sens'] = $_sens;
1905
+    $boucle->modificateur['tri_liste_sens_defaut'] = $_liste_sens_defaut;
1906
+    $boucle->modificateur['tri_nom'] = $_variable;
1907
+    // faut il inserer un test sur l'existence de $tri parmi les champs de la table ?
1908
+    // evite des erreurs sql, mais peut empecher des tri sur jointure ...
1909
+    $boucle->hash .= "
1910 1910
 	\$senstri = '';
1911 1911
 	\$tri = $_tri;
1912 1912
 	if (\$tri){
@@ -1914,8 +1914,8 @@  discard block
 block discarded – undo
1914 1914
 		\$senstri = (\$senstri<0)?' DESC':'';
1915 1915
 	};
1916 1916
 	";
1917
-	$boucle->select[] = '".tri_champ_select($tri)."';
1918
-	$boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1917
+    $boucle->select[] = '".tri_champ_select($tri)."';
1918
+    $boucle->order[] = "tri_champ_order(\$tri,\$command['from'],\$senstri)";
1919 1919
 }
1920 1920
 
1921 1921
 # criteres de comparaison
@@ -1932,21 +1932,21 @@  discard block
 block discarded – undo
1932 1932
  * @return void|array
1933 1933
  **/
1934 1934
 function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) {
1935
-	// double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1936
-	if ($crit->op == ',' || $crit->op == '/') {
1937
-		calculer_critere_parties($idb, $boucles, $crit);
1938
-		return;
1939
-	}
1940
-
1941
-	$r = calculer_critere_infixe($idb, $boucles, $crit);
1942
-	if (!$r) {
1943
-		#	// on produit une erreur seulement si le critere n'a pas de '?'
1944
-		#	if (!$crit->cond) {
1945
-		return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1946
-		#	}
1947
-	} else {
1948
-		calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1949
-	}
1935
+    // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale
1936
+    if ($crit->op == ',' || $crit->op == '/') {
1937
+        calculer_critere_parties($idb, $boucles, $crit);
1938
+        return;
1939
+    }
1940
+
1941
+    $r = calculer_critere_infixe($idb, $boucles, $crit);
1942
+    if (!$r) {
1943
+        #	// on produit une erreur seulement si le critere n'a pas de '?'
1944
+        #	if (!$crit->cond) {
1945
+        return ['zbug_critere_inconnu', ['critere' => $crit->op]];
1946
+        #	}
1947
+    } else {
1948
+        calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r);
1949
+    }
1950 1950
 }
1951 1951
 
1952 1952
 
@@ -1966,60 +1966,60 @@  discard block
 block discarded – undo
1966 1966
  * @return void
1967 1967
  **/
1968 1968
 function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) {
1969
-	[$arg, $op, $val, $col, $where_complement] = $args;
1970
-
1971
-	$where = ["'$op'", "'$arg'", $val[0]];
1972
-
1973
-	// inserer la negation (cf !...)
1974
-
1975
-	if ($crit->not) {
1976
-		$where = ["'NOT'", $where];
1977
-	}
1978
-	if ($crit->exclus) {
1979
-		if (!preg_match(',^L\d+[.],', (string) $arg)) {
1980
-			$where = ["'NOT'", $where];
1981
-		} else {
1982
-			// un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1983
-			// c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1984
-			$where = [
1985
-				"'NOT'",
1986
-				[
1987
-					"'IN'",
1988
-					"'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1989
-					["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1990
-				]
1991
-			];
1992
-		}
1993
-	}
1994
-
1995
-	// inserer la condition (cf {lang?})
1996
-	// traiter a part la date, elle est mise d'office par SPIP,
1997
-	if ($crit->cond) {
1998
-		$pred = calculer_argument_precedent($idb, $col, $boucles);
1999
-		if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['" . $col . "']") {
2000
-			$pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
2001
-		}
2002
-
2003
-		if ($op === '=' && !$crit->not) {
2004
-			$where = [
2005
-				"'?'",
2006
-				"(is_array($pred))",
2007
-				critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
2008
-				$where
2009
-			];
2010
-		}
2011
-		$where = ["'?'", "!is_whereable($pred)", "''", $where];
2012
-		if ($where_complement) {
2013
-			// condition annexe du type "AND (objet='article')"
2014
-			$where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
2015
-		}
2016
-	}
2017
-
2018
-	$boucles[$idb]->where[] = $where;
2019
-	if ($where_complement) {
2020
-		// condition annexe du type "AND (objet='article')"
2021
-		$boucles[$idb]->where[] = $where_complement;
2022
-	}
1969
+    [$arg, $op, $val, $col, $where_complement] = $args;
1970
+
1971
+    $where = ["'$op'", "'$arg'", $val[0]];
1972
+
1973
+    // inserer la negation (cf !...)
1974
+
1975
+    if ($crit->not) {
1976
+        $where = ["'NOT'", $where];
1977
+    }
1978
+    if ($crit->exclus) {
1979
+        if (!preg_match(',^L\d+[.],', (string) $arg)) {
1980
+            $where = ["'NOT'", $where];
1981
+        } else {
1982
+            // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete
1983
+            // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent
1984
+            $where = [
1985
+                "'NOT'",
1986
+                [
1987
+                    "'IN'",
1988
+                    "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'",
1989
+                    ["'SELF'", "'" . $boucles[$idb]->id_table . '.' . $boucles[$idb]->primary . "'", $where]
1990
+                ]
1991
+            ];
1992
+        }
1993
+    }
1994
+
1995
+    // inserer la condition (cf {lang?})
1996
+    // traiter a part la date, elle est mise d'office par SPIP,
1997
+    if ($crit->cond) {
1998
+        $pred = calculer_argument_precedent($idb, $col, $boucles);
1999
+        if (($col === 'date' || $col === 'date_redac') && $pred === "\$Pile[0]['" . $col . "']") {
2000
+            $pred = "(\$Pile[0]['{$col}_default']?'':$pred)";
2001
+        }
2002
+
2003
+        if ($op === '=' && !$crit->not) {
2004
+            $where = [
2005
+                "'?'",
2006
+                "(is_array($pred))",
2007
+                critere_IN_cas($idb, $boucles, 'COND', $arg, $op, [$pred], $col),
2008
+                $where
2009
+            ];
2010
+        }
2011
+        $where = ["'?'", "!is_whereable($pred)", "''", $where];
2012
+        if ($where_complement) {
2013
+            // condition annexe du type "AND (objet='article')"
2014
+            $where_complement = ["'?'", "!is_whereable($pred)", "''", $where_complement];
2015
+        }
2016
+    }
2017
+
2018
+    $boucles[$idb]->where[] = $where;
2019
+    if ($where_complement) {
2020
+        // condition annexe du type "AND (objet='article')"
2021
+        $boucles[$idb]->where[] = $where_complement;
2022
+    }
2023 2023
 }
2024 2024
 
2025 2025
 
@@ -2060,160 +2060,160 @@  discard block
 block discarded – undo
2060 2060
  **/
2061 2061
 function calculer_critere_infixe($idb, &$boucles, $crit) {
2062 2062
 
2063
-	$boucle = &$boucles[$idb];
2064
-	$type = $boucle->type_requete;
2065
-	$table = $boucle->id_table;
2066
-	$desc = $boucle->show;
2067
-	$col_vraie = null;
2068
-
2069
-	[$fct, $col, $op, $val, $args_sql] =
2070
-		calculer_critere_infixe_ops($idb, $boucles, $crit);
2071
-
2072
-	$col_alias = $col;
2073
-	$where_complement = false;
2074
-
2075
-	// Cas particulier : id_enfant => utiliser la colonne id_objet
2076
-	if ($col == 'id_enfant') {
2077
-		$col = $boucle->primary;
2078
-	}
2079
-
2080
-	// Cas particulier : id_parent => verifier les exceptions de tables
2081
-	if (
2082
-		in_array($col, ['id_parent', 'id_secteur'])
2083
-		&& isset($GLOBALS['exceptions_des_tables'][$table][$col]) || isset($GLOBALS['exceptions_des_tables'][$table][$col]) && is_string($GLOBALS['exceptions_des_tables'][$table][$col])
2084
-	) {
2085
-		$col = $GLOBALS['exceptions_des_tables'][$table][$col];
2086
-	} // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2087
-	else {
2088
-		if ($col == 'id_secteur' && ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2089
-			$table = $critere_secteur($idb, $boucles, $val, $crit);
2090
-		}
2091
-
2092
-		// cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2093
-		// sauf si exception declaree : sauter cette etape
2094
-		else {
2095
-			if (
2096
-				!isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2097
-				&& !isset($GLOBALS['exceptions_des_jointures'][$col])
2098
-				&& count(trouver_champs_decomposes($col, $desc)) > 1
2099
-			) {
2100
-				$e = decompose_champ_id_objet($col);
2101
-				$col = array_shift($e);
2102
-				$where_complement = primary_doublee($e, $table);
2103
-			} // Cas particulier : expressions de date
2104
-			else {
2105
-				if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2106
-					[$col, $col_vraie] = $c;
2107
-					$table = '';
2108
-				} // table explicitée {mots.titre}
2109
-				else {
2110
-					if (preg_match('/^(.*)\.(.*)$/', (string) $col, $r)) {
2111
-						[, $table, $col] = $r;
2112
-						$col_alias = $col;
2113
-
2114
-						$trouver_table = charger_fonction('trouver_table', 'base');
2115
-						if (
2116
-							($desc = $trouver_table($table, $boucle->sql_serveur))
2117
-							&& isset($desc['field'][$col])
2118
-							&& ($cle = array_search($desc['table'], $boucle->from))
2119
-						) {
2120
-							$table = $cle;
2121
-						} else {
2122
-							$table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond || $op != '='));
2123
-						}
2124
-						#$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2125
-						if (!$table) {
2126
-							return '';
2127
-						}
2128
-					}
2129
-					// si le champ n'est pas trouvé dans la table,
2130
-					// on cherche si une jointure peut l'obtenir
2131
-					elseif (@!array_key_exists($col, $desc['field'])) {
2132
-						// Champ joker * des iterateurs DATA qui accepte tout
2133
-						if (@array_key_exists('*', $desc['field'])) {
2134
-							$desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2135
-						}
2136
-						else {
2137
-							$r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2138
-							if (!$r) {
2139
-								return '';
2140
-							}
2141
-							[$col, $col_alias, $table, $where_complement, $desc] = $r;
2142
-						}
2143
-					}
2144
-				}
2145
-			}
2146
-		}
2147
-	}
2148
-
2149
-	$col_vraie = ($col_vraie ?: $col);
2150
-	// Dans tous les cas,
2151
-	// virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2152
-	// et passer dans sql_quote avec le type si connu
2153
-	// et int sinon si la valeur est numerique
2154
-	// sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2155
-	// Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2156
-	if ($op == '=' || in_array($op, $GLOBALS['table_criteres_infixes'])) {
2157
-		$type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2158
-		// defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2159
-		// prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2160
-		if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", (string) $val[0], $r)) {
2161
-			$val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2162
-		}
2163
-		// sinon expliciter les
2164
-		// sql_quote(truc) en sql_quote(truc,'',type)
2165
-		// sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2166
-		// sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2167
-		// sans toucher aux
2168
-		// sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2169
-		// sql_quote(truc,'','varchar')
2170
-		elseif (
2171
-			preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', (string) $val[0], $r)
2172
-			&& (!isset($r[3]) || !$r[3] || !trim($r[3], ", '"))
2173
-		) {
2174
-			$r = $r[1]
2175
-				. ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
2176
-				. ",'" . addslashes((string) $type_cast_quote) . "'";
2177
-			$val[0] = "sql_quote($r)";
2178
-		}
2179
-		elseif (
2180
-			str_contains((string) $val[0], '@@defaultcast@@')
2181
-			&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2182
-		) {
2183
-			$val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'" . addslashes((string) $type_cast_quote) . "')";
2184
-		}
2185
-	}
2186
-
2187
-	if (
2188
-		str_contains((string) $val[0], '@@defaultcast@@')
2189
-		&& preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2190
-	) {
2191
-		$val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'char')";
2192
-	}
2193
-
2194
-	// Indicateur pour permettre aux fonctionx boucle_X de modifier
2195
-	// leurs requetes par defaut, notamment le champ statut
2196
-	// Ne pas confondre champs de la table principale et des jointures
2197
-	if ($table === $boucle->id_table) {
2198
-		$boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2199
-		if ($col_alias != $col_vraie) {
2200
-			$boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2201
-		}
2202
-	}
2203
-
2204
-	// inserer le nom de la table SQL devant le nom du champ
2205
-	if ($table) {
2206
-		$arg = $col[0] == '`' ? "$table." . substr((string) $col, 1, -1) : "$table.$col";
2207
-	} else {
2208
-		$arg = $col;
2209
-	}
2210
-
2211
-	// inserer la fonction SQL
2212
-	if ($fct) {
2213
-		$arg = "$fct($arg$args_sql)";
2214
-	}
2215
-
2216
-	return [$arg, $op, $val, $col_alias, $where_complement];
2063
+    $boucle = &$boucles[$idb];
2064
+    $type = $boucle->type_requete;
2065
+    $table = $boucle->id_table;
2066
+    $desc = $boucle->show;
2067
+    $col_vraie = null;
2068
+
2069
+    [$fct, $col, $op, $val, $args_sql] =
2070
+        calculer_critere_infixe_ops($idb, $boucles, $crit);
2071
+
2072
+    $col_alias = $col;
2073
+    $where_complement = false;
2074
+
2075
+    // Cas particulier : id_enfant => utiliser la colonne id_objet
2076
+    if ($col == 'id_enfant') {
2077
+        $col = $boucle->primary;
2078
+    }
2079
+
2080
+    // Cas particulier : id_parent => verifier les exceptions de tables
2081
+    if (
2082
+        in_array($col, ['id_parent', 'id_secteur'])
2083
+        && isset($GLOBALS['exceptions_des_tables'][$table][$col]) || isset($GLOBALS['exceptions_des_tables'][$table][$col]) && is_string($GLOBALS['exceptions_des_tables'][$table][$col])
2084
+    ) {
2085
+        $col = $GLOBALS['exceptions_des_tables'][$table][$col];
2086
+    } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums)
2087
+    else {
2088
+        if ($col == 'id_secteur' && ($critere_secteur = charger_fonction("critere_secteur_$type", 'public', true))) {
2089
+            $table = $critere_secteur($idb, $boucles, $val, $crit);
2090
+        }
2091
+
2092
+        // cas id_article=xx qui se mappe en id_objet=xx AND objet=article
2093
+        // sauf si exception declaree : sauter cette etape
2094
+        else {
2095
+            if (
2096
+                !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col])
2097
+                && !isset($GLOBALS['exceptions_des_jointures'][$col])
2098
+                && count(trouver_champs_decomposes($col, $desc)) > 1
2099
+            ) {
2100
+                $e = decompose_champ_id_objet($col);
2101
+                $col = array_shift($e);
2102
+                $where_complement = primary_doublee($e, $table);
2103
+            } // Cas particulier : expressions de date
2104
+            else {
2105
+                if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) {
2106
+                    [$col, $col_vraie] = $c;
2107
+                    $table = '';
2108
+                } // table explicitée {mots.titre}
2109
+                else {
2110
+                    if (preg_match('/^(.*)\.(.*)$/', (string) $col, $r)) {
2111
+                        [, $table, $col] = $r;
2112
+                        $col_alias = $col;
2113
+
2114
+                        $trouver_table = charger_fonction('trouver_table', 'base');
2115
+                        if (
2116
+                            ($desc = $trouver_table($table, $boucle->sql_serveur))
2117
+                            && isset($desc['field'][$col])
2118
+                            && ($cle = array_search($desc['table'], $boucle->from))
2119
+                        ) {
2120
+                            $table = $cle;
2121
+                        } else {
2122
+                            $table = trouver_jointure_champ($col, $boucle, [$table], ($crit->cond || $op != '='));
2123
+                        }
2124
+                        #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true);
2125
+                        if (!$table) {
2126
+                            return '';
2127
+                        }
2128
+                    }
2129
+                    // si le champ n'est pas trouvé dans la table,
2130
+                    // on cherche si une jointure peut l'obtenir
2131
+                    elseif (@!array_key_exists($col, $desc['field'])) {
2132
+                        // Champ joker * des iterateurs DATA qui accepte tout
2133
+                        if (@array_key_exists('*', $desc['field'])) {
2134
+                            $desc['field'][$col_vraie ?: $col] = ''; // on veut pas de cast INT par defaut car le type peut etre n'importe quoi dans les boucles DATA
2135
+                        }
2136
+                        else {
2137
+                            $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table);
2138
+                            if (!$r) {
2139
+                                return '';
2140
+                            }
2141
+                            [$col, $col_alias, $table, $where_complement, $desc] = $r;
2142
+                        }
2143
+                    }
2144
+                }
2145
+            }
2146
+        }
2147
+    }
2148
+
2149
+    $col_vraie = ($col_vraie ?: $col);
2150
+    // Dans tous les cas,
2151
+    // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL)
2152
+    // et passer dans sql_quote avec le type si connu
2153
+    // et int sinon si la valeur est numerique
2154
+    // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon)
2155
+    // Ne pas utiliser intval, PHP tronquant les Bigint de SQL
2156
+    if ($op == '=' || in_array($op, $GLOBALS['table_criteres_infixes'])) {
2157
+        $type_cast_quote = ($desc['field'][$col_vraie] ?? 'int NOT NULL');
2158
+        // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon
2159
+        // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut
2160
+        if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", (string) $val[0], $r)) {
2161
+            $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, $type_cast_quote) . '"';
2162
+        }
2163
+        // sinon expliciter les
2164
+        // sql_quote(truc) en sql_quote(truc,'',type)
2165
+        // sql_quote(truc,serveur) en sql_quote(truc,serveur,type)
2166
+        // sql_quote(truc,serveur,'') en sql_quote(truc,serveur,type)
2167
+        // sans toucher aux
2168
+        // sql_quote(truc,'','varchar(10) DEFAULT \'oui\' COLLATE NOCASE')
2169
+        // sql_quote(truc,'','varchar')
2170
+        elseif (
2171
+            preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', (string) $val[0], $r)
2172
+            && (!isset($r[3]) || !$r[3] || !trim($r[3], ", '"))
2173
+        ) {
2174
+            $r = $r[1]
2175
+                . ((isset($r[2]) && $r[2]) ? $r[2] : ",''")
2176
+                . ",'" . addslashes((string) $type_cast_quote) . "'";
2177
+            $val[0] = "sql_quote($r)";
2178
+        }
2179
+        elseif (
2180
+            str_contains((string) $val[0], '@@defaultcast@@')
2181
+            && preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2182
+        ) {
2183
+            $val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'" . addslashes((string) $type_cast_quote) . "')";
2184
+        }
2185
+    }
2186
+
2187
+    if (
2188
+        str_contains((string) $val[0], '@@defaultcast@@')
2189
+        && preg_match("/'@@defaultcast@@'\s*\)\s*\z/ms", (string) $val[0], $r)
2190
+    ) {
2191
+        $val[0] = substr((string) $val[0], 0, -strlen($r[0])) . "'char')";
2192
+    }
2193
+
2194
+    // Indicateur pour permettre aux fonctionx boucle_X de modifier
2195
+    // leurs requetes par defaut, notamment le champ statut
2196
+    // Ne pas confondre champs de la table principale et des jointures
2197
+    if ($table === $boucle->id_table) {
2198
+        $boucles[$idb]->modificateur['criteres'][$col_vraie] = true;
2199
+        if ($col_alias != $col_vraie) {
2200
+            $boucles[$idb]->modificateur['criteres'][$col_alias] = true;
2201
+        }
2202
+    }
2203
+
2204
+    // inserer le nom de la table SQL devant le nom du champ
2205
+    if ($table) {
2206
+        $arg = $col[0] == '`' ? "$table." . substr((string) $col, 1, -1) : "$table.$col";
2207
+    } else {
2208
+        $arg = $col;
2209
+    }
2210
+
2211
+    // inserer la fonction SQL
2212
+    if ($fct) {
2213
+        $arg = "$fct($arg$args_sql)";
2214
+    }
2215
+
2216
+    return [$arg, $op, $val, $col_alias, $where_complement];
2217 2217
 }
2218 2218
 
2219 2219
 
@@ -2242,75 +2242,75 @@  discard block
 block discarded – undo
2242 2242
  **/
2243 2243
 function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) {
2244 2244
 
2245
-	$where = '';
2246
-
2247
-	$calculer_critere_externe = 'calculer_critere_externe_init';
2248
-	// gestion par les plugins des jointures tordues
2249
-	// pas automatiques mais necessaires
2250
-	$table_sql = table_objet_sql($table);
2251
-	if (
2252
-		isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2253
-		&& is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2254
-		&& (
2255
-			isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2256
-			|| isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2257
-		)
2258
-	) {
2259
-		$t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2260
-		$index = $t[$col] ?? $t[''] ?? [];
2261
-
2262
-		if ((is_countable($index) ? count($index) : 0) == 3) {
2263
-			[$t, $col, $calculer_critere_externe] = $index;
2264
-		} elseif ((is_countable($index) ? count($index) : 0) == 2) {
2265
-			[$t, $col] = $t[$col];
2266
-		} elseif ((is_countable($index) ? count($index) : 0) == 1) {
2267
-			[$calculer_critere_externe] = $index;
2268
-			$t = $table;
2269
-		} else {
2270
-			$t = '';
2271
-		} // jointure non declaree. La trouver.
2272
-	} elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2273
-		[$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2274
-	} else {
2275
-		$t = '';
2276
-	} // jointure non declaree. La trouver.
2277
-
2278
-	// ici on construit le from pour fournir $col en piochant dans les jointures
2279
-
2280
-	// si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2281
-	// permet de forcer une table de lien quand il y a ambiguite
2282
-	// <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2283
-	// alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2284
-	$table = '';
2285
-	if ($boucle->jointures_explicites) {
2286
-		$jointures_explicites = explode(' ', $boucle->jointures_explicites);
2287
-		$table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond || $op != '='), $t);
2288
-	}
2289
-
2290
-	// et sinon on cherche parmi toutes les jointures declarees
2291
-	if (!$table) {
2292
-		$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond || $op != '='), $t);
2293
-	}
2294
-
2295
-	if (!$table) {
2296
-		return '';
2297
-	}
2298
-
2299
-	// il ne reste plus qu'a trouver le champ dans les from
2300
-	[$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2301
-
2302
-	if ((is_countable($cle) ? count($cle) : 0) > 1 || reset($cle) !== $col) {
2303
-		$col_alias = $col; // id_article devient juste le nom d'origine
2304
-		if ((is_countable($cle) ? count($cle) : 0) > 1 && reset($cle) == 'id_objet') {
2305
-			$e = decompose_champ_id_objet($col);
2306
-			$col = array_shift($e);
2307
-			$where = primary_doublee($e, $table);
2308
-		} else {
2309
-			$col = reset($cle);
2310
-		}
2311
-	}
2312
-
2313
-	return [$col, $col_alias, $table, $where, $desc];
2245
+    $where = '';
2246
+
2247
+    $calculer_critere_externe = 'calculer_critere_externe_init';
2248
+    // gestion par les plugins des jointures tordues
2249
+    // pas automatiques mais necessaires
2250
+    $table_sql = table_objet_sql($table);
2251
+    if (
2252
+        isset($GLOBALS['exceptions_des_jointures'][$table_sql])
2253
+        && is_array($GLOBALS['exceptions_des_jointures'][$table_sql])
2254
+        && (
2255
+            isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col])
2256
+            || isset($GLOBALS['exceptions_des_jointures'][$table_sql][''])
2257
+        )
2258
+    ) {
2259
+        $t = $GLOBALS['exceptions_des_jointures'][$table_sql];
2260
+        $index = $t[$col] ?? $t[''] ?? [];
2261
+
2262
+        if ((is_countable($index) ? count($index) : 0) == 3) {
2263
+            [$t, $col, $calculer_critere_externe] = $index;
2264
+        } elseif ((is_countable($index) ? count($index) : 0) == 2) {
2265
+            [$t, $col] = $t[$col];
2266
+        } elseif ((is_countable($index) ? count($index) : 0) == 1) {
2267
+            [$calculer_critere_externe] = $index;
2268
+            $t = $table;
2269
+        } else {
2270
+            $t = '';
2271
+        } // jointure non declaree. La trouver.
2272
+    } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) {
2273
+        [$t, $col] = $GLOBALS['exceptions_des_jointures'][$col];
2274
+    } else {
2275
+        $t = '';
2276
+    } // jointure non declaree. La trouver.
2277
+
2278
+    // ici on construit le from pour fournir $col en piochant dans les jointures
2279
+
2280
+    // si des jointures explicites sont fournies, on cherche d'abord dans celles ci
2281
+    // permet de forcer une table de lien quand il y a ambiguite
2282
+    // <BOUCLE_(DOCUMENTS documents_liens){id_mot}>
2283
+    // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}>
2284
+    $table = '';
2285
+    if ($boucle->jointures_explicites) {
2286
+        $jointures_explicites = explode(' ', $boucle->jointures_explicites);
2287
+        $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond || $op != '='), $t);
2288
+    }
2289
+
2290
+    // et sinon on cherche parmi toutes les jointures declarees
2291
+    if (!$table) {
2292
+        $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond || $op != '='), $t);
2293
+    }
2294
+
2295
+    if (!$table) {
2296
+        return '';
2297
+    }
2298
+
2299
+    // il ne reste plus qu'a trouver le champ dans les from
2300
+    [$nom, $desc, $cle] = trouver_champ_exterieur($col, $boucle->from, $boucle);
2301
+
2302
+    if ((is_countable($cle) ? count($cle) : 0) > 1 || reset($cle) !== $col) {
2303
+        $col_alias = $col; // id_article devient juste le nom d'origine
2304
+        if ((is_countable($cle) ? count($cle) : 0) > 1 && reset($cle) == 'id_objet') {
2305
+            $e = decompose_champ_id_objet($col);
2306
+            $col = array_shift($e);
2307
+            $where = primary_doublee($e, $table);
2308
+        } else {
2309
+            $col = reset($cle);
2310
+        }
2311
+    }
2312
+
2313
+    return [$col, $col_alias, $table, $where, $desc];
2314 2314
 }
2315 2315
 
2316 2316
 
@@ -2331,10 +2331,10 @@  discard block
 block discarded – undo
2331 2331
  *     - valeur
2332 2332
  **/
2333 2333
 function primary_doublee($decompose, $table) {
2334
-	$e1 = reset($decompose);
2335
-	$e2 = "sql_quote('" . end($decompose) . "')";
2334
+    $e1 = reset($decompose);
2335
+    $e2 = "sql_quote('" . end($decompose) . "')";
2336 2336
 
2337
-	return ["'='", "'$table." . $e1 . "'", $e2];
2337
+    return ["'='", "'$table." . $e1 . "'", $e2];
2338 2338
 }
2339 2339
 
2340 2340
 /**
@@ -2365,56 +2365,56 @@  discard block
 block discarded – undo
2365 2365
  *     Vide sinon.
2366 2366
  */
2367 2367
 function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2368
-	// si on demande un truc du genre spip_mots
2369
-	// avec aussi spip_mots_liens dans les jointures dispo
2370
-	// et qu'on est la
2371
-	// il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2372
-	if (
2373
-		$checkarrivee
2374
-		&& is_string($checkarrivee)
2375
-		&& ($a = table_objet($checkarrivee))
2376
-		&& in_array($a . '_liens', $joints)
2377
-		&& ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee))
2378
-	) {
2379
-		return $res;
2380
-	}
2381
-	foreach ($joints as $joint) {
2382
-		if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2383
-			// alias de table dans le from
2384
-			$t = array_search($arrivee[0], $boucle->from);
2385
-			// recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2386
-			$cols = $arrivee[2];
2387
-			// mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2388
-			if ((is_countable($cols) ? count($cols) : 0) > 2) {
2389
-				array_pop($cols);
2390
-			}
2391
-			if ($t) {
2392
-				// la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2393
-				$joindre = false;
2394
-				foreach ($cols as $col) {
2395
-					$c = '/\b' . $t . ".$col" . '\b/';
2396
-					if (trouver_champ($c, $boucle->where)) {
2397
-						$joindre = true;
2398
-					} else {
2399
-						// mais ca peut etre dans le FIELD pour le Having
2400
-						$c = "/FIELD.$t" . ".$col,/";
2401
-						if (trouver_champ($c, $boucle->select)) {
2402
-							$joindre = true;
2403
-						}
2404
-					}
2405
-				}
2406
-				if (!$joindre) {
2407
-					return $t;
2408
-				}
2409
-			}
2410
-			array_pop($arrivee);
2411
-			if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2412
-				return $res;
2413
-			}
2414
-		}
2415
-	}
2416
-
2417
-	return '';
2368
+    // si on demande un truc du genre spip_mots
2369
+    // avec aussi spip_mots_liens dans les jointures dispo
2370
+    // et qu'on est la
2371
+    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
2372
+    if (
2373
+        $checkarrivee
2374
+        && is_string($checkarrivee)
2375
+        && ($a = table_objet($checkarrivee))
2376
+        && in_array($a . '_liens', $joints)
2377
+        && ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee))
2378
+    ) {
2379
+        return $res;
2380
+    }
2381
+    foreach ($joints as $joint) {
2382
+        if ($arrivee = trouver_champ_exterieur($col, [$joint], $boucle, $checkarrivee)) {
2383
+            // alias de table dans le from
2384
+            $t = array_search($arrivee[0], $boucle->from);
2385
+            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
2386
+            $cols = $arrivee[2];
2387
+            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
2388
+            if ((is_countable($cols) ? count($cols) : 0) > 2) {
2389
+                array_pop($cols);
2390
+            }
2391
+            if ($t) {
2392
+                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
2393
+                $joindre = false;
2394
+                foreach ($cols as $col) {
2395
+                    $c = '/\b' . $t . ".$col" . '\b/';
2396
+                    if (trouver_champ($c, $boucle->where)) {
2397
+                        $joindre = true;
2398
+                    } else {
2399
+                        // mais ca peut etre dans le FIELD pour le Having
2400
+                        $c = "/FIELD.$t" . ".$col,/";
2401
+                        if (trouver_champ($c, $boucle->select)) {
2402
+                            $joindre = true;
2403
+                        }
2404
+                    }
2405
+                }
2406
+                if (!$joindre) {
2407
+                    return $t;
2408
+                }
2409
+            }
2410
+            array_pop($arrivee);
2411
+            if ($res = calculer_jointure($boucle, [$boucle->id_table, $desc], $arrivee, $cols, $cond, 1)) {
2412
+                return $res;
2413
+            }
2414
+        }
2415
+    }
2416
+
2417
+    return '';
2418 2418
 }
2419 2419
 
2420 2420
 /**
@@ -2440,35 +2440,35 @@  discard block
 block discarded – undo
2440 2440
  *     Alias de la table de jointure (Lx)
2441 2441
  */
2442 2442
 function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) {
2443
-	$primary_arrivee = id_table_objet($checkarrivee);
2444
-
2445
-	// [FIXME] $checkarrivee peut-il arriver avec false ????
2446
-	$intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2447
-	$arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2448
-
2449
-	if (!$intermediaire || !$arrivee) {
2450
-		return '';
2451
-	}
2452
-	array_pop($intermediaire); // enlever la cle en 3eme argument
2453
-	array_pop($arrivee); // enlever la cle en 3eme argument
2454
-
2455
-	$res = fabrique_jointures(
2456
-		$boucle,
2457
-		[
2458
-			[
2459
-				$boucle->id_table,
2460
-				$intermediaire,
2461
-				[id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2462
-			],
2463
-			[reset($intermediaire), $arrivee, $primary_arrivee]
2464
-		],
2465
-		$cond,
2466
-		$desc,
2467
-		$boucle->id_table,
2468
-		[$col]
2469
-	);
2470
-
2471
-	return $res;
2443
+    $primary_arrivee = id_table_objet($checkarrivee);
2444
+
2445
+    // [FIXME] $checkarrivee peut-il arriver avec false ????
2446
+    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . '_liens');
2447
+    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
2448
+
2449
+    if (!$intermediaire || !$arrivee) {
2450
+        return '';
2451
+    }
2452
+    array_pop($intermediaire); // enlever la cle en 3eme argument
2453
+    array_pop($arrivee); // enlever la cle en 3eme argument
2454
+
2455
+    $res = fabrique_jointures(
2456
+        $boucle,
2457
+        [
2458
+            [
2459
+                $boucle->id_table,
2460
+                $intermediaire,
2461
+                [id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']]
2462
+            ],
2463
+            [reset($intermediaire), $arrivee, $primary_arrivee]
2464
+        ],
2465
+        $cond,
2466
+        $desc,
2467
+        $boucle->id_table,
2468
+        [$col]
2469
+    );
2470
+
2471
+    return $res;
2472 2472
 }
2473 2473
 
2474 2474
 
@@ -2485,17 +2485,17 @@  discard block
 block discarded – undo
2485 2485
  *     false sinon.
2486 2486
  **/
2487 2487
 function trouver_champ($champ, $where) {
2488
-	if (!is_array($where)) {
2489
-		return preg_match($champ, $where);
2490
-	} else {
2491
-		foreach ($where as $clause) {
2492
-			if (trouver_champ($champ, $clause)) {
2493
-				return true;
2494
-			}
2495
-		}
2496
-
2497
-		return false;
2498
-	}
2488
+    if (!is_array($where)) {
2489
+        return preg_match($champ, $where);
2490
+    } else {
2491
+        foreach ($where as $clause) {
2492
+            if (trouver_champ($champ, $clause)) {
2493
+                return true;
2494
+            }
2495
+        }
2496
+
2497
+        return false;
2498
+    }
2499 2499
 }
2500 2500
 
2501 2501
 
@@ -2521,128 +2521,128 @@  discard block
 block discarded – undo
2521 2521
  *     - string $args_sql  Suite des arguments du critère. ?
2522 2522
  **/
2523 2523
 function calculer_critere_infixe_ops($idb, &$boucles, $crit) {
2524
-	// cas d'une valeur comparee a elle-meme ou son referent
2525
-	if ((is_countable($crit->param) ? count($crit->param) : 0) == 0) {
2526
-		$op = '=';
2527
-		$col = $val = $crit->op;
2528
-		if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2529
-			$val = $r[2];
2530
-		}
2531
-		// Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2532
-		if ($val == 'lang') {
2533
-			$val = [kwote('$GLOBALS[\'spip_lang\']')];
2534
-		} else {
2535
-			$defaut = null;
2536
-			if ($val == 'id_parent') {
2537
-				// Si id_parent, comparer l'id_parent avec l'id_objet
2538
-				// de la boucle superieure.... faudrait verifier qu'il existe
2539
-				// pour eviter l'erreur SQL
2540
-				$val = $boucles[$idb]->primary;
2541
-				// mais si pas de boucle superieure, prendre id_parent dans l'env
2542
-				$defaut = "(\$Pile[0]['id_parent'] ?? null)";
2543
-			} elseif ($val == 'id_enfant') {
2544
-				// Si id_enfant, comparer l'id_objet avec l'id_parent
2545
-				// de la boucle superieure
2546
-				$val = 'id_parent';
2547
-			} elseif ($crit->cond && ($col == 'date' || $col == 'date_redac')) {
2548
-				// un critere conditionnel sur date est traite a part
2549
-				// car la date est mise d'office par SPIP,
2550
-				$defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2551
-			}
2552
-
2553
-			$val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2554
-			$val = [kwote($val)];
2555
-		}
2556
-	} else {
2557
-		// comparaison explicite
2558
-		// le phraseur impose que le premier param soit du texte
2559
-		$params = $crit->param;
2560
-		$op = $crit->op;
2561
-		if ($op == '==') {
2562
-			$op = 'REGEXP';
2563
-		}
2564
-		$col = array_shift($params);
2565
-		$col = $col[0]->texte;
2566
-
2567
-		$val = [];
2568
-		$parent = $boucles[$idb]->id_parent;
2569
-
2570
-		// Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2571
-		// celui ne sachant pas ce qu'est un critere infixe
2572
-		// et a fortiori son 2e operande qu'entoure " ou '
2573
-		if (
2574
-			(is_countable($params) ? count($params) : 0) == 1
2575
-			&& (is_countable($params[0]) ? count($params[0]) : 0) == 3
2576
-			&& $params[0][0]->type == 'texte'
2577
-			&& $params[0][2]->type == 'texte'
2578
-			&& ($p = $params[0][0]->texte) == $params[0][2]->texte
2579
-			&& ($p == "'" || $p == '"')
2580
-			&& $params[0][1]->type == 'champ'
2581
-		) {
2582
-			$val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2583
-		} else {
2584
-			foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2585
-				$a = calculer_liste($p, $idb, $boucles, $parent);
2586
-				$val[] = strcasecmp($op, 'IN') == 0
2587
-					? $a
2588
-					// toujours quoter en char ici
2589
-					: kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2590
-			}
2591
-		}
2592
-	}
2593
-
2594
-	$fct = $args_sql = '';
2595
-	// fonction SQL ?
2596
-	// chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2597
-	if (preg_match('/^(.*)' . SQL_ARGS . '$/', (string) $col, $m)) {
2598
-		$fct = $m[1];
2599
-		preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2600
-		$col = $a[1];
2601
-		if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2602
-			$col = $m[1];
2603
-			$args_sql = $m[2];
2604
-		}
2605
-		$args_sql .= $a[2];
2606
-	}
2607
-
2608
-	return [$fct, $col, $op, $val, $args_sql];
2524
+    // cas d'une valeur comparee a elle-meme ou son referent
2525
+    if ((is_countable($crit->param) ? count($crit->param) : 0) == 0) {
2526
+        $op = '=';
2527
+        $col = $val = $crit->op;
2528
+        if (preg_match('/^(.*)\.(.*)$/', $col, $r)) {
2529
+            $val = $r[2];
2530
+        }
2531
+        // Cas special {lang} : aller chercher $GLOBALS['spip_lang']
2532
+        if ($val == 'lang') {
2533
+            $val = [kwote('$GLOBALS[\'spip_lang\']')];
2534
+        } else {
2535
+            $defaut = null;
2536
+            if ($val == 'id_parent') {
2537
+                // Si id_parent, comparer l'id_parent avec l'id_objet
2538
+                // de la boucle superieure.... faudrait verifier qu'il existe
2539
+                // pour eviter l'erreur SQL
2540
+                $val = $boucles[$idb]->primary;
2541
+                // mais si pas de boucle superieure, prendre id_parent dans l'env
2542
+                $defaut = "(\$Pile[0]['id_parent'] ?? null)";
2543
+            } elseif ($val == 'id_enfant') {
2544
+                // Si id_enfant, comparer l'id_objet avec l'id_parent
2545
+                // de la boucle superieure
2546
+                $val = 'id_parent';
2547
+            } elseif ($crit->cond && ($col == 'date' || $col == 'date_redac')) {
2548
+                // un critere conditionnel sur date est traite a part
2549
+                // car la date est mise d'office par SPIP,
2550
+                $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])";
2551
+            }
2552
+
2553
+            $val = calculer_argument_precedent($idb, $val, $boucles, $defaut);
2554
+            $val = [kwote($val)];
2555
+        }
2556
+    } else {
2557
+        // comparaison explicite
2558
+        // le phraseur impose que le premier param soit du texte
2559
+        $params = $crit->param;
2560
+        $op = $crit->op;
2561
+        if ($op == '==') {
2562
+            $op = 'REGEXP';
2563
+        }
2564
+        $col = array_shift($params);
2565
+        $col = $col[0]->texte;
2566
+
2567
+        $val = [];
2568
+        $parent = $boucles[$idb]->id_parent;
2569
+
2570
+        // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur,
2571
+        // celui ne sachant pas ce qu'est un critere infixe
2572
+        // et a fortiori son 2e operande qu'entoure " ou '
2573
+        if (
2574
+            (is_countable($params) ? count($params) : 0) == 1
2575
+            && (is_countable($params[0]) ? count($params[0]) : 0) == 3
2576
+            && $params[0][0]->type == 'texte'
2577
+            && $params[0][2]->type == 'texte'
2578
+            && ($p = $params[0][0]->texte) == $params[0][2]->texte
2579
+            && ($p == "'" || $p == '"')
2580
+            && $params[0][1]->type == 'champ'
2581
+        ) {
2582
+            $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p";
2583
+        } else {
2584
+            foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) {
2585
+                $a = calculer_liste($p, $idb, $boucles, $parent);
2586
+                $val[] = strcasecmp($op, 'IN') == 0
2587
+                    ? $a
2588
+                    // toujours quoter en char ici
2589
+                    : kwote($a, $boucles[$idb]->sql_serveur, '@@defaultcast@@');
2590
+            }
2591
+        }
2592
+    }
2593
+
2594
+    $fct = $args_sql = '';
2595
+    // fonction SQL ?
2596
+    // chercher FONCTION(champ) tel que CONCAT(titre,descriptif)
2597
+    if (preg_match('/^(.*)' . SQL_ARGS . '$/', (string) $col, $m)) {
2598
+        $fct = $m[1];
2599
+        preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
2600
+        $col = $a[1];
2601
+        if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) {
2602
+            $col = $m[1];
2603
+            $args_sql = $m[2];
2604
+        }
2605
+        $args_sql .= $a[2];
2606
+    }
2607
+
2608
+    return [$fct, $col, $op, $val, $args_sql];
2609 2609
 }
2610 2610
 
2611 2611
 // compatibilite ancienne version
2612 2612
 
2613 2613
 function calculer_vieux_in($params) {
2614
-	$deb = $params[0][0];
2615
-	$k = (is_countable($params) ? count($params) : 0) - 1;
2616
-	$last = $params[$k];
2617
-	$j = (is_countable($last) ? count($last) : 0) - 1;
2618
-	$last = $last[$j];
2619
-	$n = isset($last->texte) ? strlen((string) $last->texte) : 0;
2620
-
2621
-	if (
2622
-		!((isset($deb->texte[0]) && $deb->texte[0] == '(')
2623
-		&& (isset($last->texte[$n - 1]) && $last->texte[$n - 1] == ')'))
2624
-	) {
2625
-		return $params;
2626
-	}
2627
-	$params[0][0]->texte = substr((string) $deb->texte, 1);
2628
-	// attention, on peut avoir k=0,j=0 ==> recalculer
2629
-	$last = $params[$k][$j];
2630
-	$n = strlen((string) $last->texte);
2631
-	$params[$k][$j]->texte = substr((string) $last->texte, 0, $n - 1);
2632
-	$newp = [];
2633
-	foreach ($params as $v) {
2634
-		if ($v[0]->type != 'texte') {
2635
-			$newp[] = $v;
2636
-		} else {
2637
-			foreach (explode(',', (string) $v[0]->texte) as $x) {
2638
-				$t = new Texte();
2639
-				$t->texte = $x;
2640
-				$newp[] = [$t];
2641
-			}
2642
-		}
2643
-	}
2644
-
2645
-	return $newp;
2614
+    $deb = $params[0][0];
2615
+    $k = (is_countable($params) ? count($params) : 0) - 1;
2616
+    $last = $params[$k];
2617
+    $j = (is_countable($last) ? count($last) : 0) - 1;
2618
+    $last = $last[$j];
2619
+    $n = isset($last->texte) ? strlen((string) $last->texte) : 0;
2620
+
2621
+    if (
2622
+        !((isset($deb->texte[0]) && $deb->texte[0] == '(')
2623
+        && (isset($last->texte[$n - 1]) && $last->texte[$n - 1] == ')'))
2624
+    ) {
2625
+        return $params;
2626
+    }
2627
+    $params[0][0]->texte = substr((string) $deb->texte, 1);
2628
+    // attention, on peut avoir k=0,j=0 ==> recalculer
2629
+    $last = $params[$k][$j];
2630
+    $n = strlen((string) $last->texte);
2631
+    $params[$k][$j]->texte = substr((string) $last->texte, 0, $n - 1);
2632
+    $newp = [];
2633
+    foreach ($params as $v) {
2634
+        if ($v[0]->type != 'texte') {
2635
+            $newp[] = $v;
2636
+        } else {
2637
+            foreach (explode(',', (string) $v[0]->texte) as $x) {
2638
+                $t = new Texte();
2639
+                $t->texte = $x;
2640
+                $newp[] = [$t];
2641
+            }
2642
+        }
2643
+    }
2644
+
2645
+    return $newp;
2646 2646
 }
2647 2647
 
2648 2648
 /**
@@ -2661,91 +2661,91 @@  discard block
 block discarded – undo
2661 2661
  *     - nom de la colonne de date (si le calcul n'est pas relatif)
2662 2662
  **/
2663 2663
 function calculer_critere_infixe_date($idb, &$boucles, $col) {
2664
-	if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2665
-		return '';
2666
-	}
2667
-
2668
-	$boucle = $boucles[$idb];
2669
-	$table = $boucle->show;
2670
-
2671
-	// si c'est une colonne de la table, ne rien faire
2672
-	if (isset($table['field'][$col])) {
2673
-		return '';
2674
-	}
2675
-
2676
-	// Le type de critère à prendre en compte
2677
-	$col = $regs[1];
2678
-
2679
-	// Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2680
-	if (isset($regs[3]) && ($suite = $regs[3])) {
2681
-		# Recherche de l'existence du champ date_xxxx,
2682
-		# si oui choisir ce champ, sinon choisir xxxx
2683
-		$date_orig = isset($table['field']["date$suite"]) ? 'date' . $suite : substr($suite, 1);
2684
-
2685
-		$pred = $date_orig;
2686
-	} else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2687
-		// Si aucune déclaration trouvée, on quitte
2688
-		if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2689
-			return '';
2690
-		}
2691
-		// Par défaut, on prend le champ date déclaré dans l'API
2692
-		$pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2693
-
2694
-		// Si c'est pour du relatif
2695
-		if (isset($regs[2]) && ($rel = $regs[2])) {
2696
-			$pred = 'date';
2697
-		}
2698
-	}
2699
-
2700
-	$date_compare = "\"' . normaliser_date(" .
2701
-		calculer_argument_precedent($idb, $pred, $boucles) .
2702
-		") . '\"";
2703
-
2704
-	$col_vraie = $date_orig;
2705
-	$date_orig = $boucle->id_table . '.' . $date_orig;
2706
-
2707
-	switch ($col) {
2708
-		case 'date':
2709
-			$col = $date_orig;
2710
-			break;
2711
-		case 'jour':
2712
-			$col = "DAYOFMONTH($date_orig)";
2713
-			break;
2714
-		case 'mois':
2715
-			$col = "MONTH($date_orig)";
2716
-			break;
2717
-		case 'annee':
2718
-			$col = "YEAR($date_orig)";
2719
-			break;
2720
-		case 'heure':
2721
-			$col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2722
-			break;
2723
-		case 'age':
2724
-			$col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2725
-			$col_vraie = '';// comparer a un int (par defaut)
2726
-			break;
2727
-		case 'age_relatif':
2728
-			$col = calculer_param_date($date_compare, $date_orig);
2729
-			$col_vraie = '';// comparer a un int (par defaut)
2730
-			break;
2731
-		case 'jour_relatif':
2732
-			$col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2733
-			$col_vraie = '';// comparer a un int (par defaut)
2734
-			break;
2735
-		case 'mois_relatif':
2736
-			$col = 'MONTH(' . $date_compare . ')-MONTH(' .
2737
-				$date_orig . ')+12*(YEAR(' . $date_compare .
2738
-				')-YEAR(' . $date_orig . '))';
2739
-			$col_vraie = '';// comparer a un int (par defaut)
2740
-			break;
2741
-		case 'annee_relatif':
2742
-			$col = 'YEAR(' . $date_compare . ')-YEAR(' .
2743
-				$date_orig . ')';
2744
-			$col_vraie = '';// comparer a un int (par defaut)
2745
-			break;
2746
-	}
2747
-
2748
-	return [$col, $col_vraie];
2664
+    if (!preg_match(',^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z_]+)?$,', $col, $regs)) {
2665
+        return '';
2666
+    }
2667
+
2668
+    $boucle = $boucles[$idb];
2669
+    $table = $boucle->show;
2670
+
2671
+    // si c'est une colonne de la table, ne rien faire
2672
+    if (isset($table['field'][$col])) {
2673
+        return '';
2674
+    }
2675
+
2676
+    // Le type de critère à prendre en compte
2677
+    $col = $regs[1];
2678
+
2679
+    // Si on trouve un nom de champ date précis, on l'utilise, pas besoin de déclaration dans l'API objet
2680
+    if (isset($regs[3]) && ($suite = $regs[3])) {
2681
+        # Recherche de l'existence du champ date_xxxx,
2682
+        # si oui choisir ce champ, sinon choisir xxxx
2683
+        $date_orig = isset($table['field']["date$suite"]) ? 'date' . $suite : substr($suite, 1);
2684
+
2685
+        $pred = $date_orig;
2686
+    } else { // Sinon il FAUT avoir déclaré le champ date officiel dans l'API objet
2687
+        // Si aucune déclaration trouvée, on quitte
2688
+        if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) {
2689
+            return '';
2690
+        }
2691
+        // Par défaut, on prend le champ date déclaré dans l'API
2692
+        $pred = $date_orig = $GLOBALS['table_date'][$table['id_table']] ?? $table['date'];
2693
+
2694
+        // Si c'est pour du relatif
2695
+        if (isset($regs[2]) && ($rel = $regs[2])) {
2696
+            $pred = 'date';
2697
+        }
2698
+    }
2699
+
2700
+    $date_compare = "\"' . normaliser_date(" .
2701
+        calculer_argument_precedent($idb, $pred, $boucles) .
2702
+        ") . '\"";
2703
+
2704
+    $col_vraie = $date_orig;
2705
+    $date_orig = $boucle->id_table . '.' . $date_orig;
2706
+
2707
+    switch ($col) {
2708
+        case 'date':
2709
+            $col = $date_orig;
2710
+            break;
2711
+        case 'jour':
2712
+            $col = "DAYOFMONTH($date_orig)";
2713
+            break;
2714
+        case 'mois':
2715
+            $col = "MONTH($date_orig)";
2716
+            break;
2717
+        case 'annee':
2718
+            $col = "YEAR($date_orig)";
2719
+            break;
2720
+        case 'heure':
2721
+            $col = "DATE_FORMAT($date_orig, \\'%H:%i\\')";
2722
+            break;
2723
+        case 'age':
2724
+            $col = calculer_param_date("\'' . date('Y-m-d H:i:00') . '\'", $date_orig);
2725
+            $col_vraie = '';// comparer a un int (par defaut)
2726
+            break;
2727
+        case 'age_relatif':
2728
+            $col = calculer_param_date($date_compare, $date_orig);
2729
+            $col_vraie = '';// comparer a un int (par defaut)
2730
+            break;
2731
+        case 'jour_relatif':
2732
+            $col = '(TO_DAYS(' . $date_compare . ')-TO_DAYS(' . $date_orig . '))';
2733
+            $col_vraie = '';// comparer a un int (par defaut)
2734
+            break;
2735
+        case 'mois_relatif':
2736
+            $col = 'MONTH(' . $date_compare . ')-MONTH(' .
2737
+                $date_orig . ')+12*(YEAR(' . $date_compare .
2738
+                ')-YEAR(' . $date_orig . '))';
2739
+            $col_vraie = '';// comparer a un int (par defaut)
2740
+            break;
2741
+        case 'annee_relatif':
2742
+            $col = 'YEAR(' . $date_compare . ')-YEAR(' .
2743
+                $date_orig . ')';
2744
+            $col_vraie = '';// comparer a un int (par defaut)
2745
+            break;
2746
+    }
2747
+
2748
+    return [$col, $col_vraie];
2749 2749
 }
2750 2750
 
2751 2751
 /**
@@ -2764,16 +2764,16 @@  discard block
 block discarded – undo
2764 2764
  *     de colonne SQL et une date.
2765 2765
  **/
2766 2766
 function calculer_param_date($date_compare, $date_orig) {
2767
-	if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2768
-		$init = "'\" . (\$x = $r[1]) . \"'";
2769
-		$date_compare = '\'$x\'';
2770
-	} else {
2771
-		$init = $date_compare;
2772
-	}
2773
-
2774
-	return
2775
-		// optimisation : mais prevoir le support SQLite avant
2776
-		"TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2767
+    if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) {
2768
+        $init = "'\" . (\$x = $r[1]) . \"'";
2769
+        $date_compare = '\'$x\'';
2770
+    } else {
2771
+        $init = $date_compare;
2772
+    }
2773
+
2774
+    return
2775
+        // optimisation : mais prevoir le support SQLite avant
2776
+        "TIMESTAMPDIFF(HOUR,$date_orig,$init)/24";
2777 2777
 }
2778 2778
 
2779 2779
 /**
@@ -2791,17 +2791,17 @@  discard block
 block discarded – undo
2791 2791
  * @param Critere $crit Paramètres du critère dans cette boucle
2792 2792
  */
2793 2793
 function critere_DATA_source_dist($idb, &$boucles, $crit) {
2794
-	$boucle = &$boucles[$idb];
2794
+    $boucle = &$boucles[$idb];
2795 2795
 
2796
-	$args = [];
2797
-	foreach ($crit->param as &$param) {
2798
-		$args[] = calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent);
2799
-	}
2796
+    $args = [];
2797
+    foreach ($crit->param as &$param) {
2798
+        $args[] = calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent);
2799
+    }
2800 2800
 
2801
-	$boucle->hash .= '
2801
+    $boucle->hash .= '
2802 2802
 	$command[\'sourcemode\'] = ' . array_shift($args) . ";\n";
2803 2803
 
2804
-	$boucle->hash .= '
2804
+    $boucle->hash .= '
2805 2805
 	$command[\'source\'] = array(' . implode(', ', $args) . ");\n";
2806 2806
 }
2807 2807
 
@@ -2819,8 +2819,8 @@  discard block
 block discarded – undo
2819 2819
  * @param Critere $crit Paramètres du critère dans cette boucle
2820 2820
  */
2821 2821
 function critere_DATA_datacache_dist($idb, &$boucles, $crit) {
2822
-	$boucle = &$boucles[$idb];
2823
-	$boucle->hash .= '
2822
+    $boucle = &$boucles[$idb];
2823
+    $boucle->hash .= '
2824 2824
 	$command[\'datacache\'] = ' . calculer_liste($crit->param[0], $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2825 2825
 }
2826 2826
 
@@ -2836,12 +2836,12 @@  discard block
 block discarded – undo
2836 2836
  * @param Critere $crit Paramètres du critère dans cette boucle
2837 2837
  */
2838 2838
 function critere_php_args_dist($idb, &$boucles, $crit) {
2839
-	$boucle = &$boucles[$idb];
2840
-	$boucle->hash .= '$command[\'args\']=array();';
2841
-	foreach ($crit->param as $param) {
2842
-		$boucle->hash .= '
2839
+    $boucle = &$boucles[$idb];
2840
+    $boucle->hash .= '$command[\'args\']=array();';
2841
+    foreach ($crit->param as $param) {
2842
+        $boucle->hash .= '
2843 2843
 			$command[\'args\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2844
-	}
2844
+    }
2845 2845
 }
2846 2846
 
2847 2847
 /**
@@ -2858,16 +2858,16 @@  discard block
 block discarded – undo
2858 2858
  * @param Critere $crit Paramètres du critère dans cette boucle
2859 2859
  */
2860 2860
 function critere_DATA_liste_dist($idb, &$boucles, $crit) {
2861
-	$boucle = &$boucles[$idb];
2862
-	$boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2863
-	foreach ($crit->param as $param) {
2864
-		$boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2865
-			$param,
2866
-			$idb,
2867
-			$boucles,
2868
-			$boucles[$idb]->id_parent
2869
-		) . ";\n";
2870
-	}
2861
+    $boucle = &$boucles[$idb];
2862
+    $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n";
2863
+    foreach ($crit->param as $param) {
2864
+        $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste(
2865
+            $param,
2866
+            $idb,
2867
+            $boucles,
2868
+            $boucles[$idb]->id_parent
2869
+        ) . ";\n";
2870
+    }
2871 2871
 }
2872 2872
 
2873 2873
 /**
@@ -2892,16 +2892,16 @@  discard block
 block discarded – undo
2892 2892
  * @param Critere $crit Paramètres du critère dans cette boucle
2893 2893
  */
2894 2894
 function critere_DATA_enum_dist($idb, &$boucles, $crit) {
2895
-	$boucle = &$boucles[$idb];
2896
-	$boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2897
-	foreach ($crit->param as $param) {
2898
-		$boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2899
-			$param,
2900
-			$idb,
2901
-			$boucles,
2902
-			$boucles[$idb]->id_parent
2903
-		) . ";\n";
2904
-	}
2895
+    $boucle = &$boucles[$idb];
2896
+    $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n";
2897
+    foreach ($crit->param as $param) {
2898
+        $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste(
2899
+            $param,
2900
+            $idb,
2901
+            $boucles,
2902
+            $boucles[$idb]->id_parent
2903
+        ) . ";\n";
2904
+    }
2905 2905
 }
2906 2906
 
2907 2907
 /**
@@ -2916,11 +2916,11 @@  discard block
 block discarded – undo
2916 2916
  * @param Critere $crit Paramètres du critère dans cette boucle
2917 2917
  */
2918 2918
 function critere_DATA_datapath_dist($idb, &$boucles, $crit) {
2919
-	$boucle = &$boucles[$idb];
2920
-	foreach ($crit->param as $param) {
2921
-		$boucle->hash .= '
2919
+    $boucle = &$boucles[$idb];
2920
+    foreach ($crit->param as $param) {
2921
+        $boucle->hash .= '
2922 2922
 			$command[\'datapath\'][] = ' . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ';';
2923
-	}
2923
+    }
2924 2924
 }
2925 2925
 
2926 2926
 
@@ -2952,20 +2952,20 @@  discard block
 block discarded – undo
2952 2952
  * @param Critere $crit Paramètres du critère dans cette boucle
2953 2953
  */
2954 2954
 function critere_si_dist($idb, &$boucles, $crit) {
2955
-	$boucle = &$boucles[$idb];
2956
-	// il faut initialiser 1 fois le tableau a chaque appel de la boucle
2957
-	// (par exemple lorsque notre boucle est appelee dans une autre boucle)
2958
-	// mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2959
-	$boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2960
-	if ($crit->param) {
2961
-		foreach ($crit->param as $param) {
2962
-			$boucle->hash .= "\t\$command['si'][] = "
2963
-				. calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2964
-		}
2965
-		// interdire {si 0} aussi !
2966
-	} else {
2967
-		$boucle->hash .= '$command[\'si\'][] = 0;';
2968
-	}
2955
+    $boucle = &$boucles[$idb];
2956
+    // il faut initialiser 1 fois le tableau a chaque appel de la boucle
2957
+    // (par exemple lorsque notre boucle est appelee dans une autre boucle)
2958
+    // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle !
2959
+    $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n";
2960
+    if ($crit->param) {
2961
+        foreach ($crit->param as $param) {
2962
+            $boucle->hash .= "\t\$command['si'][] = "
2963
+                . calculer_liste($param, $idb, $boucles, $boucles[$idb]->id_parent) . ";\n";
2964
+        }
2965
+        // interdire {si 0} aussi !
2966
+    } else {
2967
+        $boucle->hash .= '$command[\'si\'][] = 0;';
2968
+    }
2969 2969
 }
2970 2970
 
2971 2971
 /**
@@ -2983,27 +2983,27 @@  discard block
 block discarded – undo
2983 2983
  */
2984 2984
 function critere_noeud_dist($idb, &$boucles, $crit) {
2985 2985
 
2986
-	$not = $crit->not;
2987
-	$boucle = &$boucles[$idb];
2988
-	$primary = $boucle->primary;
2986
+    $not = $crit->not;
2987
+    $boucle = &$boucles[$idb];
2988
+    $primary = $boucle->primary;
2989 2989
 
2990
-	if (!$primary || strpos((string) $primary, ',')) {
2991
-		erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2990
+    if (!$primary || strpos((string) $primary, ',')) {
2991
+        erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
2992 2992
 
2993
-		return;
2994
-	}
2995
-	$table = $boucle->type_requete;
2996
-	$table_sql = table_objet_sql(objet_type($table));
2993
+        return;
2994
+    }
2995
+    $table = $boucle->type_requete;
2996
+    $table_sql = table_objet_sql(objet_type($table));
2997 2997
 
2998
-	$id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2998
+    $id_parent = $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] ?? 'id_parent';
2999 2999
 
3000
-	$in = 'IN';
3001
-	$where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
3002
-	if ($not) {
3003
-		$where = ["'NOT'", $where];
3004
-	}
3000
+    $in = 'IN';
3001
+    $where = ["'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"];
3002
+    if ($not) {
3003
+        $where = ["'NOT'", $where];
3004
+    }
3005 3005
 
3006
-	$boucle->where[] = $where;
3006
+    $boucle->where[] = $where;
3007 3007
 }
3008 3008
 
3009 3009
 /**
@@ -3019,8 +3019,8 @@  discard block
 block discarded – undo
3019 3019
  * @param Critere $crit Paramètres du critère dans cette boucle
3020 3020
  */
3021 3021
 function critere_feuille_dist($idb, &$boucles, $crit) {
3022
-	$not = $crit->not;
3023
-	$crit->not = !$not;
3024
-	critere_noeud_dist($idb, $boucles, $crit);
3025
-	$crit->not = $not;
3022
+    $not = $crit->not;
3023
+    $crit->not = !$not;
3024
+    critere_noeud_dist($idb, $boucles, $crit);
3025
+    $crit->not = $not;
3026 3026
 }
Please login to merge, or discard this patch.