Completed
Push — master ( 3cd762...a3cb85 )
by cam
01:24 queued 20s
created
ecrire/public/interfaces.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -975,9 +975,9 @@
 block discarded – undo
975 975
 	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
976 976
 		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
977 977
 	}
978
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
978
+	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml('._TRAITEMENT_RACCOURCIS.')';
979 979
 	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
980
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
980
+	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml('._TRAITEMENT_TYPO_SANS_NUMERO.')';
981 981
 	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
982 982
 	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
983 983
 	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
Please login to merge, or discard this patch.
Indentation   +750 added lines, -750 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 
@@ -34,35 +34,35 @@  discard block
 block discarded – undo
34 34
  * @package SPIP\Core\Compilateur\AST
35 35
  */
36 36
 class Contexte {
37
-	/**
38
-	 * Description du squelette
39
-	 *
40
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
-	 *
42
-	 * Peut contenir les index :
43
-	 *
44
-	 * - nom : Nom du fichier de cache
45
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
-	 * - sourcefile : Chemin du squelette
47
-	 * - squelette : Code du squelette
48
-	 * - id_mere : Identifiant de la boucle parente
49
-	 * - documents : Pour embed et img dans les textes
50
-	 * - session : Pour un cache sessionné par auteur
51
-	 * - niv : Niveau de tabulation
52
-	 */
53
-	public array $descr = [];
54
-
55
-	/** Identifiant de la boucle */
56
-	public string $id_boucle = '';
57
-
58
-	/** Numéro de ligne dans le code source du squelette */
59
-	public int $ligne = 0;
60
-
61
-	/** Langue d'exécution */
62
-	public string $lang = '';
63
-
64
-	/** Résultat de la compilation: toujours une expression PHP */
65
-	public string $code = '';
37
+    /**
38
+     * Description du squelette
39
+     *
40
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
41
+     *
42
+     * Peut contenir les index :
43
+     *
44
+     * - nom : Nom du fichier de cache
45
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
46
+     * - sourcefile : Chemin du squelette
47
+     * - squelette : Code du squelette
48
+     * - id_mere : Identifiant de la boucle parente
49
+     * - documents : Pour embed et img dans les textes
50
+     * - session : Pour un cache sessionné par auteur
51
+     * - niv : Niveau de tabulation
52
+     */
53
+    public array $descr = [];
54
+
55
+    /** Identifiant de la boucle */
56
+    public string $id_boucle = '';
57
+
58
+    /** Numéro de ligne dans le code source du squelette */
59
+    public int $ligne = 0;
60
+
61
+    /** Langue d'exécution */
62
+    public string $lang = '';
63
+
64
+    /** Résultat de la compilation: toujours une expression PHP */
65
+    public string $code = '';
66 66
 }
67 67
 
68 68
 
@@ -72,32 +72,32 @@  discard block
 block discarded – undo
72 72
  * @package SPIP\Core\Compilateur\AST
73 73
  **/
74 74
 class Texte {
75
-	/** Type de noeud */
76
-	public string $type = 'texte';
77
-
78
-	/** Le texte */
79
-	public string $texte;
80
-
81
-	/**
82
-	 * Contenu avant le texte.
83
-	 *
84
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
85
-	 *
86
-	 * @var string|array
87
-	 */
88
-	public $avant = '';
89
-
90
-	/**
91
-	 * Contenu après le texte.
92
-	 *
93
-	 * Vide ou apostrophe simple ou double si le texte en était entouré
94
-	 *
95
-	 * @var string|array
96
-	 */
97
-	public $apres = '';
98
-
99
-	/** Numéro de ligne dans le code source du squelette */
100
-	public int $ligne = 0;
75
+    /** Type de noeud */
76
+    public string $type = 'texte';
77
+
78
+    /** Le texte */
79
+    public string $texte;
80
+
81
+    /**
82
+     * Contenu avant le texte.
83
+     *
84
+     * Vide ou apostrophe simple ou double si le texte en était entouré
85
+     *
86
+     * @var string|array
87
+     */
88
+    public $avant = '';
89
+
90
+    /**
91
+     * Contenu après le texte.
92
+     *
93
+     * Vide ou apostrophe simple ou double si le texte en était entouré
94
+     *
95
+     * @var string|array
96
+     */
97
+    public $apres = '';
98
+
99
+    /** Numéro de ligne dans le code source du squelette */
100
+    public int $ligne = 0;
101 101
 }
102 102
 
103 103
 /**
@@ -106,59 +106,59 @@  discard block
 block discarded – undo
106 106
  * @package SPIP\Core\Compilateur\AST
107 107
  **/
108 108
 class Inclure {
109
-	/** Type de noeud */
110
-	public string $type = 'include';
111
-
112
-	/**
113
-	 * Nom d'un fichier inclu
114
-	 *
115
-	 * - Objet Texte si inclusion d'un autre squelette
116
-	 * - chaîne si inclusion d'un fichier PHP directement
117
-	 *
118
-	 * @var string|Texte
119
-	 */
120
-	public $texte;
121
-
122
-	/**
123
-	 * Inutilisé, propriété générique de l'AST
124
-	 *
125
-	 * @var string|array
126
-	 */
127
-	public $avant = '';
128
-
129
-	/**
130
-	 * Inutilisé, propriété générique de l'AST
131
-	 *
132
-	 * @var string|array
133
-	 */
134
-	public $apres = '';
135
-
136
-	/** Numéro de ligne dans le code source du squelette */
137
-	public int $ligne = 0;
138
-
139
-	/** Valeurs des paramètres */
140
-	public array $param = [];
141
-
142
-	/** Source des filtres (compatibilité) (?) */
143
-	public array $fonctions = [];
144
-
145
-	/**
146
-	 * Description du squelette
147
-	 *
148
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
149
-	 *
150
-	 * Peut contenir les index :
151
-	 *
152
-	 * - nom : Nom du fichier de cache
153
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
154
-	 * - sourcefile : Chemin du squelette
155
-	 * - squelette : Code du squelette
156
-	 * - id_mere : Identifiant de la boucle parente
157
-	 * - documents : Pour embed et img dans les textes
158
-	 * - session : Pour un cache sessionné par auteur
159
-	 * - niv : Niveau de tabulation
160
-	 */
161
-	public array $descr = [];
109
+    /** Type de noeud */
110
+    public string $type = 'include';
111
+
112
+    /**
113
+     * Nom d'un fichier inclu
114
+     *
115
+     * - Objet Texte si inclusion d'un autre squelette
116
+     * - chaîne si inclusion d'un fichier PHP directement
117
+     *
118
+     * @var string|Texte
119
+     */
120
+    public $texte;
121
+
122
+    /**
123
+     * Inutilisé, propriété générique de l'AST
124
+     *
125
+     * @var string|array
126
+     */
127
+    public $avant = '';
128
+
129
+    /**
130
+     * Inutilisé, propriété générique de l'AST
131
+     *
132
+     * @var string|array
133
+     */
134
+    public $apres = '';
135
+
136
+    /** Numéro de ligne dans le code source du squelette */
137
+    public int $ligne = 0;
138
+
139
+    /** Valeurs des paramètres */
140
+    public array $param = [];
141
+
142
+    /** Source des filtres (compatibilité) (?) */
143
+    public array $fonctions = [];
144
+
145
+    /**
146
+     * Description du squelette
147
+     *
148
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
149
+     *
150
+     * Peut contenir les index :
151
+     *
152
+     * - nom : Nom du fichier de cache
153
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
154
+     * - sourcefile : Chemin du squelette
155
+     * - squelette : Code du squelette
156
+     * - id_mere : Identifiant de la boucle parente
157
+     * - documents : Pour embed et img dans les textes
158
+     * - session : Pour un cache sessionné par auteur
159
+     * - niv : Niveau de tabulation
160
+     */
161
+    public array $descr = [];
162 162
 }
163 163
 
164 164
 
@@ -168,365 +168,365 @@  discard block
 block discarded – undo
168 168
  * @package SPIP\Core\Compilateur\AST
169 169
  **/
170 170
 class Boucle {
171
-	/** Type de noeud */
172
-	public string $type = 'boucle';
173
-
174
-	/** Identifiant de la boucle */
175
-	public string $id_boucle;
176
-
177
-	/** Identifiant de la boucle parente */
178
-	public string $id_parent = '';
179
-
180
-	/** Un nom explicite qui peut être affecté manuellement à certaines boucles générées */
181
-	public string $nom = '';
182
-
183
-	/**
184
-	 * Partie avant toujours affichee
185
-	 *
186
-	 * @var string|array
187
-	 */
188
-	public $preaff = '';
189
-
190
-	/**
191
-	 * Partie optionnelle avant
192
-	 *
193
-	 * @var string|array
194
-	 */
195
-	public $avant = '';
196
-
197
-	/**
198
-	 * Pour chaque élément
199
-	 *
200
-	 * @var string|array
201
-	 */
202
-	public $milieu = '';
203
-
204
-	/**
205
-	 * Partie optionnelle après
206
-	 *
207
-	 * @var string|array
208
-	 */
209
-	public $apres = '';
210
-
211
-	/**
212
-	 * Partie alternative, si pas de résultat dans la boucle
213
-	 *
214
-	 * @var string|array
215
-	 */
216
-	public $altern = '';
217
-
218
-	/**
219
-	 * Partie apres toujours affichee
220
-	 *
221
-	 * @var string|array
222
-	 */
223
-	public $postaff = '';
224
-
225
-
226
-	/**
227
-	 * La boucle doit-elle sélectionner la langue ?
228
-	 *
229
-	 * Valeurs : '', 'oui', 'non'
230
-	 */
231
-	public string $lang_select = '';
232
-
233
-	/**
234
-	 * Alias de table d'application de la requête ou nom complet de la table SQL
235
-	 *
236
-	 * FIXME: un seul typage (string ?)
237
-	 *
238
-	 * @var string|false|null
239
-	 */
240
-	public $type_requete = null;
241
-
242
-	/**
243
-	 * La table est elle optionnelle ?
244
-	 *
245
-	 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
246
-	 */
247
-	public bool $table_optionnelle = false;
248
-
249
-	/**
250
-	 * Nom du fichier de connexion
251
-	 */
252
-	public string $sql_serveur = '';
253
-
254
-	/**
255
-	 * Paramètres de la boucle
256
-	 *
257
-	 * Description des paramètres passés à la boucle, qui servent ensuite
258
-	 * au calcul des critères
259
-	 */
260
-	public array $param = [];
261
-
262
-	/**
263
-	 * Critères de la boucle
264
-	 *
265
-	 * FIXME: type array unique.
266
-	 *
267
-	 * @var string|Critere[]
268
-	 * - string: phrasage (code brut). Il reste si erreur de critère
269
-	 * - array: analyse correcte des critères...
270
-	 */
271
-	public $criteres = [];
272
-
273
-	/**
274
-	 * Textes insérés entre 2 éléments de boucle (critère inter)
275
-	 *
276
-	 * @var string[]
277
-	 */
278
-	public array $separateur = [];
279
-
280
-	/**
281
-	 * Liste des jointures possibles avec cette table
282
-	 *
283
-	 * Les jointures par défaut de la table sont complétées en priorité
284
-	 * des jointures déclarées explicitement sur la boucle
285
-	 *
286
-	 * @see base_trouver_table_dist()
287
-	 */
288
-	public array $jointures = [];
289
-
290
-	/**
291
-	 * Jointures explicites avec cette table
292
-	 *
293
-	 * Ces jointures sont utilisées en priorité par rapport aux jointures
294
-	 * normales possibles pour retrouver les colonnes demandées extérieures
295
-	 * à la boucle.
296
-	 *
297
-	 * @var string|bool
298
-	 */
299
-	public $jointures_explicites = false;
300
-
301
-	/**
302
-	 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
303
-	 */
304
-	public string $doublons = '';
305
-
306
-	/**
307
-	 * Code PHP ajouté au début de chaque itération de boucle.
308
-	 *
309
-	 * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
310
-	 */
311
-	public string $partie = '';
312
-
313
-	/**
314
-	 * Nombre de divisions de la boucle, d'éléments à afficher,
315
-	 * ou de soustractions d'éléments à faire
316
-	 *
317
-	 * Dans les critères limitant le nombre d'éléments affichés
318
-	 * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
319
-	 */
320
-	public string $total_parties = '';
321
-
322
-	/**
323
-	 * Code PHP ajouté avant l'itération de boucle.
324
-	 *
325
-	 * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
326
-	 * pour initialiser les variables de début et de fin d'itération.
327
-	 */
328
-	public string $mode_partie = '';
329
-
330
-	/**
331
-	 * Identifiant d'une boucle qui appelle celle-ci de manière récursive
332
-	 *
333
-	 * Si une boucle est appelée de manière récursive quelque part par
334
-	 * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
335
-	 * boucle (identifiant) reçoit dans cette propriété l'identifiant
336
-	 * de l'appelant (rec)
337
-	 */
338
-	public string $externe = '';
339
-
340
-	// champs pour la construction de la requete SQL
341
-
342
-	/**
343
-	 * Liste des champs à récupérer par la boucle
344
-	 *
345
-	 * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
346
-	 *
347
-	 * @var string[]
348
-	 */
349
-	public array $select = [];
350
-
351
-	/**
352
-	 * Liste des alias / tables SQL utilisées dans la boucle
353
-	 *
354
-	 * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
355
-	 * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
356
-	 *
357
-	 * L'index 0 peut définir le type de sources de données de l'itérateur DATA
358
-	 *
359
-	 * @var string[]
360
-	 */
361
-	public array $from = [];
362
-
363
-	/**
364
-	 * Liste des alias / type de jointures utilisées dans la boucle
365
-	 *
366
-	 * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
367
-	 * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
368
-	 *
369
-	 * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
370
-	 * qui sera utilisé par défaut (créant donc un INNER JOIN).
371
-	 *
372
-	 * @var string[]
373
-	 */
374
-	public array $from_type = [];
375
-
376
-	/**
377
-	 * Liste des conditions WHERE de la boucle
378
-	 *
379
-	 * Permet de restreindre les éléments retournés par une boucle
380
-	 * en fonctions des conditions transmises dans ce tableau.
381
-	 *
382
-	 * Ce tableau peut avoir plusieurs niveaux de profondeur.
383
-	 *
384
-	 * Les éléments du premier niveau sont reliés par des AND, donc
385
-	 * chaque élément ajouté directement au where par
386
-	 * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
387
-	 * est une condition AND en plus.
388
-	 *
389
-	 * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
390
-	 * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
391
-	 * $expr = array(operateur, val1, val2)
392
-	 *
393
-	 * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
394
-	 * à réaliser tel que :
395
-	 *
396
-	 * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
397
-	 *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
398
-	 *    suivant cet ordre : "val1 operateur val2".
399
-	 *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
400
-	 * - "'AND'", "'OR'", "'NOT'" :
401
-	 *    dans ce cas val1 et val2 sont également des expressions
402
-	 *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
403
-	 *    Exemples :
404
-	 *    $boucle->where[] = array("'OR'", $expr1, $expr2);
405
-	 *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
406
-	 *
407
-	 * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
408
-	 * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
409
-	 * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
410
-	 */
411
-	public array $where = [];
412
-
413
-	public array $join = [];
414
-	public array $having = [];
415
-	public $limit = '';
416
-	public array $group = [];
417
-	public array $order = [];
418
-	public array $default_order = [];
419
-	public string $date = 'date';
420
-	public string $hash = '';
421
-	public $in = '';
422
-	public bool $sous_requete = false;
423
-
424
-	/**
425
-	 * Code PHP qui sera ajouté en tout début de la fonction de boucle
426
-	 *
427
-	 * Il sert à insérer le code calculant une hierarchie
428
-	 */
429
-	public string $hierarchie = '';
430
-
431
-	// champs pour la construction du corps PHP
432
-
433
-	/**
434
-	 * Description des sources de données de la boucle
435
-	 *
436
-	 * Description des données de la boucle issu de trouver_table
437
-	 * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
438
-	 *
439
-	 * @see base_trouver_table_dist()
440
-	 */
441
-	public array $show = [];
442
-
443
-	/**
444
-	 * Nom de la table SQL principale de la boucle, sans son préfixe
445
-	 */
446
-	public string $id_table = '';
447
-
448
-	/**
449
-	 * Nom de la clé primaire de la table SQL principale de la boucle
450
-	 */
451
-	public string $primary = '';
452
-
453
-	/**
454
-	 * Code PHP compilé de la boucle
455
-	 *
456
-	 * FIXME: un seul type (string ?)
457
-	 *
458
-	 * - false: boucle fautive ?
459
-	 *
460
-	 * @var string|false
461
-	 */
462
-	public $return = '';
463
-
464
-	public $numrows = false;
465
-	public $cptrows = false;
466
-
467
-	/**
468
-	 * Description du squelette
469
-	 *
470
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
471
-	 *
472
-	 * Peut contenir les index :
473
-	 *
474
-	 * - nom : Nom du fichier de cache
475
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
476
-	 * - sourcefile : Chemin du squelette
477
-	 * - squelette : Code du squelette
478
-	 * - id_mere : Identifiant de la boucle parente
479
-	 * - documents : Pour embed et img dans les textes
480
-	 * - session : Pour un cache sessionné par auteur
481
-	 * - niv : Niveau de tabulation
482
-	 */
483
-	public array $descr = [];
484
-
485
-	/** Numéro de ligne dans le code source du squelette */
486
-	public int $ligne = 0;
487
-
488
-
489
-	/**
490
-	 * table pour stocker les modificateurs de boucle tels que tout, plat ...,
491
-	 * utilisable par les plugins egalement
492
-	 *
493
-	 * @var array<string, mixed>
494
-	 */
495
-	public array $modificateur = [];
496
-
497
-	/**
498
-	 * Type d'itérateur utilisé pour cette boucle
499
-	 *
500
-	 * - 'SQL' dans le cadre d'une boucle sur une table SQL
501
-	 * - 'DATA' pour l'itérateur DATA, ...
502
-	 *
503
-	 * @var string
504
-	 */
505
-	public string $iterateur = ''; // type d'iterateur
506
-
507
-	/**
508
-	 * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
509
-	 */
510
-	public array $debug = [];
511
-
512
-	/**
513
-	 * Index de la boucle dont le champ présent dans cette boucle est originaire,
514
-	 * notamment si le champ a été trouve dans une boucle parente
515
-	 *
516
-	 * Tableau nom du champ => index de boucle
517
-	*/
518
-	public array $index_champ = [];
519
-
520
-	/** Résultat de la compilation (?) (sert au débusqueur) */
521
-	public string $code = '';
522
-
523
-	/** Source des filtres (compatibilité) (?) */
524
-	public array $fonctions = [];
525
-
526
-	// obsoletes, conserves provisoirement pour compatibilite
527
-	public $tout = false;
528
-	public $plat = false;
529
-	public $lien = false;
171
+    /** Type de noeud */
172
+    public string $type = 'boucle';
173
+
174
+    /** Identifiant de la boucle */
175
+    public string $id_boucle;
176
+
177
+    /** Identifiant de la boucle parente */
178
+    public string $id_parent = '';
179
+
180
+    /** Un nom explicite qui peut être affecté manuellement à certaines boucles générées */
181
+    public string $nom = '';
182
+
183
+    /**
184
+     * Partie avant toujours affichee
185
+     *
186
+     * @var string|array
187
+     */
188
+    public $preaff = '';
189
+
190
+    /**
191
+     * Partie optionnelle avant
192
+     *
193
+     * @var string|array
194
+     */
195
+    public $avant = '';
196
+
197
+    /**
198
+     * Pour chaque élément
199
+     *
200
+     * @var string|array
201
+     */
202
+    public $milieu = '';
203
+
204
+    /**
205
+     * Partie optionnelle après
206
+     *
207
+     * @var string|array
208
+     */
209
+    public $apres = '';
210
+
211
+    /**
212
+     * Partie alternative, si pas de résultat dans la boucle
213
+     *
214
+     * @var string|array
215
+     */
216
+    public $altern = '';
217
+
218
+    /**
219
+     * Partie apres toujours affichee
220
+     *
221
+     * @var string|array
222
+     */
223
+    public $postaff = '';
224
+
225
+
226
+    /**
227
+     * La boucle doit-elle sélectionner la langue ?
228
+     *
229
+     * Valeurs : '', 'oui', 'non'
230
+     */
231
+    public string $lang_select = '';
232
+
233
+    /**
234
+     * Alias de table d'application de la requête ou nom complet de la table SQL
235
+     *
236
+     * FIXME: un seul typage (string ?)
237
+     *
238
+     * @var string|false|null
239
+     */
240
+    public $type_requete = null;
241
+
242
+    /**
243
+     * La table est elle optionnelle ?
244
+     *
245
+     * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
246
+     */
247
+    public bool $table_optionnelle = false;
248
+
249
+    /**
250
+     * Nom du fichier de connexion
251
+     */
252
+    public string $sql_serveur = '';
253
+
254
+    /**
255
+     * Paramètres de la boucle
256
+     *
257
+     * Description des paramètres passés à la boucle, qui servent ensuite
258
+     * au calcul des critères
259
+     */
260
+    public array $param = [];
261
+
262
+    /**
263
+     * Critères de la boucle
264
+     *
265
+     * FIXME: type array unique.
266
+     *
267
+     * @var string|Critere[]
268
+     * - string: phrasage (code brut). Il reste si erreur de critère
269
+     * - array: analyse correcte des critères...
270
+     */
271
+    public $criteres = [];
272
+
273
+    /**
274
+     * Textes insérés entre 2 éléments de boucle (critère inter)
275
+     *
276
+     * @var string[]
277
+     */
278
+    public array $separateur = [];
279
+
280
+    /**
281
+     * Liste des jointures possibles avec cette table
282
+     *
283
+     * Les jointures par défaut de la table sont complétées en priorité
284
+     * des jointures déclarées explicitement sur la boucle
285
+     *
286
+     * @see base_trouver_table_dist()
287
+     */
288
+    public array $jointures = [];
289
+
290
+    /**
291
+     * Jointures explicites avec cette table
292
+     *
293
+     * Ces jointures sont utilisées en priorité par rapport aux jointures
294
+     * normales possibles pour retrouver les colonnes demandées extérieures
295
+     * à la boucle.
296
+     *
297
+     * @var string|bool
298
+     */
299
+    public $jointures_explicites = false;
300
+
301
+    /**
302
+     * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
303
+     */
304
+    public string $doublons = '';
305
+
306
+    /**
307
+     * Code PHP ajouté au début de chaque itération de boucle.
308
+     *
309
+     * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}...
310
+     */
311
+    public string $partie = '';
312
+
313
+    /**
314
+     * Nombre de divisions de la boucle, d'éléments à afficher,
315
+     * ou de soustractions d'éléments à faire
316
+     *
317
+     * Dans les critères limitant le nombre d'éléments affichés
318
+     * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties.
319
+     */
320
+    public string $total_parties = '';
321
+
322
+    /**
323
+     * Code PHP ajouté avant l'itération de boucle.
324
+     *
325
+     * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b}
326
+     * pour initialiser les variables de début et de fin d'itération.
327
+     */
328
+    public string $mode_partie = '';
329
+
330
+    /**
331
+     * Identifiant d'une boucle qui appelle celle-ci de manière récursive
332
+     *
333
+     * Si une boucle est appelée de manière récursive quelque part par
334
+     * une autre boucle comme <BOUCLE_rec(boucle_identifiant) />, cette
335
+     * boucle (identifiant) reçoit dans cette propriété l'identifiant
336
+     * de l'appelant (rec)
337
+     */
338
+    public string $externe = '';
339
+
340
+    // champs pour la construction de la requete SQL
341
+
342
+    /**
343
+     * Liste des champs à récupérer par la boucle
344
+     *
345
+     * Expression 'table.nom_champ' ou calculée 'nom_champ AS x'
346
+     *
347
+     * @var string[]
348
+     */
349
+    public array $select = [];
350
+
351
+    /**
352
+     * Liste des alias / tables SQL utilisées dans la boucle
353
+     *
354
+     * L'index est un identifiant (xx dans spip_xx assez souvent) qui servira
355
+     * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée.
356
+     *
357
+     * L'index 0 peut définir le type de sources de données de l'itérateur DATA
358
+     *
359
+     * @var string[]
360
+     */
361
+    public array $from = [];
362
+
363
+    /**
364
+     * Liste des alias / type de jointures utilisées dans la boucle
365
+     *
366
+     * L'index est le nom d'alias (comme pour la propriété $from), et la valeur
367
+     * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'.
368
+     *
369
+     * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER'
370
+     * qui sera utilisé par défaut (créant donc un INNER JOIN).
371
+     *
372
+     * @var string[]
373
+     */
374
+    public array $from_type = [];
375
+
376
+    /**
377
+     * Liste des conditions WHERE de la boucle
378
+     *
379
+     * Permet de restreindre les éléments retournés par une boucle
380
+     * en fonctions des conditions transmises dans ce tableau.
381
+     *
382
+     * Ce tableau peut avoir plusieurs niveaux de profondeur.
383
+     *
384
+     * Les éléments du premier niveau sont reliés par des AND, donc
385
+     * chaque élément ajouté directement au where par
386
+     * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'"
387
+     * est une condition AND en plus.
388
+     *
389
+     * Par contre, lorsqu'on indique un tableau, il peut décrire des relations
390
+     * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs :
391
+     * $expr = array(operateur, val1, val2)
392
+     *
393
+     * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur
394
+     * à réaliser tel que :
395
+     *
396
+     * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... :
397
+     *    val1 et val2 sont des champs et valeurs à utiliser dans la comparaison
398
+     *    suivant cet ordre : "val1 operateur val2".
399
+     *    Exemple : $boucle->where[] = array("'='", "'articles.statut'", "'\"publie\"'");
400
+     * - "'AND'", "'OR'", "'NOT'" :
401
+     *    dans ce cas val1 et val2 sont également des expressions
402
+     *    de comparaison complètes, et peuvent être eux-même des tableaux comme $expr
403
+     *    Exemples :
404
+     *    $boucle->where[] = array("'OR'", $expr1, $expr2);
405
+     *    $boucle->where[] = array("'NOT'", $expr); // val2 n'existe pas avec NOT
406
+     *
407
+     * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) :
408
+     * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes
409
+     * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3)
410
+     */
411
+    public array $where = [];
412
+
413
+    public array $join = [];
414
+    public array $having = [];
415
+    public $limit = '';
416
+    public array $group = [];
417
+    public array $order = [];
418
+    public array $default_order = [];
419
+    public string $date = 'date';
420
+    public string $hash = '';
421
+    public $in = '';
422
+    public bool $sous_requete = false;
423
+
424
+    /**
425
+     * Code PHP qui sera ajouté en tout début de la fonction de boucle
426
+     *
427
+     * Il sert à insérer le code calculant une hierarchie
428
+     */
429
+    public string $hierarchie = '';
430
+
431
+    // champs pour la construction du corps PHP
432
+
433
+    /**
434
+     * Description des sources de données de la boucle
435
+     *
436
+     * Description des données de la boucle issu de trouver_table
437
+     * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'.
438
+     *
439
+     * @see base_trouver_table_dist()
440
+     */
441
+    public array $show = [];
442
+
443
+    /**
444
+     * Nom de la table SQL principale de la boucle, sans son préfixe
445
+     */
446
+    public string $id_table = '';
447
+
448
+    /**
449
+     * Nom de la clé primaire de la table SQL principale de la boucle
450
+     */
451
+    public string $primary = '';
452
+
453
+    /**
454
+     * Code PHP compilé de la boucle
455
+     *
456
+     * FIXME: un seul type (string ?)
457
+     *
458
+     * - false: boucle fautive ?
459
+     *
460
+     * @var string|false
461
+     */
462
+    public $return = '';
463
+
464
+    public $numrows = false;
465
+    public $cptrows = false;
466
+
467
+    /**
468
+     * Description du squelette
469
+     *
470
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
471
+     *
472
+     * Peut contenir les index :
473
+     *
474
+     * - nom : Nom du fichier de cache
475
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
476
+     * - sourcefile : Chemin du squelette
477
+     * - squelette : Code du squelette
478
+     * - id_mere : Identifiant de la boucle parente
479
+     * - documents : Pour embed et img dans les textes
480
+     * - session : Pour un cache sessionné par auteur
481
+     * - niv : Niveau de tabulation
482
+     */
483
+    public array $descr = [];
484
+
485
+    /** Numéro de ligne dans le code source du squelette */
486
+    public int $ligne = 0;
487
+
488
+
489
+    /**
490
+     * table pour stocker les modificateurs de boucle tels que tout, plat ...,
491
+     * utilisable par les plugins egalement
492
+     *
493
+     * @var array<string, mixed>
494
+     */
495
+    public array $modificateur = [];
496
+
497
+    /**
498
+     * Type d'itérateur utilisé pour cette boucle
499
+     *
500
+     * - 'SQL' dans le cadre d'une boucle sur une table SQL
501
+     * - 'DATA' pour l'itérateur DATA, ...
502
+     *
503
+     * @var string
504
+     */
505
+    public string $iterateur = ''; // type d'iterateur
506
+
507
+    /**
508
+     * @var array $debug Textes qui seront insérés dans l’entête de boucle du mode debug
509
+     */
510
+    public array $debug = [];
511
+
512
+    /**
513
+     * Index de la boucle dont le champ présent dans cette boucle est originaire,
514
+     * notamment si le champ a été trouve dans une boucle parente
515
+     *
516
+     * Tableau nom du champ => index de boucle
517
+     */
518
+    public array $index_champ = [];
519
+
520
+    /** Résultat de la compilation (?) (sert au débusqueur) */
521
+    public string $code = '';
522
+
523
+    /** Source des filtres (compatibilité) (?) */
524
+    public array $fonctions = [];
525
+
526
+    // obsoletes, conserves provisoirement pour compatibilite
527
+    public $tout = false;
528
+    public $plat = false;
529
+    public $lien = false;
530 530
 }
