Completed
Push — master ( 47be08...0b670a )
by cam
01:02
created
ecrire/balise/formulaire_.php 1 patch
Indentation   +267 added lines, -267 removed lines patch added patch discarded remove patch
@@ -16,7 +16,7 @@  discard block
 block discarded – undo
16 16
  * @package SPIP\Core\Formulaires
17 17
  **/
18 18
 if (!defined('_ECRIRE_INC_VERSION')) {
19
-	return;
19
+    return;
20 20
 }
21 21
 
22 22
 include_spip('inc/filtres');
@@ -35,22 +35,22 @@  discard block
 block discarded – undo
35 35
  *     Saisie protégée
36 36
  **/
37 37
 function protege_champ($texte) {
38
-	if (is_array($texte)) {
39
-		return array_map('protege_champ', $texte);
40
-	} elseif ($texte === null) {
41
-		return $texte;
42
-	} elseif (is_bool($texte)) {
43
-		return $texte ? '1' : '';
44
-	} elseif (is_string($texte) and $texte) {
45
-		if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
-			// ne pas corrompre une valeur serialize
47
-			return $texte;
48
-		} elseif (strpbrk($texte, "&\"'<>") !== false) {
49
-			return spip_htmlspecialchars($texte, ENT_QUOTES);
50
-		}
51
-	}
52
-
53
-	return $texte;
38
+    if (is_array($texte)) {
39
+        return array_map('protege_champ', $texte);
40
+    } elseif ($texte === null) {
41
+        return $texte;
42
+    } elseif (is_bool($texte)) {
43
+        return $texte ? '1' : '';
44
+    } elseif (is_string($texte) and $texte) {
45
+        if (preg_match(',^[abis]:\d+[:;],', $texte) and @unserialize($texte) !== false) {
46
+            // ne pas corrompre une valeur serialize
47
+            return $texte;
48
+        } elseif (strpbrk($texte, "&\"'<>") !== false) {
49
+            return spip_htmlspecialchars($texte, ENT_QUOTES);
50
+        }
51
+    }
52
+
53
+    return $texte;
54 54
 }
55 55
 
56 56
 /**
@@ -64,17 +64,17 @@  discard block
 block discarded – undo
64 64
  *     - false : pas de squelette trouvé
65 65
  **/
66 66
 function existe_formulaire($form) {
67
-	if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
-		$form = strtolower(substr($form, 11));
69
-	} else {
70
-		$form = strtolower($form);
71
-	}
67
+    if (substr($form, 0, 11) == 'FORMULAIRE_') {
68
+        $form = strtolower(substr($form, 11));
69
+    } else {
70
+        $form = strtolower($form);
71
+    }
72 72
 
73
-	if (!$form) {
74
-		return '';
75
-	} // on ne sait pas, le nom du formulaire n'est pas fourni ici
73
+    if (!$form) {
74
+        return '';
75
+    } // on ne sait pas, le nom du formulaire n'est pas fourni ici
76 76
 
77
-	return trouver_fond($form, 'formulaires/') ? $form : false;
77
+    return trouver_fond($form, 'formulaires/') ? $form : false;
78 78
 }
79 79
 
80 80
 /**
@@ -83,31 +83,31 @@  discard block
 block discarded – undo
83 83
  * @return false|array
84 84
  */
