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