531 531
 
532 532
 /**
@@ -537,30 +537,30 @@  discard block
 block discarded – undo
537 537
  * @package SPIP\Core\Compilateur\AST
538 538
  **/
539 539
 class Critere {
540
-	/** Type de noeud */
541
-	public string $type = 'critere';
540
+    /** Type de noeud */
541
+    public string $type = 'critere';
542 542
 
543
-	/** Opérateur (>, <, >=, IN, ...) */
544
-	public ?string $op;
543
+    /** Opérateur (>, <, >=, IN, ...) */
544
+    public ?string $op;
545 545
 
546
-	/** Présence d'une négation (truc !op valeur) */
547
-	public bool $not = false;
546
+    /** Présence d'une négation (truc !op valeur) */
547
+    public bool $not = false;
548 548
 
549
-	/** Présence d'une exclusion (!truc op valeur) */
550
-	public string $exclus = '';
549
+    /** Présence d'une exclusion (!truc op valeur) */
550
+    public string $exclus = '';
551 551
 
552
-	/** Présence d'une condition dans le critère (truc ?) */
553
-	public bool $cond = false;
552
+    /** Présence d'une condition dans le critère (truc ?) */
553
+    public bool $cond = false;
554 554
 
555
-	/**
556
-	 * Paramètres du critère
557
-	 * - $param[0] : élément avant l'opérateur
558
-	 * - $param[1..n] : éléments après l'opérateur
559
-	 */
560
-	public array $param = [];
555
+    /**
556
+     * Paramètres du critère
557
+     * - $param[0] : élément avant l'opérateur
558
+     * - $param[1..n] : éléments après l'opérateur
559
+     */
560
+    public array $param = [];
561 561
 
562
-	/** Numéro de ligne dans le code source du squelette */
563
-	public int $ligne = 0;
562
+    /** Numéro de ligne dans le code source du squelette */
563
+    public int $ligne = 0;
564 564
 }
565 565
 
566 566
 /**
@@ -569,100 +569,100 @@  discard block
 block discarded – undo
569 569
  * @package SPIP\Core\Compilateur\AST
570 570
  **/
571 571
 class Champ {
572
-	/** Type de noeud */
573
-	public string $type = 'champ';
574
-
575
-	/** Nom du champ demandé. Exemple 'ID_ARTICLE' */
576
-	public ?string $nom_champ;
577
-
578
-	/** Identifiant de la boucle parente si explicité */
579
-	public ?string $nom_boucle = '';
580
-
581
-	/**
582
-	 * Partie optionnelle avant
583
-	 *
584
-	 * @var null|string|array
585
-	 */
586
-	public $avant;
587
-
588
-	/**
589
-	 * Partie optionnelle après
590
-	 *
591
-	 * @var null|string|array
592
-	 */
593
-	public $apres;
594
-
595
-	/**
596
-	 * Étoiles : annuler des automatismes
597
-	 *
598
-	 * - '*' annule les filtres automatiques
599
-	 * - '**' annule en plus les protections de scripts
600
-	 */
601
-	public ?string $etoile;
602
-
603
-	/**
604
-	 * Arguments et filtres explicites sur la balise
605
-	 *
606
-	 * - $param[0] contient les arguments de la balise
607
-	 * - $param[1..n] contient les filtres à appliquer à la balise
608
-	 */
609
-	public array $param = [];
610
-
611
-	/** Source des filtres (compatibilité) (?) */
612
-	public array $fonctions = [];
613
-
614
-	/**
615
-	 * Identifiant de la boucle
616
-	 *
617
-	 * @var string
618
-	 */
619
-	public $id_boucle = '';
620
-
621
-	/**
622
-	 * AST du squelette, liste de toutes les boucles
623
-	 *
624
-	 * @var Boucle[]
625
-	 */
626
-	public array $boucles;
627
-
628
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
629
-	public ?string $type_requete;
630
-
631
-	/** Résultat de la compilation: toujours une expression PHP */
632
-	public string $code = '';
633
-
634
-	/**
635
-	 * Interdire les scripts
636
-	 *
637
-	 * false si on est sûr de cette balise
638
-	 *
639
-	 * @see interdire_scripts()
640
-	 */
641
-	public bool $interdire_scripts = true;
642
-
643
-	/**
644
-	 * Description du squelette
645
-	 *
646
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
647
-	 *
648
-	 * Peut contenir les index :
649
-	 *
650
-	 * - nom : Nom du fichier de cache
651
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
652
-	 * - sourcefile : Chemin du squelette
653
-	 * - squelette : Code du squelette
654
-	 * - id_mere : Identifiant de la boucle parente
655
-	 * - documents : Pour embed et img dans les textes
656
-	 * - session : Pour un cache sessionné par auteur
657
-	 * - niv : Niveau de tabulation
658
-	 */
659
-	public array $descr = [];
660
-
661
-	/** Numéro de ligne dans le code source du squelette*/
662
-	public int $ligne = 0;
663
-
664
-	/** Drapeau pour reperer les balises calculées par une fonction explicite */
665
-	public bool $balise_calculee = false;
572
+    /** Type de noeud */
573
+    public string $type = 'champ';
574
+
575
+    /** Nom du champ demandé. Exemple 'ID_ARTICLE' */
576
+    public ?string $nom_champ;
577
+
578
+    /** Identifiant de la boucle parente si explicité */
579
+    public ?string $nom_boucle = '';
580
+
581
+    /**
582
+     * Partie optionnelle avant
583
+     *
584
+     * @var null|string|array
585
+     */
586
+    public $avant;
587
+
588
+    /**
589
+     * Partie optionnelle après
590
+     *
591
+     * @var null|string|array
592
+     */
593
+    public $apres;
594
+
595
+    /**
596
+     * Étoiles : annuler des automatismes
597
+     *
598
+     * - '*' annule les filtres automatiques
599
+     * - '**' annule en plus les protections de scripts
600
+     */
601
+    public ?string $etoile;
602
+
603
+    /**
604
+     * Arguments et filtres explicites sur la balise
605
+     *
606
+     * - $param[0] contient les arguments de la balise
607
+     * - $param[1..n] contient les filtres à appliquer à la balise
608
+     */
609
+    public array $param = [];
610
+
611
+    /** Source des filtres (compatibilité) (?) */
612
+    public array $fonctions = [];
613
+
614
+    /**
615
+     * Identifiant de la boucle
616
+     *
617
+     * @var string
618
+     */
619
+    public $id_boucle = '';
620
+
621
+    /**
622
+     * AST du squelette, liste de toutes les boucles
623
+     *
624
+     * @var Boucle[]
625
+     */
626
+    public array $boucles;
627
+
628
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
629
+    public ?string $type_requete;
630
+
631
+    /** Résultat de la compilation: toujours une expression PHP */
632
+    public string $code = '';
633
+
634
+    /**
635
+     * Interdire les scripts
636
+     *
637
+     * false si on est sûr de cette balise
638
+     *
639
+     * @see interdire_scripts()
640
+     */
641
+    public bool $interdire_scripts = true;
642
+
643
+    /**
644
+     * Description du squelette
645
+     *
646
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
647
+     *
648
+     * Peut contenir les index :
649
+     *
650
+     * - nom : Nom du fichier de cache
651
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
652
+     * - sourcefile : Chemin du squelette
653
+     * - squelette : Code du squelette
654
+     * - id_mere : Identifiant de la boucle parente
655
+     * - documents : Pour embed et img dans les textes
656
+     * - session : Pour un cache sessionné par auteur
657
+     * - niv : Niveau de tabulation
658
+     */
659
+    public array $descr = [];
660
+
661
+    /** Numéro de ligne dans le code source du squelette*/
662
+    public int $ligne = 0;
663
+
664
+    /** Drapeau pour reperer les balises calculées par une fonction explicite */
665
+    public bool $balise_calculee = false;
666 666
 }
667 667
 
668 668
 
@@ -670,80 +670,80 @@  discard block
 block discarded – undo
670 670
  * Description d'une chaîne de langue
671 671
  **/
672 672
 class Idiome {
673
-	/** Type de noeud */
674
-	public string $type = 'idiome';
675
-
676
-	/** Clé de traduction demandée. Exemple 'item_oui' */
677
-	public string $nom_champ = '';
678
-
679
-	/** Module de langue où chercher la clé de traduction. Exemple 'medias' */
680
-	public string $module = '';
681
-
682
-	/** Arguments à passer à la chaîne */
683
-	public array $arg = [];
684
-
685
-	/** Filtres à appliquer au résultat */
686
-	public array $param = [];
687
-
688
-	/** Source des filtres (compatibilité) (?) */
689
-	public array $fonctions = [];
690
-
691
-	/**
692
-	 * Inutilisé, propriété générique de l'AST
693
-	 *
694
-	 * @var string|array
695
-	 */
696
-	public $avant = '';
697
-
698
-	/**
699
-	 * Inutilisé, propriété générique de l'AST
700
-	 *
701
-	 * @var string|array
702
-	 */
703
-	public $apres = '';
704
-
705
-	/** Identifiant de la boucle */
706
-	public string $id_boucle = '';
707
-
708
-	/**
709
-	 * AST du squelette, liste de toutes les boucles
710
-	 *
711
-	 * @var Boucle[]
712
-	 */
713
-	public array $boucles;
714
-
715
-	/** Alias de table d'application de la requête ou nom complet de la table SQL */
716
-	public ?string $type_requete;
717
-
718
-	/** Résultat de la compilation: toujours une expression PHP */
719
-	public string $code = '';
720
-
721
-	/**
722
-	 * Interdire les scripts
723
-	 *
724
-	 * @see interdire_scripts()
725
-	 */
726
-	public bool $interdire_scripts = false;
727
-
728
-	/**
729
-	 * Description du squelette
730
-	 *
731
-	 * Sert pour la gestion d'erreur et la production de code dependant du contexte
732
-	 *
733
-	 * Peut contenir les index :
734
-	 * - nom : Nom du fichier de cache
735
-	 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
736
-	 * - sourcefile : Chemin du squelette
737
-	 * - squelette : Code du squelette
738
-	 * - id_mere : Identifiant de la boucle parente
739
-	 * - documents : Pour embed et img dans les textes
740
-	 * - session : Pour un cache sessionné par auteur
741
-	 * - niv : Niveau de tabulation
742
-	 */
743
-	public array $descr = [];
744
-
745
-	/** Numéro de ligne dans le code source du squelette */
746
-	public int $ligne = 0;
673
+    /** Type de noeud */
674
+    public string $type = 'idiome';
675
+
676
+    /** Clé de traduction demandée. Exemple 'item_oui' */
677
+    public string $nom_champ = '';
678
+
679
+    /** Module de langue où chercher la clé de traduction. Exemple 'medias' */
680
+    public string $module = '';
681
+
682
+    /** Arguments à passer à la chaîne */
683
+    public array $arg = [];
684
+
685
+    /** Filtres à appliquer au résultat */
686
+    public array $param = [];
687
+
688
+    /** Source des filtres (compatibilité) (?) */
689
+    public array $fonctions = [];
690
+
691
+    /**
692
+     * Inutilisé, propriété générique de l'AST
693
+     *
694
+     * @var string|array
695
+     */
696
+    public $avant = '';
697
+
698
+    /**
699
+     * Inutilisé, propriété générique de l'AST
700
+     *
701
+     * @var string|array
702
+     */
703
+    public $apres = '';
704
+
705
+    /** Identifiant de la boucle */
706
+    public string $id_boucle = '';
707
+
708
+    /**
709
+     * AST du squelette, liste de toutes les boucles
710
+     *
711
+     * @var Boucle[]
712
+     */
713
+    public array $boucles;
714
+
715
+    /** Alias de table d'application de la requête ou nom complet de la table SQL */
716
+    public ?string $type_requete;
717
+
718
+    /** Résultat de la compilation: toujours une expression PHP */
719
+    public string $code = '';
720
+
721
+    /**
722
+     * Interdire les scripts
723
+     *
724
+     * @see interdire_scripts()
725
+     */
726
+    public bool $interdire_scripts = false;
727
+
728
+    /**
729
+     * Description du squelette
730
+     *
731
+     * Sert pour la gestion d'erreur et la production de code dependant du contexte
732
+     *
733
+     * Peut contenir les index :
734
+     * - nom : Nom du fichier de cache
735
+     * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
736
+     * - sourcefile : Chemin du squelette
737
+     * - squelette : Code du squelette
738
+     * - id_mere : Identifiant de la boucle parente
739
+     * - documents : Pour embed et img dans les textes
740
+     * - session : Pour un cache sessionné par auteur
741
+     * - niv : Niveau de tabulation
742
+     */
743
+    public array $descr = [];
744
+
745
+    /** Numéro de ligne dans le code source du squelette */
746
+    public int $ligne = 0;
747 747
 }
748 748
 
749 749
 /**
@@ -752,18 +752,18 @@  discard block
 block discarded – undo
752 752
  * @package SPIP\Core\Compilateur\AST
753 753
  **/
754 754
 class Polyglotte {
755
-	/** Type de noeud */
756
-	public string $type = 'polyglotte';
757
-
758
-	/**
759
-	 * Tableau des traductions possibles classées par langue
760
-	 *
761
-	 * Tableau code de langue => texte
762
-	 */
763
-	public array $traductions = [];
764
-
765
-	/** Numéro de ligne dans le code source du squelette */
766
-	public int $ligne = 0;
755
+    /** Type de noeud */
756
+    public string $type = 'polyglotte';
757
+
758
+    /**
759
+     * Tableau des traductions possibles classées par langue
760
+     *
761
+     * Tableau code de langue => texte
762
+     */
763
+    public array $traductions = [];
764
+
765
+    /** Numéro de ligne dans le code source du squelette */
766
+    public int $ligne = 0;
767 767
 }
768 768
 
769 769
 
@@ -786,90 +786,90 @@  discard block
 block discarded – undo
786 786
  */
787 787
 function declarer_interfaces() {
788 788
 
789
-	$GLOBALS['table_des_tables']['articles'] = 'articles';
790
-	$GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
791
-	$GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
792
-	$GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
793
-
794
-	// definition des statuts de publication
795
-	$GLOBALS['table_statut'] = [];
796
-
797
-	//
798
-	// tableau des tables de jointures
799
-	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
800
-	$GLOBALS['tables_jointures'] = [];
801
-	$GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
802
-
803
-	// $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
804
-	$GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
805
-
806
-
807
-	if (!defined('_TRAITEMENT_TYPO')) {
808
-		define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
809
-	}
810
-	if (!defined('_TRAITEMENT_RACCOURCIS')) {
811
-		define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
812
-	}
813
-	if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
814
-		define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
815
-	}
816
-	$GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
817
-	$GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
818
-	$GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
819
-	$GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
820
-	$GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
821
-	$GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
822
-	$GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
823
-	$GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
824
-	$GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
825
-	$GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
826
-	$GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
827
-	$GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
828
-	$GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
829
-	$GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
830
-	$GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
831
-	$GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
832
-	$GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
833
-	$GLOBALS['table_des_traitements']['TAGS'][] = '%s';
834
-	$GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
835
-	$GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
836
-	$GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
837
-	$GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
838
-	$GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
839
-	$GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
840
-
841
-	// valeur par defaut pour les balises non listees ci-dessus
842
-	$GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
843
-	// toujours securiser les DATA
844
-	$GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
845
-	// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
846
-	$GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
847
-
848
-
849
-	// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
850
-	$interfaces = pipeline(
851
-		'declarer_tables_interfaces',
852
-		[
853
-			'table_des_tables' => $GLOBALS['table_des_tables'],
854
-			'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
855
-			'table_date' => $GLOBALS['table_date'],
856
-			'table_titre' => $GLOBALS['table_titre'],
857
-			'tables_jointures' => $GLOBALS['tables_jointures'],
858
-			'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
859
-			'table_des_traitements' => $GLOBALS['table_des_traitements'],
860
-			'table_statut' => $GLOBALS['table_statut'],
861
-		]
862
-	);
863
-	if ($interfaces) {
864
-		$GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
865
-		$GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
866
-		$GLOBALS['table_date'] = $interfaces['table_date'];
867
-		$GLOBALS['table_titre'] = $interfaces['table_titre'];
868
-		$GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
869
-		$GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
870
-		$GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
871
-		$GLOBALS['table_statut'] = $interfaces['table_statut'];
872
-	}
789
+    $GLOBALS['table_des_tables']['articles'] = 'articles';
790
+    $GLOBALS['table_des_tables']['auteurs'] = 'auteurs';
791
+    $GLOBALS['table_des_tables']['rubriques'] = 'rubriques';
792
+    $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques';
793
+
794
+    // definition des statuts de publication
795
+    $GLOBALS['table_statut'] = [];
796
+
797
+    //
798
+    // tableau des tables de jointures
799
+    // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
800
+    $GLOBALS['tables_jointures'] = [];
801
+    $GLOBALS['tables_jointures']['spip_jobs'][] = 'jobs_liens';
802
+
803
+    // $GLOBALS['exceptions_des_jointures']['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
804
+    $GLOBALS['exceptions_des_jointures']['profondeur'] = ['spip_rubriques', 'profondeur'];
805
+
806
+
807
+    if (!defined('_TRAITEMENT_TYPO')) {
808
+        define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
809
+    }
810
+    if (!defined('_TRAITEMENT_RACCOURCIS')) {
811
+        define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
812
+    }
813
+    if (!defined('_TRAITEMENT_TYPO_SANS_NUMERO')) {
814
+        define('_TRAITEMENT_TYPO_SANS_NUMERO', 'supprimer_numero(typo(%s, "TYPO", $connect, $Pile[0]))');
815
+    }
816
+    $GLOBALS['table_des_traitements']['BIO'][] = 'safehtml(' . _TRAITEMENT_RACCOURCIS . ')';
817
+    $GLOBALS['table_des_traitements']['NOM_SITE']['spip_auteurs'] = 'entites_html(%s)';
818
+    $GLOBALS['table_des_traitements']['NOM']['spip_auteurs'] = 'safehtml(' . _TRAITEMENT_TYPO_SANS_NUMERO . ')';
819
+    $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS;
820
+    $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)';
821
+    $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)';
822
+    $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)';
823
+    $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)';
824
+    $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS;
825
+    $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS;
826
+    $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO;
827
+    $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
828
+    $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO;
829
+    $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS;
830
+    $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO;
831
+    $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO;
832
+    $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO;
833
+    $GLOBALS['table_des_traitements']['TAGS'][] = '%s';
834
+    $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS;
835
+    $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO;
836
+    $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO;
837
+    $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS;
838
+    $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO;
839
+    $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)';
840
+
841
+    // valeur par defaut pour les balises non listees ci-dessus
842
+    $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
843
+    // toujours securiser les DATA
844
+    $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)';
845
+    // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
846
+    $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)';
847
+
848
+
849
+    // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
850
+    $interfaces = pipeline(
851
+        'declarer_tables_interfaces',
852
+        [
853
+            'table_des_tables' => $GLOBALS['table_des_tables'],
854
+            'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'],
855
+            'table_date' => $GLOBALS['table_date'],
856
+            'table_titre' => $GLOBALS['table_titre'],
857
+            'tables_jointures' => $GLOBALS['tables_jointures'],
858
+            'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'],
859
+            'table_des_traitements' => $GLOBALS['table_des_traitements'],
860
+            'table_statut' => $GLOBALS['table_statut'],
861
+        ]
862
+    );
863
+    if ($interfaces) {
864
+        $GLOBALS['table_des_tables'] = $interfaces['table_des_tables'];
865
+        $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables'];
866
+        $GLOBALS['table_date'] = $interfaces['table_date'];
867
+        $GLOBALS['table_titre'] = $interfaces['table_titre'];
868
+        $GLOBALS['tables_jointures'] = $interfaces['tables_jointures'];
869
+        $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures'];
870
+        $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements'];
871
+        $GLOBALS['table_statut'] = $interfaces['table_statut'];
872
+    }
873 873
 }
874 874
 
875 875
 declarer_interfaces();
Please login to merge, or discard this patch.
ecrire/action/editer_article.php 2 patches
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -106,7 +106,7 @@  discard block
 block discarded – undo
106 106
 	);
107 107
 
108 108
 	// Si l'article est publie, invalider les caches et demander sa reindexation
109
-	$t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
+	$t = sql_getfetsel('statut', 'spip_articles', 'id_article='.intval($id_article));
110 110
 	$invalideur = $indexation = false;
111 111
 	if ($t == 'publie') {
112 112
 		$invalideur = "id='article/$id_article'";
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
 			$id_article,
120 120
 			[
121 121
 			'data' => $set,
122
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
+			'nonvide' => ['titre' => _T('info_nouvel_article').' '._T('info_numero_abbreviation').$id_article],
123 123
 			'invalideur' => $invalideur,
124 124
 			'indexation' => $indexation,
125 125
 			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
@@ -309,7 +309,7 @@  discard block
 block discarded – undo
309 309
 		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
310 310
 			$statut = $champs['statut'] = $s;
311 311
 		} else {
312
-			spip_log("editer_article $id_article refus " . join(' ', $c));
312
+			spip_log("editer_article $id_article refus ".join(' ', $c));
313 313
 		}
314 314
 
315 315
 		// En cas de publication, fixer la date a "maintenant"
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
 		isset($c['id_parent'])
335 335
 		and $id_parent = $c['id_parent']
336 336
 		and $id_parent != $id_rubrique
337
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
+		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique='.intval($id_parent)))
338 338
 	) {
339 339
 		$champs['id_rubrique'] = $id_parent;
340 340
 
@@ -435,7 +435,7 @@  discard block
 block discarded – undo
435 435
 	// Si on deplace l'article
436 436
 	//  changer aussi son secteur et sa langue (si heritee)
437 437
 	if (isset($champs['id_rubrique'])) {
438
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
+		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique='.sql_quote($champs['id_rubrique']));
439 439
 
440 440
 		$langue = $row_rub['lang'];
441 441
 		$champs['id_secteur'] = $row_rub['id_secteur'];
@@ -443,7 +443,7 @@  discard block
 block discarded – undo
443 443
 			sql_fetsel(
444 444
 				'1',
445 445
 				'spip_articles',
446
-				'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
+				'id_article='.intval($id_article)." AND langue_choisie<>'oui' AND lang<>".sql_quote($langue)
447 447
 			)
448 448
 		) {
449 449
 			$champs['lang'] = $langue;
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
 		return;
455 455
 	}
456 456
 
457
-	sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
+	sql_updateq('spip_articles', $champs, 'id_article='.intval($id_article));
458 458
 
459 459
 	// Changer le statut des rubriques concernees
460 460
 
@@ -475,6 +475,6 @@  discard block
 block discarded – undo
475 475
 		foreach ($plus as $n => $t) {
476 476
 			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
477 477
 		}
478
-		set_request('texte', join('', $plus) . _request('texte'));
478
+		set_request('texte', join('', $plus)._request('texte'));
479 479
 	}
480 480
 }
Please login to merge, or discard this patch.
Indentation   +323 added lines, -323 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -39,36 +39,36 @@  discard block
 block discarded – undo
39 39
  *     Liste (identifiant de l'article, Texte d'erreur éventuel)
40 40
  */
41 41
 function action_editer_article_dist($arg = null) {
42
-	include_spip('inc/autoriser');
43
-	$err = '';
44
-	if (is_null($arg)) {
45
-		$securiser_action = charger_fonction('securiser_action', 'inc');
46
-		$arg = $securiser_action();
47
-	}
48
-
49
-	// si id_article n'est pas un nombre, c'est une creation
50
-	// mais on verifie qu'on a toutes les donnees qu'il faut.
51
-	if (!$id_article = intval($arg)) {
52
-		$id_parent = _request('id_parent');
53
-		if (!$id_parent) {
54
-			$err = _L("creation interdite d'un article sans rubrique");
55
-		} elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) {
56
-			$err = _T('info_creerdansrubrique_non_autorise');
57
-		} else {
58
-			$id_article = article_inserer($id_parent);
59
-		}
60
-	}
61
-
62
-	// Enregistre l'envoi dans la BD
63
-	if ($id_article > 0) {
64
-		$err = article_modifier($id_article);
65
-	}
66
-
67
-	if ($err) {
68
-		spip_log("echec editeur article: $err", _LOG_ERREUR);
69
-	}
70
-
71
-	return [$id_article, $err];
42
+    include_spip('inc/autoriser');
43
+    $err = '';
44
+    if (is_null($arg)) {
45
+        $securiser_action = charger_fonction('securiser_action', 'inc');
46
+        $arg = $securiser_action();
47
+    }
48
+
49
+    // si id_article n'est pas un nombre, c'est une creation
50
+    // mais on verifie qu'on a toutes les donnees qu'il faut.
51
+    if (!$id_article = intval($arg)) {
52
+        $id_parent = _request('id_parent');
53
+        if (!$id_parent) {
54
+            $err = _L("creation interdite d'un article sans rubrique");
55
+        } elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) {
56
+            $err = _T('info_creerdansrubrique_non_autorise');
57
+        } else {
58
+            $id_article = article_inserer($id_parent);
59
+        }
60
+    }
61
+
62
+    // Enregistre l'envoi dans la BD
63
+    if ($id_article > 0) {
64
+        $err = article_modifier($id_article);
65
+    }
66
+
67
+    if ($err) {
68
+        spip_log("echec editeur article: $err", _LOG_ERREUR);
69
+    }
70
+
71
+    return [$id_article, $err];
72 72
 }
