/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
- * Copyright (c) 2001-2016 *
+ * Copyright (c) 2001-2017 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
-if (!defined('_ECRIRE_INC_VERSION')) return;
-
-/*
- * CVT Multi etapes
- * Module facilitant l'ecriture de formulaires CVT
- * en plusieurs etapes
+/**
+ * CVT Multi étapes
*
- * #FORMULAIRE_TRUC
+ * Module facilitant l'écriture de formulaires CVT
+ * en plusieurs étapes.
+ *
+ * `#FORMULAIRE_TRUC`
*
* Squelette :
- * Chaque etape est representee par un squelette independant qui doit
- * implementer un formulaire autonome pour les saisies de l'etape n
- * formulaires/truc.html pour l'etape 1
- * formulaires/truc_2.html pour l'etape 2
- * formulaires/truc_n.html pour l'etape n
+ * Chaque étape est representée par un squelette indépendant qui doit
+ * implémenter un formulaire autonome pour les saisies de l'étape n :
+ *
+ * - formulaires/truc.html pour l'etape 1
+ * - formulaires/truc_2.html pour l'etape 2
+ * - formulaires/truc_n.html pour l'etape n
*
- * Si un squelette formulaires/truc_n.html manque pour l'etape n
- * c'est formulaires/truc.html qui sera utilise
- * (charge a lui de gerer le cas de cette etape)
+ * Si un squelette `formulaires/truc_n.html` manque pour l'étape n
+ * c'est `formulaires/truc.html` qui sera utilisé
+ * (charge à lui de gérer le cas de cette étape).
*
* Charger :
- * formulaires_truc_charger_dist() :
- * passer '_etapes' => nombre total d'etapes de saisies (>1 !)
- * indiquer toutes les valeurs a saisir sur toutes les pages
+ * `formulaires_truc_charger_dist()` :
+ * passer '_etapes' => nombre total d'etapes de saisies (>1 !)
+ * indiquer toutes les valeurs à saisir sur toutes les pages
* comme si il s'agissait d'un formulaire unique
*
- * Verifier :
- * le numero d'etape courante est disponible dans $x=_request('_etape'), si necessaire
- * _request() permet d'acceder aux saisies effectuees depuis l'etape 1,
- * comme si les etapes 1 a $x avaient ete saisies en une seule fois
+ * Vérifier :
+ * Le numero d'étape courante est disponible dans `$x=_request('_etape')`, si nécessaire
+ * `_request()` permet d'accéder aux saisies effectuées depuis l'étape 1,
+ * comme si les étapes 1 a `$x` avaient été saisies en une seule fois
*
- * formulaires_truc_verifier_1_dist() : verifier les saisies de l'etape 1 uniquement
- * formulaires_truc_verifier_2_dist() : verifier les saisies de l'etape 2
- * formulaires_truc_verifier_n_dist() : verifier les saisies de l'etape n
+ * - formulaires_truc_verifier_1_dist() : verifier les saisies de l'etape 1 uniquement
+ * - formulaires_truc_verifier_2_dist() : verifier les saisies de l'etape 2
+ * - formulaires_truc_verifier_n_dist() : verifier les saisies de l'etape n
*
- * Il est possible d'implementer toutes les verifications dans une fonction unique qui sera alors appelee
- * avec en premier argument le numero de l'etape a verifier
- * formulaires_truc_verifier_etape_dist($etape,...) : verifier les saisies de l'etape $etape uniquement
+ * Il est possible d'implémenter toutes les vérifications dans une fonction unique
+ * qui sera alors appelée avec en premier argument le numero de l'étape à vérifier
+ * `formulaires_truc_verifier_etape_dist($etape,...)` : vérifier les saisies
+ * de l'étape `$etape` uniquement.
*
- * A chaque etape x, les etapes 1 a x sont appelees en verification
- * pour verifier l'absence de regression dans la validation (erreur, tentative de reinjection ...)
- * en cas d'erreur, la saisie retourne a la premiere etape en erreur.
- * en cas de succes, l'etape est incrementee, sauf si c'est la derniere.
- * Dans ce dernier cas on declenche traiter()
- *
- * Traiter
- * formulaires_truc_traiter_dist() : ne sera appele que lorsque *toutes*
- * les etapes auront ete saisies sans erreur.
- * La fonction traiter peut donc traiter l'ensemble des saisies comme si il s'agissait d'un formulaire unique
- * dans lequel toutes les donnees auraient ete saisies en une fois
+ * À chaque étape x, les étapes 1 a x sont appelées en vérification
+ * pour vérifier l'absence de régression dans la validation (erreur, tentative de réinjection ...)
+ * en cas d'erreur, la saisie retourne à la première étape en erreur.
+ * en cas de succès, l'étape est incrémentée, sauf si c'est la dernière.
+ * Dans ce dernier cas on déclenche `traiter()`.
*
+ * Traiter :
+ * `formulaires_truc_traiter_dist()` : ne sera appelé que lorsque **toutes**
+ * les étapes auront été saisies sans erreur.
*
+ * La fonction traiter peut donc traiter l'ensemble des saisies comme si il
+ * s'agissait d'un formulaire unique dans lequel toutes les données auraient
+ * été saisies en une fois.
*/
+if (!defined('_ECRIRE_INC_VERSION')) {
+ return;
+}
+
/**
* Reinjecter dans _request() les valeurs postees
* dans les etapes precedentes
* @param string $form
* @return array
*/
-function cvtmulti_recuperer_post_precedents($form){
+function cvtmulti_recuperer_post_precedents($form) {
include_spip('inc/filtres');
if ($form
- AND $c = _request('cvtm_prev_post')
- AND $c = decoder_contexte_ajax($c, $form)){
+ and $c = _request('cvtm_prev_post')
+ and $c = decoder_contexte_ajax($c, $form)
+ ) {
#var_dump($c);
-
+
# reinjecter dans la bonne variable pour permettre de retrouver
# toutes les saisies dans un seul tableau
- if ($_SERVER['REQUEST_METHOD']=='POST')
+ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$store = &$_POST;
- else
+ } else {
$store = &$_GET;
+ }
- foreach($c as $k=>$v)
- // on ecrase pas si saisi a nouveau !
- if (!isset($store[$k]))
+ foreach ($c as $k => $v) // on ecrase pas si saisi a nouveau !
+ {
+ if (!isset($store[$k])) {
$_REQUEST[$k] = $store[$k] = $v;
- // mais si tableau des deux cotes, on merge avec priorite a la derniere saisie
- elseif(is_array($store[$k])
- AND is_array($v)
- AND $z = array_keys($v)
- AND !is_numeric(reset($z))
- AND $z = array_keys($store[$k])
- AND !is_numeric(reset($z))
- )
- $_REQUEST[$k] = $store[$k] = array_merge($v,$store[$k]);
+ } // mais si tableau des deux cotes, on merge avec priorite a la derniere saisie
+ elseif (is_array($store[$k])
+ and is_array($v)
+ and $z = array_keys($v)
+ and !is_numeric(reset($z))
+ and $z = array_keys($store[$k])
+ and !is_numeric(reset($z))
+ ) {
+ $_REQUEST[$k] = $store[$k] = array_merge($v, $store[$k]);
+ }
+ }
// vider pour eviter un second appel a verifier_n
// en cas de double implementation (unipotence)
set_request('cvtm_prev_post');
- return array($c['_etape'],$c['_etapes']);
+
+ return array($c['_etape'], $c['_etapes']);
}
+
return false;
}
/**
* Sauvegarder les valeurs postees dans une variable encodee
* pour les recuperer a la prochaine etape
- *
+ *
* @param string $form
* @param bool $je_suis_poste
* @param array $valeurs
* @return array
*/
-function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs){
- if (!isset($valeurs['_cvtm_prev_post'])){
- $post = array('_etape'=>$valeurs['_etape'],'_etapes'=>$valeurs['_etapes']);
- foreach(array_keys($valeurs) as $champ){
- if (substr($champ,0,1)!=='_'){
+function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs) {
+ if (!isset($valeurs['_cvtm_prev_post'])) {
+ $post = array('_etape' => $valeurs['_etape'], '_etapes' => $valeurs['_etapes']);
+ foreach (array_keys($valeurs) as $champ) {
+ if (substr($champ, 0, 1) !== '_') {
if ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])) {
- if (($v = _request($champ))!==NULL)
+ if (($v = _request($champ)) !== null) {
$post[$champ] = $v;
+ }
}
}
}
include_spip('inc/filtres');
- $c = encoder_contexte_ajax($post,$form);
- if (!isset($valeurs['_hidden']))
+ $c = encoder_contexte_ajax($post, $form);
+ if (!isset($valeurs['_hidden'])) {
$valeurs['_hidden'] = '';
+ }
$valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />";
// marquer comme fait, pour eviter double encodage (unipotence)
$valeurs['_cvtm_prev_post'] = true;
}
+
return $valeurs;
}
/**
* Reperer une demande de formulaire CVT multi page
* et la reformater
- *
- * @param <type> $flux
- * @return <type>
+ *
+ * @deprecated : appel direct de cvtmulti_formulaire_charger_etapes par le core
+ * @param array $flux
+ * @return array
*/
-function cvtmulti_formulaire_charger($flux){
- #var_dump($flux['data']['_etapes']);
+function cvtmulti_formulaire_charger($flux) {
if (is_array($flux['data'])
- AND isset($flux['data']['_etapes'])){
- $form = $flux['args']['form'];
- $je_suis_poste = $flux['args']['je_suis_poste'];
- $nb_etapes = $flux['data']['_etapes'];
+ and isset($flux['data']['_etapes'])
+ ) {
+ $flux['data'] = cvtmulti_formulaire_charger_etapes($flux['args'], $flux['data']);
+ }
+
+ return $flux;
+}
+
+/**
+ * Charger une etape du cvt multi
+ * @param $args
+ * @param $valeurs
+ * @return array
+ */
+function cvtmulti_formulaire_charger_etapes($args, $valeurs) {
+ if (!isset($valeurs['_etape'])) {
+ $form = $args['form'];
+ $je_suis_poste = $args['je_suis_poste'];
+ $nb_etapes = $valeurs['_etapes'];
$etape = _request('_etape');
- $etape = min(max($etape,1),$nb_etapes);
- set_request('_etape',$etape);
- $flux['data']['_etape'] = $etape;
+ $etape = min(max($etape, 1), $nb_etapes);
+ set_request('_etape', $etape);
+ $valeurs['_etape'] = $etape;
// sauver les posts de cette etape pour les avoir a la prochaine etape
- $flux['data'] = cvtmulti_sauver_post($form, $je_suis_poste, $flux['data']);
- #var_dump($flux['data']);
+ $valeurs = cvtmulti_sauver_post($form, $je_suis_poste, $valeurs);
}
- return $flux;
+ return $valeurs;
}
/**
* Verifier les etapes de saisie
*
+ * @deprecated : appel direct de cvtmulti_formulaire_verifier_etapes par le core
* @param array $flux
* @return array
*/
-function cvtmulti_formulaire_verifier($flux){
+function cvtmulti_formulaire_verifier($flux) {
+ $flux['data'] = cvtmulti_formulaire_verifier_etapes($flux['args'], $flux['data']);
+ return $flux;
+}
+
+/**
+ * Verifier les etapes de saisie
+ *
+ * @param array $args
+ * @param $erreurs
+ * @return array
+ */
+function cvtmulti_formulaire_verifier_etapes($args, $erreurs) {
#var_dump('Pipe verifier');
-
- if ($form = $flux['args']['form']
- AND ($e = cvtmulti_recuperer_post_precedents($form))!==false){
+
+ if ($form = $args['form']
+ and ($e = cvtmulti_recuperer_post_precedents($form)) !== false
+ ) {
// recuperer l'etape saisie et le nombre d'etapes total
- list($etape,$etapes) = $e;
+ list($etape, $etapes) = $e;
$etape_demandee = _request('aller_a_etape'); // possibilite de poster en entier dans aller_a_etape
// lancer les verifs pour chaque etape deja saisie de 1 a $etape
- $erreurs = array();
+ $erreurs_etapes = array();
$derniere_etape_ok = 0;
$e = 0;
- while ($e<$etape AND $e<$etapes){
+ while ($e < $etape and $e < $etapes) {
$e++;
- $erreurs[$e] = array();
- if ($verifier = charger_fonction("verifier_$e","formulaires/$form/",true))
- $erreurs[$e] = call_user_func_array($verifier, $flux['args']['args']);
- elseif ($verifier = charger_fonction("verifier_etape","formulaires/$form/",true)){
- $args = $flux['args']['args'];
- array_unshift($args, $e);
- $erreurs[$e] = call_user_func_array($verifier, $args);
+ $erreurs_etapes[$e] = array();
+ if ($verifier = charger_fonction("verifier_$e", "formulaires/$form/", true)) {
+ $erreurs_etapes[$e] = call_user_func_array($verifier, $args['args']);
+ } elseif ($verifier = charger_fonction("verifier_etape", "formulaires/$form/", true)) {
+ $a = $args['args'];
+ array_unshift($a, $e);
+ $erreurs_etapes[$e] = call_user_func_array($verifier, $a);
}
- if ($derniere_etape_ok==$e-1 AND !count($erreurs[$e]))
+ // et on appelle un pipeline dedie aux etapes, plus easy
+ $args['etape'] = $e;
+ $erreurs_etapes[$e] = pipeline(
+ 'formulaire_verifier_etape',
+ array(
+ 'args' => $args,
+ 'data' => $erreurs_etapes[$e]
+ )
+ );
+
+ if ($derniere_etape_ok == $e - 1 and !count($erreurs_etapes[$e])) {
$derniere_etape_ok = $e;
+ }
// possibilite de poster dans _retour_etape_x
- if (!is_null(_request("_retour_etape_$e")))
+ if (!is_null(_request("_retour_etape_$e"))) {
$etape_demandee = $e;
+ }
}
// si la derniere etape OK etait la derniere
// on renvoie le flux inchange et ca declenche traiter
- if ($derniere_etape_ok==$etapes AND !$etape_demandee){
- return $flux;
- }
- else {
- $etape = $derniere_etape_ok+1;
- if ($etape_demandee>0 AND $etape_demandee<$etape)
+ if ($derniere_etape_ok == $etapes and !$etape_demandee) {
+ return $erreurs;
+ } else {
+ $etape = $derniere_etape_ok + 1;
+ if ($etape_demandee > 0 and $etape_demandee < $etape) {
$etape = $etape_demandee;
- $etape = min($etape,$etapes);
+ }
+ $etape = min($etape, $etapes);
#var_dump("prochaine etape $etape");
// retourner les erreurs de l'etape ciblee
- $flux['data'] = isset($erreurs[$etape]) ? $erreurs[$etape] : array() ;
- $flux['data']['_etapes'] = "etape suivante $etape";
- set_request('_etape',$etape);
+ $erreurs = isset($erreurs_etapes[$etape]) ? $erreurs_etapes[$etape] : array();
+ // Ne pas se tromper dans le texte du message d'erreur : la clé '_etapes' n'est pas une erreur !
+ if ($erreurs) {
+ $erreurs['message_erreur'] = singulier_ou_pluriel(count($erreurs), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie');
+ } else {
+ $erreurs['message_erreur'] = "";
+ }
+ $erreurs['_etapes'] = "etape suivante $etape";
+ set_request('_etape', $etape);
}
}
- return $flux;
+
+ return $erreurs;
}
/**
* Selectionner le bon fond en fonction de l'etape
* L'etape 1 est sur le fond sans suffixe
* Les autres etapes x sont sur le fond _x
- *
+ *
* @param array $flux
* @return array
*/
-function cvtmulti_styliser($flux){
- if (strncmp($flux['args']['fond'],'formulaires/',12)==0
- AND isset($flux['args']['contexte']['_etapes'])
- AND isset($flux['args']['contexte']['_etape'])
- AND ($e=$flux['args']['contexte']['_etape'])>1
- AND $ext = $flux['args']['ext']
- AND $f=$flux['data']
- AND file_exists($f."_$e.$ext"))
- $flux['data'] = $f."_$e";
+function cvtmulti_styliser($flux) {
+ if (strncmp($flux['args']['fond'], 'formulaires/', 12) == 0
+ and isset($flux['args']['contexte']['_etapes'])
+ and isset($flux['args']['contexte']['_etape'])
+ and ($e = $flux['args']['contexte']['_etape']) > 1
+ and $ext = $flux['args']['ext']
+ and $f = $flux['data']
+ and file_exists($f . "_$e.$ext")
+ ) {
+ $flux['data'] = $f . "_$e";
+ }
+
return $flux;
}
-
-
-?>