source: spip-zone/_plugins_/formidable/trunk/formidable_administrations.php @ 84737

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

Les listes de reponses sont par defaut non signifiantes car n'affichant aucune autre information que la date de saisie et l'IP source.
On permet de configurer pour chaque formulaire une chaine qui sera utilisee pour afficher un resume de chaque reponse (les champs @input_1@.. etant remplaces par leur valeur).
Ceci rend les listes de reponse beaucoup plus utilisables.

File size: 12.2 KB
Line 
1<?php
2
3/**
4 * Fichier gérant l'installation et désinstallation du plugin
5 *
6 * @package SPIP\Formidable\Installation
7**/
8
9// Sécurité
10if (!defined("_ECRIRE_INC_VERSION")) return;
11
12/**
13 * Installation/maj des tables de formidable...
14 *
15 * @param string $nom_meta_base_version
16 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
17 * @param string $version_cible
18 *     Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
19 * @return void
20 */
21function formidable_upgrade($nom_meta_base_version, $version_cible){
22        // Création des tables
23        include_spip('base/create');
24        include_spip('base/abstract_sql');
25
26        $maj = array();
27        $maj['create'] = array(
28                array('maj_tables',array(
29                        'spip_formulaires',
30                        'spip_formulaires_reponses',
31                        'spip_formulaires_reponses_champs',
32                        'spip_formulaires_liens')),
33                array('formidable_importer_forms'),
34                array('formidable_importer_forms_donnees'),
35                array('formidable_associer_forms'),
36        );
37
38        // Ajout du choix de ce qu'on affiche à la fin des traitements
39        $maj['0.4.0'] = array(array('maj_tables',array('spip_formulaires')));
40        // Ajout d'une URL de redirection
41        $maj['0.5.0'] = array(array('maj_tables',array('spip_formulaires')));
42        // Modif du type du message de retour pour pouvoir mettre plus de chose
43        $maj['0.5.1'] = array(array('sql_alter','TABLE spip_formulaires CHANGE message_retour message_retour text NOT NULL default ""'));
44        // Passer le champ saisies en longtext pour permettre d'y stocker des formulaires longs
45        $maj['0.5.2'] = array(array('sql_alter','TABLE spip_formulaires CHANGE saisies saisies longtext NOT NULL default ""'));
46        // Ajouter un champ date de création
47        $maj['0.5.3'] = array(array('sql_alter','TABLE spip_formulaires ADD date_crea datetime NOT NULL DEFAULT "0000-00-00 00:00:00"'));
48        // Renommer la date de création (pas d'abbréviations dans les noms)
49        $maj['0.5.5'] = array(array('sql_alter','TABLE spip_formulaires CHANGE date_crea date_creation datetime NOT NULL DEFAULT "0000-00-00 00:00:00"'));
50
51        // statut publie sur les formulaires sans statut
52        $maj['0.5.6'] = array(
53                array('sql_updateq','spip_formulaires',array('statut'=>'publie'),"statut=".sql_quote('')),
54        );
55
56        $maj['0.6.0'] = array(
57                array('sql_alter','TABLE spip_formulaires_reponses_champs RENAME TO spip_formulaires_reponses_champs_bad'),
58                array('maj_tables',array('spip_formulaires_reponses_champs')),
59                array('formidable_transferer_reponses_champs'),
60                array('sql_drop_table','spip_formulaires_reponses_champs_bad'),
61        );
62        $maj['0.6.1'] = array(
63                array('formidable_unifier_reponses_champs'),
64        );
65        $maj['0.6.3'] = array(
66                array('sql_alter','TABLE spip_formulaires_reponses_champs ADD UNIQUE reponse (id_formulaires_reponse,nom)'),
67        );
68        $maj['0.6.4'] = array(
69                // champ resume_reponse
70                array('maj_tables',array('spip_formulaires')),
71        );
72
73        include_spip('base/upgrade');
74        maj_plugin($nom_meta_base_version, $version_cible, $maj);
75}
76
77
78function formidable_unifier_reponses_champs(){
79
80        $rows = sql_allfetsel("DISTINCT id_formulaires_reponses_champ,id_formulaires_reponse,nom,count(id_formulaires_reponse) AS N","spip_formulaires_reponses_champs",'nom LIKE '.sql_quote('multiple%').' OR nom LIKE '.sql_quote('mot%'),'concat( id_formulaires_reponse, nom )','id_formulaires_reponse','0,100','N>1');
81        do {
82
83
84                foreach($rows as $row){
85
86                        #var_dump($row);
87
88                        // pour chaque reponse on recupere tous les champs
89                        $reponse = sql_allfetsel("*","spip_formulaires_reponses_champs","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
90                        spip_log("id_formulaires_reponse ".$row['id_formulaires_reponse'],"formidable_unifier_reponses_champs"._LOG_INFO_IMPORTANTE);
91                        // on les reinsere un par un dans la nouvelle table propre
92                        $data = array();
93                        foreach($reponse as $champ){
94                                $data[$champ['nom']][] = $champ;
95                        }
96
97                        foreach($data as $nom=>$champs){
98                                if (count($champs)>1){
99                                        #var_dump($champs);
100                                        $keep = $champs[0]['id_formulaires_reponses_champ'];
101                                        $delete = array();
102                                        $valeurs = array();
103                                        foreach($champs as $champ){
104                                                $valeurs[] = $champ['valeur'];
105                                                if ($champ['id_formulaires_reponses_champ']!==$keep)
106                                                        $delete[] = $champ['id_formulaires_reponses_champ'];
107                                        }
108                                        $valeurs = serialize($valeurs);
109                                        #var_dump($valeurs);
110                                        #var_dump($keep);
111                                        #var_dump($delete);
112                                        sql_updateq('spip_formulaires_reponses_champs',array('valeur'=>$valeurs),'id_formulaires_reponses_champ='.intval($keep));
113                                        sql_delete('spip_formulaires_reponses_champs',sql_in('id_formulaires_reponses_champ',$delete));
114                                        //die();
115                                }
116                        }
117                        #var_dump($data);
118                        //die('nothing?');
119
120                        if (time()>_TIME_OUT)
121                                return;
122                }
123
124                if (time()>_TIME_OUT)
125                        return;
126
127        }
128        while ($rows = sql_allfetsel("DISTINCT id_formulaires_reponses_champ,id_formulaires_reponse,nom,count( id_formulaires_reponse ) AS N","spip_formulaires_reponses_champs",'nom LIKE '.sql_quote('multiple%').' OR nom LIKE '.sql_quote('mot%'),'concat( id_formulaires_reponse, nom )','id_formulaires_reponse','0,100','N>1'));
129        //die('fini?');
130}
131
132
133function formidable_transferer_reponses_champs(){
134
135        $rows = sql_allfetsel("DISTINCT id_formulaires_reponse","spip_formulaires_reponses_champs_bad",'','id_formulaires_reponse','','0,100');
136        do {
137
138                foreach($rows as $row){
139
140                        // pour chaque reponse on recupere tous les champs
141                        $reponse = sql_allfetsel("*","spip_formulaires_reponses_champs_bad","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
142                        // on les reinsere un par un dans la nouvelle table propre
143                        foreach($reponse as $champ){
144                                sql_insertq("spip_formulaires_reponses_champs",$champ);
145                        }
146                        // et on les vire de la mauvaise
147                        sql_delete("spip_formulaires_reponses_champs_bad","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
148
149                        if (time()>_TIME_OUT)
150                                return;
151                }
152
153                if (time()>_TIME_OUT)
154                        return;
155
156        }
157        while ($rows = sql_allfetsel("DISTINCT id_formulaires_reponse","spip_formulaires_reponses_champs_bad",'','id_formulaires_reponse','','0,100'));
158
159}
160
161
162/**
163 * Désinstallation/suppression des tables de formidable
164 *
165 * @param string $nom_meta_base_version
166 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
167 * @return void
168 */
169function formidable_vider_tables($nom_meta_base_version){
170
171        include_spip('inc/meta');
172        include_spip('base/abstract_sql');
173
174        // On efface les tables du plugin
175        sql_drop_table('spip_formulaires');
176        sql_drop_table('spip_formulaires_reponses');
177        sql_drop_table('spip_formulaires_reponses_champs');
178        sql_drop_table('spip_formulaires_liens');
179
180        // on efface les champs d'import de f&t si il y a lieu
181        $trouver_table = charger_fonction("trouver_table","base");
182        if ($trouver_table('spip_forms')){
183                sql_alter("TABLE spip_forms DROP id_formulaire");
184        }
185        if ($trouver_table('spip_forms_donnees')){
186                sql_alter("TABLE spip_forms_donnees DROP id_formulaires_reponse");
187        }
188
189
190        // On efface la version entregistrée
191        effacer_meta($nom_meta_base_version);
192}
193
194/**
195 * Associer les <formXX> issus de f&t aux articles concernes
196 */
197function formidable_associer_forms(){
198        include_spip("inc/rechercher");
199        include_spip("inc/editer_liens");
200        $forms = sql_allfetsel("*","spip_formulaires","identifiant REGEXP ".sql_quote('^form[0-9]+$'));
201        foreach($forms as $form){
202                if (!sql_countsel("spip_formulaires_liens","id_formulaire=".intval($form['id_formulaire']))){
203                        $articles = array();
204                        $id = $form['identifiant'];
205                        #var_dump($id);
206                        $res = recherche_en_base("/<{$id}[>|]/","article");
207                        #var_dump($res);
208                        if (count($res) AND isset($res['article'])){
209                                foreach($res['article'] as $id_article=>$details){
210                                        $articles[] = $id_article;
211                                }
212                        }
213                        #var_dump($form['id_formulaire']);
214                        #var_dump($articles);
215                        objet_associer(array('formulaire'=>array($form['id_formulaire'])),array('article'=>$articles));
216                }
217                if (time()>_TIME_OUT)
218                        return;
219        }
220}
221
222/**
223 * Importer les formulaires de f&t
224 */
225function formidable_importer_forms(){
226        $trouver_table = charger_fonction("trouver_table","base");
227        if ($trouver_table('spip_forms')){
228                sql_alter("TABLE spip_forms ADD id_formulaire bigint(21) NOT NULL DEFAULT 0");
229
230                include_spip("echanger/formulaire/forms");
231
232                $forms = sql_allfetsel("*","spip_forms",'id_formulaire=0 AND type_form='.sql_quote('')." OR type_form=".sql_quote('sondage'),'','id_form');
233                foreach($forms as $form){
234                        $formulaire = array();
235                        // configurer le formulaire (titre etc)
236                        forms_configure_formulaire($form,$formulaire);
237
238                        // identifiant formXX puisqu'on est en installation, pas de risque de conflits
239                        // et facilite la migration de modele
240                        $formulaire['identifiant'] = "form".$form['id_form'];
241                        // on peut faire ca aussi puisqu'on est a l'installation
242                        $formulaire['id_formulaire'] = $form['id_form'];
243
244                        $fields = sql_allfetsel("*","spip_forms_champs","id_form=".intval($form['id_form']),"","rang");
245                        foreach($fields as $field){
246                                $choix = sql_allfetsel("*","spip_forms_champs_choix","id_form=".intval($form['id_form'])." AND champ=".sql_quote($field['champ']),'','rang');
247                                if (count($choix))
248                                        $field['choix'] = $choix;
249
250                                if ($saisie = forms_champ_vers_saisie($field))
251                                        $formulaire['saisies'][] = $saisie;
252                        }
253
254                        // les traitements
255                        forms_configure_traitement_formulaire($form,$formulaire);
256
257                        // si ce formulaire a des reponses on le met en publie
258                        if (sql_countsel("spip_forms_donnees","id_form=".intval($form['id_form'])))
259                                $formulaire['statut'] = 'publie';
260
261                        $id_formulaire = forms_importe_en_base($formulaire);
262                        spip_log("Import spip_forms #".$form['id_form']." en spip_formulaires #$id_formulaire","maj"._LOG_INFO_IMPORTANTE);
263
264                        sql_update('spip_forms',array('id_formulaire'=>$id_formulaire),'id_form='.intval($form['id_form']));
265
266                        if (time()>_TIME_OUT)
267                                return;
268                }
269
270        }
271
272        include_spip("inc/drapeau_edition");
273        debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
274}
275
276function formidable_importer_forms_donnees(){
277        $trouver_table = charger_fonction("trouver_table","base");
278        if ($trouver_table('spip_forms')){
279                sql_alter("TABLE spip_forms_donnees ADD id_formulaires_reponse bigint(21) NOT NULL DEFAULT 0");
280
281                // 2 champs de plus pour ne pas perdre des donnees
282                sql_alter("TABLE spip_formulaires_reponses ADD url varchar(255) NOT NULL default ''");
283                sql_alter("TABLE spip_formulaires_reponses ADD confirmation varchar(10) NOT NULL default ''");
284
285                // table de correspondance id_form=>id_formulaire
286                $rows = sql_allfetsel("id_form,id_formulaire","spip_forms","id_formulaire>0");
287                $trans = array();
288                foreach($rows as $row)
289                        $trans[$row['id_form']] = $row['id_formulaire'];
290
291                $rows = sql_allfetsel("*","spip_forms_donnees",sql_in('id_form',array_keys($trans))." AND id_formulaires_reponse=0",'','id_donnee','0,100');
292                do {
293
294                        foreach($rows as $row){
295
296                                #var_dump($row);
297                                $reponse = array(
298                                        "id_formulaires_reponse"=>$row['id_donnee'], // conserver le meme id par facilite (on est sur une creation de base)
299                                        "id_formulaire" => $trans[$row['id_form']],
300                                        "date" => $row["date"],
301                                        "ip" => $row["ip"],
302                                        "id_auteur" => $row["id_auteur"],
303                                        "cookie" => $row["cookie"],
304                                        "statut" => $row["statut"],
305                                        "url" => $row["url"],
306                                        "confirmation" => $row["confirmation"],
307                                );
308
309                                #var_dump($reponse);
310                                $id_formulaires_reponse = sql_insertq("spip_formulaires_reponses",$reponse);
311                                #var_dump($id_formulaires_reponse);
312                                if ($id_formulaires_reponse){
313                                        $donnees = sql_allfetsel("$id_formulaires_reponse as id_formulaires_reponse,champ as nom,valeur","spip_forms_donnees_champs","id_donnee=".intval($row['id_donnee']));
314                                        $data = array();
315                                        foreach($donnees AS $donnee){
316                                                $data[$donnee['nom']][] = $donnee;
317                                        }
318                                        $ins = array();
319                                        foreach($data as $nom=>$valeurs){
320                                                if (count($valeurs)==1)
321                                                        $ins[] = reset($valeurs);
322                                                else {
323                                                        $v = array();
324                                                        foreach($valeurs as $valeur)
325                                                                $v[] = $valeur['valeur'];
326                                                        $valeurs[0]['valeur'] = serialize($v);
327                                                        $ins[] = $valeurs[0];
328                                                }
329                                        }
330                                        sql_insertq_multi("spip_formulaires_reponses_champs",$ins);
331                                        // et on marque la donnee pour ne pas la rejouer
332                                        sql_update("spip_forms_donnees",array("id_formulaires_reponse"=>$id_formulaires_reponse),"id_donnee=".intval($row['id_donnee']));
333                                }
334                                if (time()>_TIME_OUT)
335                                        return;
336                        }
337
338                        if (time()>_TIME_OUT)
339                                return;
340
341                } while ($rows = sql_allfetsel("*","spip_forms_donnees",sql_in('id_form',array_keys($trans))." AND id_formulaires_reponse=0",'','id_donnee','0,100'));
342
343        }
344
345}
Note: See TracBrowser for help on using the repository browser.