73 73
 
74 74
 /**
@@ -90,50 +90,50 @@  discard block
 block discarded – undo
90 90
  */
91 91
 function article_modifier($id_article, $set = null) {
92 92
 
93
-	// unifier $texte en cas de texte trop long
94
-	trop_longs_articles();
95
-
96
-	include_spip('inc/modifier');
97
-	include_spip('inc/filtres');
98
-	$c = collecter_requests(
99
-		// include list
100
-		objet_info('article', 'champs_editables'),
101
-		// exclude list
102
-		['date', 'statut', 'id_parent'],
103
-		// donnees eventuellement fournies
104
-		$set
105
-	);
106
-
107
-	// Si l'article est publie, invalider les caches et demander sa reindexation
108
-	$t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
-	$invalideur = $indexation = false;
110
-	if ($t == 'publie') {
111
-		$invalideur = "id='article/$id_article'";
112
-		$indexation = true;
113
-	}
114
-
115
-	if (
116
-		$err = objet_modifier_champs(
117
-			'article',
118
-			$id_article,
119
-			[
120
-			'data' => $set,
121
-			'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
-			'invalideur' => $invalideur,
123
-			'indexation' => $indexation,
124
-			'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
125
-			],
126
-			$c
127
-		)
128
-	) {
129
-		return $err;
130
-	}
131
-
132
-	// Modification de statut, changement de rubrique ?
133
-	$c = collecter_requests(['date', 'statut', 'id_parent'], [], $set);
134
-	$err = article_instituer($id_article, $c);
135
-
136
-	return $err;
93
+    // unifier $texte en cas de texte trop long
94
+    trop_longs_articles();
95
+
96
+    include_spip('inc/modifier');
97
+    include_spip('inc/filtres');
98
+    $c = collecter_requests(
99
+        // include list
100
+        objet_info('article', 'champs_editables'),
101
+        // exclude list
102
+        ['date', 'statut', 'id_parent'],
103
+        // donnees eventuellement fournies
104
+        $set
105
+    );
106
+
107
+    // Si l'article est publie, invalider les caches et demander sa reindexation
108
+    $t = sql_getfetsel('statut', 'spip_articles', 'id_article=' . intval($id_article));
109
+    $invalideur = $indexation = false;
110
+    if ($t == 'publie') {
111
+        $invalideur = "id='article/$id_article'";
112
+        $indexation = true;
113
+    }
114
+
115
+    if (
116
+        $err = objet_modifier_champs(
117
+            'article',
118
+            $id_article,
119
+            [
120
+            'data' => $set,
121
+            'nonvide' => ['titre' => _T('info_nouvel_article') . ' ' . _T('info_numero_abbreviation') . $id_article],
122
+            'invalideur' => $invalideur,
123
+            'indexation' => $indexation,
124
+            'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif
125
+            ],
126
+            $c
127
+        )
128
+    ) {
129
+        return $err;
130
+    }
131
+
132
+    // Modification de statut, changement de rubrique ?
133
+    $c = collecter_requests(['date', 'statut', 'id_parent'], [], $set);
134
+    $err = article_instituer($id_article, $c);
135
+
136
+    return $err;
137 137
 }
138 138
 
139 139
 /**
@@ -169,98 +169,98 @@  discard block
 block discarded – undo
169 169
  */
170 170
 function article_inserer($id_rubrique, $set = null) {
171 171
 
172
-	// Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
173
-	// dans la premiere rubrique racine
174
-	if (!$id_rubrique = intval($id_rubrique)) {
175
-		$row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
176
-		$id_rubrique = $row['id_rubrique'];
177
-	} else {
178
-		$row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique");
179
-	}
180
-
181
-	// eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue
182
-	// cas de id_rubrique = -1 par exemple avec plugin "pages"
183
-	$id_secteur = $row['id_secteur'] ?? 0;
184
-	$lang_rub = $row['lang'] ?? '';
185
-
186
-	$lang = '';
187
-	$choisie = 'non';
188
-	// La langue a la creation : si les liens de traduction sont autorises
189
-	// dans les rubriques, on essaie avec la langue de l'auteur,
190
-	// ou a defaut celle de la rubrique
191
-	// Sinon c'est la langue de la rubrique qui est choisie + heritee
192
-	if (
193
-		!empty($GLOBALS['meta']['multi_objets']) and in_array(
194
-			'spip_articles',
195
-			explode(',', $GLOBALS['meta']['multi_objets'])
196
-		)
197
-	) {
198
-		lang_select($GLOBALS['visiteur_session']['lang']);
199
-		if (
200
-			in_array(
201
-				$GLOBALS['spip_lang'],
202
-				explode(',', $GLOBALS['meta']['langues_multilingue'])
203
-			)
204
-		) {
205
-			$lang = $GLOBALS['spip_lang'];
206
-			$choisie = 'oui';
207
-		}
208
-	}
209
-
210
-	if (!$lang) {
211
-		$choisie = 'non';
212
-		$lang = $lang_rub ?: $GLOBALS['meta']['langue_site'];
213
-	}
214
-
215
-	$champs = [
216
-		'id_rubrique' => $id_rubrique,
217
-		'id_secteur' => $id_secteur,
218
-		'statut' => 'prepa',
219
-		'date' => date('Y-m-d H:i:s'),
220
-		'lang' => $lang,
221
-		'langue_choisie' => $choisie
222
-	];
223
-
224
-	if ($set) {
225
-		$champs = array_merge($champs, $set);
226
-	}
227
-
228
-	// Envoyer aux plugins
229
-	$champs = pipeline(
230
-		'pre_insertion',
231
-		[
232
-			'args' => [
233
-				'table' => 'spip_articles',
234
-			],
235
-			'data' => $champs
236
-		]
237
-	);
238
-
239
-	$id_article = sql_insertq('spip_articles', $champs);
240
-
241
-	// controler si le serveur n'a pas renvoye une erreur
242
-	if ($id_article > 0) {
243
-		$id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
244
-			$GLOBALS['visiteur_session']['id_auteur']
245
-			: _request('id_auteur'));
246
-		if ($id_auteur) {
247
-			include_spip('action/editer_auteur');
248
-			auteur_associer($id_auteur, ['article' => $id_article]);
249
-		}
250
-	}
251
-
252
-	pipeline(
253
-		'post_insertion',
254
-		[
255
-			'args' => [
256
-				'table' => 'spip_articles',
257
-				'id_objet' => $id_article
258
-			],
259
-			'data' => $champs
260
-		]
261
-	);
262
-
263
-	return $id_article;
172
+    // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
173
+    // dans la premiere rubrique racine
174
+    if (!$id_rubrique = intval($id_rubrique)) {
175
+        $row = sql_fetsel('id_rubrique, id_secteur, lang', 'spip_rubriques', 'id_parent=0', '', '0+titre,titre', '1');
176
+        $id_rubrique = $row['id_rubrique'];
177
+    } else {
178
+        $row = sql_fetsel('lang, id_secteur', 'spip_rubriques', "id_rubrique=$id_rubrique");
179
+    }
180
+
181
+    // eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue
182
+    // cas de id_rubrique = -1 par exemple avec plugin "pages"
183
+    $id_secteur = $row['id_secteur'] ?? 0;
184
+    $lang_rub = $row['lang'] ?? '';
185
+
186
+    $lang = '';
187
+    $choisie = 'non';
188
+    // La langue a la creation : si les liens de traduction sont autorises
189
+    // dans les rubriques, on essaie avec la langue de l'auteur,
190
+    // ou a defaut celle de la rubrique
191
+    // Sinon c'est la langue de la rubrique qui est choisie + heritee
192
+    if (
193
+        !empty($GLOBALS['meta']['multi_objets']) and in_array(
194
+            'spip_articles',
195
+            explode(',', $GLOBALS['meta']['multi_objets'])
196
+        )
197
+    ) {
198
+        lang_select($GLOBALS['visiteur_session']['lang']);
199
+        if (
200
+            in_array(
201
+                $GLOBALS['spip_lang'],
202
+                explode(',', $GLOBALS['meta']['langues_multilingue'])
203
+            )
204
+        ) {
205
+            $lang = $GLOBALS['spip_lang'];
206
+            $choisie = 'oui';
207
+        }
208
+    }
209
+
210
+    if (!$lang) {
211
+        $choisie = 'non';
212
+        $lang = $lang_rub ?: $GLOBALS['meta']['langue_site'];
213
+    }
214
+
215
+    $champs = [
216
+        'id_rubrique' => $id_rubrique,
217
+        'id_secteur' => $id_secteur,
218
+        'statut' => 'prepa',
219
+        'date' => date('Y-m-d H:i:s'),
220
+        'lang' => $lang,
221
+        'langue_choisie' => $choisie
222
+    ];
223
+
224
+    if ($set) {
225
+        $champs = array_merge($champs, $set);
226
+    }
227
+
228
+    // Envoyer aux plugins
229
+    $champs = pipeline(
230
+        'pre_insertion',
231
+        [
232
+            'args' => [
233
+                'table' => 'spip_articles',
234
+            ],
235
+            'data' => $champs
236
+        ]
237
+    );
238
+
239
+    $id_article = sql_insertq('spip_articles', $champs);
240
+
241
+    // controler si le serveur n'a pas renvoye une erreur
242
+    if ($id_article > 0) {
243
+        $id_auteur = ((is_null(_request('id_auteur')) and isset($GLOBALS['visiteur_session']['id_auteur'])) ?
244
+            $GLOBALS['visiteur_session']['id_auteur']
245
+            : _request('id_auteur'));
246
+        if ($id_auteur) {
247
+            include_spip('action/editer_auteur');
248
+            auteur_associer($id_auteur, ['article' => $id_article]);
249
+        }
250
+    }
251
+
252
+    pipeline(
253
+        'post_insertion',
254
+        [
255
+            'args' => [
256
+                'table' => 'spip_articles',
257
+                'id_objet' => $id_article
258
+            ],
259
+            'data' => $champs
260
+        ]
261
+    );
262
+
263
+    return $id_article;
264 264
 }
265 265
 
266 266
 
@@ -288,125 +288,125 @@  discard block
 block discarded – undo
288 288
  */
289 289
 function article_instituer($id_article, $c, $calcul_rub = true) {
290 290
 
291
-	include_spip('inc/autoriser');
292
-	include_spip('inc/rubriques');
293
-	include_spip('inc/modifier');
294
-
295
-	$row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article");
296
-	$id_rubrique = $row['id_rubrique'];
297
-	$statut_ancien = $statut = $row['statut'];
298
-	$date_ancienne = $date = $row['date'];
299
-	$champs = [];
300
-
301
-	$d = $c['date'] ?? null;
302
-	$s = $c['statut'] ?? $statut;
303
-
304
-	// cf autorisations dans inc/instituer_article
305
-	if ($s != $statut or ($d and $d != $date)) {
306
-		if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
307
-			$statut = $champs['statut'] = $s;
308
-		} elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
309
-			$statut = $champs['statut'] = $s;
310
-		} else {
311
-			spip_log("editer_article $id_article refus " . join(' ', $c));
312
-		}
313
-
314
-		// En cas de publication, fixer la date a "maintenant"
315
-		// sauf si $c commande autre chose
316
-		// ou si l'article est deja date dans le futur
317
-		// En cas de proposition d'un article (mais pas depublication), idem
318
-		if (
319
-			$champs['statut'] == 'publie'
320
-			or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
321
-		) {
322
-			if ($d or strtotime($d = $date) > time()) {
323
-				$champs['date'] = $date = $d;
324
-			} else {
325
-				$champs['date'] = $date = date('Y-m-d H:i:s');
326
-			}
327
-		}
328
-	}
329
-
330
-	// Verifier que la rubrique demandee existe et est differente
331
-	// de la rubrique actuelle
332
-	if (
333
-		isset($c['id_parent'])
334
-		and $id_parent = $c['id_parent']
335
-		and $id_parent != $id_rubrique
336
-		and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
-	) {
338
-		$champs['id_rubrique'] = $id_parent;
339
-
340
-		// si l'article etait publie
341
-		// et que le demandeur n'est pas admin de la rubrique de destination
342
-		// repasser l'article en statut 'propose'.
343
-		if (
344
-			$statut == 'publie'
345
-			and !autoriser('publierdans', 'rubrique', $id_parent)
346
-		) {
347
-			$champs['statut'] = 'prop';
348
-		}
349
-	}
350
-
351
-	// Envoyer aux plugins
352
-	$champs = pipeline(
353
-		'pre_edition',
354
-		[
355
-			'args' => [
356
-				'table' => 'spip_articles',
357
-				'id_objet' => $id_article,
358
-				'action' => 'instituer',
359
-				'statut_ancien' => $statut_ancien,
360
-				'date_ancienne' => $date_ancienne,
361
-			],
362
-			'data' => $champs
363
-		]
364
-	);
365
-
366
-	if (!(is_countable($champs) ? count($champs) : 0)) {
367
-		return '';
368
-	}
369
-
370
-	// Envoyer les modifs.
371
-	editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
372
-
373
-	// Invalider les caches
374
-	include_spip('inc/invalideur');
375
-	suivre_invalideur("id='article/$id_article'");
376
-
377
-	if ($date) {
378
-		$t = strtotime($date);
379
-		$p = @$GLOBALS['meta']['date_prochain_postdate'];
380
-		if ($t > time() and (!$p or ($t < $p))) {
381
-			ecrire_meta('date_prochain_postdate', $t);
382
-		}
383
-	}
384
-
385
-	// Pipeline
386
-	pipeline(
387
-		'post_edition',
388
-		[
389
-			'args' => [
390
-				'table' => 'spip_articles',
391
-				'id_objet' => $id_article,
392
-				'action' => 'instituer',
393
-				'statut_ancien' => $statut_ancien,
394
-				'date_ancienne' => $date_ancienne,
395
-			],
396
-			'data' => $champs
397
-		]
398
-	);
399
-
400
-	// Notifications
401
-	if ($notifications = charger_fonction('notifications', 'inc')) {
402
-		$notifications(
403
-			'instituerarticle',
404
-			$id_article,
405
-			['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
406
-		);
407
-	}
408
-
409
-	return ''; // pas d'erreur
291
+    include_spip('inc/autoriser');
292
+    include_spip('inc/rubriques');
293
+    include_spip('inc/modifier');
294
+
295
+    $row = sql_fetsel('statut, date, id_rubrique', 'spip_articles', "id_article=$id_article");
296
+    $id_rubrique = $row['id_rubrique'];
297
+    $statut_ancien = $statut = $row['statut'];
298
+    $date_ancienne = $date = $row['date'];
299
+    $champs = [];
300
+
301
+    $d = $c['date'] ?? null;
302
+    $s = $c['statut'] ?? $statut;
303
+
304
+    // cf autorisations dans inc/instituer_article
305
+    if ($s != $statut or ($d and $d != $date)) {
306
+        if (autoriser('publierdans', 'rubrique', $id_rubrique)) {
307
+            $statut = $champs['statut'] = $s;
308
+        } elseif (autoriser('modifier', 'article', $id_article) and $s != 'publie') {
309
+            $statut = $champs['statut'] = $s;
310
+        } else {
311
+            spip_log("editer_article $id_article refus " . join(' ', $c));
312
+        }
313
+
314
+        // En cas de publication, fixer la date a "maintenant"
315
+        // sauf si $c commande autre chose
316
+        // ou si l'article est deja date dans le futur
317
+        // En cas de proposition d'un article (mais pas depublication), idem
318
+        if (
319
+            $champs['statut'] == 'publie'
320
+            or ($champs['statut'] == 'prop' and ($d or !in_array($statut_ancien, ['publie', 'prop'])))
321
+        ) {
322
+            if ($d or strtotime($d = $date) > time()) {
323
+                $champs['date'] = $date = $d;
324
+            } else {
325
+                $champs['date'] = $date = date('Y-m-d H:i:s');
326
+            }
327
+        }
328
+    }
329
+
330
+    // Verifier que la rubrique demandee existe et est differente
331
+    // de la rubrique actuelle
332
+    if (
333
+        isset($c['id_parent'])
334
+        and $id_parent = $c['id_parent']
335
+        and $id_parent != $id_rubrique
336
+        and (sql_fetsel('1', 'spip_rubriques', 'id_rubrique=' . intval($id_parent)))
337
+    ) {
338
+        $champs['id_rubrique'] = $id_parent;
339
+
340
+        // si l'article etait publie
341
+        // et que le demandeur n'est pas admin de la rubrique de destination
342
+        // repasser l'article en statut 'propose'.
343
+        if (
344
+            $statut == 'publie'
345
+            and !autoriser('publierdans', 'rubrique', $id_parent)
346
+        ) {
347
+            $champs['statut'] = 'prop';
348
+        }
349
+    }
350
+
351
+    // Envoyer aux plugins
352
+    $champs = pipeline(
353
+        'pre_edition',
354
+        [
355
+            'args' => [
356
+                'table' => 'spip_articles',
357
+                'id_objet' => $id_article,
358
+                'action' => 'instituer',
359
+                'statut_ancien' => $statut_ancien,
360
+                'date_ancienne' => $date_ancienne,
361
+            ],
362
+            'data' => $champs
363
+        ]
364
+    );
365
+
366
+    if (!(is_countable($champs) ? count($champs) : 0)) {
367
+        return '';
368
+    }
369
+
370
+    // Envoyer les modifs.
371
+    editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub);
372
+
373
+    // Invalider les caches
374
+    include_spip('inc/invalideur');
375
+    suivre_invalideur("id='article/$id_article'");
376
+
377
+    if ($date) {
378
+        $t = strtotime($date);
379
+        $p = @$GLOBALS['meta']['date_prochain_postdate'];
380
+        if ($t > time() and (!$p or ($t < $p))) {
381
+            ecrire_meta('date_prochain_postdate', $t);
382
+        }
383
+    }
384
+
385
+    // Pipeline
386
+    pipeline(
387
+        'post_edition',
388
+        [
389
+            'args' => [
390
+                'table' => 'spip_articles',
391
+                'id_objet' => $id_article,
392
+                'action' => 'instituer',
393
+                'statut_ancien' => $statut_ancien,
394
+                'date_ancienne' => $date_ancienne,
395
+            ],
396
+            'data' => $champs
397
+        ]
398
+    );
399
+
400
+    // Notifications
401
+    if ($notifications = charger_fonction('notifications', 'inc')) {
402
+        $notifications(
403
+            'instituerarticle',
404
+            $id_article,
405
+            ['statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne]
406
+        );
407
+    }
408
+
409
+    return ''; // pas d'erreur
410 410
 }
411 411
 
412 412
 /**
@@ -431,37 +431,37 @@  discard block
 block discarded – undo
431 431
  */
432 432
 function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $cond = true) {
433 433
 
434
-	// Si on deplace l'article
435
-	//  changer aussi son secteur et sa langue (si heritee)
436
-	if (isset($champs['id_rubrique'])) {
437
-		$row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
-
439
-		$langue = $row_rub['lang'];
440
-		$champs['id_secteur'] = $row_rub['id_secteur'];
441
-		if (
442
-			sql_fetsel(
443
-				'1',
444
-				'spip_articles',
445
-				'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
-			)
447
-		) {
448
-			$champs['lang'] = $langue;
449
-		}
450
-	}
451
-
452
-	if (!$champs) {
453
-		return;
454
-	}
455
-
456
-	sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
-
458
-	// Changer le statut des rubriques concernees
459
-
460
-	if ($cond) {
461
-		include_spip('inc/rubriques');
462
-		$postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
463
-		calculer_rubriques_if($id_rubrique, $champs, ['statut_ancien' => $statut], $postdate);
464
-	}
434
+    // Si on deplace l'article
435
+    //  changer aussi son secteur et sa langue (si heritee)
436
+    if (isset($champs['id_rubrique'])) {
437
+        $row_rub = sql_fetsel('id_secteur, lang', 'spip_rubriques', 'id_rubrique=' . sql_quote($champs['id_rubrique']));
438
+
439
+        $langue = $row_rub['lang'];
440
+        $champs['id_secteur'] = $row_rub['id_secteur'];
441
+        if (
442
+            sql_fetsel(
443
+                '1',
444
+                'spip_articles',
445
+                'id_article=' . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue)
446
+            )
447
+        ) {
448
+            $champs['lang'] = $langue;
449
+        }
450
+    }
451
+
452
+    if (!$champs) {
453
+        return;
454
+    }
455
+
456
+    sql_updateq('spip_articles', $champs, 'id_article=' . intval($id_article));
457
+
458
+    // Changer le statut des rubriques concernees
459
+
460
+    if ($cond) {
461
+        include_spip('inc/rubriques');
462
+        $postdate = ($GLOBALS['meta']['post_dates'] == 'non' and isset($champs['date']) and (strtotime($champs['date']) < time())) ? $champs['date'] : false;
463
+        calculer_rubriques_if($id_rubrique, $champs, ['statut_ancien' => $statut], $postdate);
464
+    }
465 465
 }
466 466
 
467 467
 /**
@@ -470,10 +470,10 @@  discard block
 block discarded – undo
470 470
  * @return void
471 471
  */
472 472
 function trop_longs_articles() {
473
-	if (is_array($plus = _request('texte_plus'))) {
474
-		foreach ($plus as $n => $t) {
475
-			$plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
476
-		}
477
-		set_request('texte', join('', $plus) . _request('texte'));
478
-	}
473
+    if (is_array($plus = _request('texte_plus'))) {
474
+        foreach ($plus as $n => $t) {
475
+            $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", '', $t);
476
+        }
477
+        set_request('texte', join('', $plus) . _request('texte'));
478
+    }
479 479
 }
Please login to merge, or discard this patch.
ecrire/auth/ldap.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -68,7 +68,7 @@  discard block
 block discarded – undo
68 68
 	$credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
69 69
 
70 70
 	// Si l'utilisateur figure deja dans la base, y recuperer les infos
71
-	$r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
71
+	$r = sql_fetsel('*', 'spip_auteurs', 'login='.sql_quote($login)." AND source='ldap'", '', '', '', '', $serveur);
72 72
 
73 73
 	if ($r) {
74 74
 		return array_merge($r, $credentials_ldap);
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 	if ($r) {
93 93
 		return array_merge(
94 94
 			$credentials_ldap,
95
-			sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
95
+			sql_fetsel('*', 'spip_auteurs', 'id_auteur='.intval($r), '', '', '', '', $serveur)
96 96
 		);
97 97
 	}
98 98
 
@@ -121,7 +121,7 @@  discard block
 block discarded – undo
121 121
 	$connexion = spip_connect($serveur);
122 122
 	if (!is_array($connexion['ldap'])) {
123 123
 		if ($connexion['authentification']['ldap']) {
124
-			$f = _DIR_CONNECT . $connexion['authentification']['ldap'];
124
+			$f = _DIR_CONNECT.$connexion['authentification']['ldap'];
125 125
 			unset($GLOBALS['ldap_link']);
126 126
 			if (is_readable($f)) {
127 127
 				include_once($f);
@@ -334,7 +334,7 @@  discard block
 block discarded – undo
334 334
 	if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
335 335
 		return false;
336 336
 	}
337
-	$encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
337
+	$encoded_pass = '{MD5}'.base64_encode(pack('H*', md5($new_pass)));
338 338
 	$success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
339 339
 
340 340
 	return $success;
Please login to merge, or discard this patch.
Indentation   +176 added lines, -176 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 // Authentifie via LDAP et retourne la ligne SQL decrivant l'utilisateur si ok
@@ -25,12 +25,12 @@  discard block
 block discarded – undo
25 25
 // Attributs LDAP correspondants a ceux de SPIP, notamment pour le login
26 26
 // ne pas ecraser une definition perso dans mes_options
27 27
 if (!isset($GLOBALS['ldap_attributes']) or !is_array($GLOBALS['ldap_attributes'])) {
28
-	$GLOBALS['ldap_attributes'] = [
29
-		'login' => ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'],
30
-		'nom' => 'cn',
31
-		'email' => 'mail',
32
-		'bio' => 'description'
33
-	];
28
+    $GLOBALS['ldap_attributes'] = [
29
+        'login' => ['sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'],
30
+        'nom' => 'cn',
31
+        'email' => 'mail',
32
+        'bio' => 'description'
33
+    ];
34 34
 }
35 35
 
36 36
 /**
@@ -56,50 +56,50 @@  discard block
 block discarded – undo
56 56
  */
57 57
 function auth_ldap_dist($login, $pass, $serveur = '', $phpauth = false) {
58 58
 
59
-	#spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
60
-
61
-	// Utilisateur connu ?
62
-	// si http auth, inutile de reauthentifier: cela
63
-	// ne marchera pas avec auth http autre que basic.
64
-	$checkpass = isset($_SERVER['REMOTE_USER']) ? false : true;
65
-	if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) {
66
-		return [];
67
-	}
68
-	$credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
69
-
70
-	// Si l'utilisateur figure deja dans la base, y recuperer les infos
71
-	$r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
72
-
73
-	if ($r) {
74
-		return array_merge($r, $credentials_ldap);
75
-	}
76
-
77
-	// sinon importer les infos depuis LDAP,
78
-
79
-	if (
80
-		$GLOBALS['meta']['ldap_statut_import']
81
-		and $desc = auth_ldap_retrouver($dn, [], $serveur)
82
-	) {
83
-		// rajouter le statut indique  a l'install
84
-		$desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
85
-		$desc['login'] = $login;
86
-		$desc['source'] = 'ldap';
87
-		$desc['pass'] = '';
88
-
89
-		$r = sql_insertq('spip_auteurs', $desc, [], $serveur);
90
-	}
91
-
92
-	if ($r) {
93
-		return array_merge(
94
-			$credentials_ldap,
95
-			sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
96
-		);
97
-	}
98
-
99
-	// sinon echec
100
-	spip_log("Creation de l'auteur '$login' impossible");
101
-
102
-	return [];
59
+    #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent"));
60
+
61
+    // Utilisateur connu ?
62
+    // si http auth, inutile de reauthentifier: cela
63
+    // ne marchera pas avec auth http autre que basic.
64
+    $checkpass = isset($_SERVER['REMOTE_USER']) ? false : true;
65
+    if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) {
66
+        return [];
67
+    }
68
+    $credentials_ldap = ['ldap_dn' => $dn, 'ldap_password' => $pass];
69
+
70
+    // Si l'utilisateur figure deja dans la base, y recuperer les infos
71
+    $r = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur);
72
+
73
+    if ($r) {
74
+        return array_merge($r, $credentials_ldap);
75
+    }
76
+
77
+    // sinon importer les infos depuis LDAP,
78
+
79
+    if (
80
+        $GLOBALS['meta']['ldap_statut_import']
81
+        and $desc = auth_ldap_retrouver($dn, [], $serveur)
82
+    ) {
83
+        // rajouter le statut indique  a l'install
84
+        $desc['statut'] = $GLOBALS['meta']['ldap_statut_import'];
85
+        $desc['login'] = $login;
86
+        $desc['source'] = 'ldap';
87
+        $desc['pass'] = '';
88
+
89
+        $r = sql_insertq('spip_auteurs', $desc, [], $serveur);
90
+    }
91
+
92
+    if ($r) {
93
+        return array_merge(
94
+            $credentials_ldap,
95
+            sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . intval($r), '', '', '', '', $serveur)
96
+        );
97
+    }
98
+
99
+    // sinon echec
100
+    spip_log("Creation de l'auteur '$login' impossible");
101
+
102
+    return [];
103 103
 }
