source: spip-zone/_plugins_/cvt-multi-etapes/cvtm_pipelines.php @ 51428

Last change on this file since 51428 was 51428, checked in by cedric@…, 8 years ago

permettre de forcer le passage a traiter avec un set_request('aller_a_etape',N) avec N>etapes

File size: 7.3 KB
Line 
1<?php
2/*
3 * Plugin CVT Multi etapes
4 * (c) 2010 Cedric Morin Yterium.net
5 * Distribue sous licence GPL
6 *
7 * Formulaires multi etapes :
8 *
9 * #FORMULAIRE_TRUC
10 *
11 * Squelette :
12 * Chaque etape est representee par un squelette independant qui doit
13 * implementer un formulaire autonome pour les saisies de l'etape n
14 * formulaires/truc.html pour l'etape 1
15 * formulaires/truc_2.html pour l'etape 2
16 * formulaires/truc_n.html pour l'etape n
17 *
18 * Charger :
19 * formulaires_truc_charger_dist() :
20 *      passer '_etapes' => nombre total d'etapes de saisies (>1 !)
21 *  indiquer toutes les valeurs a saisir sur toutes les pages
22 *  comme si il s'agissait d'un formulaire unique
23 *
24 * Verifier :
25 * le numero d'etape courante est disponible dans $x=_request('_etape'), si necessaire
26 * _request() permet d'acceder aux saisies effectuees depuis l'etape 1,
27 * comme si les etapes 1 a $x avaient ete saisies en une seule fois
28 *
29 * formulaires_truc_verifier_1_dist() : verifier les saisies de l'etape 1 uniquement
30 * formulaires_truc_verifier_2_dist() : verifier les saisies de l'etape 2
31 * formulaires_truc_verifier_n_dist() : verifier les saisies de l'etape n
32 *
33 * A chaque etape x, les etapes 1 a x sont appelees en verification
34 * pour verifier l'absence de regression dans la validation (erreur, tentative de reinjection ...)
35 * en cas d'erreur, la saisie retourne a la premiere etape en erreur.
36 * en cas de succes, l'etape est incrementee, sauf si c'est la derniere.
37 * Dans ce dernier cas on declenche traiter()
38 *
39 * Traiter
40 * formulaires_truc_traiter_dist() : ne sera appele que lorsque *toutes*
41 * les etapes auront ete saisies sans erreur.
42 * Traite donc l'ensemble des saisies comme si il s'agissait d'un formulaire unique
43 *
44 *
45 */
46
47/**
48 * Reinjecter dans _request() les valeurs postees
49 * dans les etapes precedentes
50 *
51 * @param string $form
52 * @return array
53 */
54function cvtm_recuperer_post_precedents($form){
55        include_spip('inc/filtres');
56        if ($form
57          AND $c = _request('cvtm_prev_post')
58                AND $c = decoder_contexte_ajax($c, $form)){
59                #var_dump($c);
60               
61                # reinjecter dans la bonne variable pour permettre de retrouver
62                # toutes les saisies dans un seul tableau
63                if ($_SERVER['REQUEST_METHOD']=='POST')
64                        $store = &$_POST;
65                else
66                        $store = &$_GET;
67
68                foreach($c as $k=>$v)
69                        if (!isset($store[$k])) // on ecrase pas si saisi a nouveau !
70                                $_REQUEST[$k] = $store[$k] = $v;
71                        elseif(is_array($store[$k])
72                          AND is_array($v)
73                                AND !is_numeric(reset(array_keys($v)))
74                                AND !is_numeric(reset(array_keys($store[$k])))
75                                )
76                                $_REQUEST[$k] = $store[$k] = array_merge($v,$store[$k]);
77
78                // vider pour eviter un second appel a verifier_n
79                // en cas de double implementation (unipotence)
80                set_request('cvtm_prev_post');
81                return array($c['_etape'],$c['_etapes']);
82        }
83        return false;
84}
85
86/**
87 * Sauvegarder les valeurs postees dans une variable encodee
88 * pour les recuperer a la prochaine etape
89 * 
90 * @param string $form
91 * @param bool $je_suis_poste
92 * @param array $valeurs
93 * @return array
94 */
95function cvtm_sauver_post($form, $je_suis_poste, &$valeurs){
96        if (!isset($valeurs['_cvtm_prev_post'])){
97                $post = array('_etape'=>$valeurs['_etape'],'_etapes'=>$valeurs['_etapes']);
98                foreach(array_keys($valeurs) as $champ){
99                        if (substr($champ,0,1)!=='_'){
100                                if ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])) {
101                                        if (($v = _request($champ))!==NULL)
102                                                $post[$champ] = $v;
103                                }
104                        }
105                }
106                include_spip('inc/filtres');
107                $c = encoder_contexte_ajax($post,$form);
108                if (!isset($valeurs['_hidden']))
109                        $valeurs['_hidden'] = '';
110                $valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />";
111                // marquer comme fait, pour eviter double encodage (unipotence)
112                $valeurs['_cvtm_prev_post'] = true;
113        }
114        return $valeurs;
115}
116
117
118/**
119 * Reperer une demande de formulaire CVT multi page
120 * et la reformater
121 *
122 * @param <type> $flux
123 * @return <type>
124 */
125function cvtm_formulaire_charger($flux){
126        #var_dump($flux['data']['_etapes']);
127        if (isset($flux['data']['_etapes'])){
128                $form = $flux['args']['form'];
129                $je_suis_poste = $flux['args']['je_suis_poste'];
130                $nb_etapes = $flux['data']['_etapes'];
131                $etape = _request('_etape');
132                $etape = min(max($etape,1),$nb_etapes);
133                set_request('_etape',$etape);
134                $flux['data']['_etape'] = $etape;
135
136                // sauver les posts de cette etape pour les avoir a la prochaine etape
137                $flux['data'] = cvtm_sauver_post($form, $je_suis_poste, $flux['data']);
138                #var_dump($flux['data']);
139        }
140        return $flux;
141}
142
143
144/**
145 * Verifier les etapes de saisie
146 *
147 * @param array $flux
148 * @return array
149 */
150function cvtm_formulaire_verifier($flux){
151        #var_dump('Pipe verifier');
152       
153        if ($form = $flux['args']['form']
154          AND ($e = cvtm_recuperer_post_precedents($form))!==false){
155                // recuperer l'etape saisie et le nombre d'etapes total
156                list($etape,$etapes) = $e;
157                $etape_demandee = _request('aller_a_etape'); // possibilite de poster en entier dans _etape
158                set_request('aller_a_etape'); // vider pour reperer si un verifier() le modifie
159
160                // lancer les verifs pour chaque etape deja saisie de 1 a $etape
161                $erreurs = array();
162                $derniere_etape_ok = 0;
163                $e = 0;
164                while ($e<$etape AND $e<$etapes){
165                        $e++;
166                        $erreurs[$e] = array();
167                        if ($verifier = charger_fonction("verifier_$e","formulaires/$form/",true))
168                                $erreurs[$e] = call_user_func_array($verifier, $flux['args']['args']);
169                        elseif ($verifier = charger_fonction("verifier_etape","formulaires/$form/",true)){
170                                $args = $flux['args']['args'];
171                                array_unshift($args, $e);
172                                $erreurs[$e] = call_user_func_array($verifier, $args);
173                        }
174                        if ($derniere_etape_ok==$e-1 AND !count($erreurs[$e]))
175                                $derniere_etape_ok = $e;
176                        // possibilite de poster dans _retour_etape_x
177                        if (!is_null(_request("_retour_etape_$e")))
178                                $etape_demandee = $e;
179                        if (!is_null(_request("aller_a_etape"))){
180                                $etape_demandee = _request("aller_a_etape");
181                                if ($etape_demandee>$etape+1)
182                                        $etape = $etape_demandee-1;
183                                set_request('aller_a_etape'); // vider pour reperer si un verifier() le modifie
184                        }
185                }
186
187                // si la derniere etape OK etait la derniere
188                // on renvoie le flux inchange et ca declenche traiter
189                if ($derniere_etape_ok==$etapes AND (!$etape_demandee OR $etape_demandee>$etapes)){
190                        return $flux;
191                }
192                else {
193                        $etape = $derniere_etape_ok+1;
194                        if ($etape_demandee>0 AND $etape_demandee<$etape)
195                                $etape = $etape_demandee;
196                        $etape = min($etape,$etapes);
197                        #var_dump("prochaine etape $etape");
198                        // retourner les erreurs de l'etape ciblee
199                        $flux['data'] = $erreurs[$etape];
200                        $flux['data']['_etapes'] = "etape suivante $etape";
201                        set_request('_etape',$etape);
202                }
203        }
204        return $flux;
205}
206
207/**
208 * Selectionner le bon fond en fonction de l'etape
209 * L'etape 1 est sur le fond sans suffixe
210 * Les autres etapes x sont sur le fond _x
211 *
212 * @param array $flux
213 * @return array
214 */
215function cvtm_styliser($flux){
216        if (strncmp($flux['args']['fond'],'formulaires/',12)==0
217          AND isset($flux['args']['contexte']['_etapes'])
218          AND isset($flux['args']['contexte']['_etape'])
219          AND ($e=$flux['args']['contexte']['_etape'])>1
220                AND $ext = $flux['args']['ext']
221                AND $f=$flux['data']
222                AND file_exists($f."_$e.$ext"))
223                $flux['data'] = $f."_$e";
224        return $flux;
225}
226
227/*
228        $squelette = pipeline('styliser', array(
229                'args' => array(
230                        'id_rubrique' => $id_rubrique,
231                        'ext' => $ext,
232                        'fond' => $fond,
233                        'lang' => $lang,
234                        'contexte' => $contexte, // le style d'un objet peut dependre de lui meme
235                        'connect' => $connect
236                ),
237                'data' => $squelette,
238        ));
239*/
240?>
Note: See TracBrowser for help on using the repository browser.