85 85
 function test_formulaire_inclus_par_modele() {
86
-	$trace = debug_backtrace(0, 20);
87
-	$trace_fonctions = array_column($trace, 'function');
88
-	$trace_fonctions = array_map('strtolower', $trace_fonctions);
89
-
90
-	// regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
-	if (
92
-		function_exists('arguments_balise_dyn_depuis_modele')
93
-		and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
-	) {
95
-		if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
-			$k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
-			if ($trace[$k]['args'][0] === $form) {
98
-				return $trace[$k]['args'];
99
-			}
100
-		}
101
-	}
102
-
103
-	// fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
-	// mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
-	if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
-		$k = array_search('inclure_modele', $trace_fonctions);
107
-		// les arguments de recuperer_fond() passes par inclure_modele()
108
-		return $trace[$k - 1]['args'][1]['args'];
109
-	}
110
-	return false;
86
+    $trace = debug_backtrace(0, 20);
87
+    $trace_fonctions = array_column($trace, 'function');
88
+    $trace_fonctions = array_map('strtolower', $trace_fonctions);
89
+
90
+    // regarder si un flag a ete leve juste avant l'appel de balise_FORMULAIRE_dyn
91
+    if (
92
+        function_exists('arguments_balise_dyn_depuis_modele')
93
+        and $form = arguments_balise_dyn_depuis_modele(null, 'read')
94
+    ) {
95
+        if (in_array('balise_formulaire__dyn', $trace_fonctions)) {
96
+            $k = array_search('balise_formulaire__dyn', $trace_fonctions);
97
+            if ($trace[$k]['args'][0] === $form) {
98
+                return $trace[$k]['args'];
99
+            }
100
+        }
101
+    }
102
+
103
+    // fallback qui ne repose pas sur le flag lie a l'analyse de contexte_compil,
104
+    // mais ne marche pas si executer_balise_dynamique est appelee via du php dans le squelette
105
+    if (in_array('eval', $trace_fonctions) and in_array('inclure_modele', $trace_fonctions)) {
106
+        $k = array_search('inclure_modele', $trace_fonctions);
107
+        // les arguments de recuperer_fond() passes par inclure_modele()
108
+        return $trace[$k - 1]['args'][1]['args'];
109
+    }
110
+    return false;
111 111
 }
112 112
 
113 113
 /**
@@ -122,32 +122,32 @@  discard block
 block discarded – undo
122 122
  **/
123 123
 function balise_FORMULAIRE__dist($p) {
124 124
 
125
-	// Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
-	// mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
-	if (existe_formulaire($p->nom_champ) === false) {
128
-		$p->code = "''";
129
-		$p->interdire_scripts = false;
130
-
131
-		return $p;
132
-	}
133
-
134
-	// sinon renvoyer un code php dynamique
135
-	$p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
-
137
-	if (
138
-		!test_espace_prive()
139
-		and !empty($p->descr['sourcefile'])
140
-		and $f = $p->descr['sourcefile']
141
-		and basename(dirname($f)) === 'modeles'
142
-	) {
143
-		// un modele est toujours inséré en texte dans son contenant
144
-		// donc si on est dans le public avec un cache on va perdre le dynamisme
145
-		// et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
-		// on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
-		$p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
-		// dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
-	}
150
-	return $p;
125
+    // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide.
126
+    // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer
127
+    if (existe_formulaire($p->nom_champ) === false) {
128
+        $p->code = "''";
129
+        $p->interdire_scripts = false;
130
+
131
+        return $p;
132
+    }
133
+
134
+    // sinon renvoyer un code php dynamique
135
+    $p = calculer_balise_dynamique($p, $p->nom_champ, []);
136
+
137
+    if (
138
+        !test_espace_prive()
139
+        and !empty($p->descr['sourcefile'])
140
+        and $f = $p->descr['sourcefile']
141
+        and basename(dirname($f)) === 'modeles'
142
+    ) {
143
+        // un modele est toujours inséré en texte dans son contenant
144
+        // donc si on est dans le public avec un cache on va perdre le dynamisme
145
+        // et on risque de mettre en cache les valeurs pre-remplies du formulaire
146
+        // on injecte donc le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction
147
+        $p->code = "'<'.'?php echo (" . texte_script($p->code) . "); ?'.'>'";
148
+        // dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)
149
+    }
150
+    return $p;
151 151
 }
152 152
 
153 153
 /**
@@ -167,17 +167,17 @@  discard block
 block discarded – undo
167 167
  *     - string : texte à afficher directement
168 168
  */