104 104
 
105 105
 /**
@@ -113,36 +113,36 @@  discard block
 block discarded – undo
113 113
  * @return array
114 114
  */
115 115
 function auth_ldap_connect($serveur = '') {
116
-	include_spip('base/connect_sql');
117
-	static $connexions_ldap = [];
118
-	if (isset($connexions_ldap[$serveur])) {
119
-		return $connexions_ldap[$serveur];
120
-	}
121
-	$connexion = spip_connect($serveur);
122
-	if (!is_array($connexion['ldap'])) {
123
-		if ($connexion['authentification']['ldap']) {
124
-			$f = _DIR_CONNECT . $connexion['authentification']['ldap'];
125
-			unset($GLOBALS['ldap_link']);
126
-			if (is_readable($f)) {
127
-				include_once($f);
128
-			};
129
-			if (isset($GLOBALS['ldap_link'])) {
130
-				$connexion['ldap'] = [
131
-					'link' => $GLOBALS['ldap_link'],
132
-					'base' => $GLOBALS['ldap_base']
133
-				];
134
-			} else {
135
-				spip_log("connection LDAP $serveur mal definie dans $f");
136
-			}
137
-			if (isset($GLOBALS['ldap_champs'])) {
138
-				$connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
139
-			}
140
-		} else {
141
-			spip_log("connection LDAP $serveur inconnue");
142
-		}
143
-	}
144
-
145
-	return $connexions_ldap[$serveur] = $connexion['ldap'];
116
+    include_spip('base/connect_sql');
117
+    static $connexions_ldap = [];
118
+    if (isset($connexions_ldap[$serveur])) {
119
+        return $connexions_ldap[$serveur];
120
+    }
121
+    $connexion = spip_connect($serveur);
122
+    if (!is_array($connexion['ldap'])) {
123
+        if ($connexion['authentification']['ldap']) {
124
+            $f = _DIR_CONNECT . $connexion['authentification']['ldap'];
125
+            unset($GLOBALS['ldap_link']);
126
+            if (is_readable($f)) {
127
+                include_once($f);
128
+            };
129
+            if (isset($GLOBALS['ldap_link'])) {
130
+                $connexion['ldap'] = [
131
+                    'link' => $GLOBALS['ldap_link'],
132
+                    'base' => $GLOBALS['ldap_base']
133
+                ];
134
+            } else {
135
+                spip_log("connection LDAP $serveur mal definie dans $f");
136
+            }
137
+            if (isset($GLOBALS['ldap_champs'])) {
138
+                $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs'];
139
+            }
140
+        } else {
141
+            spip_log("connection LDAP $serveur inconnue");
142
+        }
143
+    }
144
+
145
+    return $connexions_ldap[$serveur] = $connexion['ldap'];
146 146
 }
147 147
 
148 148
 /**
@@ -156,52 +156,52 @@  discard block
 block discarded – undo
156 156
  *    Le login trouvé ou chaine vide si non trouvé
157 157
  */
158 158
 function auth_ldap_search($login, $pass, $checkpass = true, $serveur = '') {
159
-	// Securite anti-injection et contre un serveur LDAP laxiste
160
-	$login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
161
-	if (!strlen($login_search) or ($checkpass and !strlen($pass))) {
162
-		return '';
163
-	}
164
-
165
-	// verifier la connexion
166
-	if (!$ldap = auth_ldap_connect($serveur)) {
167
-		return '';
168
-	}
169
-
170
-	$ldap_link = $ldap['link'] ?? null;
171
-	$ldap_base = $ldap['base'] ?? null;
172
-	$desc = !empty($ldap['attributes']) ? $ldap['attributes'] : $GLOBALS['ldap_attributes'];
173
-
174
-	$logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
175
-
176
-	// Tenter une recherche pour essayer de retrouver le DN
177
-	foreach ($logins as $att) {
178
-		$result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
179
-		$info = @ldap_get_entries($ldap_link, $result);
180
-		// Ne pas accepter les resultats si plus d'une entree
181
-		// (on veut un attribut unique)
182
-
183
-		if (is_array($info) and $info['count'] == 1) {
184
-			$dn = $info[0]['dn'];
185
-			if (!$checkpass) {
186
-				return $dn;
187
-			}
188
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
189
-				return $dn;
190
-			}
191
-		}
192
-	}
193
-
194
-	if ($checkpass and !isset($dn)) {
195
-		// Si echec, essayer de deviner le DN
196
-		foreach ($logins as $att) {
197
-			$dn = "$att=$login_search, $ldap_base";
198
-			if (@ldap_bind($ldap_link, $dn, $pass)) {
199
-				return "$att=$login_search, $ldap_base";
200
-			}
201
-		}
202
-	}
203
-
204
-	return '';
159
+    // Securite anti-injection et contre un serveur LDAP laxiste
160
+    $login_search = preg_replace('/[^-@._\s\d\w]/', '', $login);
161
+    if (!strlen($login_search) or ($checkpass and !strlen($pass))) {
162
+        return '';
163
+    }
164
+
165
+    // verifier la connexion
166
+    if (!$ldap = auth_ldap_connect($serveur)) {
167
+        return '';
168
+    }
169
+
170
+    $ldap_link = $ldap['link'] ?? null;
171
+    $ldap_base = $ldap['base'] ?? null;
172
+    $desc = !empty($ldap['attributes']) ? $ldap['attributes'] : $GLOBALS['ldap_attributes'];
173
+
174
+    $logins = is_array($desc['login']) ? $desc['login'] : [$desc['login']];
175
+
176
+    // Tenter une recherche pour essayer de retrouver le DN
177
+    foreach ($logins as $att) {
178
+        $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", ['dn']);
179
+        $info = @ldap_get_entries($ldap_link, $result);
180
+        // Ne pas accepter les resultats si plus d'une entree
181
+        // (on veut un attribut unique)
182
+
183
+        if (is_array($info) and $info['count'] == 1) {
184
+            $dn = $info[0]['dn'];
185
+            if (!$checkpass) {
186
+                return $dn;
187
+            }
188
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
189
+                return $dn;
190
+            }
191
+        }
192
+    }
193
+
194
+    if ($checkpass and !isset($dn)) {
195
+        // Si echec, essayer de deviner le DN
196
+        foreach ($logins as $att) {
197
+            $dn = "$att=$login_search, $ldap_base";
198
+            if (@ldap_bind($ldap_link, $dn, $pass)) {
199
+                return "$att=$login_search, $ldap_base";
200
+            }
201
+        }
202
+    }
203
+
204
+    return '';
205 205
 }
206 206
 
207 207
 /**
@@ -213,40 +213,40 @@  discard block
 block discarded – undo
213 213
  * @return array
214 214
  */
215 215
 function auth_ldap_retrouver($dn, $desc = [], $serveur = '') {
216
-	// Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
216
+    // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP
217 217
 
218
-	if (!$ldap = auth_ldap_connect($serveur)) {
219
-		spip_log("ldap $serveur injoignable");
218
+    if (!$ldap = auth_ldap_connect($serveur)) {
219
+        spip_log("ldap $serveur injoignable");
220 220
 
221
-		return [];
222
-	}
221
+        return [];
222
+    }
223 223
 
224
-	$ldap_link = $ldap['link'];
225
-	if (!$desc) {
226
-		$desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
227
-		unset($desc['login']);
228
-	}
229
-	$result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
224
+    $ldap_link = $ldap['link'];
225
+    if (!$desc) {
226
+        $desc = $ldap['attributes'] ?: $GLOBALS['ldap_attributes'];
227
+        unset($desc['login']);
228
+    }
229
+    $result = @ldap_read($ldap_link, $dn, 'objectClass=*', array_values($desc));
230 230
 
231
-	if (!$result) {
232
-		return [];
233
-	}
231
+    if (!$result) {
232
+        return [];
233
+    }
234 234
 
235
-	// Recuperer les donnees du premier (unique?) compte de l'auteur
236
-	$val = @ldap_get_entries($ldap_link, $result);
237
-	if (!is_array($val) or !is_array($val[0])) {
238
-		return [];
239
-	}
240
-	$val = $val[0];
235
+    // Recuperer les donnees du premier (unique?) compte de l'auteur
236
+    $val = @ldap_get_entries($ldap_link, $result);
237
+    if (!is_array($val) or !is_array($val[0])) {
238
+        return [];
239
+    }
240
+    $val = $val[0];
241 241
 
242
-	// Convertir depuis UTF-8 (jeu de caracteres par defaut)
243
-	include_spip('inc/charsets');
242
+    // Convertir depuis UTF-8 (jeu de caracteres par defaut)
243
+    include_spip('inc/charsets');
244 244
 
245
-	foreach ($desc as $k => $v) {
246
-		$desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
247
-	}
245
+    foreach ($desc as $k => $v) {
246
+        $desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8');
247
+    }
248 248
 
249
-	return $desc;
249
+    return $desc;
250 250
 }
251 251
 
252 252
 
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
  * @return string
259 259
  */
260 260
 function auth_ldap_retrouver_login($login, $serveur = '') {
261
-	return auth_ldap_search($login, '', false, $serveur) ? $login : '';
261
+    return auth_ldap_search($login, '', false, $serveur) ? $login : '';
262 262
 }
263 263
 
264 264
 /**
@@ -278,9 +278,9 @@  discard block
 block discarded – undo
278 278
  *   Message d'erreur si login non valide, chaîne vide sinon
279 279
  */
280 280
 function auth_ldap_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') {
281
-	include_spip('auth/spip');
281
+    include_spip('auth/spip');
282 282
 
283
-	return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
283
+    return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur);
284 284
 }
285 285
 
286 286
 /**
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
  *   ```
302 302
  */
303 303
 function auth_ldap_autoriser_modifier_pass($serveur = '') {
304
-	return true;
304
+    return true;
305 305
 }
306 306
 
307 307
 /**
@@ -319,23 +319,23 @@  discard block
 block discarded – undo
319 319
  *    Informe du succès ou de l'echec du changement du mot de passe
320 320
  */
321 321
 function auth_ldap_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') {
322
-	if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
323
-		return false;
324
-	}
325
-	if (!$ldap = auth_ldap_connect($serveur)) {
326
-		return false;
327
-	}
328
-	$link = $ldap['link'];
329
-	include_spip('inc/session');
330
-	$dn = session_get('ldap_dn');
331
-	if ('' == $dn) {
332
-		return false;
333
-	}
334
-	if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
335
-		return false;
336
-	}
337
-	$encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
338
-	$success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
339
-
340
-	return $success;
322
+    if (is_null($new_pass) or auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') {
323
+        return false;
324
+    }
325
+    if (!$ldap = auth_ldap_connect($serveur)) {
326
+        return false;
327
+    }
328
+    $link = $ldap['link'];
329
+    include_spip('inc/session');
330
+    $dn = session_get('ldap_dn');
331
+    if ('' == $dn) {
332
+        return false;
333
+    }
334
+    if (!ldap_bind($link, $dn, session_get('ldap_password'))) {
335
+        return false;
336
+    }
337
+    $encoded_pass = '{MD5}' . base64_encode(pack('H*', md5($new_pass)));
338
+    $success = ldap_mod_replace($link, $dn, ['userPassword' => $encoded_pass]);
339
+
340
+    return $success;
341 341
 }
Please login to merge, or discard this patch.
ecrire/public.php 2 patches
Indentation   +188 added lines, -188 removed lines patch added patch discarded remove patch
@@ -21,193 +21,193 @@
 block discarded – undo
21 21
 // par souci de compatiilite).
22 22
 
23 23
 if (isset($GLOBALS['_INC_PUBLIC']) and $GLOBALS['_INC_PUBLIC']) {
24
-	echo recuperer_fond($fond, $contexte_inclus, [], _request('connect') ?? '');
24
+    echo recuperer_fond($fond, $contexte_inclus, [], _request('connect') ?? '');
25 25
 } else {
26
-	$GLOBALS['_INC_PUBLIC'] = 1;
27
-	define('_PIPELINE_SUFFIX', test_espace_prive() ? '_prive' : '');
28
-
29
-	// Faut-il initialiser SPIP ? (oui dans le cas general)
30
-	if (!defined('_DIR_RESTREINT_ABS')) {
31
-		if (
32
-			defined('_DIR_RESTREINT')
33
-			and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
34
-		) {
35
-			include_once _ROOT_RESTREINT . 'inc_version.php';
36
-		} else {
37
-			die('inc_version absent ?');
38
-		}
39
-	} // $fond defini dans le fichier d'appel ?
40
-
41
-	else {
42
-		if (isset($fond) and !_request('fond')) {
43
-		} // fond demande dans l'url par page=xxxx ?
44
-		else {
45
-			if (isset($_GET[_SPIP_PAGE])) {
46
-				$fond = (string)$_GET[_SPIP_PAGE];
47
-
48
-				// Securite
49
-				if (
50
-					strstr($fond, '/')
51
-					and !(
52
-						isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
53
-						and include_spip('inc/autoriser')
54
-						and autoriser('webmestre'))
55
-				) {
56
-					include_spip('inc/minipres');
57
-					echo minipres();
58
-					exit;
59
-				}
60
-				// l'argument Page a priorite sur l'argument action
61
-				// le cas se presente a cause des RewriteRule d'Apache
62
-				// qui permettent d'ajouter un argument dans la QueryString
63
-				// mais pas d'en retirer un en conservant les autres.
64
-				if (isset($_GET['action']) and $_GET['action'] === $fond) {
65
-					unset($_GET['action']);
66
-				}
67
-				# sinon, fond par defaut
68
-			} else {
69
-				// sinon fond par defaut (cf. assembler.php)
70
-				$fond = pipeline('detecter_fond_par_defaut', '');
71
-			}
72
-		}
73
-	}
74
-
75
-	$tableau_des_temps = [];
76
-
77
-	// Particularites de certains squelettes
78
-	if ($fond == 'login') {
79
-		$forcer_lang = true;
80
-	}
81
-
82
-	if (
83
-		isset($forcer_lang) and $forcer_lang and ($forcer_lang !== 'non')
84
-		and !_request('action')
85
-		and $_SERVER['REQUEST_METHOD'] != 'POST'
86
-	) {
87
-		include_spip('inc/lang');
88
-		verifier_lang_url();
89
-	}
90
-
91
-	$lang = !isset($_GET['lang']) ? '' : lang_select($_GET['lang']);
92
-
93
-	// Charger l'aiguilleur des traitements derogatoires
94
-	// (action en base SQL, formulaires CVT, AJax)
95
-	if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
96
-		include_spip('public/aiguiller');
97
-		if (
98
-			// cas des appels actions ?action=xxx
99
-			traiter_appels_actions()
100
-			or
101
-			// cas des hits ajax sur les inclusions ajax
102
-			traiter_appels_inclusions_ajax()
103
-			or
104
-			// cas des formulaires charger/verifier/traiter
105
-			traiter_formulaires_dynamiques()
106
-		) {
107
-			// lancer les taches sur affichage final, comme le cron
108
-			// mais sans rien afficher
109
-			$GLOBALS['html'] = false; // ne rien afficher
110
-			pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
111
-			exit; // le hit est fini !
112
-		}
113
-	}
114
-
115
-	// Il y a du texte a produire, charger le metteur en page
116
-	include_spip('public/assembler');
117
-	$page = assembler($fond, _request('connect') ?? '');
118
-
119
-	if (isset($page['status'])) {
120
-		include_spip('inc/headers');
121
-		http_response_code($page['status']);
122
-	}
123
-
124
-	// Content-Type ?
125
-	if (!isset($page['entetes']['Content-Type'])) {
126
-		$charset = $GLOBALS['meta']['charset'] ?? 'utf-8';
127
-		$page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
128
-		$html = true;
129
-	} else {
130
-		$html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
131
-	}
132
-
133
-	// Tester si on est admin et il y a des choses supplementaires a dire
134
-	// type tableau pour y mettre des choses au besoin.
135
-	$debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
136
-
137
-	// affiche-t-on les boutons d'administration ? voir f_admin()
138
-	$affiche_boutons_admin = ($html and (
139
-			(isset($_COOKIE['spip_admin']) and (!isset($flag_preserver) or !$flag_preserver))
140
-			or ($debug and include_spip('inc/autoriser') and autoriser('debug'))
141
-			or (defined('_VAR_PREVIEW') and _VAR_PREVIEW)
142
-		));
143
-
144
-	if ($affiche_boutons_admin) {
145
-		include_spip('balise/formulaire_admin');
146
-	}
147
-
148
-
149
-	// Execution de la page calculee
150
-
151
-	// traitements sur les entetes avant envoi
152
-	// peut servir pour le plugin de stats
153
-	$page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
154
-
155
-
156
-	// eval $page et affecte $res
157
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
158
-	envoyer_entetes($page['entetes']);
159
-	if ($res === false) {
160
-		include_spip('inc/autoriser');
161
-		$err = _T('zbug_erreur_execution_page');
162
-		if (autoriser('webmestre')) {
163
-			$err .= "\n<hr />\n"
164
-				. highlight_string($page['codephp'], true)
165
-				. "\n<hr />\n";
166
-		}
167
-		$msg = [$err];
168
-		erreur_squelette($msg);
169
-	}
170
-
171
-	//
172
-	// Envoyer le resultat apres post-traitements
173
-	//
174
-	// (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175
-	// cf. public/assembler.php)
176
-	echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
177
-
178
-	if ($lang) {
179
-		lang_select();
180
-	}
181
-	// l'affichage de la page a pu lever des erreurs (inclusion manquante)
182
-	// il faut tester a nouveau
183
-	$debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
184
-
185
-	// Appel au debusqueur en cas d'erreurs ou de demande de trace
186
-	// at last
187
-	if ($debug) {
188
-		// en cas d'erreur, retester l'affichage
189
-		if ($html and ($affiche_boutons_admin or $debug)) {
190
-			$var_mode_affiche = _request('var_mode_affiche');
191
-			$var_mode_objet = _request('var_mode_objet');
192
-			$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
193
-			echo erreur_squelette(false);
194
-		}
195
-	} else {
196
-		if (
197
-			isset($GLOBALS['meta']['date_prochain_postdate'])
198
-			and $GLOBALS['meta']['date_prochain_postdate'] <= time()
199
-		) {
200
-			include_spip('inc/rubriques');
201
-			calculer_prochain_postdate(true);
202
-		}
203
-
204
-		// Effectuer une tache de fond ?
205
-		// si _DIRECT_CRON_FORCE est present, on force l'appel
206
-		if (defined('_DIRECT_CRON_FORCE')) {
207
-			cron();
208
-		}
209
-
210
-		// sauver le cache chemin si necessaire
211
-		save_path_cache();
212
-	}
26
+    $GLOBALS['_INC_PUBLIC'] = 1;
27
+    define('_PIPELINE_SUFFIX', test_espace_prive() ? '_prive' : '');
28
+
29
+    // Faut-il initialiser SPIP ? (oui dans le cas general)
30
+    if (!defined('_DIR_RESTREINT_ABS')) {
31
+        if (
32
+            defined('_DIR_RESTREINT')
33
+            and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
34
+        ) {
35
+            include_once _ROOT_RESTREINT . 'inc_version.php';
36
+        } else {
37
+            die('inc_version absent ?');
38
+        }
39
+    } // $fond defini dans le fichier d'appel ?
40
+
41
+    else {
42
+        if (isset($fond) and !_request('fond')) {
43
+        } // fond demande dans l'url par page=xxxx ?
44
+        else {
45
+            if (isset($_GET[_SPIP_PAGE])) {
46
+                $fond = (string)$_GET[_SPIP_PAGE];
47
+
48
+                // Securite
49
+                if (
50
+                    strstr($fond, '/')
51
+                    and !(
52
+                        isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes
53
+                        and include_spip('inc/autoriser')
54
+                        and autoriser('webmestre'))
55
+                ) {
56
+                    include_spip('inc/minipres');
57
+                    echo minipres();
58
+                    exit;
59
+                }
60
+                // l'argument Page a priorite sur l'argument action
61
+                // le cas se presente a cause des RewriteRule d'Apache
62
+                // qui permettent d'ajouter un argument dans la QueryString
63
+                // mais pas d'en retirer un en conservant les autres.
64
+                if (isset($_GET['action']) and $_GET['action'] === $fond) {
65
+                    unset($_GET['action']);
66
+                }
67
+                # sinon, fond par defaut
68
+            } else {
69
+                // sinon fond par defaut (cf. assembler.php)
70
+                $fond = pipeline('detecter_fond_par_defaut', '');
71
+            }
72
+        }
73
+    }
74
+
75
+    $tableau_des_temps = [];
76
+
77
+    // Particularites de certains squelettes
78
+    if ($fond == 'login') {
79
+        $forcer_lang = true;
80
+    }
81
+
82
+    if (
83
+        isset($forcer_lang) and $forcer_lang and ($forcer_lang !== 'non')
84
+        and !_request('action')
85
+        and $_SERVER['REQUEST_METHOD'] != 'POST'
86
+    ) {
87
+        include_spip('inc/lang');
88
+        verifier_lang_url();
89
+    }
90
+
91
+    $lang = !isset($_GET['lang']) ? '' : lang_select($_GET['lang']);
92
+
93
+    // Charger l'aiguilleur des traitements derogatoires
94
+    // (action en base SQL, formulaires CVT, AJax)
95
+    if (_request('action') or _request('var_ajax') or _request('formulaire_action')) {
96
+        include_spip('public/aiguiller');
97
+        if (
98
+            // cas des appels actions ?action=xxx
99
+            traiter_appels_actions()
100
+            or
101
+            // cas des hits ajax sur les inclusions ajax
102
+            traiter_appels_inclusions_ajax()
103
+            or
104
+            // cas des formulaires charger/verifier/traiter
105
+            traiter_formulaires_dynamiques()
106
+        ) {
107
+            // lancer les taches sur affichage final, comme le cron
108
+            // mais sans rien afficher
109
+            $GLOBALS['html'] = false; // ne rien afficher
110
+            pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
111
+            exit; // le hit est fini !
112
+        }
113
+    }
114
+
115
+    // Il y a du texte a produire, charger le metteur en page
116
+    include_spip('public/assembler');
117
+    $page = assembler($fond, _request('connect') ?? '');
118
+
119
+    if (isset($page['status'])) {
120
+        include_spip('inc/headers');
121
+        http_response_code($page['status']);
122
+    }
123
+
124
+    // Content-Type ?
125
+    if (!isset($page['entetes']['Content-Type'])) {
126
+        $charset = $GLOBALS['meta']['charset'] ?? 'utf-8';
127
+        $page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
128
+        $html = true;
129
+    } else {
130
+        $html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
131
+    }
132
+
133
+    // Tester si on est admin et il y a des choses supplementaires a dire
134
+    // type tableau pour y mettre des choses au besoin.
135
+    $debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
136
+
137
+    // affiche-t-on les boutons d'administration ? voir f_admin()
138
+    $affiche_boutons_admin = ($html and (
139
+            (isset($_COOKIE['spip_admin']) and (!isset($flag_preserver) or !$flag_preserver))
140
+            or ($debug and include_spip('inc/autoriser') and autoriser('debug'))
141
+            or (defined('_VAR_PREVIEW') and _VAR_PREVIEW)
142
+        ));
143
+
144
+    if ($affiche_boutons_admin) {
145
+        include_spip('balise/formulaire_admin');
146
+    }
147
+
148
+
149
+    // Execution de la page calculee
150
+
151
+    // traitements sur les entetes avant envoi
152
+    // peut servir pour le plugin de stats
153
+    $page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
154
+
155
+
156
+    // eval $page et affecte $res
157
+    include _ROOT_RESTREINT . 'public/evaluer_page.php';
158
+    envoyer_entetes($page['entetes']);
159
+    if ($res === false) {
160
+        include_spip('inc/autoriser');
161
+        $err = _T('zbug_erreur_execution_page');
162
+        if (autoriser('webmestre')) {
163
+            $err .= "\n<hr />\n"
164
+                . highlight_string($page['codephp'], true)
165
+                . "\n<hr />\n";
166
+        }
167
+        $msg = [$err];
168
+        erreur_squelette($msg);
169
+    }
170
+
171
+    //
172
+    // Envoyer le resultat apres post-traitements
173
+    //
174
+    // (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175
+    // cf. public/assembler.php)
176
+    echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
177
+
178
+    if ($lang) {
179
+        lang_select();
180
+    }
181
+    // l'affichage de la page a pu lever des erreurs (inclusion manquante)
182
+    // il faut tester a nouveau
183
+    $debug = ((_request('var_mode') == 'debug') or $tableau_des_temps) ? [1] : [];
184
+
185
+    // Appel au debusqueur en cas d'erreurs ou de demande de trace
186
+    // at last
187
+    if ($debug) {
188
+        // en cas d'erreur, retester l'affichage
189
+        if ($html and ($affiche_boutons_admin or $debug)) {
190
+            $var_mode_affiche = _request('var_mode_affiche');
191
+            $var_mode_objet = _request('var_mode_objet');
192
+            $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
193
+            echo erreur_squelette(false);
194
+        }
195
+    } else {
196
+        if (
197
+            isset($GLOBALS['meta']['date_prochain_postdate'])
198
+            and $GLOBALS['meta']['date_prochain_postdate'] <= time()
199
+        ) {
200
+            include_spip('inc/rubriques');
201
+            calculer_prochain_postdate(true);
202
+        }
203
+
204
+        // Effectuer une tache de fond ?
205
+        // si _DIRECT_CRON_FORCE est present, on force l'appel
206
+        if (defined('_DIRECT_CRON_FORCE')) {
207
+            cron();
208
+        }
209
+
210
+        // sauver le cache chemin si necessaire
211
+        save_path_cache();
212
+    }
213 213
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -30,9 +30,9 @@  discard block
 block discarded – undo
