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

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

Compat PHP 5.4

File size: 7.5 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 $z = array_keys($v)
74                                AND !is_numeric(reset($z))
75                                AND $z = array_keys($store[$k])
76                                AND !is_numeric(reset($z))
77                                )
78                                $_REQUEST[$k] = $store[$k] = array_merge($v,$store[$k]);
79
80                // vider pour eviter un second appel a verifier_n
81                // en cas de double implementation (unipotence)
82                set_request('cvtm_prev_post');
83                return array($c['_etape'],$c['_etapes']);
84        }
85        return false;
86}
87
88/**
89 * Sauvegarder les valeurs postees dans une variable encodee
90 * pour les recuperer a la prochaine etape
91 * 
92 * @param string $form
93 * @param bool $je_suis_poste
94 * @param array $valeurs
95 * @return array
96 */
97function cvtm_sauver_post($form, $je_suis_poste, &$valeurs){
98        if (!isset($valeurs['_cvtm_prev_post'])){
99                $post = array('_etape'=>$valeurs['_etape'],'_etapes'=>$valeurs['_etapes']);
100                foreach(array_keys($valeurs) as $champ){
101                        if (substr($champ,0,1)!=='_'){
102                                if ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])) {
103                                        if (($v = _request($champ))!==NULL)
104                                                $post[$champ] = $v;
105                                }
106                        }
107                }
108                include_spip('inc/filtres');
109                $c = encoder_contexte_ajax($post,$form);
110                if (!isset($valeurs['_hidden']))
111                        $valeurs['_hidden'] = '';
112                $valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />";
113                // marquer comme fait, pour eviter double encodage (unipotence)
114                $valeurs['_cvtm_prev_post'] = true;
115        }
116        return $valeurs;
117}
118
119
120/**
121 * Reperer une demande de formulaire CVT multi page
122 * et la reformater
123 *
124 * @param <type> $flux
125 * @return <type>
126 */
127function cvtm_formulaire_charger($flux){
128        #var_dump($flux['data']['_etapes']);
129        if (isset($flux['data']['_etapes'])){
130                $form = $flux['args']['form'];
131                $je_suis_poste = $flux['args']['je_suis_poste'];
132                $nb_etapes = $flux['data']['_etapes'];
133                $etape = _request('_etape');
134                $etape = min(max($etape,1),$nb_etapes);
135                set_request('_etape',$etape);
136                $flux['data']['_etape'] = $etape;
137
138                // sauver les posts de cette etape pour les avoir a la prochaine etape
139                $flux['data'] = cvtm_sauver_post($form, $je_suis_poste, $flux['data']);
140                #var_dump($flux['data']);
141        }
142        return $flux;
143}
144
145
146/**
147 * Verifier les etapes de saisie
148 *
149 * @param array $flux
150 * @return array
151 */
152function cvtm_formulaire_verifier($flux){
153        #var_dump('Pipe verifier');
154       
155        if ($form = $flux['args']['form']
156          AND ($e = cvtm_recuperer_post_precedents($form))!==false){
157                // recuperer l'etape saisie et le nombre d'etapes total
158                list($etape,$etapes) = $e;
159                $etape_demandee = _request('aller_a_etape'); // possibilite de poster en entier dans _etape
160                set_request('aller_a_etape'); // vider pour reperer si un verifier() le modifie
161
162                // lancer les verifs pour chaque etape deja saisie de 1 a $etape
163                $erreurs = array();
164                $derniere_etape_ok = 0;
165                $e = 0;
166                while ($e<$etape AND $e<$etapes){
167                        $e++;
168                        $erreurs[$e] = array();
169                        if ($verifier = charger_fonction("verifier_$e","formulaires/$form/",true))
170                                $erreurs[$e] = call_user_func_array($verifier, $flux['args']['args']);
171                        elseif ($verifier = charger_fonction("verifier_etape","formulaires/$form/",true)){
172                                $args = $flux['args']['args'];
173                                array_unshift($args, $e);
174                                $erreurs[$e] = call_user_func_array($verifier, $args);
175                        }
176                        if ($derniere_etape_ok==$e-1 AND !count($erreurs[$e]))
177                                $derniere_etape_ok = $e;
178                        // possibilite de poster dans _retour_etape_x
179                        if (!is_null(_request("_retour_etape_$e")))
180                                $etape_demandee = $e;
181                        if (!is_null(_request("aller_a_etape"))){
182                                $etape_demandee = _request("aller_a_etape");
183                                if ($etape_demandee>$etape+1)
184                                        $etape = $etape_demandee-1;
185                                set_request('aller_a_etape'); // vider pour reperer si un verifier() le modifie
186                        }
187                }
188
189                // si la derniere etape OK etait la derniere
190                // on renvoie le flux inchange et ca declenche traiter
191                if ($derniere_etape_ok==$etapes AND (!$etape_demandee OR $etape_demandee>$etapes)){
192                        return $flux;
193                }
194                else {
195                        $etape = $derniere_etape_ok+1;
196                        if ($etape_demandee>0 AND $etape_demandee<$etape)
197                                $etape = $etape_demandee;
198                        $etape = min($etape,$etapes);
199                        #var_dump("prochaine etape $etape");
200                        // retourner les erreurs de l'etape ciblee
201                        $flux['data'] = $erreurs[$etape];
202                        $flux['data']['_etapes'] = "etape suivante $etape";
203                        set_request('_etape',$etape);
204                }
205        }
206        return $flux;
207}
208
209/**
210 * Selectionner le bon fond en fonction de l'etape
211 * L'etape 1 est sur le fond sans suffixe
212 * Les autres etapes x sont sur le fond _x
213 *
214 * @param array $flux
215 * @return array
216 */
217function cvtm_styliser($flux){
218        if (strncmp($flux['args']['fond'],'formulaires/',12)==0
219          AND isset($flux['args']['contexte']['_etapes'])
220          AND isset($flux['args']['contexte']['_etape'])
221          AND ($e=$flux['args']['contexte']['_etape'])>1
222                AND $ext = $flux['args']['ext']
223                AND $f=$flux['data']
224    ){
225        preg_match("#formulaires\/.*#",$f,$matches);
226        $f = chemin($matches[0]."_".$e.".".$ext);
227        $flux['data'] = substr($f,0,strlen($f)-strlen($ext)-1);
228    }
229
230        return $flux;
231}
232
233/*
234        $squelette = pipeline('styliser', array(
235                'args' => array(
236                        'id_rubrique' => $id_rubrique,
237                        'ext' => $ext,
238                        'fond' => $fond,
239                        'lang' => $lang,
240                        'contexte' => $contexte, // le style d'un objet peut dependre de lui meme
241                        'connect' => $connect
242                ),
243                'data' => $squelette,
244        ));
245*/
246?>
Note: See TracBrowser for help on using the repository browser.