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

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

quand on poste dans un tableau (choix multiples), sur plusieurs pages, il faut merger et non écraser par la saisie de la dernière page.
Attention au sens du merge qui doit bien prendre le post en priorité.

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