30 30
 	if (!defined('_DIR_RESTREINT_ABS')) {
31 31
 		if (
32 32
 			defined('_DIR_RESTREINT')
33
-			and @file_exists(_ROOT_RESTREINT . 'inc_version.php')
33
+			and @file_exists(_ROOT_RESTREINT.'inc_version.php')
34 34
 		) {
35
-			include_once _ROOT_RESTREINT . 'inc_version.php';
35
+			include_once _ROOT_RESTREINT.'inc_version.php';
36 36
 		} else {
37 37
 			die('inc_version absent ?');
38 38
 		}
@@ -43,7 +43,7 @@  discard block
 block discarded – undo
43 43
 		} // fond demande dans l'url par page=xxxx ?
44 44
 		else {
45 45
 			if (isset($_GET[_SPIP_PAGE])) {
46
-				$fond = (string)$_GET[_SPIP_PAGE];
46
+				$fond = (string) $_GET[_SPIP_PAGE];
47 47
 
48 48
 				// Securite
49 49
 				if (
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
 			// lancer les taches sur affichage final, comme le cron
108 108
 			// mais sans rien afficher
109 109
 			$GLOBALS['html'] = false; // ne rien afficher
110
-			pipeline('affichage_final' . _PIPELINE_SUFFIX, '');
110
+			pipeline('affichage_final'._PIPELINE_SUFFIX, '');
111 111
 			exit; // le hit est fini !
112 112
 		}
113 113
 	}
@@ -124,7 +124,7 @@  discard block
 block discarded – undo
124 124
 	// Content-Type ?
125 125
 	if (!isset($page['entetes']['Content-Type'])) {
126 126
 		$charset = $GLOBALS['meta']['charset'] ?? 'utf-8';
127
-		$page['entetes']['Content-Type'] = 'text/html; charset=' . $charset;
127
+		$page['entetes']['Content-Type'] = 'text/html; charset='.$charset;
128 128
 		$html = true;
129 129
 	} else {
130 130
 		$html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']);
@@ -150,11 +150,11 @@  discard block
 block discarded – undo
150 150
 
151 151
 	// traitements sur les entetes avant envoi
152 152
 	// peut servir pour le plugin de stats
153
-	$page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']);
153
+	$page['entetes'] = pipeline('affichage_entetes_final'._PIPELINE_SUFFIX, $page['entetes']);
154 154
 
155 155
 
156 156
 	// eval $page et affecte $res
157
-	include _ROOT_RESTREINT . 'public/evaluer_page.php';
157
+	include _ROOT_RESTREINT.'public/evaluer_page.php';
158 158
 	envoyer_entetes($page['entetes']);
159 159
 	if ($res === false) {
160 160
 		include_spip('inc/autoriser');
@@ -173,7 +173,7 @@  discard block
 block discarded – undo
173 173
 	//
174 174
 	// (c'est ici qu'on fait var_recherche, validation, boutons d'admin,
175 175
 	// cf. public/assembler.php)
176
-	echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']);
176
+	echo pipeline('affichage_final'._PIPELINE_SUFFIX, $page['texte']);
177 177
 
178 178
 	if ($lang) {
179 179
 		lang_select();
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
 		if ($html and ($affiche_boutons_admin or $debug)) {
190 190
 			$var_mode_affiche = _request('var_mode_affiche');
191 191
 			$var_mode_objet = _request('var_mode_objet');
192
-			$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
192
+			$GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet.'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : '');
193 193
 			echo erreur_squelette(false);
194 194
 		}
195 195
 	} else {
Please login to merge, or discard this patch.
ecrire/iterateur/data.php 2 patches
Spacing   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
 		// Si a ce stade on n'a pas de table, il y a un bug
235 235
 		if (!is_array($this->tableau)) {
236 236
 			$this->err = true;
237
-			spip_log('erreur datasource ' . var_export($command, true));
237
+			spip_log('erreur datasource '.var_export($command, true));
238 238
 		}
239 239
 
240 240
 		// {datapath query.results}
@@ -276,7 +276,7 @@  discard block
 block discarded – undo
276 276
 			isset($this->command['sourcemode'])
277 277
 			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
278 278
 		) {
279
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
279
+			charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true);
280 280
 		}
281 281
 
282 282
 		# le premier argument peut etre un array, une URL etc.
@@ -285,7 +285,7 @@  discard block
 block discarded – undo
285 285
 		# avons-nous un cache dispo ?
286 286
 		$cle = null;
287 287
 		if (is_string($src)) {
288
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
288
+			$cle = 'datasource_'.md5($this->command['sourcemode'].':'.var_export($this->command['source'], true));
289 289
 		}
290 290
 
291 291
 		$cache = $this->cache_get($cle);
@@ -344,7 +344,7 @@  discard block
 block discarded – undo
344 344
 
345 345
 					if (
346 346
 						!$this->err
347
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
347
+						and $data_to_array = charger_fonction($this->command['sourcemode'].'_to_array', 'inc', true)
348 348
 					) {
349 349
 						$args = $this->command['source'];
350 350
 						$args[0] = $data;
@@ -484,13 +484,13 @@  discard block
 block discarded – undo
484 484
 							$tv = '%s';
485 485
 						} # {par valeur/xx/yy} ??
486 486
 						else {
487
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
487
+							$tv = 'table_valeur(%s, '.var_export($r[1], true).')';
488 488
 						}
489 489
 						$sortfunc .= '
490
-					$a = ' . sprintf($tv, '$aa') . ';
491
-					$b = ' . sprintf($tv, '$bb') . ';
490
+					$a = ' . sprintf($tv, '$aa').';
491
+					$b = ' . sprintf($tv, '$bb').';
492 492
 					if ($a <> $b)
493
-						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
493
+						return ($a ' . (!empty($r[2]) ? '>' : '<').' $b) ? -1 : 1;';
494 494
 					}
495 495
 				}
496 496
 			}
@@ -643,7 +643,7 @@  discard block
 block discarded – undo
643 643
 function inc_sql_to_array_dist($data) {
644 644
 	# sortir le connecteur de $data
645 645
 	preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
646
-	$serveur = (string)$v[1];
646
+	$serveur = (string) $v[1];
647 647
 	$req = trim($v[2]);
648 648
 	if ($s = sql_query($req, $serveur)) {
649 649
 		$r = [];
@@ -668,7 +668,7 @@  discard block
 block discarded – undo
668 668
 		$json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
669 669
 	} catch (JsonException $e) {
670 670
 		$json = null;
671
-		spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
671
+		spip_log('Failed to parse Json data : '.$e->getMessage(), _LOG_INFO);
672 672
 	}
673 673
 	return is_array($json) ? (array) $json : [];
674 674
 }
@@ -688,13 +688,13 @@  discard block
 block discarded – undo
688 688
 	$i = 1;
689 689
 	foreach ($entete as $k => $v) {
690 690
 		if (trim($v) == '') {
691
-			$v = 'col' . $i;
691
+			$v = 'col'.$i;
692 692
 		} // reperer des eventuelles cases vides
693 693
 		if (is_numeric($v) and $v < 0) {
694
-			$v = '__' . $v;
694
+			$v = '__'.$v;
695 695
 		} // ne pas risquer d'ecraser une cle numerique
696 696
 		if (is_numeric($v)) {
697
-			$v = '_' . $v;
697
+			$v = '_'.$v;
698 698
 		} // ne pas risquer d'ecraser une cle numerique
699 699
 		$v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
700 700
 		foreach ($csv as &$item) {
@@ -780,7 +780,7 @@  discard block
 block discarded – undo
780 780
  * @return array|bool
781 781
  */
782 782
 function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) {
783
-	return (array)preg_files($dir, $regexp, $limit);
783
+	return (array) preg_files($dir, $regexp, $limit);
784 784
 }
785 785
 
786 786
 /**
@@ -795,13 +795,13 @@  discard block
 block discarded – undo
795 795
 	$glob_to_array = charger_fonction('glob_to_array', 'inc');
796 796
 	$a = $glob_to_array($data);
797 797
 	foreach ($a as &$v) {
798
-		$b = (array)@stat($v);
798
+		$b = (array) @stat($v);
799 799
 		foreach ($b as $k => $ignore) {
800 800
 			if (is_numeric($k)) {
801 801
 				unset($b[$k]);
802 802
 			}
803 803
 		}
804
-		$b['file'] = preg_replace('`/$`', '', $v) ;
804
+		$b['file'] = preg_replace('`/$`', '', $v);
805 805
 		$v = array_merge(
806 806
 			pathinfo($v),
807 807
 			$b
@@ -821,7 +821,7 @@  discard block
 block discarded – undo
821 821
 	$xml_array = [];
822 822
 	for ($object->rewind(); $object->valid(); $object->next()) {
823 823
 		if (array_key_exists($key = $object->key(), $xml_array)) {
824
-			$key .= '-' . uniqid();
824
+			$key .= '-'.uniqid();
825 825
 		}
826 826
 		$vars = get_object_vars($object->current());
827 827
 		if (isset($vars['@attributes'])) {
Please login to merge, or discard this patch.
Indentation   +636 added lines, -636 removed lines patch added patch discarded remove patch
@@ -17,11 +17,11 @@  discard block
 block discarded – undo
17 17
  **/
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 if (!defined('_DATA_SOURCE_MAX_SIZE')) {
24
-	define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
24
+    define('_DATA_SOURCE_MAX_SIZE', 2 * 1_048_576);
25 25
 }
26 26
 
27 27
 
@@ -42,17 +42,17 @@  discard block
 block discarded – undo
42 42
  *     Description de la boucle complétée des champs
43 43
  */
44 44
 function iterateur_DATA_dist($b) {
45
-	$b->iterateur = 'DATA'; # designe la classe d'iterateur
46
-	$b->show = [
47
-		'field' => [
48
-			'cle' => 'STRING',
49
-			'valeur' => 'STRING',
50
-			'*' => 'ALL' // Champ joker *
51
-		]
52
-	];
53
-	$b->select[] = '.valeur';
54
-
55
-	return $b;
45
+    $b->iterateur = 'DATA'; # designe la classe d'iterateur
46
+    $b->show = [
47
+        'field' => [
48
+            'cle' => 'STRING',
49
+            'valeur' => 'STRING',
50
+            '*' => 'ALL' // Champ joker *
51
+        ]
52
+    ];
53
+    $b->select[] = '.valeur';
54
+
55
+    return $b;
56 56
 }
57 57
 
58 58
 
@@ -62,518 +62,518 @@  discard block
 block discarded – undo
62 62
  * Pour itérer sur des données quelconques (transformables en tableau)
63 63
  */
64 64
 class IterateurDATA implements Iterator {
65
-	/** Tableau de données */
66
-	protected array $tableau = [];
67
-
68
-	/**
69
-	 * Conditions de filtrage
70
-	 * ie criteres de selection
71
-	 */
72
-	protected array $filtre = [];
73
-
74
-
75
-	/**
76
-	 * Cle courante
77
-	 *
78
-	 * @var scalar
79
-	 */
80
-	protected $cle = null;
81
-
82
-	/**
83
-	 * Valeur courante
84
-	 *
85
-	 * @var mixed
86
-	 */
87
-	protected $valeur = null;
88
-
89
-	protected string $type = 'DATA';
90
-
91
-	protected array $command = [];
92
-
93
-	protected array $info = [];
94
-
95
-	/** Erreur presente ? */
96
-	public bool $err = false;
97
-
98
-	/**
99
-	 * Calcul du total des elements
100
-	 *
101
-	 * @var int|null
102
-	 **/
103
-	public $total = null;
104
-
105
-	/**
106
-	 * Constructeur
107
-	 *
108
-	 * @param  $command
109
-	 * @param array $info
110
-	 */
111
-	public function __construct($command, $info = []) {
112
-		$this->type = 'DATA';
113
-		$this->command = $command;
114
-		$this->info = $info;
115
-
116
-		$this->select($command);
117
-	}
118
-
119
-	/**
120
-	 * Revenir au depart
121
-	 *
122
-	 * @return void
123
-	 */
124
-	public function rewind(): void {
125
-		reset($this->tableau);
126
-		$this->cle = array_key_first($this->tableau);
127
-		$this->valeur = current($this->tableau);
128
-		next($this->tableau);
129
-	}
130
-
131
-	/**
132
-	 * Déclarer les critères exceptions
133
-	 *
134
-	 * @return array
135
-	 */
136
-	public function exception_des_criteres() {
137
-		return ['tableau'];
138
-	}
139
-
140
-	/**
141
-	 * Récupérer depuis le cache si possible
142
-	 *
143
-	 * @param string $cle
144
-	 * @return mixed
145
-	 */
146
-	protected function cache_get($cle) {
147
-		if (!$cle) {
148
-			return;
149
-		}
150
-		# utiliser memoization si dispo
151
-		if (!function_exists('cache_get')) {
152
-			return;
153
-		}
154
-
155
-		return cache_get($cle);
156
-	}
157
-
158
-	/**
159
-	 * Stocker en cache si possible
160
-	 *
161
-	 * @param string $cle
162
-	 * @param int $ttl
163
-	 * @param null|mixed $valeur
164
-	 * @return bool
165
-	 */
166
-	protected function cache_set($cle, $ttl, $valeur = null) {
167
-		if (!$cle) {
168
-			return;
169
-		}
170
-		if (is_null($valeur)) {
171
-			$valeur = $this->tableau;
172
-		}
173
-		# utiliser memoization si dispo
174
-		if (!function_exists('cache_set')) {
175
-			return;
176
-		}
177
-
178
-		return cache_set(
179
-			$cle,
180
-			[
181
-				'data' => $valeur,
182
-				'time' => time(),
183
-				'ttl' => $ttl
184
-			],
185
-			3600 + $ttl
186
-		);
187
-		# conserver le cache 1h de plus que la validite demandee,
188
-		# pour le cas ou le serveur distant ne reponde plus
189
-	}
190
-
191
-	/**
192
-	 * Aller chercher les données de la boucle DATA
193
-	 *
194
-	 * @throws Exception
195
-	 * @param array $command
196
-	 * @return void
197
-	 */
198
-	protected function select($command) {
199
-
200
-		// l'iterateur DATA peut etre appele en passant (data:type)
201
-		// le type se retrouve dans la commande 'from'
202
-		// dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
203
-		if (isset($this->command['from'][0])) {
204
-			if (isset($this->command['source']) and is_array($this->command['source'])) {
205
-				array_unshift($this->command['source'], $this->command['sourcemode']);
206
-			}
207
-			$this->command['sourcemode'] = $this->command['from'][0];
208
-		}
209
-
210
-		// cherchons differents moyens de creer le tableau de donnees
211
-		// les commandes connues pour l'iterateur DATA
212
-		// sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
213
-
214
-		// {source format, [URL], [arg2]...}
215
-		if (
216
-			isset($this->command['source'])
217
-			and isset($this->command['sourcemode'])
218
-		) {
219
-			$this->select_source();
220
-		}
221
-
222
-		// Critere {liste X1, X2, X3}
223
-		if (isset($this->command['liste'])) {
224
-			$this->select_liste();
225
-		}
226
-		if (isset($this->command['enum'])) {
227
-			$this->select_enum();
228
-		}
229
-
230
-		// Si a ce stade on n'a pas de table, il y a un bug
231
-		if (!is_array($this->tableau)) {
232
-			$this->err = true;
233
-			spip_log('erreur datasource ' . var_export($command, true));
234
-		}
235
-
236
-		// {datapath query.results}
237
-		// extraire le chemin "query.results" du tableau de donnees
238
-		if (
239
-			!$this->err
240
-			and isset($this->command['datapath'])
241
-			and is_array($this->command['datapath'])
242
-		) {
243
-			$this->select_datapath();
244
-		}
245
-
246
-		// tri {par x}
247
-		if ($this->command['orderby']) {
248
-			$this->select_orderby();
249
-		}
250
-
251
-		// grouper les resultats {fusion /x/y/z} ;
252
-		if ($this->command['groupby']) {
253
-			$this->select_groupby();
254
-		}
255
-
256
-		$this->rewind();
257
-		#var_dump($this->tableau);
258
-	}
259
-
260
-
261
-	/**
262
-	 * Aller chercher les donnees de la boucle DATA
263
-	 * depuis une source
264
-	 * {source format, [URL], [arg2]...}
265
-	 */
266
-	protected function select_source() {
267
-		# un peu crado : avant de charger le cache il faut charger
268
-		# les class indispensables, sinon PHP ne saura pas gerer
269
-		# l'objet en cache ; cf plugins/icalendar
270
-		# perf : pas de fonction table_to_array ! (table est deja un array)
271
-		if (
272
-			isset($this->command['sourcemode'])
273
-			and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
274
-		) {
275
-			charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
276
-		}
277
-
278
-		# le premier argument peut etre un array, une URL etc.
279
-		$src = $this->command['source'][0];
280
-
281
-		# avons-nous un cache dispo ?
282
-		$cle = null;
283
-		if (is_string($src)) {
284
-			$cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
285
-		}
286
-
287
-		$cache = $this->cache_get($cle);
288
-		if (isset($this->command['datacache'])) {
289
-			$ttl = intval($this->command['datacache']);
290
-		}
291
-		if (
292
-			$cache
293
-			and ($cache['time'] + ($ttl ?? $cache['ttl'])
294
-				> time())
295
-			and !(_request('var_mode') === 'recalcul'
296
-				and include_spip('inc/autoriser')
297
-				and autoriser('recalcul')
298
-			)
299
-		) {
300
-			$this->tableau = $cache['data'];
301
-		} else {
302
-			try {
303
-				if (
304
-					isset($this->command['sourcemode'])
305
-					and in_array(
306
-						$this->command['sourcemode'],
307
-						['table', 'array', 'tableau']
308
-					)
309
-				) {
310
-					if (
311
-						is_array($a = $src)
312
-						or (is_string($a)
313
-							and $a = str_replace('&quot;', '"', $a) # fragile!
314
-							and is_array($a = @unserialize($a)))
315
-					) {
316
-						$this->tableau = $a;
317
-					}
318
-				} else {
319
-					$data = $src;
320
-					if (is_string($src)) {
321
-						if (tester_url_absolue($src)) {
322
-							include_spip('inc/distant');
323
-							$data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
324
-							$data = $data['page'] ?? '';
325
-							if (!$data) {
326
-								throw new Exception('404');
327
-							}
328
-							if (!isset($ttl)) {
329
-								$ttl = 24 * 3600;
330
-							}
331
-						} elseif (@is_dir($src)) {
332
-							$data = $src;
333
-						} elseif (@is_readable($src) && @is_file($src)) {
334
-							$data = spip_file_get_contents($src);
335
-						}
336
-						if (!isset($ttl)) {
337
-							$ttl = 10;
338
-						}
339
-					}
340
-
341
-					if (
342
-						!$this->err
343
-						and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
344
-					) {
345
-						$args = $this->command['source'];
346
-						$args[0] = $data;
347
-						if (is_array($a = $data_to_array(...$args))) {
348
-							$this->tableau = $a;
349
-						}
350
-					}
351
-				}
352
-
353
-				if (!is_array($this->tableau)) {
354
-					$this->err = true;
355
-				}
356
-
357
-				if (!$this->err and isset($ttl) and $ttl > 0) {
358
-					$this->cache_set($cle, $ttl);
359
-				}
360
-			} catch (Exception $e) {
361
-				$e = $e->getMessage();
362
-				$err = sprintf(
363
-					"[%s, %s] $e",
364
-					$src,
365
-					$this->command['sourcemode']
366
-				);
367
-				erreur_squelette([$err, []]);
368
-				$this->err = true;
369
-			}
370
-		}
371
-
372
-		# en cas d'erreur, utiliser le cache si encore dispo
373
-		if (
374
-			$this->err
375
-			and $cache
376
-		) {
377
-			$this->tableau = $cache['data'];
378
-			$this->err = false;
379
-		}
380
-	}
381
-
382
-
383
-	/**
384
-	 * Retourne un tableau donne depuis un critère liste
385
-	 *
386
-	 * Critère `{liste X1, X2, X3}`
387
-	 *
388
-	 * @see critere_DATA_liste_dist()
389
-	 *
390
-	 **/
391
-	protected function select_liste() {
392
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
393
-		if (!isset($this->command['liste'][1])) {
394
-			if (!is_array($this->command['liste'][0])) {
395
-				$this->command['liste'] = explode(',', $this->command['liste'][0]);
396
-			} else {
397
-				$this->command['liste'] = $this->command['liste'][0];
398
-			}
399
-		}
400
-		$this->tableau = $this->command['liste'];
401
-	}
402
-
403
-	/**
404
-	 * Retourne un tableau donne depuis un critere liste
405
-	 * Critere {enum Xmin, Xmax}
406
-	 *
407
-	 **/
408
-	protected function select_enum() {
409
-		# s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
410
-		if (!isset($this->command['enum'][1])) {
411
-			if (!is_array($this->command['enum'][0])) {
412
-				$this->command['enum'] = explode(',', $this->command['enum'][0]);
413
-			} else {
414
-				$this->command['enum'] = $this->command['enum'][0];
415
-			}
416
-		}
417
-		if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
418
-			$enum = range(
419
-				array_shift($this->command['enum']),
420
-				array_shift($this->command['enum']),
421
-				array_shift($this->command['enum'])
422
-			);
423
-		} else {
424
-			$enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
425
-		}
426
-		$this->tableau = $enum;
427
-	}
428
-
429
-
430
-	/**
431
-	 * extraire le chemin "query.results" du tableau de donnees
432
-	 * {datapath query.results}
433
-	 *
434
-	 **/
435
-	protected function select_datapath() {
436
-		$base = reset($this->command['datapath']);
437
-		if (strlen($base = ltrim(trim($base), '/'))) {
438
-			$this->tableau = table_valeur($this->tableau, $base);
439
-			if (!is_array($this->tableau)) {
440
-				$this->tableau = [];
441
-				$this->err = true;
442
-				spip_log("datapath '$base' absent");
443
-			}
444
-		}
445
-	}
446
-
447
-	/**
448
-	 * Ordonner les resultats
449
-	 * {par x}
450
-	 *
451
-	 **/
452
-	protected function select_orderby() {
453
-		$sortfunc = '';
454
-		$aleas = 0;
455
-		foreach ($this->command['orderby'] as $tri) {
456
-			// virer le / initial pour les criteres de la forme {par /xx}
457
-			if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
458
-				$r = array_pad($r, 3, null);
459
-
460
-				// tri par cle
461
-				if ($r[1] == 'cle') {
462
-					if (isset($r[2]) and $r[2]) {
463
-						krsort($this->tableau);
464
-					} else {
465
-						ksort($this->tableau);
466
-					}
467
-				} # {par hasard}
468
-				else {
469
-					if ($r[1] == 'hasard') {
470
-						$k = array_keys($this->tableau);
471
-						shuffle($k);
472
-						$v = [];
473
-						foreach ($k as $cle) {
474
-							$v[$cle] = $this->tableau[$cle];
475
-						}
476
-						$this->tableau = $v;
477
-					} else {
478
-						# {par valeur}
479
-						if ($r[1] == 'valeur') {
480
-							$tv = '%s';
481
-						} # {par valeur/xx/yy} ??
482
-						else {
483
-							$tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
484
-						}
485
-						$sortfunc .= '
65
+    /** Tableau de données */
66
+    protected array $tableau = [];
67
+
68
+    /**
69
+     * Conditions de filtrage
70
+     * ie criteres de selection
71
+     */
72
+    protected array $filtre = [];
73
+
74
+
75
+    /**
76
+     * Cle courante
77
+     *
78
+     * @var scalar
79
+     */
80
+    protected $cle = null;
81
+
82
+    /**
83
+     * Valeur courante
84
+     *
85
+     * @var mixed
86
+     */
87
+    protected $valeur = null;
88
+
89
+    protected string $type = 'DATA';
90
+
91
+    protected array $command = [];
92
+
93
+    protected array $info = [];
94
+
95
+    /** Erreur presente ? */
96
+    public bool $err = false;
97
+
98
+    /**
99
+     * Calcul du total des elements
100
+     *
101
+     * @var int|null
102
+     **/
103
+    public $total = null;
104
+
105
+    /**
106
+     * Constructeur
107
+     *
108
+     * @param  $command
109
+     * @param array $info
110
+     */
111
+    public function __construct($command, $info = []) {
112
+        $this->type = 'DATA';
113
+        $this->command = $command;
114
+        $this->info = $info;
115
+
116
+        $this->select($command);
117
+    }
118
+
119
+    /**
120
+     * Revenir au depart
121
+     *
122
+     * @return void
123
+     */
124
+    public function rewind(): void {
125
+        reset($this->tableau);
126
+        $this->cle = array_key_first($this->tableau);
127
+        $this->valeur = current($this->tableau);
128
+        next($this->tableau);
129
+    }
130
+
131
+    /**
132
+     * Déclarer les critères exceptions
133
+     *
134
+     * @return array
135
+     */
136
+    public function exception_des_criteres() {
137
+        return ['tableau'];
138
+    }
139
+
140
+    /**
141
+     * Récupérer depuis le cache si possible
142
+     *
143
+     * @param string $cle
144
+     * @return mixed
145
+     */
146
+    protected function cache_get($cle) {
147
+        if (!$cle) {
148
+            return;
149
+        }
150
+        # utiliser memoization si dispo
151
+        if (!function_exists('cache_get')) {
152
+            return;
153
+        }
154
+
155
+        return cache_get($cle);
156
+    }
157
+
158
+    /**
159
+     * Stocker en cache si possible
160
+     *
161
+     * @param string $cle
162
+     * @param int $ttl
163
+     * @param null|mixed $valeur
164
+     * @return bool
165
+     */
166
+    protected function cache_set($cle, $ttl, $valeur = null) {
167
+        if (!$cle) {
168
+            return;
169
+        }
170
+        if (is_null($valeur)) {
171
+            $valeur = $this->tableau;
172
+        }
173
+        # utiliser memoization si dispo
174
+        if (!function_exists('cache_set')) {
175
+            return;
176
+        }
177
+
178
+        return cache_set(
179
+            $cle,
180
+            [
181
+                'data' => $valeur,
182
+                'time' => time(),
183
+                'ttl' => $ttl
184
+            ],
185
+            3600 + $ttl
186
+        );
187
+        # conserver le cache 1h de plus que la validite demandee,
188
+        # pour le cas ou le serveur distant ne reponde plus
189
+    }
190
+
191
+    /**
192
+     * Aller chercher les données de la boucle DATA
193
+     *
194
+     * @throws Exception
195
+     * @param array $command
196
+     * @return void
197
+     */
198
+    protected function select($command) {
199
+
200
+        // l'iterateur DATA peut etre appele en passant (data:type)
201
+        // le type se retrouve dans la commande 'from'
202
+        // dans ce cas la le critere {source}, si present, n'a pas besoin du 1er argument
203
+        if (isset($this->command['from'][0])) {
204
+            if (isset($this->command['source']) and is_array($this->command['source'])) {
205
+                array_unshift($this->command['source'], $this->command['sourcemode']);
206
+            }
207
+            $this->command['sourcemode'] = $this->command['from'][0];
208
+        }
209
+
210
+        // cherchons differents moyens de creer le tableau de donnees
211
+        // les commandes connues pour l'iterateur DATA
212
+        // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
213
+
214
+        // {source format, [URL], [arg2]...}
215
+        if (
216
+            isset($this->command['source'])
217
+            and isset($this->command['sourcemode'])
218
+        ) {
219
+            $this->select_source();
220
+        }
221
+
222
+        // Critere {liste X1, X2, X3}
223
+        if (isset($this->command['liste'])) {
224
+            $this->select_liste();
225
+        }
226
+        if (isset($this->command['enum'])) {
227
+            $this->select_enum();
228
+        }
229
+
230
+        // Si a ce stade on n'a pas de table, il y a un bug
231
+        if (!is_array($this->tableau)) {
232
+            $this->err = true;
233
+            spip_log('erreur datasource ' . var_export($command, true));
234
+        }
235
+
236
+        // {datapath query.results}
237
+        // extraire le chemin "query.results" du tableau de donnees
238
+        if (
239
+            !$this->err
240
+            and isset($this->command['datapath'])
241
+            and is_array($this->command['datapath'])
242
+        ) {
243
+            $this->select_datapath();
244
+        }
245
+
246
+        // tri {par x}
247
+        if ($this->command['orderby']) {
248
+            $this->select_orderby();
249
+        }
250
+
251
+        // grouper les resultats {fusion /x/y/z} ;
252
+        if ($this->command['groupby']) {
253
+            $this->select_groupby();
254
+        }
255
+
256
+        $this->rewind();
257
+        #var_dump($this->tableau);
258
+    }
259
+
260
+
261
+    /**
262
+     * Aller chercher les donnees de la boucle DATA
263
+     * depuis une source
264
+     * {source format, [URL], [arg2]...}
265
+     */
266
+    protected function select_source() {
267
+        # un peu crado : avant de charger le cache il faut charger
268
+        # les class indispensables, sinon PHP ne saura pas gerer
269
+        # l'objet en cache ; cf plugins/icalendar
270
+        # perf : pas de fonction table_to_array ! (table est deja un array)
271
+        if (
272
+            isset($this->command['sourcemode'])
273
+            and !in_array($this->command['sourcemode'], ['table', 'array', 'tableau'])
274
+        ) {
275
+            charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true);
276
+        }
277
+
278
+        # le premier argument peut etre un array, une URL etc.
279
+        $src = $this->command['source'][0];
280
+
281
+        # avons-nous un cache dispo ?
282
+        $cle = null;
283
+        if (is_string($src)) {
284
+            $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true));
285
+        }
286
+
287
+        $cache = $this->cache_get($cle);
288
+        if (isset($this->command['datacache'])) {
289
+            $ttl = intval($this->command['datacache']);
290
+        }
291
+        if (
292
+            $cache
293
+            and ($cache['time'] + ($ttl ?? $cache['ttl'])
294
+                > time())
295
+            and !(_request('var_mode') === 'recalcul'
296
+                and include_spip('inc/autoriser')
297
+                and autoriser('recalcul')
298
+            )
299
+        ) {
300
+            $this->tableau = $cache['data'];
301
+        } else {
302
+            try {
303
+                if (
304
+                    isset($this->command['sourcemode'])
305
+                    and in_array(
306
+                        $this->command['sourcemode'],
307
+                        ['table', 'array', 'tableau']
308
+                    )
309
+                ) {
310
+                    if (
311
+                        is_array($a = $src)
312
+                        or (is_string($a)
313
+                            and $a = str_replace('&quot;', '"', $a) # fragile!
314
+                            and is_array($a = @unserialize($a)))
315
+                    ) {
316
+                        $this->tableau = $a;
317
+                    }
318
+                } else {
319
+                    $data = $src;
320
+                    if (is_string($src)) {
321
+                        if (tester_url_absolue($src)) {
322
+                            include_spip('inc/distant');
323
+                            $data = recuperer_url($src, ['taille_max' => _DATA_SOURCE_MAX_SIZE]);
324
+                            $data = $data['page'] ?? '';
325
+                            if (!$data) {
326
+                                throw new Exception('404');
327
+                            }
328
+                            if (!isset($ttl)) {
329
+                                $ttl = 24 * 3600;
330
+                            }
331
+                        } elseif (@is_dir($src)) {
332
+                            $data = $src;
333
+                        } elseif (@is_readable($src) && @is_file($src)) {
334
+                            $data = spip_file_get_contents($src);
335
+                        }
336
+                        if (!isset($ttl)) {
337
+                            $ttl = 10;
338
+                        }
339
+                    }
340
+
341
+                    if (
342
+                        !$this->err
343
+                        and $data_to_array = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)
344
+                    ) {
345
+                        $args = $this->command['source'];
346
+                        $args[0] = $data;
347
+                        if (is_array($a = $data_to_array(...$args))) {
348
+                            $this->tableau = $a;
349
+                        }
350
+                    }
351
+                }
352
+
353
+                if (!is_array($this->tableau)) {
354
+                    $this->err = true;
355
+                }
356
+
357
+                if (!$this->err and isset($ttl) and $ttl > 0) {
358
+                    $this->cache_set($cle, $ttl);
359
+                }
360
+            } catch (Exception $e) {
361
+                $e = $e->getMessage();
362
+                $err = sprintf(
363
+                    "[%s, %s] $e",
364
+                    $src,
365
+                    $this->command['sourcemode']
366
+                );
367
+                erreur_squelette([$err, []]);
368
+                $this->err = true;
369
+            }
370
+        }
371
+
372
+        # en cas d'erreur, utiliser le cache si encore dispo
373
+        if (
374
+            $this->err
375
+            and $cache
376
+        ) {
377
+            $this->tableau = $cache['data'];
378
+            $this->err = false;
379
+        }
380
+    }
381
+
382
+
383
+    /**
384
+     * Retourne un tableau donne depuis un critère liste
385
+     *
386
+     * Critère `{liste X1, X2, X3}`
387
+     *
388
+     * @see critere_DATA_liste_dist()
389
+     *
390
+     **/
391
+    protected function select_liste() {
392
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
393
+        if (!isset($this->command['liste'][1])) {
394
+            if (!is_array($this->command['liste'][0])) {
395
+                $this->command['liste'] = explode(',', $this->command['liste'][0]);
396
+            } else {
397
+                $this->command['liste'] = $this->command['liste'][0];
398
+            }
399
+        }
400
+        $this->tableau = $this->command['liste'];
401
+    }
402
+
403
+    /**
404
+     * Retourne un tableau donne depuis un critere liste
405
+     * Critere {enum Xmin, Xmax}
406
+     *
407
+     **/
408
+    protected function select_enum() {
409
+        # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE
410
+        if (!isset($this->command['enum'][1])) {
411
+            if (!is_array($this->command['enum'][0])) {
412
+                $this->command['enum'] = explode(',', $this->command['enum'][0]);
413
+            } else {
414
+                $this->command['enum'] = $this->command['enum'][0];
415
+            }
416
+        }
417
+        if ((is_countable($this->command['enum']) ? count($this->command['enum']) : 0) >= 3) {
418
+            $enum = range(
419
+                array_shift($this->command['enum']),
420
+                array_shift($this->command['enum']),
421
+                array_shift($this->command['enum'])
422
+            );
423
+        } else {
424
+            $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']));
425
+        }
426
+        $this->tableau = $enum;
427
+    }
428
+
429
+
430
+    /**
431
+     * extraire le chemin "query.results" du tableau de donnees
432
+     * {datapath query.results}
433
+     *
434
+     **/
435
+    protected function select_datapath() {
436
+        $base = reset($this->command['datapath']);
437
+        if (strlen($base = ltrim(trim($base), '/'))) {
438
+            $this->tableau = table_valeur($this->tableau, $base);
439
+            if (!is_array($this->tableau)) {
440
+                $this->tableau = [];
441
+                $this->err = true;
442
+                spip_log("datapath '$base' absent");
443
+            }
444
+        }
445
+    }
446
+
447
+    /**
448
+     * Ordonner les resultats
449
+     * {par x}
450
+     *
451
+     **/
452
+    protected function select_orderby() {
453
+        $sortfunc = '';
454
+        $aleas = 0;
455
+        foreach ($this->command['orderby'] as $tri) {
456
+            // virer le / initial pour les criteres de la forme {par /xx}
457
+            if (preg_match(',^\.?([/\w:_-]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) {
458
+                $r = array_pad($r, 3, null);
459
+
460
+                // tri par cle
461
+                if ($r[1] == 'cle') {
462
+                    if (isset($r[2]) and $r[2]) {
463
+                        krsort($this->tableau);
464
+                    } else {
465
+                        ksort($this->tableau);
466
+                    }
467
+                } # {par hasard}
468
+                else {
469
+                    if ($r[1] == 'hasard') {
470
+                        $k = array_keys($this->tableau);
471
+                        shuffle($k);
472
+                        $v = [];
473
+                        foreach ($k as $cle) {
474
+                            $v[$cle] = $this->tableau[$cle];
475
+                        }
476
+                        $this->tableau = $v;
477
+                    } else {
478
+                        # {par valeur}
479
+                        if ($r[1] == 'valeur') {
480
+                            $tv = '%s';
481
+                        } # {par valeur/xx/yy} ??
482
+                        else {
483
+                            $tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')';
484
+                        }
485
+                        $sortfunc .= '
486 486
 					$a = ' . sprintf($tv, '$aa') . ';
487 487
 					$b = ' . sprintf($tv, '$bb') . ';
488 488
 					if ($a <> $b)
489 489
 						return ($a ' . (!empty($r[2]) ? '>' : '<') . ' $b) ? -1 : 1;';
490
-					}
491
-				}
492
-			}
493
-		}
494
-
495
-		if ($sortfunc) {
496
-			$sortfunc .= "\n return 0;";
497
-			uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
498
-		}
499
-	}
500
-
501
-
502
-	/**
503
-	 * Grouper les resultats
504
-	 * {fusion /x/y/z}
505
-	 *
506
-	 **/
507
-	protected function select_groupby() {
508
-		// virer le / initial pour les criteres de la forme {fusion /xx}
509
-		if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
510
-			$vu = [];
511
-			foreach ($this->tableau as $k => $v) {
512
-				$val = table_valeur($v, $fusion);
513
-				if (isset($vu[$val])) {
514
-					unset($this->tableau[$k]);
515
-				} else {
516
-					$vu[$val] = true;
517
-				}
518
-			}
519
-		}
520
-	}
521
-
522
-
523
-	/**
524
-	 * L'iterateur est-il encore valide ?
525
-	 *
526
-	 * @return bool
527
-	 */
528
-	public function valid(): bool {
529
-		return !is_null($this->cle);
530
-	}
531
-
532
-	/**
533
-	 * Retourner la valeur
534
-	 *
535
-	 * @return mixed
536
-	 */
537
-	#[\ReturnTypeWillChange]
538
-	public function current() {
539
-		return $this->valeur;
540
-	}
541
-
542
-	/**
543
-	 * Retourner la cle
544
-	 *
545
-	 * @return mixed
546
-	 */
547
-	#[\ReturnTypeWillChange]
548
-	public function key() {
549
-		return $this->cle;
550
-	}
551
-
552
-	/**
553
-	 * Passer a la valeur suivante
554
-	 *
555
-	 * @return void
556
-	 */
557
-	public function next(): void {
558
-		if ($this->valid()) {
559
-			$this->cle = key($this->tableau);
560
-			$this->valeur = current($this->tableau);
561
-			next($this->tableau);
562
-		}
563
-	}
564
-
565
-	/**
566
-	 * Compter le nombre total de resultats
567
-	 *
568
-	 * @return int
569
-	 */
570
-	public function count() {
571
-		if (is_null($this->total)) {
572
-			$this->total = count($this->tableau);
573
-		}
574
-
575
-		return $this->total;
576
-	}
490
+                    }
491
+                }
492
+            }
493
+        }
494
+
495
+        if ($sortfunc) {
496
+            $sortfunc .= "\n return 0;";
497
+            uasort($this->tableau, fn($aa, $bb) => eval($sortfunc));
498
+        }
499
+    }
500
+
501
+
502
+    /**
503
+     * Grouper les resultats
504
+     * {fusion /x/y/z}
505
+     *
506
+     **/
507
+    protected function select_groupby() {
508
+        // virer le / initial pour les criteres de la forme {fusion /xx}
509
+        if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) {
510
+            $vu = [];
511
+            foreach ($this->tableau as $k => $v) {
512
+                $val = table_valeur($v, $fusion);
513
+                if (isset($vu[$val])) {
514
+                    unset($this->tableau[$k]);
515
+                } else {
516
+                    $vu[$val] = true;
517
+                }
518
+            }
519
+        }
520
+    }
521
+
522
+
523
+    /**
524
+     * L'iterateur est-il encore valide ?
525
+     *
526
+     * @return bool
527
+     */
528
+    public function valid(): bool {
529
+        return !is_null($this->cle);
530
+    }
531
+
532
+    /**
533
+     * Retourner la valeur
534
+     *
535
+     * @return mixed
536
+     */
537
+    #[\ReturnTypeWillChange]
538
+    public function current() {
539
+        return $this->valeur;
540
+    }
541
+
542
+    /**
543
+     * Retourner la cle
544
+     *
545
+     * @return mixed
546
+     */
547
+    #[\ReturnTypeWillChange]
548
+    public function key() {
549
+        return $this->cle;
550
+    }
551
+
552
+    /**
553
+     * Passer a la valeur suivante
554
+     *
555
+     * @return void
556
+     */
557
+    public function next(): void {
558
+        if ($this->valid()) {
559
+            $this->cle = key($this->tableau);
560
+            $this->valeur = current($this->tableau);
561
+            next($this->tableau);
562
+        }
563
+    }
564
+
565
+    /**
566
+     * Compter le nombre total de resultats
567
+     *
568
+     * @return int
569
+     */
570
+    public function count() {
571
+        if (is_null($this->total)) {
572
+            $this->total = count($this->tableau);
573
+        }
574
+
575
+        return $this->total;
576
+    }
577 577
 }
