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

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

complement a r51042 : il ne faut merger le array de l'etape precedente avec celui poste que si ils n'ont pas de cle numerique (sinon un merge est contreproductif car il ajoute les deux tableaux)

File size: 7.0 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
159                // lancer les verifs pour chaque etape deja saisie de 1 a $etape
160                $erreurs = array();
161                $derniere_etape_ok = 0;
162                $e = 0;
163                while ($e<$etape AND $e<$etapes){
164                        $e++;
165                        $erreurs[$e] = array();
166                        if ($verifier = charger_fonction("verifier_$e","formulaires/$form/",true))
167                                $erreurs[$e] = call_user_func_array($verifier, $flux['args']['args']);
168                        elseif ($verifier = charger_fonction("verifier_etape","formulaires/$form/",true)){
169                                $args = $flux['args']['args'];
170                                array_unshift($args, $e);
171                                $erreurs[$e] = call_user_func_array($verifier, $args);
172                        }
173                        if ($derniere_etape_ok==$e-1 AND !count($erreurs[$e]))
174                                $derniere_etape_ok = $e;
175                        // possibilite de poster dans _retour_etape_x
176                        if (!is_null(_request("_retour_etape_$e")))
177                                $etape_demandee = $e;
178                }
179
180                // si la derniere etape OK etait la derniere
181                // on renvoie le flux inchange et ca declenche traiter
182                if ($derniere_etape_ok==$etapes AND !$etape_demandee){
183                        return $flux;
184                }
185                else {
186                        $etape = $derniere_etape_ok+1;
187                        if ($etape_demandee>0 AND $etape_demandee<$etape)
188                                $etape = $etape_demandee;
189                        $etape = min($etape,$etapes);
190                        #var_dump("prochaine etape $etape");
191                        // retourner les erreurs de l'etape ciblee
192                        $flux['data'] = $erreurs[$etape];
193                        $flux['data']['_etapes'] = "etape suivante $etape";
194                        set_request('_etape',$etape);
195                }
196        }
197        return $flux;
198}
199
200/**
201 * Selectionner le bon fond en fonction de l'etape
202 * L'etape 1 est sur le fond sans suffixe
203 * Les autres etapes x sont sur le fond _x
204 *
205 * @param array $flux
206 * @return array
207 */
208function cvtm_styliser($flux){
209        if (strncmp($flux['args']['fond'],'formulaires/',12)==0
210          AND isset($flux['args']['contexte']['_etapes'])
211          AND isset($flux['args']['contexte']['_etape'])
212          AND ($e=$flux['args']['contexte']['_etape'])>1
213                AND $ext = $flux['args']['ext']
214                AND $f=$flux['data']
215                AND file_exists($f."_$e.$ext"))
216                $flux['data'] = $f."_$e";
217        return $flux;
218}
219
220/*
221        $squelette = pipeline('styliser', array(
222                'args' => array(
223                        'id_rubrique' => $id_rubrique,
224                        'ext' => $ext,
225                        'fond' => $fond,
226                        'lang' => $lang,
227                        'contexte' => $contexte, // le style d'un objet peut dependre de lui meme
228                        'connect' => $connect
229                ),
230                'data' => $squelette,
231        ));
232*/
233?>
Note: See TracBrowser for help on using the repository browser.