169 169
 function balise_FORMULAIRE__dyn($form, ...$args) {
170
-	$form = existe_formulaire($form);
171
-	if (!$form) {
172
-		return '';
173
-	}
170
+    $form = existe_formulaire($form);
171
+    if (!$form) {
172
+        return '';
173
+    }
174 174
 
175
-	$contexte = balise_FORMULAIRE__contexte($form, $args);
176
-	if (!is_array($contexte)) {
177
-		return $contexte;
178
-	}
175
+    $contexte = balise_FORMULAIRE__contexte($form, $args);
176
+    if (!is_array($contexte)) {
177
+        return $contexte;
178
+    }
179 179
 
180
-	return ["formulaires/$form", 3600, $contexte];
180
+    return ["formulaires/$form", 3600, $contexte];
181 181
 }
182 182
 
183 183
 /**
@@ -192,85 +192,85 @@  discard block
 block discarded – undo
192 192
  *     string: Formulaire non applicable (message d’explication)
193 193
  **/
194 194
 function balise_FORMULAIRE__contexte($form, $args) {
195
-	// tester si ce formulaire vient d'etre poste (memes arguments)
196
-	// pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
197
-	// si poste, on recupere les erreurs
198
-
199
-	$je_suis_poste = false;
200
-	if (
201
-		$post_form = _request('formulaire_action')
202
-		and $post_form == $form
203
-		and $p = _request('formulaire_action_args')
204
-		and is_array($p = decoder_contexte_ajax($p, $post_form))
205
-	) {
206
-		// enlever le faux attribut de langue masque
207
-		array_shift($p);
208
-		if (formulaire__identifier($form, $args, $p)) {
209
-			$je_suis_poste = true;
210
-		}
211
-	}
212
-
213
-	$editable = true;
214
-	$erreurs = $post = [];
215
-	if ($je_suis_poste) {
216
-		$post = traiter_formulaires_dynamiques(true);
217
-		$e = "erreurs_$form";
218
-		$erreurs = $post[$e] ?? [];
219
-		$editable = "editable_$form";
220
-		$editable = (!isset($post[$e]))
221
-			|| (is_countable($erreurs) ? count($erreurs) : 0)
222
-			|| (isset($post[$editable]) && $post[$editable]);
223
-	}
224
-
225
-	$valeurs = formulaire__charger($form, $args, $je_suis_poste);
226
-
227
-	// si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
228
-	// C'est plus fort qu'editable qui est gere par le squelette
229
-	// Idealement $valeur doit etre alors un message explicatif.
230
-	if (!is_array($valeurs)) {
231
-		return is_string($valeurs) ? $valeurs : '';
232
-	}
233
-
234
-	// charger peut passer une action si le formulaire ne tourne pas sur self()
235
-	// ou une action vide si elle ne sert pas
236
-	$action = $valeurs['action'] ?? self('&amp;', true);
237
-	// bug IEx : si action finit par /
238
-	// IE croit que le <form ... action=../ > est autoferme
239
-	if (substr($action, -1) == '/') {
240
-		// on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
241
-		$action .= '#';
242
-	}
243
-
244
-	// recuperer la saisie en cours si erreurs
245
-	// seulement si c'est ce formulaire qui est poste
246
-	// ou si on le demande explicitement par le parametre _forcer_request = true
247
-	$dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
248
-	foreach (array_keys($valeurs) as $champ) {
249
-		if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
250
-			if ($dispo and (($v = _request($champ)) !== null)) {
251
-				$valeurs[$champ] = $v;
252
-			}
253
-			// nettoyer l'url des champs qui vont etre saisis
254
-			if ($action) {
255
-				$action = parametre_url($action, $champ, '');
256
-			}
257
-			// proteger les ' et les " dans les champs que l'on va injecter
258
-			$valeurs[$champ] = protege_champ($valeurs[$champ]);
259
-		}
260
-	}
261
-
262
-	if ($action) {
263
-		// nettoyer l'url
264
-		$action = parametre_url($action, 'formulaire_action', '');
265
-		$action = parametre_url($action, 'formulaire_action_args', '');
266
-		$action = parametre_url($action, 'formulaire_action_sign', '');
267
-	}
268
-
269
-	/**
270
-	 * @deprecated 4.0
271
-	 * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
272
-	 */
273
-	/*
195
+    // tester si ce formulaire vient d'etre poste (memes arguments)
196
+    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
197
+    // si poste, on recupere les erreurs
198
+
199
+    $je_suis_poste = false;
200
+    if (
201
+        $post_form = _request('formulaire_action')
202
+        and $post_form == $form
203
+        and $p = _request('formulaire_action_args')
204
+        and is_array($p = decoder_contexte_ajax($p, $post_form))
205
+    ) {
206
+        // enlever le faux attribut de langue masque
207
+        array_shift($p);
208
+        if (formulaire__identifier($form, $args, $p)) {
209
+            $je_suis_poste = true;
210
+        }
211
+    }
212
+
213
+    $editable = true;
214
+    $erreurs = $post = [];
215
+    if ($je_suis_poste) {
216
+        $post = traiter_formulaires_dynamiques(true);
217
+        $e = "erreurs_$form";
218
+        $erreurs = $post[$e] ?? [];
219
+        $editable = "editable_$form";
220
+        $editable = (!isset($post[$e]))
221
+            || (is_countable($erreurs) ? count($erreurs) : 0)
222
+            || (isset($post[$editable]) && $post[$editable]);
223
+    }
224
+
225
+    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
226
+
227
+    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
228
+    // C'est plus fort qu'editable qui est gere par le squelette
229
+    // Idealement $valeur doit etre alors un message explicatif.
230
+    if (!is_array($valeurs)) {
231
+        return is_string($valeurs) ? $valeurs : '';
232
+    }
233
+
234
+    // charger peut passer une action si le formulaire ne tourne pas sur self()
235
+    // ou une action vide si elle ne sert pas
236
+    $action = $valeurs['action'] ?? self('&amp;', true);
237
+    // bug IEx : si action finit par /
238
+    // IE croit que le <form ... action=../ > est autoferme
239
+    if (substr($action, -1) == '/') {
240
+        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
241
+        $action .= '#';
242
+    }
243
+
244
+    // recuperer la saisie en cours si erreurs
245
+    // seulement si c'est ce formulaire qui est poste
246
+    // ou si on le demande explicitement par le parametre _forcer_request = true
247
+    $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']));
248
+    foreach (array_keys($valeurs) as $champ) {
249
+        if ($champ[0] !== '_' and !in_array($champ, ['message_ok', 'message_erreur', 'editable'])) {
250
+            if ($dispo and (($v = _request($champ)) !== null)) {
251
+                $valeurs[$champ] = $v;
252
+            }
253
+            // nettoyer l'url des champs qui vont etre saisis
254
+            if ($action) {
255
+                $action = parametre_url($action, $champ, '');
256
+            }
257
+            // proteger les ' et les " dans les champs que l'on va injecter
258
+            $valeurs[$champ] = protege_champ($valeurs[$champ]);
259
+        }
260
+    }
261
+
262
+    if ($action) {
263
+        // nettoyer l'url
264
+        $action = parametre_url($action, 'formulaire_action', '');
265
+        $action = parametre_url($action, 'formulaire_action_args', '');
266
+        $action = parametre_url($action, 'formulaire_action_sign', '');
267
+    }
268
+
269
+    /**
270
+     * @deprecated 4.0
271
+     * servait pour poster sur les actions de type editer_xxx() qui ne prenaient pas d'argument autrement que par _request('arg') et pour lesquelles il fallait donc passer un hash valide
272
+     */
273
+    /*
274 274
 	if (isset($valeurs['_action'])) {
275 275
 		$securiser_action = charger_fonction('securiser_action', 'inc');
276 276
 		$secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
@@ -280,59 +280,59 @@  discard block
 block discarded – undo
280 280
 	}
281 281
 	*/