578 578
 
579 579
 /*
@@ -587,7 +587,7 @@  discard block
 block discarded – undo
587 587
  * @return array
588 588
  */
589 589
 function inc_file_to_array_dist($data) {
590
-	return preg_split('/\r?\n/', $data);
590
+    return preg_split('/\r?\n/', $data);
591 591
 }
592 592
 
593 593
 /**
@@ -596,9 +596,9 @@  discard block
 block discarded – undo
596 596
  * @return array
597 597
  */
598 598
 function inc_plugins_to_array_dist() {
599
-	include_spip('inc/plugin');
599
+    include_spip('inc/plugin');
600 600
 
601
-	return liste_chemin_plugin_actifs();
601
+    return liste_chemin_plugin_actifs();
602 602
 }
603 603
 
604 604
 /**
@@ -608,7 +608,7 @@  discard block
 block discarded – undo
608 608
  * @return array
609 609
  */
610 610
 function inc_xml_to_array_dist($data) {
611
-	return @XMLObjectToArray(new SimpleXmlIterator($data));
611
+    return @XMLObjectToArray(new SimpleXmlIterator($data));
612 612
 }
613 613
 
614 614
 /**
@@ -620,14 +620,14 @@  discard block
 block discarded – undo
620 620
  *
621 621
  */
622 622
 function inc_object_to_array($object) {
623
-	if (!is_object($object) && !is_array($object)) {
624
-		return $object;
625
-	}
626
-	if (is_object($object)) {
627
-		$object = get_object_vars($object);
628
-	}
629
-
630
-	return array_map('inc_object_to_array', $object);
623
+    if (!is_object($object) && !is_array($object)) {
624
+        return $object;
625
+    }
626
+    if (is_object($object)) {
627
+        $object = get_object_vars($object);
628
+    }
629
+
630
+    return array_map('inc_object_to_array', $object);
631 631
 }
632 632
 
633 633
 /**
@@ -637,20 +637,20 @@  discard block
 block discarded – undo
637 637
  * @return array|bool
638 638
  */
639 639
 function inc_sql_to_array_dist($data) {
640
-	# sortir le connecteur de $data
641
-	preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
642
-	$serveur = (string)$v[1];
643
-	$req = trim($v[2]);
644
-	if ($s = sql_query($req, $serveur)) {
645
-		$r = [];
646
-		while ($t = sql_fetch($s)) {
647
-			$r[] = $t;
648
-		}
649
-
650
-		return $r;
651
-	}
652
-
653
-	return false;
640
+    # sortir le connecteur de $data
641
+    preg_match(',^(?:(\w+):)?(.*)$,Sm', $data, $v);
642
+    $serveur = (string)$v[1];
643
+    $req = trim($v[2]);
644
+    if ($s = sql_query($req, $serveur)) {
645
+        $r = [];
646
+        while ($t = sql_fetch($s)) {
647
+            $r[] = $t;
648
+        }
649
+
650
+        return $r;
651
+    }
652
+
653
+    return false;
654 654
 }
655 655
 
656 656
 /**
@@ -660,13 +660,13 @@  discard block
 block discarded – undo
660 660
  * @return array|bool
661 661
  */
662 662
 function inc_json_to_array_dist($data) {
663
-	try {
664
-		$json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
665
-	} catch (JsonException $e) {
666
-		$json = null;
667
-		spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
668
-	}
669
-	return is_array($json) ? (array) $json : [];
663
+    try {
664
+        $json = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
665
+    } catch (JsonException $e) {
666
+        $json = null;
667
+        spip_log('Failed to parse Json data : ' . $e->getMessage(), _LOG_INFO);
668
+    }
669
+    return is_array($json) ? (array) $json : [];
670 670
 }
671 671
 
672 672
 /**
@@ -676,30 +676,30 @@  discard block
 block discarded – undo
676 676
  * @return array|bool
677 677
  */
678 678
 function inc_csv_to_array_dist($data) {
679
-	include_spip('inc/csv');
680
-	[$entete, $csv] = analyse_csv($data);
681
-	array_unshift($csv, $entete);
682
-
683
-	include_spip('inc/charsets');
684
-	$i = 1;
685
-	foreach ($entete as $k => $v) {
686
-		if (trim($v) == '') {
687
-			$v = 'col' . $i;
688
-		} // reperer des eventuelles cases vides
689
-		if (is_numeric($v) and $v < 0) {
690
-			$v = '__' . $v;
691
-		} // ne pas risquer d'ecraser une cle numerique
692
-		if (is_numeric($v)) {
693
-			$v = '_' . $v;
694
-		} // ne pas risquer d'ecraser une cle numerique
695
-		$v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
696
-		foreach ($csv as &$item) {
697
-			$item[$v] = &$item[$k];
698
-		}
699
-		$i++;
700
-	}
701
-
702
-	return $csv;
679
+    include_spip('inc/csv');
680
+    [$entete, $csv] = analyse_csv($data);
681
+    array_unshift($csv, $entete);
682
+
683
+    include_spip('inc/charsets');
684
+    $i = 1;
685
+    foreach ($entete as $k => $v) {
686
+        if (trim($v) == '') {
687
+            $v = 'col' . $i;
688
+        } // reperer des eventuelles cases vides
689
+        if (is_numeric($v) and $v < 0) {
690
+            $v = '__' . $v;
691
+        } // ne pas risquer d'ecraser une cle numerique
692
+        if (is_numeric($v)) {
693
+            $v = '_' . $v;
694
+        } // ne pas risquer d'ecraser une cle numerique
695
+        $v = strtolower(preg_replace(',\W+,', '_', translitteration($v)));
696
+        foreach ($csv as &$item) {
697
+            $item[$v] = &$item[$k];
698
+        }
699
+        $i++;
700
+    }
701
+
702
+    return $csv;
703 703
 }
704 704
 
705 705
 /**
@@ -709,13 +709,13 @@  discard block
 block discarded – undo
709 709
  * @return array|bool
710 710
  */
711 711
 function inc_rss_to_array_dist($data) {
712
-	$tableau = null;
713
-	include_spip('inc/syndic');
714
-	if (is_array($rss = analyser_backend($data))) {
715
-		$tableau = $rss;
716
-	}
712
+    $tableau = null;
713
+    include_spip('inc/syndic');
714
+    if (is_array($rss = analyser_backend($data))) {
715
+        $tableau = $rss;
716
+    }
717 717
 
718
-	return $tableau;
718
+    return $tableau;
719 719
 }
720 720
 
721 721
 /**
@@ -725,9 +725,9 @@  discard block
 block discarded – undo
725 725
  * @return array|bool
726 726
  */
727 727
 function inc_atom_to_array_dist($data) {
728
-	$rss_to_array = charger_fonction('rss_to_array', 'inc');
728
+    $rss_to_array = charger_fonction('rss_to_array', 'inc');
729 729
 
730
-	return $rss_to_array($data);
730
+    return $rss_to_array($data);
731 731
 }
732 732
 
733 733
 /**
@@ -738,12 +738,12 @@  discard block
 block discarded – undo
738 738
  * @return array|bool
739 739
  */
740 740
 function inc_glob_to_array_dist($data) {
741
-	$a = glob(
742
-		$data,
743
-		GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
744
-	);
741
+    $a = glob(
742
+        $data,
743
+        GLOB_MARK | GLOB_NOSORT | GLOB_BRACE
744
+    );
745 745
 
746
-	return $a ?: [];
746
+    return $a ?: [];
747 747
 }
748 748
 
749 749
 /**
@@ -754,14 +754,14 @@  discard block
 block discarded – undo
754 754
  * @throws Exception
755 755
  */
756 756
 function inc_yaml_to_array_dist($data) {
757
-	include_spip('inc/yaml-mini');
758
-	if (!function_exists('yaml_decode')) {
759
-		throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
757
+    include_spip('inc/yaml-mini');
758
+    if (!function_exists('yaml_decode')) {
759
+        throw new Exception('YAML: impossible de trouver la fonction yaml_decode');
760 760
 
761
-		return false;
762
-	}
761
+        return false;
762
+    }
763 763
 
764
-	return yaml_decode($data);
764
+    return yaml_decode($data);
765 765
 }
766 766
 
767 767
 
@@ -776,7 +776,7 @@  discard block
 block discarded – undo
776 776
  * @return array|bool
777 777
  */
778 778
 function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) {
779
-	return (array)preg_files($dir, $regexp, $limit);
779
+    return (array)preg_files($dir, $regexp, $limit);
780 780
 }
781 781
 
782 782
 /**
@@ -788,23 +788,23 @@  discard block
 block discarded – undo
788 788
  * @return array|bool
789 789
  */
790 790
 function inc_ls_to_array_dist($data) {
791
-	$glob_to_array = charger_fonction('glob_to_array', 'inc');
792
-	$a = $glob_to_array($data);
793
-	foreach ($a as &$v) {
794
-		$b = (array)@stat($v);
795
-		foreach ($b as $k => $ignore) {
796
-			if (is_numeric($k)) {
797
-				unset($b[$k]);
798
-			}
799
-		}
800
-		$b['file'] = preg_replace('`/$`', '', $v) ;
801
-		$v = array_merge(
802
-			pathinfo($v),
803
-			$b
804
-		);
805
-	}
806
-
807
-	return $a;
791
+    $glob_to_array = charger_fonction('glob_to_array', 'inc');
792
+    $a = $glob_to_array($data);
793
+    foreach ($a as &$v) {
794
+        $b = (array)@stat($v);
795
+        foreach ($b as $k => $ignore) {
796
+            if (is_numeric($k)) {
797
+                unset($b[$k]);
798
+            }
799
+        }
800
+        $b['file'] = preg_replace('`/$`', '', $v) ;
801
+        $v = array_merge(
802
+            pathinfo($v),
803
+            $b
804
+        );
805
+    }
806
+
807
+    return $a;
808 808
 }
809 809
 
810 810
 /**
@@ -814,25 +814,25 @@  discard block
 block discarded – undo
814 814
  * @return array|bool
815 815
  */
816 816
 function XMLObjectToArray($object) {
817
-	$xml_array = [];
818
-	for ($object->rewind(); $object->valid(); $object->next()) {
819
-		if (array_key_exists($key = $object->key(), $xml_array)) {
820
-			$key .= '-' . uniqid();
821
-		}
822
-		$vars = get_object_vars($object->current());
823
-		if (isset($vars['@attributes'])) {
824
-			foreach ($vars['@attributes'] as $k => $v) {
825
-				$xml_array[$key][$k] = $v;
826
-			}
827
-		}
828
-		if ($object->hasChildren()) {
829
-			$xml_array[$key][] = XMLObjectToArray(
830
-				$object->current()
831
-			);
832
-		} else {
833
-			$xml_array[$key][] = strval($object->current());
834
-		}
835
-	}
836
-
837
-	return $xml_array;
817
+    $xml_array = [];
818
+    for ($object->rewind(); $object->valid(); $object->next()) {
819
+        if (array_key_exists($key = $object->key(), $xml_array)) {
820
+            $key .= '-' . uniqid();
821
+        }
822
+        $vars = get_object_vars($object->current());
823
+        if (isset($vars['@attributes'])) {
824
+            foreach ($vars['@attributes'] as $k => $v) {
825
+                $xml_array[$key][$k] = $v;
826
+            }
827
+        }
828
+        if ($object->hasChildren()) {
829
+            $xml_array[$key][] = XMLObjectToArray(
830
+                $object->current()
831
+            );
832
+        } else {
833
+            $xml_array[$key][] = strval($object->current());
834
+        }
835
+    }
836
+
837
+    return $xml_array;
838 838
 }
Please login to merge, or discard this patch.
ecrire/plugins/extraire_pipelines.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -11,7 +11,7 @@  discard block
 block discarded – undo
11 11
 \***************************************************************************/
12 12
 
13 13
 if (!defined('_ECRIRE_INC_VERSION')) {
14
-	return;
14
+    return;
15 15
 }
16 16
 
17 17
 
@@ -21,28 +21,28 @@  discard block
 block discarded – undo
21 21
  * @param array $arbre
22 22
  */
23 23
 function plugins_extraire_pipelines_dist(&$arbre) {
24
-	$pipes = null;
25
-	$tag = null;
26
-	$pipeline = [];
27
-	if (spip_xml_match_nodes(',^pipeline,', $arbre, $pipes)) {
28
-		foreach ($pipes as $tag => $p) {
29
-			if (!is_array($p[0])) {
30
-				[$tag, $att] = spip_xml_decompose_tag($tag);
31
-				$pipeline[] = $att;
32
-			} else {
33
-				foreach ($p as $pipe) {
34
-					$att = [];
35
-					if (is_array($pipe)) {
36
-						foreach ($pipe as $k => $t) {
37
-							$att[$k] = trim(end($t));
38
-						}
39
-					}
40
-					$pipeline[] = $att;
41
-				}
42
-			}
43
-		}
44
-		unset($arbre[$tag]);
45
-	}
24
+    $pipes = null;
25
+    $tag = null;
26
+    $pipeline = [];
27
+    if (spip_xml_match_nodes(',^pipeline,', $arbre, $pipes)) {
28
+        foreach ($pipes as $tag => $p) {
29
+            if (!is_array($p[0])) {
30
+                [$tag, $att] = spip_xml_decompose_tag($tag);
31
+                $pipeline[] = $att;
32
+            } else {
33
+                foreach ($p as $pipe) {
34
+                    $att = [];
35
+                    if (is_array($pipe)) {
36
+                        foreach ($pipe as $k => $t) {
37
+                            $att[$k] = trim(end($t));
38
+                        }
39
+                    }
40
+                    $pipeline[] = $att;
41
+                }
42
+            }
43
+        }
44
+        unset($arbre[$tag]);
45
+    }
46 46
 
47
-	return $pipeline;
47
+    return $pipeline;
48 48
 }
Please login to merge, or discard this patch.
ecrire/maj/legacy/v30.php 2 patches
Indentation   +230 added lines, -230 removed lines patch added patch discarded remove patch
@@ -18,18 +18,18 @@  discard block
 block discarded – undo
18 18
  * @package SPIP\Core\SQL\Upgrade
19 19
  **/
20 20
 if (!defined('_ECRIRE_INC_VERSION')) {
21
-	return;
21
+    return;
22 22
 }
23 23
 
24 24
 
25 25
 $GLOBALS['maj'][16428] = [
26
-	['maj_liens', 'auteur'], // creer la table liens
27
-	['maj_liens', 'auteur', 'article'],
28
-	['sql_drop_table', 'spip_auteurs_articles'],
29
-	['maj_liens', 'auteur', 'rubrique'],
30
-	['sql_drop_table', 'spip_auteurs_rubriques'],
31
-	['maj_liens', 'auteur', 'message'],
32
-	['sql_drop_table', 'spip_auteurs_messages'],
26
+    ['maj_liens', 'auteur'], // creer la table liens
27
+    ['maj_liens', 'auteur', 'article'],
28
+    ['sql_drop_table', 'spip_auteurs_articles'],
29
+    ['maj_liens', 'auteur', 'rubrique'],
30
+    ['sql_drop_table', 'spip_auteurs_rubriques'],
31
+    ['maj_liens', 'auteur', 'message'],
32
+    ['sql_drop_table', 'spip_auteurs_messages'],
33 33
 ];
34 34
 
35 35
 /**
@@ -55,89 +55,89 @@  discard block
 block discarded – undo
55 55
  */
56 56
 function maj_liens($pivot, $l = '') {
57 57
 
58
-	@define('_LOG_FILTRE_GRAVITE', 8);
59
-
60
-	$exceptions_pluriel = ['forum' => 'forum', 'syndic' => 'syndic'];
61
-
62
-	$pivot = preg_replace(',[^\w],', '', $pivot); // securite
63
-	$pivots = ($exceptions_pluriel[$pivot] ?? $pivot . 's');
64
-	$liens = 'spip_' . $pivots . '_liens';
65
-	$id_pivot = 'id_' . $pivot;
66
-	// Creer spip_auteurs_liens
67
-	global $tables_auxiliaires;
68
-	if (!$l) {
69
-		include_spip('base/auxiliaires');
70
-		include_spip('base/create');
71
-		creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
72
-	} else {
73
-		// Preparer
74
-		$l = preg_replace(',[^\w],', '', $l); // securite
75
-		$primary = "id_$l";
76
-		$objet = ($l == 'syndic' ? 'site' : $l);
77
-		$ls = ($exceptions_pluriel[$l] ?? $l . 's');
78
-		$ancienne_table = 'spip_' . $pivots . '_' . $ls;
79
-		$pool = 400;
80
-
81
-		$trouver_table = charger_fonction('trouver_table', 'base');
82
-		if (!$desc = $trouver_table($ancienne_table)) {
83
-			return;
84
-		}
85
-
86
-		// securite pour ne pas perdre de donnees
87
-		if (!$trouver_table($liens)) {
88
-			return;
89
-		}
90
-
91
-		$champs = $desc['field'];
92
-		if (isset($champs['maj'])) {
93
-			unset($champs['maj']);
94
-		}
95
-		if (isset($champs[$primary])) {
96
-			unset($champs[$primary]);
97
-		}
98
-
99
-		$champs = array_keys($champs);
100
-		// ne garder que les champs qui existent sur la table destination
101
-		if ($desc_cible = $trouver_table($liens)) {
102
-			$champs = array_intersect($champs, array_keys($desc_cible['field']));
103
-		}
104
-
105
-		$champs[] = "$primary as id_objet";
106
-		$champs[] = "'$objet' as objet";
107
-		$champs = implode(', ', $champs);
108
-
109
-		// Recopier les donnees
110
-		$sub_pool = 100;
111
-		while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
112
-			$insert = [];
113
-			foreach ($ids as $id) {
114
-				$n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
115
-				while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
116
-					$n += is_countable($t) ? count($t) : 0;
117
-					// empiler en s'assurant a minima de l'unicite
118
-					while ($r = array_shift($t)) {
119
-						$insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
120
-					}
121
-					if (count($insert) >= $sub_pool) {
122
-						maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
123
-						$insert = [];
124
-					}
125
-					// si timeout, sortir, la relance nous ramenera dans cette fonction
126
-					// et on verifiera/repartira de la
127
-					if (time() >= _TIME_OUT) {
128
-						return;
129
-					}
130
-				}
131
-				if (time() >= _TIME_OUT) {
132
-					return;
133
-				}
134
-			}
135
-			if (count($insert)) {
136
-				maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
137
-			}
138
-			sql_delete($ancienne_table, sql_in($primary, $ids));
139
-		}
140
-	}
58
+    @define('_LOG_FILTRE_GRAVITE', 8);
59
+
60
+    $exceptions_pluriel = ['forum' => 'forum', 'syndic' => 'syndic'];
61
+
62
+    $pivot = preg_replace(',[^\w],', '', $pivot); // securite
63
+    $pivots = ($exceptions_pluriel[$pivot] ?? $pivot . 's');
64
+    $liens = 'spip_' . $pivots . '_liens';
65
+    $id_pivot = 'id_' . $pivot;
66
+    // Creer spip_auteurs_liens
67
+    global $tables_auxiliaires;
68
+    if (!$l) {
69
+        include_spip('base/auxiliaires');
70
+        include_spip('base/create');
71
+        creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false);
72
+    } else {
73
+        // Preparer
74
+        $l = preg_replace(',[^\w],', '', $l); // securite
75
+        $primary = "id_$l";
76
+        $objet = ($l == 'syndic' ? 'site' : $l);
77
+        $ls = ($exceptions_pluriel[$l] ?? $l . 's');
78
+        $ancienne_table = 'spip_' . $pivots . '_' . $ls;
79
+        $pool = 400;
80
+
81
+        $trouver_table = charger_fonction('trouver_table', 'base');
82
+        if (!$desc = $trouver_table($ancienne_table)) {
83
+            return;
84
+        }
85
+
86
+        // securite pour ne pas perdre de donnees
87
+        if (!$trouver_table($liens)) {
88
+            return;
89
+        }
90
+
91
+        $champs = $desc['field'];
92
+        if (isset($champs['maj'])) {
93
+            unset($champs['maj']);
94
+        }
95
+        if (isset($champs[$primary])) {
96
+            unset($champs[$primary]);
97
+        }
98
+
99
+        $champs = array_keys($champs);
100
+        // ne garder que les champs qui existent sur la table destination
101
+        if ($desc_cible = $trouver_table($liens)) {
102
+            $champs = array_intersect($champs, array_keys($desc_cible['field']));
103
+        }
104
+
105
+        $champs[] = "$primary as id_objet";
106
+        $champs[] = "'$objet' as objet";
107
+        $champs = implode(', ', $champs);
108
+
109
+        // Recopier les donnees
110
+        $sub_pool = 100;
111
+        while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
112
+            $insert = [];
113
+            foreach ($ids as $id) {
114
+                $n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
115
+                while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
116
+                    $n += is_countable($t) ? count($t) : 0;
117
+                    // empiler en s'assurant a minima de l'unicite
118
+                    while ($r = array_shift($t)) {
119
+                        $insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
120
+                    }
121
+                    if (count($insert) >= $sub_pool) {
122
+                        maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
123
+                        $insert = [];
124
+                    }
125
+                    // si timeout, sortir, la relance nous ramenera dans cette fonction
126
+                    // et on verifiera/repartira de la
127
+                    if (time() >= _TIME_OUT) {
128
+                        return;
129
+                    }
130
+                }
131
+                if (time() >= _TIME_OUT) {
132
+                    return;
133
+                }
134
+            }
135
+            if (count($insert)) {
136
+                maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
137
+            }
138
+            sql_delete($ancienne_table, sql_in($primary, $ids));
139
+        }
140
+    }
141 141
 }
142 142
 
143 143
 /**
@@ -151,86 +151,86 @@  discard block
 block discarded – undo
151 151
  * @return void
152 152
  **/
153 153
 function maj_liens_insertq_multi_check($table, $couples, $desc = []) {
154
-	$n_before = sql_countsel($table);
155
-	sql_insertq_multi($table, $couples, $desc);
156
-	$n_after = sql_countsel($table);
157
-	if (($n_after - $n_before) == count($couples)) {
158
-		return;
159
-	}
160
-	// si ecart, on recommence l'insertion ligne par ligne...
161
-	// moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
162
-	foreach ($couples as $c) {
163
-		sql_insertq($table, $c, $desc);
164
-	}
154
+    $n_before = sql_countsel($table);
155
+    sql_insertq_multi($table, $couples, $desc);
156
+    $n_after = sql_countsel($table);
157
+    if (($n_after - $n_before) == count($couples)) {
158
+        return;
159
+    }
160
+    // si ecart, on recommence l'insertion ligne par ligne...
161
+    // moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie
162
+    foreach ($couples as $c) {
163
+        sql_insertq($table, $c, $desc);
164
+    }
165 165
 }
166 166
 