282 282
 
283
-	// empiler la lang en tant que premier argument implicite du CVT
284
-	// pour permettre de la restaurer au moment du Verifier et du Traiter
285
-	array_unshift($args, $GLOBALS['spip_lang']);
286
-
287
-	$valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
288
-	$valeurs['erreurs'] = $erreurs;
289
-	$valeurs['action'] = $action;
290
-	$valeurs['form'] = $form;
291
-
292
-	$valeurs['formulaire_sign'] = '';
293
-	if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
294
-		$securiser_action = charger_fonction('securiser_action', 'inc');
295
-		$secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
296
-		$valeurs['formulaire_sign'] = $secu['hash'];
297
-	}
298
-
299
-	if (!isset($valeurs['id'])) {
300
-		$valeurs['id'] = 'new';
301
-	}
302
-	// editable peut venir de charger() ou de traiter() sinon
303
-	if (!isset($valeurs['editable'])) {
304
-		$valeurs['editable'] = $editable;
305
-	}
306
-	// dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
307
-	$valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
308
-
309
-	if ($je_suis_poste) {
310
-		$valeurs['message_erreur'] = '';
311
-		if (isset($erreurs['message_erreur'])) {
312
-			$valeurs['message_erreur'] = $erreurs['message_erreur'];
313
-		}
314
-
315
-		$valeurs['message_ok'] = '';
316
-		if (isset($post["message_ok_$form"])) {
317
-			$valeurs['message_ok'] = $post["message_ok_$form"];
318
-		} elseif (isset($erreurs['message_ok'])) {
319
-			$valeurs['message_ok'] = $erreurs['message_ok'];
320
-		}
321
-
322
-		// accessibilite : encapsuler toutes les erreurs dans un role='alert'
323
-		// uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
324
-		// et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
325
-		if (html5_permis()) {
326
-			foreach ($erreurs as $k => $v) {
327
-				if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
328
-					// on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
329
-					$valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
330
-				}
331
-			}
332
-		}
333
-	}
334
-
335
-	return $valeurs;
283
+    // empiler la lang en tant que premier argument implicite du CVT
284
+    // pour permettre de la restaurer au moment du Verifier et du Traiter
285
+    array_unshift($args, $GLOBALS['spip_lang']);
286
+
287
+    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
288
+    $valeurs['erreurs'] = $erreurs;
289
+    $valeurs['action'] = $action;
290
+    $valeurs['form'] = $form;
291
+
292
+    $valeurs['formulaire_sign'] = '';
293
+    if (!empty($GLOBALS['visiteur_session']['id_auteur'])) {
294
+        $securiser_action = charger_fonction('securiser_action', 'inc');
295
+        $secu = $securiser_action($valeurs['form'], $valeurs['formulaire_args'], '', -1);
296
+        $valeurs['formulaire_sign'] = $secu['hash'];
297
+    }
298
+
299
+    if (!isset($valeurs['id'])) {
300
+        $valeurs['id'] = 'new';
301
+    }
302
+    // editable peut venir de charger() ou de traiter() sinon
303
+    if (!isset($valeurs['editable'])) {
304
+        $valeurs['editable'] = $editable;
305
+    }
306
+    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
307
+    $valeurs['editable'] = ($valeurs['editable'] ? ' ' : '');
308
+
309
+    if ($je_suis_poste) {
310
+        $valeurs['message_erreur'] = '';
311
+        if (isset($erreurs['message_erreur'])) {
312
+            $valeurs['message_erreur'] = $erreurs['message_erreur'];
313
+        }
314
+
315
+        $valeurs['message_ok'] = '';
316
+        if (isset($post["message_ok_$form"])) {
317
+            $valeurs['message_ok'] = $post["message_ok_$form"];
318
+        } elseif (isset($erreurs['message_ok'])) {
319
+            $valeurs['message_ok'] = $erreurs['message_ok'];
320
+        }
321
+
322
+        // accessibilite : encapsuler toutes les erreurs dans un role='alert'
323
+        // uniquement si c'est une string et au premier niveau (on ne touche pas au tableaux)
324
+        // et si $k ne commence pas par un _ (c'est bien une vrai erreur sur un vrai champ)
325
+        if (html5_permis()) {
326
+            foreach ($erreurs as $k => $v) {
327
+                if (is_string($v) and strlen(trim($v)) and strpos($k, '_') !== 0) {
328
+                    // on encapsule dans un span car ces messages sont en general simple, juste du texte, et deja dans un span dans le form
329
+                    $valeurs['erreurs'][$k] = "<span role='alert'>" . $erreurs[$k] . '</span>';
330
+                }
331
+            }
332
+        }
333
+    }
334
+
335
+    return $valeurs;
336 336
 }