167 167
 $GLOBALS['maj'][17311] = [
168
-	[
169
-		'ecrire_meta',
170
-		'multi_objets',
171
-		implode(
172
-			',',
173
-			array_diff(
174
-				[
175
-					(isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui')
176
-						? 'spip_rubriques' : '',
177
-					(isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui')
178
-						? 'spip_articles' : ''
179
-				],
180
-				['']
181
-			)
182
-		)
183
-	],
184
-	[
185
-		'ecrire_meta',
186
-		'gerer_trad_objets',
187
-		implode(
188
-			',',
189
-			array_diff(
190
-				[
191
-					(isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui')
192
-						? 'spip_articles' : ''
193
-				],
194
-				['']
195
-			)
196
-		)
197
-	],
168
+    [
169
+        'ecrire_meta',
170
+        'multi_objets',
171
+        implode(
172
+            ',',
173
+            array_diff(
174
+                [
175
+                    (isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui')
176
+                        ? 'spip_rubriques' : '',
177
+                    (isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui')
178
+                        ? 'spip_articles' : ''
179
+                ],
180
+                ['']
181
+            )
182
+        )
183
+    ],
184
+    [
185
+        'ecrire_meta',
186
+        'gerer_trad_objets',
187
+        implode(
188
+            ',',
189
+            array_diff(
190
+                [
191
+                    (isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui')
192
+                        ? 'spip_articles' : ''
193
+                ],
194
+                ['']
195
+            )
196
+        )
197
+    ],
198 198
 ];
199 199
 $GLOBALS['maj'][17555] = [
200
-	['sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"],
201
-	['sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"],
200
+    ['sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"],
201
+    ['sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"],
202 202
 ];
203 203
 
204 204
 $GLOBALS['maj'][17563] = [
205
-	['sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"],
206
-	['sql_update', 'spip_articles', ['virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"], "chapo LIKE '=_%'"],
205
+    ['sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"],
206
+    ['sql_update', 'spip_articles', ['virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"], "chapo LIKE '=_%'"],
207 207
 ];
208 208
 
209 209
 $GLOBALS['maj'][17577] = [
210
-	['maj_tables', ['spip_jobs', 'spip_jobs_liens']],
210
+    ['maj_tables', ['spip_jobs', 'spip_jobs_liens']],
211 211
 ];
212 212
 
213 213
 $GLOBALS['maj'][17743] = [
214
-	['sql_update', 'spip_auteurs', ['prefs' => 'bio', 'bio' => "''"], "statut='nouveau' AND bio<>''"],
214
+    ['sql_update', 'spip_auteurs', ['prefs' => 'bio', 'bio' => "''"], "statut='nouveau' AND bio<>''"],
215 215
 ];
216 216
 
217 217
 $GLOBALS['maj'][18219] = [
218
-	['sql_alter', 'TABLE spip_rubriques DROP id_import'],
219
-	['sql_alter', 'TABLE spip_rubriques DROP export'],
218
+    ['sql_alter', 'TABLE spip_rubriques DROP id_import'],
219
+    ['sql_alter', 'TABLE spip_rubriques DROP export'],
220 220
 ];
221 221
 
222 222
 $GLOBALS['maj'][18310] = [
223
-	['sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"],
223
+    ['sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"],
224 224
 ];
225 225
 
226 226
 $GLOBALS['maj'][18597] = [
227
-	['sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"],
228
-	['maj_propager_les_secteurs'],
227
+    ['sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"],
228
+    ['maj_propager_les_secteurs'],
229 229
 ];
230 230
 
231 231
 $GLOBALS['maj'][18955] = [
232
-	['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)'],
233
-	['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX objet (objet)'],
232
+    ['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)'],
233
+    ['sql_alter', 'TABLE spip_auteurs_liens ADD INDEX objet (objet)'],
234 234
 ];
235 235
 
236 236
 /**
@@ -239,8 +239,8 @@  discard block
 block discarded – undo
239 239
  * @uses propager_les_secteurs()
240 240
  **/
241 241
 function maj_propager_les_secteurs() {
242
-	include_spip('inc/rubriques');
243
-	propager_les_secteurs();
242
+    include_spip('inc/rubriques');
243
+    propager_les_secteurs();
244 244
 }
245 245
 
246 246
 /**
@@ -253,87 +253,87 @@  discard block
 block discarded – undo
253 253
 function maj_collation_sqlite() {
254 254
 
255 255
 
256
-	include_spip('base/dump');
257
-	$tables = base_lister_toutes_tables();
258
-
259
-	// rien a faire si base non sqlite
260
-	if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) {
261
-		return;
262
-	}
263
-
264
-	$trouver_table = charger_fonction('trouver_table', 'base');
265
-	// forcer le vidage de cache
266
-	$trouver_table('');
267
-
268
-	// cas particulier spip_auteurs : retablir le collate binary sur le login
269
-	$desc = $trouver_table('spip_auteurs');
270
-	spip_log('spip_auteurs : ' . var_export($desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
271
-	if (stripos($desc['field']['login'], 'BINARY') === false) {
272
-		spip_log('Retablir champ login BINARY sur table spip_auteurs', 'maj');
273
-		sql_alter('table spip_auteurs change login login VARCHAR(255) BINARY');
274
-		$trouver_table('');
275
-		$new_desc = $trouver_table('spip_auteurs');
276
-		spip_log('Apres conversion spip_auteurs : ' . var_export($new_desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
277
-	}
278
-
279
-	foreach ($tables as $table) {
280
-		if (time() >= _TIME_OUT) {
281
-			return;
282
-		}
283
-		if ($desc = $trouver_table($table)) {
284
-			$desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
285
-			if ($d = array_diff($desc['field'], $desc_collate)) {
286
-				spip_log("Table $table COLLATE incorrects", 'maj');
287
-
288
-				// cas particulier spip_urls :
289
-				// supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
290
-				if ($table == 'spip_urls') {
291
-					// par date DESC pour conserver les urls les plus recentes
292
-					$data = sql_allfetsel('*', 'spip_urls', '', '', 'date DESC');
293
-					$urls = [];
294
-					foreach ($data as $d) {
295
-						$key = $d['id_parent'] . '::' . strtolower($d['url']);
296
-						if (!isset($urls[$key])) {
297
-							$urls[$key] = true;
298
-						} else {
299
-							spip_log(
300
-								'Suppression doublon dans spip_urls avant conversion : ' . serialize($d),
301
-								'maj.' . _LOG_INFO_IMPORTANTE
302
-							);
303
-							sql_delete('spip_urls', 'id_parent=' . sql_quote($d['id_parent']) . ' AND url=' . sql_quote($d['url']));
304
-						}
305
-					}
306
-				}
307
-				foreach ($desc['field'] as $field => $type) {
308
-					if ($desc['field'][$field] !== $desc_collate[$field]) {
309
-						spip_log("Conversion COLLATE table $table", 'maj.' . _LOG_INFO_IMPORTANTE);
310
-						sql_alter("table $table change $field $field " . $desc_collate[$field]);
311
-						$trouver_table('');
312
-						$new_desc = $trouver_table($table);
313
-						spip_log(
314
-							"Apres conversion $table : " . var_export($new_desc['field'], true),
315
-							'maj.' . _LOG_INFO_IMPORTANTE
316
-						);
317
-						continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
318
-					}
319
-				}
320
-			}
321
-		}
322
-	}
323
-
324
-	// forcer le vidage de cache
325
-	$trouver_table('');
256
+    include_spip('base/dump');
257
+    $tables = base_lister_toutes_tables();
258
+
259
+    // rien a faire si base non sqlite
260
+    if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) {
261
+        return;
262
+    }
263
+
264
+    $trouver_table = charger_fonction('trouver_table', 'base');
265
+    // forcer le vidage de cache
266
+    $trouver_table('');
267
+
268
+    // cas particulier spip_auteurs : retablir le collate binary sur le login
269
+    $desc = $trouver_table('spip_auteurs');
270
+    spip_log('spip_auteurs : ' . var_export($desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
271
+    if (stripos($desc['field']['login'], 'BINARY') === false) {
272
+        spip_log('Retablir champ login BINARY sur table spip_auteurs', 'maj');
273
+        sql_alter('table spip_auteurs change login login VARCHAR(255) BINARY');
274
+        $trouver_table('');
275
+        $new_desc = $trouver_table('spip_auteurs');
276
+        spip_log('Apres conversion spip_auteurs : ' . var_export($new_desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
277
+    }
278
+
279
+    foreach ($tables as $table) {
280
+        if (time() >= _TIME_OUT) {
281
+            return;
282
+        }
283
+        if ($desc = $trouver_table($table)) {
284
+            $desc_collate = _sqlite_remplacements_definitions_table($desc['field']);
285
+            if ($d = array_diff($desc['field'], $desc_collate)) {
286
+                spip_log("Table $table COLLATE incorrects", 'maj');
287
+
288
+                // cas particulier spip_urls :
289
+                // supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes)
290
+                if ($table == 'spip_urls') {
291
+                    // par date DESC pour conserver les urls les plus recentes
292
+                    $data = sql_allfetsel('*', 'spip_urls', '', '', 'date DESC');
293
+                    $urls = [];
294
+                    foreach ($data as $d) {
295
+                        $key = $d['id_parent'] . '::' . strtolower($d['url']);
296
+                        if (!isset($urls[$key])) {
297
+                            $urls[$key] = true;
298
+                        } else {
299
+                            spip_log(
300
+                                'Suppression doublon dans spip_urls avant conversion : ' . serialize($d),
301
+                                'maj.' . _LOG_INFO_IMPORTANTE
302
+                            );
303
+                            sql_delete('spip_urls', 'id_parent=' . sql_quote($d['id_parent']) . ' AND url=' . sql_quote($d['url']));
304
+                        }
305
+                    }
306
+                }
307
+                foreach ($desc['field'] as $field => $type) {
308
+                    if ($desc['field'][$field] !== $desc_collate[$field]) {
309
+                        spip_log("Conversion COLLATE table $table", 'maj.' . _LOG_INFO_IMPORTANTE);
310
+                        sql_alter("table $table change $field $field " . $desc_collate[$field]);
311
+                        $trouver_table('');
312
+                        $new_desc = $trouver_table($table);
313
+                        spip_log(
314
+                            "Apres conversion $table : " . var_export($new_desc['field'], true),
315
+                            'maj.' . _LOG_INFO_IMPORTANTE
316
+                        );
317
+                        continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
318
+                    }
319
+                }
320
+            }
321
+        }
322
+    }
323
+
324
+    // forcer le vidage de cache
325
+    $trouver_table('');
326 326
 }
327 327
 
328 328
 
329 329
 $GLOBALS['maj'][19236] = [
330
-	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom='version_installee'"], // version base principale
331
-	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom LIKE '%_base_version'"],  // version base plugins
332
-	['maj_collation_sqlite'],
330
+    ['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom='version_installee'"], // version base principale
331
+    ['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom LIKE '%_base_version'"],  // version base plugins
332
+    ['maj_collation_sqlite'],
333 333
 ];
334 334
 
335 335
 $GLOBALS['maj'][19268] = [
336
-	['supprimer_toutes_sessions'],
336
+    ['supprimer_toutes_sessions'],
337 337
 ];
338 338
 
339 339
 /**
@@ -342,13 +342,13 @@  discard block
 block discarded – undo
342 342
  * Obligera tous les auteurs à se reconnecter !
343 343
  **/
344 344
 function supprimer_toutes_sessions() {
345
-	spip_log('supprimer sessions auteur');
346
-	if ($dir = opendir(_DIR_SESSIONS)) {
347
-		while (($f = readdir($dir)) !== false) {
348
-			spip_unlink(_DIR_SESSIONS . $f);
349
-			if (time() >= _TIME_OUT) {
350
-				return;
351
-			}
352
-		}
353
-	}
345
+    spip_log('supprimer sessions auteur');
346
+    if ($dir = opendir(_DIR_SESSIONS)) {
347
+        while (($f = readdir($dir)) !== false) {
348
+            spip_unlink(_DIR_SESSIONS . $f);
349
+            if (time() >= _TIME_OUT) {
350
+                return;
351
+            }
352
+        }
353
+    }
354 354
 }
Please login to merge, or discard this patch.
Spacing   +20 added lines, -20 removed lines patch added patch discarded remove patch
@@ -60,9 +60,9 @@  discard block
 block discarded – undo
60 60
 	$exceptions_pluriel = ['forum' => 'forum', 'syndic' => 'syndic'];
61 61
 
62 62
 	$pivot = preg_replace(',[^\w],', '', $pivot); // securite
63
-	$pivots = ($exceptions_pluriel[$pivot] ?? $pivot . 's');
64
-	$liens = 'spip_' . $pivots . '_liens';
65
-	$id_pivot = 'id_' . $pivot;
63
+	$pivots = ($exceptions_pluriel[$pivot] ?? $pivot.'s');
64
+	$liens = 'spip_'.$pivots.'_liens';
65
+	$id_pivot = 'id_'.$pivot;
66 66
 	// Creer spip_auteurs_liens
67 67
 	global $tables_auxiliaires;
68 68
 	if (!$l) {
@@ -74,8 +74,8 @@  discard block
 block discarded – undo
74 74
 		$l = preg_replace(',[^\w],', '', $l); // securite
75 75
 		$primary = "id_$l";
76 76
 		$objet = ($l == 'syndic' ? 'site' : $l);
77
-		$ls = ($exceptions_pluriel[$l] ?? $l . 's');
78
-		$ancienne_table = 'spip_' . $pivots . '_' . $ls;
77
+		$ls = ($exceptions_pluriel[$l] ?? $l.'s');
78
+		$ancienne_table = 'spip_'.$pivots.'_'.$ls;
79 79
 		$pool = 400;
80 80
 
81 81
 		$trouver_table = charger_fonction('trouver_table', 'base');
@@ -111,12 +111,12 @@  discard block
 block discarded – undo
111 111
 		while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) {
112 112
 			$insert = [];
113 113
 			foreach ($ids as $id) {
114
-				$n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id));
115
-				while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) {
114
+				$n = sql_countsel($liens, "objet='$objet' AND id_objet=".intval($id));
115
+				while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=".intval($id), '', $id_pivot, "$n,$pool")) {
116 116
 					$n += is_countable($t) ? count($t) : 0;
117 117
 					// empiler en s'assurant a minima de l'unicite
118 118
 					while ($r = array_shift($t)) {
119
-						$insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r;
119
+						$insert[$r[$id_pivot].':'.$r['id_objet']] = $r;
120 120
 					}
121 121
 					if (count($insert) >= $sub_pool) {
122 122
 						maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]);
@@ -267,13 +267,13 @@  discard block
 block discarded – undo
267 267
 
268 268
 	// cas particulier spip_auteurs : retablir le collate binary sur le login
269 269
 	$desc = $trouver_table('spip_auteurs');
270
-	spip_log('spip_auteurs : ' . var_export($desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
270
+	spip_log('spip_auteurs : '.var_export($desc['field'], true), 'maj.'._LOG_INFO_IMPORTANTE);
271 271
 	if (stripos($desc['field']['login'], 'BINARY') === false) {
272 272
 		spip_log('Retablir champ login BINARY sur table spip_auteurs', 'maj');
273 273
 		sql_alter('table spip_auteurs change login login VARCHAR(255) BINARY');
274 274
 		$trouver_table('');
275 275
 		$new_desc = $trouver_table('spip_auteurs');
276
-		spip_log('Apres conversion spip_auteurs : ' . var_export($new_desc['field'], true), 'maj.' . _LOG_INFO_IMPORTANTE);
276
+		spip_log('Apres conversion spip_auteurs : '.var_export($new_desc['field'], true), 'maj.'._LOG_INFO_IMPORTANTE);
277 277
 	}
278 278
 
279 279
 	foreach ($tables as $table) {
@@ -292,27 +292,27 @@  discard block
 block discarded – undo
292 292
 					$data = sql_allfetsel('*', 'spip_urls', '', '', 'date DESC');
293 293
 					$urls = [];
294 294
 					foreach ($data as $d) {
295
-						$key = $d['id_parent'] . '::' . strtolower($d['url']);
295
+						$key = $d['id_parent'].'::'.strtolower($d['url']);
296 296
 						if (!isset($urls[$key])) {
297 297
 							$urls[$key] = true;
298 298
 						} else {
299 299
 							spip_log(
300
-								'Suppression doublon dans spip_urls avant conversion : ' . serialize($d),
301
-								'maj.' . _LOG_INFO_IMPORTANTE
300
+								'Suppression doublon dans spip_urls avant conversion : '.serialize($d),
301
+								'maj.'._LOG_INFO_IMPORTANTE
302 302
 							);
303
-							sql_delete('spip_urls', 'id_parent=' . sql_quote($d['id_parent']) . ' AND url=' . sql_quote($d['url']));
303
+							sql_delete('spip_urls', 'id_parent='.sql_quote($d['id_parent']).' AND url='.sql_quote($d['url']));
304 304
 						}
305 305
 					}
306 306
 				}
307 307
 				foreach ($desc['field'] as $field => $type) {
308 308
 					if ($desc['field'][$field] !== $desc_collate[$field]) {
309
-						spip_log("Conversion COLLATE table $table", 'maj.' . _LOG_INFO_IMPORTANTE);
310
-						sql_alter("table $table change $field $field " . $desc_collate[$field]);
309
+						spip_log("Conversion COLLATE table $table", 'maj.'._LOG_INFO_IMPORTANTE);
310
+						sql_alter("table $table change $field $field ".$desc_collate[$field]);
311 311
 						$trouver_table('');
312 312
 						$new_desc = $trouver_table($table);
313 313
 						spip_log(
314
-							"Apres conversion $table : " . var_export($new_desc['field'], true),
315
-							'maj.' . _LOG_INFO_IMPORTANTE
314
+							"Apres conversion $table : ".var_export($new_desc['field'], true),
315
+							'maj.'._LOG_INFO_IMPORTANTE
316 316
 						);
317 317
 						continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite
318 318
 					}
@@ -328,7 +328,7 @@  discard block
 block discarded – undo
328 328
 
329 329
 $GLOBALS['maj'][19236] = [
330 330
 	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom='version_installee'"], // version base principale
331
-	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom LIKE '%_base_version'"],  // version base plugins
331
+	['sql_updateq', 'spip_meta', ['impt' => 'oui'], "nom LIKE '%_base_version'"], // version base plugins
332 332
 	['maj_collation_sqlite'],
333 333
 ];
334 334
 
@@ -345,7 +345,7 @@  discard block
 block discarded – undo
345 345
 	spip_log('supprimer sessions auteur');
346 346
 	if ($dir = opendir(_DIR_SESSIONS)) {
347 347
 		while (($f = readdir($dir)) !== false) {
348
-			spip_unlink(_DIR_SESSIONS . $f);
348
+			spip_unlink(_DIR_SESSIONS.$f);
349 349
 			if (time() >= _TIME_OUT) {
350 350
 				return;
351 351
 			}
Please login to merge, or discard this patch.
ecrire/action/editer_auteur.php 2 patches
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -93,7 +93,7 @@  discard block
 block discarded – undo
93 93
 	$champs['source'] = $source ?: 'spip';
94 94
 
95 95
 	$champs['login'] = '';
96
-	$champs['statut'] = '5poubelle';  // inutilisable tant qu'il n'a pas ete renseigne et institue
96
+	$champs['statut'] = '5poubelle'; // inutilisable tant qu'il n'a pas ete renseigne et institue
97 97
 	$champs['webmestre'] = 'non';
98 98
 	if (empty($champs['imessage'])) {
99 99
 		$champs['imessage'] = 'oui';
@@ -313,7 +313,7 @@  discard block
 block discarded – undo
313 313
 		$champs['pass'] = $c['pass'];
314 314
 	}
315 315
 
316
-	$statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
316
+	$statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur='.intval($id_auteur));
317 317
 
318 318
 	if (
319 319
 		isset($c['statut'])
@@ -373,7 +373,7 @@  discard block
 block discarded – undo
373 373
 	// commencer par traiter les cas particuliers des logins et pass
374 374
 	// avant les autres ecritures en base
375 375
 	if (isset($champs['login']) or isset($champs['pass'])) {
376
-		$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
376
+		$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur='.intval($id_auteur));
377 377
 		include_spip('inc/auth');
378 378
 		if (isset($champs['login']) and strlen($champs['login'])) {
379 379
 			if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) {
@@ -381,7 +381,7 @@  discard block
 block discarded – undo
381 381
 			}
382 382
 		}
383 383
 		if (isset($champs['pass']) and strlen($champs['pass'])) {
384
-			$champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
384
+			$champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur='.intval($id_auteur));
385 385
 			if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) {
386 386
 				$erreurs[] = 'ecrire:impossible_modifier_pass_auteur';
387 387
 			}
@@ -394,7 +394,7 @@  discard block
 block discarded – undo
394 394
 	if (!(is_countable($champs) ? count($champs) : 0)) {
395 395
 		return implode(' ', array_map('_T', $erreurs));
396 396
 	}
397
-	sql_updateq('spip_auteurs', $champs, 'id_auteur=' . $id_auteur);
397
+	sql_updateq('spip_auteurs', $champs, 'id_auteur='.$id_auteur);
398 398
 
399 399
 	// .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
400 400
 	if (
Please login to merge, or discard this patch.
Indentation   +279 added lines, -279 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -37,41 +37,41 @@  discard block
 block discarded – undo
37 37
  */
38 38
 function action_editer_auteur_dist($arg = null) {
39 39
 
40
-	if (is_null($arg)) {
41
-		$securiser_action = charger_fonction('securiser_action', 'inc');
42
-		$arg = $securiser_action();
43
-	}
44
-
45
-
46
-	// si id_auteur n'est pas un nombre, c'est une creation
47
-	if (!$id_auteur = intval($arg)) {
48
-		if (($id_auteur = auteur_inserer()) > 0) {
49
-			# cf. GROS HACK
50
-			# recuperer l'eventuel logo charge avant la creation
51
-			# ils ont un id = 0-id_auteur de la session
52
-			$id_hack = 0 - $GLOBALS['visiteur_session']['id_auteur'];
53
-			$chercher_logo = charger_fonction('chercher_logo', 'inc');
54
-			foreach (['on', 'off'] as $type) {
55
-				if ($logo = $chercher_logo($id_hack, 'id_auteur', $type)) {
56
-					if ($logo = reset($logo)) {
57
-						rename($logo, str_replace($id_hack, $id_auteur, $logo));
58
-					}
59
-				}
60
-			}
61
-		}
62
-	}
63
-
64
-	// Enregistre l'envoi dans la BD
65
-	$err = '';
66
-	if ($id_auteur > 0) {
67
-		$err = auteur_modifier($id_auteur);
68
-	}
69
-
70
-	if ($err) {
71
-		spip_log("echec editeur auteur: $err", _LOG_ERREUR);
72
-	}
73
-
74
-	return [$id_auteur, $err];
40
+    if (is_null($arg)) {
41
+        $securiser_action = charger_fonction('securiser_action', 'inc');
42
+        $arg = $securiser_action();
43
+    }
44
+
45
+
46
+    // si id_auteur n'est pas un nombre, c'est une creation
47
+    if (!$id_auteur = intval($arg)) {
48
+        if (($id_auteur = auteur_inserer()) > 0) {
49
+            # cf. GROS HACK
50
+            # recuperer l'eventuel logo charge avant la creation
51
+            # ils ont un id = 0-id_auteur de la session
52
+            $id_hack = 0 - $GLOBALS['visiteur_session']['id_auteur'];
53
+            $chercher_logo = charger_fonction('chercher_logo', 'inc');
54
+            foreach (['on', 'off'] as $type) {
55
+                if ($logo = $chercher_logo($id_hack, 'id_auteur', $type)) {
56
+                    if ($logo = reset($logo)) {
57
+                        rename($logo, str_replace($id_hack, $id_auteur, $logo));
58
+                    }
59
+                }
60
+            }
61
+        }
62
+    }
63
+
64
+    // Enregistre l'envoi dans la BD
65
+    $err = '';
66
+    if ($id_auteur > 0) {
67
+        $err = auteur_modifier($id_auteur);
68
+    }
69
+
70
+    if ($err) {
71
+        spip_log("echec editeur auteur: $err", _LOG_ERREUR);
72
+    }
73
+
74
+    return [$id_auteur, $err];
75 75
 }
76 76
 
77 77
 /**
@@ -88,44 +88,44 @@  discard block
 block discarded – undo
88 88
  */
89 89
 function auteur_inserer($source = null, $set = null) {
90 90
 
91
-	// Ce qu'on va demander comme modifications
92
-	$champs = [];
93
-	$champs['source'] = $source ?: 'spip';
94
-
95
-	$champs['login'] = '';
96
-	$champs['statut'] = '5poubelle';  // inutilisable tant qu'il n'a pas ete renseigne et institue
97
-	$champs['webmestre'] = 'non';
98
-	if (empty($champs['imessage'])) {
99
-		$champs['imessage'] = 'oui';
100
-	}
101
-
102
-	if ($set) {
103
-		$champs = array_merge($champs, $set);
104
-	}
105
-
106
-	// Envoyer aux plugins
107
-	$champs = pipeline(
108
-		'pre_insertion',
109
-		[
110
-			'args' => [
111
-				'table' => 'spip_auteurs',
112
-			],
113
-			'data' => $champs
114
-		]
115
-	);
116
-	$id_auteur = sql_insertq('spip_auteurs', $champs);
117
-	pipeline(
118
-		'post_insertion',
119
-		[
120
-			'args' => [
121
-				'table' => 'spip_auteurs',
122
-				'id_objet' => $id_auteur
123
-			],
124
-			'data' => $champs
125
-		]
126
-	);
127
-
128
-	return $id_auteur;
91
+    // Ce qu'on va demander comme modifications
92
+    $champs = [];
93
+    $champs['source'] = $source ?: 'spip';
94
+
95
+    $champs['login'] = '';
96
+    $champs['statut'] = '5poubelle';  // inutilisable tant qu'il n'a pas ete renseigne et institue
97
+    $champs['webmestre'] = 'non';
98
+    if (empty($champs['imessage'])) {
99
+        $champs['imessage'] = 'oui';
100
+    }
101
+
102
+    if ($set) {
103
+        $champs = array_merge($champs, $set);
104
+    }
105
+
106
+    // Envoyer aux plugins
107
+    $champs = pipeline(
108
+        'pre_insertion',
109
+        [
110
+            'args' => [
111
+                'table' => 'spip_auteurs',
112
+            ],
113
+            'data' => $champs
114
+        ]
115
+    );
116
+    $id_auteur = sql_insertq('spip_auteurs', $champs);
117
+    pipeline(
118
+        'post_insertion',
119
+        [
120
+            'args' => [
121
+                'table' => 'spip_auteurs',
122
+                'id_objet' => $id_auteur
123
+            ],
124
+            'data' => $champs
125
+        ]
126
+    );
127
+
128
+    return $id_auteur;
129 129
 }
130 130
 
131 131
 
@@ -150,70 +150,70 @@  discard block
 block discarded – undo
150 150
  */
151 151
 function auteur_modifier($id_auteur, $set = null, $force_update = false) {
152 152
 
153
-	include_spip('inc/modifier');
154
-	include_spip('inc/filtres');
155
-	$c = collecter_requests(
156
-		// include list
157
-		objet_info('auteur', 'champs_editables'),
158
-		// exclude list
159
-		$force_update ? [] : ['webmestre', 'pass', 'login'],
160
-		// donnees eventuellement fournies
161
-		$set
162
-	);
163
-
164
-	if (
165
-		$err = objet_modifier_champs(
166
-			'auteur',
167
-			$id_auteur,
168
-			[
169
-			'data' => $set,
170
-			'nonvide' => ['nom' => _T('ecrire:item_nouvel_auteur')]
171
-			],
172
-			$c
173
-		)
174
-	) {
175
-		return $err;
176
-	}
177
-	$session = $c;
178
-
179
-	$err = '';
180
-	if (!$force_update) {
181
-		// Modification de statut, changement de rubrique ?
182
-		$c = collecter_requests(
183
-		// include list
184
-			[
185
-				'statut',
186
-				'new_login',
187
-				'new_pass',
188
-				'login',
189
-				'pass',
190
-				'webmestre',
191
-				'restreintes',
192
-				'id_parent'
193
-			],
194
-			// exclude list
195
-			[],
196
-			// donnees eventuellement fournies
197
-			$set
198
-		);
199
-		if (isset($c['new_login']) and !isset($c['login'])) {
200
-			$c['login'] = $c['new_login'];
201
-		}
202
-		if (isset($c['new_pass']) and !isset($c['pass'])) {
203
-			$c['pass'] = $c['new_pass'];
204
-		}
205
-		$err = auteur_instituer($id_auteur, $c);
206
-		$session = array_merge($session, $c);
207
-	}
208
-
209
-	// .. mettre a jour les sessions de cet auteur
210
-	include_spip('inc/session');
211
-	$session['id_auteur'] = $id_auteur;
212
-	unset($session['new_login']);
213
-	unset($session['new_pass']);
214
-	actualiser_sessions($session);
215
-
216
-	return $err;
153
+    include_spip('inc/modifier');
154
+    include_spip('inc/filtres');
155
+    $c = collecter_requests(
156
+        // include list
157
+        objet_info('auteur', 'champs_editables'),
158
+        // exclude list
159
+        $force_update ? [] : ['webmestre', 'pass', 'login'],
160
+        // donnees eventuellement fournies
161
+        $set
162
+    );
163
+
164
+    if (
165
+        $err = objet_modifier_champs(
166
+            'auteur',
167
+            $id_auteur,
168
+            [
169
+            'data' => $set,
170
+            'nonvide' => ['nom' => _T('ecrire:item_nouvel_auteur')]
171
+            ],
172
+            $c
173
+        )
174
+    ) {
175
+        return $err;
176
+    }
177
+    $session = $c;
178
+
179
+    $err = '';
180
+    if (!$force_update) {
181
+        // Modification de statut, changement de rubrique ?
182
+        $c = collecter_requests(
183
+        // include list
184
+            [
185
+                'statut',
186
+                'new_login',
187
+                'new_pass',
188
+                'login',
189
+                'pass',
190
+                'webmestre',
191
+                'restreintes',
192
+                'id_parent'
193
+            ],
194
+            // exclude list
195
+            [],
196
+            // donnees eventuellement fournies
197
+            $set
198
+        );
199
+        if (isset($c['new_login']) and !isset($c['login'])) {
200
+            $c['login'] = $c['new_login'];
201
+        }
202
+        if (isset($c['new_pass']) and !isset($c['pass'])) {
203
+            $c['pass'] = $c['new_pass'];
204
+        }
205
+        $err = auteur_instituer($id_auteur, $c);
206
+        $session = array_merge($session, $c);
207
+    }
208
+
209
+    // .. mettre a jour les sessions de cet auteur
210
+    include_spip('inc/session');
211
+    $session['id_auteur'] = $id_auteur;
212
+    unset($session['new_login']);
213
+    unset($session['new_pass']);
214
+    actualiser_sessions($session);
215
+
216
+    return $err;
217 217
 }
218 218
 
219 219
 /**
@@ -234,9 +234,9 @@  discard block
 block discarded – undo
234 234
  * @return string
235 235
  */
236 236
 function auteur_associer($id_auteur, $objets, $qualif = null) {
237
-	include_spip('action/editer_liens');
237
+    include_spip('action/editer_liens');
238 238
 
239
-	return objet_associer(['auteur' => $id_auteur], $objets, $qualif);
239
+    return objet_associer(['auteur' => $id_auteur], $objets, $qualif);
240 240
 }
241 241
 
242 242
 /**
@@ -255,9 +255,9 @@  discard block
 block discarded – undo
255 255
  * @return string
256 256
  */
257 257
 function auteur_dissocier($id_auteur, $objets) {
258
-	include_spip('action/editer_liens');
258
+    include_spip('action/editer_liens');
259 259
 
260
-	return objet_dissocier(['auteur' => $id_auteur], $objets);
260
+    return objet_dissocier(['auteur' => $id_auteur], $objets);
261 261
 }
262 262
 
263 263
 /**
@@ -278,9 +278,9 @@  discard block
 block discarded – undo
278 278
  * @return bool|int
279 279
  */
280 280
 function auteur_qualifier($id_auteur, $objets, $qualif) {
281
-	include_spip('action/editer_liens');
281
+    include_spip('action/editer_liens');
282 282
 
283
-	return objet_qualifier_liens(['auteur' => $id_auteur], $objets, $qualif);
283
+    return objet_qualifier_liens(['auteur' => $id_auteur], $objets, $qualif);
284 284
 }
285 285
 
286 286
 
@@ -299,139 +299,139 @@  discard block
 block discarded – undo
299 299
  * @return bool|string
300 300
  */
301 301
 function auteur_instituer($id_auteur, $c, $force_webmestre = false) {
302
-	if (!$id_auteur = intval($id_auteur)) {
303
-		return false;
304
-	}
305
-	$erreurs = []; // contiendra les differentes erreurs a traduire par _T()
306
-	$champs = [];
307
-
308
-	// les memoriser pour les faire passer dans le pipeline pre_edition
309
-	if (isset($c['login']) and strlen($c['login'])) {
310
-		$champs['login'] = $c['login'];
311
-	}
312
-	if (isset($c['pass']) and strlen($c['pass'])) {
313
-		$champs['pass'] = $c['pass'];
314
-	}
315
-
316
-	$statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
317
-
318
-	if (
319
-		isset($c['statut'])
320
-		and (autoriser('modifier', 'auteur', $id_auteur, null, ['statut' => $c['statut']]))
321
-	) {
322
-		$statut = $champs['statut'] = $c['statut'];
323
-	}
324
-
325
-	// Restreindre avant de declarer l'auteur
326
-	// (section critique sur les droits)
327
-	if (isset($c['id_parent']) and $c['id_parent']) {
328
-		if (is_array($c['restreintes'])) {
329
-			$c['restreintes'][] = $c['id_parent'];
330
-		} else {
331
-			$c['restreintes'] = [$c['id_parent']];
332
-		}
333
-	}
334
-
335
-	if (
336
-		isset($c['webmestre'])
337
-		and ($force_webmestre or autoriser('modifier', 'auteur', $id_auteur, null, ['webmestre' => '?']))
338
-	) {
339
-		$champs['webmestre'] = $c['webmestre'] == 'oui' ? 'oui' : 'non';
340
-	}
341
-
342
-	// si statut change et n'est pas 0minirezo, on force webmestre a non
343
-	if (isset($c['statut']) and $c['statut'] !== '0minirezo') {
344
-		$champs['webmestre'] = $c['webmestre'] = 'non';
345
-	}
346
-
347
-	// Envoyer aux plugins
348
-	$champs = pipeline(
349
-		'pre_edition',
350
-		[
351
-			'args' => [
352
-				'table' => 'spip_auteurs',
353
-				'id_objet' => $id_auteur,
354
-				'action' => 'instituer',
355
-				'statut_ancien' => $statut_ancien,
356
-			],
357
-			'data' => $champs
358
-		]
359
-	);
360
-
361
-	if (
362
-		isset($c['restreintes']) and is_array($c['restreintes'])
363
-		and autoriser('modifier', 'auteur', $id_auteur, null, ['restreint' => $c['restreintes']])
364
-	) {
365
-		$rubriques = array_map('intval', $c['restreintes']);
366
-		$rubriques = array_unique($rubriques);
367
-		$rubriques = array_diff($rubriques, [0]);
368
-		auteur_dissocier($id_auteur, ['rubrique' => '*']);
369
-		auteur_associer($id_auteur, ['rubrique' => $rubriques]);
370
-	}
371
-
372
-	$flag_ecrire_acces = false;
373
-	// commencer par traiter les cas particuliers des logins et pass
374
-	// avant les autres ecritures en base
375
-	if (isset($champs['login']) or isset($champs['pass'])) {
376
-		$auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
377
-		include_spip('inc/auth');
378
-		if (isset($champs['login']) and strlen($champs['login'])) {
379
-			if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) {
380
-				$erreurs[] = 'ecrire:impossible_modifier_login_auteur';
381
-			}
382
-		}
383
-		if (isset($champs['pass']) and strlen($champs['pass'])) {
384
-			$champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
385
-			if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) {
386
-				$erreurs[] = 'ecrire:impossible_modifier_pass_auteur';
387
-			}
388
-		}
389
-		unset($champs['login']);
390
-		unset($champs['pass']);
391
-		$flag_ecrire_acces = true;
392
-	}
393
-
394
-	if (!(is_countable($champs) ? count($champs) : 0)) {
395
-		return implode(' ', array_map('_T', $erreurs));
396
-	}
397
-	sql_updateq('spip_auteurs', $champs, 'id_auteur=' . $id_auteur);
398
-
399
-	// .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
400
-	if (
401
-		$flag_ecrire_acces
402
-		or isset($champs['statut'])
403
-	) {
404
-		include_spip('inc/acces');
405
-		ecrire_acces();
406
-	}
407
-
408
-	// Invalider les caches
409
-	include_spip('inc/invalideur');
410
-	suivre_invalideur("id='auteur/$id_auteur'");
411
-
412
-	// Pipeline
413
-	pipeline(
414
-		'post_edition',
415
-		[
416
-			'args' => [
417
-				'table' => 'spip_auteurs',
418
-				'id_objet' => $id_auteur,
419
-				'action' => 'instituer',
420
-				'statut_ancien' => $statut_ancien,
421
-			],
422
-			'data' => $champs
423
-		]
424
-	);
425
-
426
-
427
-	// Notifications
428
-	if ($notifications = charger_fonction('notifications', 'inc')) {
429
-		$notifications(
430
-			'instituerauteur',
431
-			$id_auteur,
432
-			['statut' => $statut, 'statut_ancien' => $statut_ancien]
433
-		);
434
-	}
435
-
436
-	return implode(' ', array_map('_T', $erreurs));
302
+    if (!$id_auteur = intval($id_auteur)) {
303
+        return false;
304
+    }
305
+    $erreurs = []; // contiendra les differentes erreurs a traduire par _T()
306
+    $champs = [];
307
+
308
+    // les memoriser pour les faire passer dans le pipeline pre_edition
309
+    if (isset($c['login']) and strlen($c['login'])) {
310
+        $champs['login'] = $c['login'];
311
+    }
312
+    if (isset($c['pass']) and strlen($c['pass'])) {
313
+        $champs['pass'] = $c['pass'];
314
+    }
315
+
316
+    $statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
317
+
318
+    if (
319
+        isset($c['statut'])
320
+        and (autoriser('modifier', 'auteur', $id_auteur, null, ['statut' => $c['statut']]))
321
+    ) {
322
+        $statut = $champs['statut'] = $c['statut'];
323
+    }
324
+
325
+    // Restreindre avant de declarer l'auteur
326
+    // (section critique sur les droits)
327
+    if (isset($c['id_parent']) and $c['id_parent']) {
328
+        if (is_array($c['restreintes'])) {
329
+            $c['restreintes'][] = $c['id_parent'];
330
+        } else {
331
+            $c['restreintes'] = [$c['id_parent']];
332
+        }
333
+    }
334
+
335
+    if (
336
+        isset($c['webmestre'])
337
+        and ($force_webmestre or autoriser('modifier', 'auteur', $id_auteur, null, ['webmestre' => '?']))
338
+    ) {
339
+        $champs['webmestre'] = $c['webmestre'] == 'oui' ? 'oui' : 'non';
340
+    }
341
+
342
+    // si statut change et n'est pas 0minirezo, on force webmestre a non
343
+    if (isset($c['statut']) and $c['statut'] !== '0minirezo') {
344
+        $champs['webmestre'] = $c['webmestre'] = 'non';
345
+    }
346
+
347
+    // Envoyer aux plugins
348
+    $champs = pipeline(
349
+        'pre_edition',
350
+        [
351
+            'args' => [
352
+                'table' => 'spip_auteurs',
353
+                'id_objet' => $id_auteur,
354
+                'action' => 'instituer',
355
+                'statut_ancien' => $statut_ancien,
356
+            ],
357
+            'data' => $champs
358
+        ]
359
+    );
360
+
361
+    if (
362
+        isset($c['restreintes']) and is_array($c['restreintes'])
363
+        and autoriser('modifier', 'auteur', $id_auteur, null, ['restreint' => $c['restreintes']])
364
+    ) {
365
+        $rubriques = array_map('intval', $c['restreintes']);
366
+        $rubriques = array_unique($rubriques);
367
+        $rubriques = array_diff($rubriques, [0]);
368
+        auteur_dissocier($id_auteur, ['rubrique' => '*']);
369
+        auteur_associer($id_auteur, ['rubrique' => $rubriques]);
370
+    }
371
+
372
+    $flag_ecrire_acces = false;
373
+    // commencer par traiter les cas particuliers des logins et pass
374
+    // avant les autres ecritures en base
375
+    if (isset($champs['login']) or isset($champs['pass'])) {
376
+        $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
377
+        include_spip('inc/auth');
378
+        if (isset($champs['login']) and strlen($champs['login'])) {
379
+            if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) {
380
+                $erreurs[] = 'ecrire:impossible_modifier_login_auteur';
381
+            }
382
+        }
383
+        if (isset($champs['pass']) and strlen($champs['pass'])) {
384
+            $champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur));
385
+            if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) {
386
+                $erreurs[] = 'ecrire:impossible_modifier_pass_auteur';
387
+            }
388
+        }
389
+        unset($champs['login']);
390
+        unset($champs['pass']);
391
+        $flag_ecrire_acces = true;
392
+    }
393
+
394
+    if (!(is_countable($champs) ? count($champs) : 0)) {
395
+        return implode(' ', array_map('_T', $erreurs));
396
+    }
397
+    sql_updateq('spip_auteurs', $champs, 'id_auteur=' . $id_auteur);
398
+
399
+    // .. mettre a jour les fichiers .htpasswd et .htpasswd-admin
400
+    if (
401
+        $flag_ecrire_acces
402
+        or isset($champs['statut'])
403
+    ) {
404
+        include_spip('inc/acces');
405
+        ecrire_acces();
406
+    }
407
+
408
+    // Invalider les caches
409
+    include_spip('inc/invalideur');
410
+    suivre_invalideur("id='auteur/$id_auteur'");
411
+
412
+    // Pipeline
413
+    pipeline(
414
+        'post_edition',
415
+        [
416
+            'args' => [
417
+                'table' => 'spip_auteurs',
418
+                'id_objet' => $id_auteur,
419
+                'action' => 'instituer',
420
+                'statut_ancien' => $statut_ancien,
421
+            ],
422
+            'data' => $champs
423
+        ]
424
+    );
425
+
426
+
427
+    // Notifications
428
+    if ($notifications = charger_fonction('notifications', 'inc')) {
429
+        $notifications(
430
+            'instituerauteur',
431
+            $id_auteur,
432
+            ['statut' => $statut, 'statut_ancien' => $statut_ancien]
433
+        );
434
+    }
435
+
436
+    return implode(' ', array_map('_T', $erreurs));
437 437
 }
Please login to merge, or discard this patch.
ecrire/action/instituer_objet.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -17,7 +17,7 @@  discard block
 block discarded – undo
17 17
  */
18 18
 
19 19
 if (!defined('_ECRIRE_INC_VERSION')) {
20
-	return;
20
+    return;
21 21
 }
22 22
 
23 23
 /**
@@ -29,24 +29,24 @@  discard block
 block discarded – undo
29 29
  */
30 30
 function action_instituer_objet_dist($arg = null) {
31 31
 
32
-	if (is_null($arg)) {
33
-		$securiser_action = charger_fonction('securiser_action', 'inc');
34
-		$arg = $securiser_action();
35
-	}
32
+    if (is_null($arg)) {
33
+        $securiser_action = charger_fonction('securiser_action', 'inc');
34
+        $arg = $securiser_action();
35
+    }
36 36
 
37
-	[$objet, $id_objet, $statut] = preg_split('/\W/', $arg);
38
-	if (!$statut) {
39
-		$statut = _request('statut_nouv');
40
-	} // cas POST
41
-	if (!$statut) {
42
-		return;
43
-	} // impossible mais sait-on jamais
37
+    [$objet, $id_objet, $statut] = preg_split('/\W/', $arg);
38
+    if (!$statut) {
39
+        $statut = _request('statut_nouv');
40
+    } // cas POST
41
+    if (!$statut) {
42
+        return;
43
+    } // impossible mais sait-on jamais
44 44
 
45
-	if (
46
-		$id_objet = intval($id_objet)
47
-		and autoriser('instituer', $objet, $id_objet, '', ['statut' => $statut])
48
-	) {
49
-		include_spip('action/editer_objet');
50
-		objet_modifier($objet, $id_objet, ['statut' => $statut]);
51
-	}
45
+    if (
46
+        $id_objet = intval($id_objet)
47
+        and autoriser('instituer', $objet, $id_objet, '', ['statut' => $statut])
48
+    ) {
49
+        include_spip('action/editer_objet');
50
+        objet_modifier($objet, $id_objet, ['statut' => $statut]);
51
+    }
52 52
 }
Please login to merge, or discard this patch.