337 337
 
338 338
 /**
@@ -344,51 +344,51 @@  discard block
 block discarded – undo
344 344
  * @return array
345 345
  */
346 346
 function formulaire__charger($form, $args, $poste) {
347
-	if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
348
-		$valeurs = $charger_valeurs(...$args);
349
-	} else {
350
-		$valeurs = [];
351
-	}
352
-
353
-	$valeurs = pipeline(
354
-		'formulaire_charger',
355
-		[
356
-			'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
357
-			'data' => $valeurs
358
-		]
359
-	);
360
-
361
-	// prise en charge CVT multi etape
362
-	if (is_array($valeurs) and isset($valeurs['_etapes'])) {
363
-		include_spip('inc/cvt_multietapes');
364
-		$valeurs = cvtmulti_formulaire_charger_etapes(
365
-			['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
366
-			$valeurs
367
-		);
368
-	}
369
-
370
-	// si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
371
-	if (is_array($valeurs)) {
372
-		if (!isset($valeurs['_pipelines'])) {
373
-			$valeurs['_pipelines'] = [];
374
-		}
375
-		// l'ancien argument _pipeline devient maintenant _pipelines
376
-		// reinjectons le vieux _pipeline au debut de _pipelines
377
-		if (isset($valeurs['_pipeline'])) {
378
-			$pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
379
-			$args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
380
-
381
-			$pipelines = [$pipe => $args];
382
-			$valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
383
-		}
384
-
385
-		// et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
386
-		// qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
387
-		// (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
388
-		$valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
389
-	}
390
-
391
-	return $valeurs;
347
+    if ($charger_valeurs = charger_fonction('charger', "formulaires/$form", true)) {
348
+        $valeurs = $charger_valeurs(...$args);
349
+    } else {
350
+        $valeurs = [];
351
+    }
352
+
353
+    $valeurs = pipeline(
354
+        'formulaire_charger',
355
+        [
356
+            'args' => ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
357
+            'data' => $valeurs
358
+        ]
359
+    );
360
+
361
+    // prise en charge CVT multi etape
362
+    if (is_array($valeurs) and isset($valeurs['_etapes'])) {
363
+        include_spip('inc/cvt_multietapes');
364
+        $valeurs = cvtmulti_formulaire_charger_etapes(
365
+            ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste],
366
+            $valeurs
367
+        );
368
+    }
369
+
370
+    // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline !
371
+    if (is_array($valeurs)) {
372
+        if (!isset($valeurs['_pipelines'])) {
373
+            $valeurs['_pipelines'] = [];
374
+        }
375
+        // l'ancien argument _pipeline devient maintenant _pipelines
376
+        // reinjectons le vieux _pipeline au debut de _pipelines
377
+        if (isset($valeurs['_pipeline'])) {
378
+            $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline'];
379
+            $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : [];
380
+
381
+            $pipelines = [$pipe => $args];
382
+            $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']);
383
+        }
384
+
385
+        // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire
386
+        // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond
387
+        // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes)
388
+        $valeurs['_pipelines']['formulaire_fond'] = ['form' => $form, 'args' => $args, 'je_suis_poste' => $poste];
389
+    }
390
+
391
+    return $valeurs;
392 392
 }
393 393
 
394 394
 /**
@@ -407,9 +407,9 @@  discard block
 block discarded – undo
407 407
  * @return bool
408 408
  */
409 409
 function formulaire__identifier($form, $args, $p) {
410
-	if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
411
-		return $identifier_args(...$args) === $identifier_args(...$p);
412
-	}
410
+    if ($identifier_args = charger_fonction('identifier', "formulaires/$form", true)) {
411
+        return $identifier_args(...$args) === $identifier_args(...$p);
412
+    }
413 413
 
414
-	return $args === $p;
414
+    return $args === $p;
415 415
 }
Please login to merge, or discard this patch.