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

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

Dans r80736 l'erreur c'était moi puisque je n'avais pas vu que traiter() serializait les valeurs multiples en une seule pour le stockage.
On retablit donc l'unicité de (id_formulaires_reponse,nom) en unifiant prealablement les éventuelles valeurs multiples importées de f&t, et en conservant la clé primaire qui n'est par contre pas inutile.

File size: 12.1 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
69        include_spip('base/upgrade');
70        maj_plugin($nom_meta_base_version, $version_cible, $maj);
71}
72
73
74function formidable_unifier_reponses_champs(){
75
76        $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');
77        do {
78
79
80                foreach($rows as $row){
81
82                        #var_dump($row);
83
84                        // pour chaque reponse on recupere tous les champs
85                        $reponse = sql_allfetsel("*","spip_formulaires_reponses_champs","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
86                        spip_log("id_formulaires_reponse ".$row['id_formulaires_reponse'],"formidable_unifier_reponses_champs"._LOG_INFO_IMPORTANTE);
87                        // on les reinsere un par un dans la nouvelle table propre
88                        $data = array();
89                        foreach($reponse as $champ){
90                                $data[$champ['nom']][] = $champ;
91                        }
92
93                        foreach($data as $nom=>$champs){
94                                if (count($champs)>1){
95                                        #var_dump($champs);
96                                        $keep = $champs[0]['id_formulaires_reponses_champ'];
97                                        $delete = array();
98                                        $valeurs = array();
99                                        foreach($champs as $champ){
100                                                $valeurs[] = $champ['valeur'];
101                                                if ($champ['id_formulaires_reponses_champ']!==$keep)
102                                                        $delete[] = $champ['id_formulaires_reponses_champ'];
103                                        }
104                                        $valeurs = serialize($valeurs);
105                                        #var_dump($valeurs);
106                                        #var_dump($keep);
107                                        #var_dump($delete);
108                                        sql_updateq('spip_formulaires_reponses_champs',array('valeur'=>$valeurs),'id_formulaires_reponses_champ='.intval($keep));
109                                        sql_delete('spip_formulaires_reponses_champs',sql_in('id_formulaires_reponses_champ',$delete));
110                                        //die();
111                                }
112                        }
113                        #var_dump($data);
114                        //die('nothing?');
115
116                        if (time()>_TIME_OUT)
117                                return;
118                }
119
120                if (time()>_TIME_OUT)
121                        return;
122
123        }
124        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'));
125        //die('fini?');
126}
127
128
129function formidable_transferer_reponses_champs(){
130
131        $rows = sql_allfetsel("DISTINCT id_formulaires_reponse","spip_formulaires_reponses_champs_bad",'','id_formulaires_reponse','','0,100');
132        do {
133
134                foreach($rows as $row){
135
136                        // pour chaque reponse on recupere tous les champs
137                        $reponse = sql_allfetsel("*","spip_formulaires_reponses_champs_bad","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
138                        // on les reinsere un par un dans la nouvelle table propre
139                        foreach($reponse as $champ){
140                                sql_insertq("spip_formulaires_reponses_champs",$champ);
141                        }
142                        // et on les vire de la mauvaise
143                        sql_delete("spip_formulaires_reponses_champs_bad","id_formulaires_reponse=".intval($row['id_formulaires_reponse']));
144
145                        if (time()>_TIME_OUT)
146                                return;
147                }
148
149                if (time()>_TIME_OUT)
150                        return;
151
152        }
153        while ($rows = sql_allfetsel("DISTINCT id_formulaires_reponse","spip_formulaires_reponses_champs_bad",'','id_formulaires_reponse','','0,100'));
154
155}
156
157
158/**
159 * Désinstallation/suppression des tables de formidable
160 *
161 * @param string $nom_meta_base_version
162 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
163 * @return void
164 */
165function formidable_vider_tables($nom_meta_base_version){
166
167        include_spip('inc/meta');
168        include_spip('base/abstract_sql');
169
170        // On efface les tables du plugin
171        sql_drop_table('spip_formulaires');
172        sql_drop_table('spip_formulaires_reponses');
173        sql_drop_table('spip_formulaires_reponses_champs');
174        sql_drop_table('spip_formulaires_liens');
175
176        // on efface les champs d'import de f&t si il y a lieu
177        $trouver_table = charger_fonction("trouver_table","base");
178        if ($trouver_table('spip_forms')){
179                sql_alter("TABLE spip_forms DROP id_formulaire");
180        }
181        if ($trouver_table('spip_forms_donnees')){
182                sql_alter("TABLE spip_forms_donnees DROP id_formulaires_reponse");
183        }
184
185
186        // On efface la version entregistrée
187        effacer_meta($nom_meta_base_version);
188}
189
190/**
191 * Associer les <formXX> issus de f&t aux articles concernes
192 */
193function formidable_associer_forms(){
194        include_spip("inc/rechercher");
195        include_spip("inc/editer_liens");
196        $forms = sql_allfetsel("*","spip_formulaires","identifiant REGEXP ".sql_quote('^form[0-9]+$'));
197        foreach($forms as $form){
198                if (!sql_countsel("spip_formulaires_liens","id_formulaire=".intval($form['id_formulaire']))){
199                        $articles = array();
200                        $id = $form['identifiant'];
201                        #var_dump($id);
202                        $res = recherche_en_base("/<{$id}[>|]/","article");
203                        #var_dump($res);
204                        if (count($res) AND isset($res['article'])){
205                                foreach($res['article'] as $id_article=>$details){
206                                        $articles[] = $id_article;
207                                }
208                        }
209                        #var_dump($form['id_formulaire']);
210                        #var_dump($articles);
211                        objet_associer(array('formulaire'=>array($form['id_formulaire'])),array('article'=>$articles));
212                }
213                if (time()>_TIME_OUT)
214                        return;
215        }
216}
217
218/**
219 * Importer les formulaires de f&t
220 */
221function formidable_importer_forms(){
222        $trouver_table = charger_fonction("trouver_table","base");
223        if ($trouver_table('spip_forms')){
224                sql_alter("TABLE spip_forms ADD id_formulaire bigint(21) NOT NULL DEFAULT 0");
225
226                include_spip("echanger/formulaire/forms");
227
228                $forms = sql_allfetsel("*","spip_forms",'id_formulaire=0 AND type_form='.sql_quote('')." OR type_form=".sql_quote('sondage'),'','id_form');
229                foreach($forms as $form){
230                        $formulaire = array();
231                        // configurer le formulaire (titre etc)
232                        forms_configure_formulaire($form,$formulaire);
233
234                        // identifiant formXX puisqu'on est en installation, pas de risque de conflits
235                        // et facilite la migration de modele
236                        $formulaire['identifiant'] = "form".$form['id_form'];
237                        // on peut faire ca aussi puisqu'on est a l'installation
238                        $formulaire['id_formulaire'] = $form['id_form'];
239
240                        $fields = sql_allfetsel("*","spip_forms_champs","id_form=".intval($form['id_form']),"","rang");
241                        foreach($fields as $field){
242                                $choix = sql_allfetsel("*","spip_forms_champs_choix","id_form=".intval($form['id_form'])." AND champ=".sql_quote($field['champ']),'','rang');
243                                if (count($choix))
244                                        $field['choix'] = $choix;
245
246                                if ($saisie = forms_champ_vers_saisie($field))
247                                        $formulaire['saisies'][] = $saisie;
248                        }
249
250                        // les traitements
251                        forms_configure_traitement_formulaire($form,$formulaire);
252
253                        // si ce formulaire a des reponses on le met en publie
254                        if (sql_countsel("spip_forms_donnees","id_form=".intval($form['id_form'])))
255                                $formulaire['statut'] = 'publie';
256
257                        $id_formulaire = forms_importe_en_base($formulaire);
258                        spip_log("Import spip_forms #".$form['id_form']." en spip_formulaires #$id_formulaire","maj"._LOG_INFO_IMPORTANTE);
259
260                        sql_update('spip_forms',array('id_formulaire'=>$id_formulaire),'id_form='.intval($form['id_form']));
261
262                        if (time()>_TIME_OUT)
263                                return;
264                }
265
266        }
267
268        include_spip("inc/drapeau_edition");
269        debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
270}
271
272function formidable_importer_forms_donnees(){
273        $trouver_table = charger_fonction("trouver_table","base");
274        if ($trouver_table('spip_forms')){
275                sql_alter("TABLE spip_forms_donnees ADD id_formulaires_reponse bigint(21) NOT NULL DEFAULT 0");
276
277                // 2 champs de plus pour ne pas perdre des donnees
278                sql_alter("TABLE spip_formulaires_reponses ADD url varchar(255) NOT NULL default ''");
279                sql_alter("TABLE spip_formulaires_reponses ADD confirmation varchar(10) NOT NULL default ''");
280
281                // table de correspondance id_form=>id_formulaire
282                $rows = sql_allfetsel("id_form,id_formulaire","spip_forms","id_formulaire>0");
283                $trans = array();
284                foreach($rows as $row)
285                        $trans[$row['id_form']] = $row['id_formulaire'];
286
287                $rows = sql_allfetsel("*","spip_forms_donnees",sql_in('id_form',array_keys($trans))." AND id_formulaires_reponse=0",'','id_donnee','0,100');
288                do {
289
290                        foreach($rows as $row){
291
292                                #var_dump($row);
293                                $reponse = array(
294                                        "id_formulaires_reponse"=>$row['id_donnee'], // conserver le meme id par facilite (on est sur une creation de base)
295                                        "id_formulaire" => $trans[$row['id_form']],
296                                        "date" => $row["date"],
297                                        "ip" => $row["ip"],
298                                        "id_auteur" => $row["id_auteur"],
299                                        "cookie" => $row["cookie"],
300                                        "statut" => $row["statut"],
301                                        "url" => $row["url"],
302                                        "confirmation" => $row["confirmation"],
303                                );
304
305                                #var_dump($reponse);
306                                $id_formulaires_reponse = sql_insertq("spip_formulaires_reponses",$reponse);
307                                #var_dump($id_formulaires_reponse);
308                                if ($id_formulaires_reponse){
309                                        $donnees = sql_allfetsel("$id_formulaires_reponse as id_formulaires_reponse,champ as nom,valeur","spip_forms_donnees_champs","id_donnee=".intval($row['id_donnee']));
310                                        $data = array();
311                                        foreach($donnees AS $donnee){
312                                                $data[$donnee['nom']][] = $donnee;
313                                        }
314                                        $ins = array();
315                                        foreach($data as $nom=>$valeurs){
316                                                if (count($valeurs)==1)
317                                                        $ins[] = reset($valeurs);
318                                                else {
319                                                        $v = array();
320                                                        foreach($valeurs as $valeur)
321                                                                $v[] = $valeur['valeur'];
322                                                        $valeurs[0]['valeur'] = serialize($v);
323                                                        $ins[] = $valeurs[0];
324                                                }
325                                        }
326                                        sql_insertq_multi("spip_formulaires_reponses_champs",$ins);
327                                        // et on marque la donnee pour ne pas la rejouer
328                                        sql_update("spip_forms_donnees",array("id_formulaires_reponse"=>$id_formulaires_reponse),"id_donnee=".intval($row['id_donnee']));
329                                }
330                                if (time()>_TIME_OUT)
331                                        return;
332                        }
333
334                        if (time()>_TIME_OUT)
335                                return;
336
337                } while ($rows = sql_allfetsel("*","spip_forms_donnees",sql_in('id_form',array_keys($trans))." AND id_formulaires_reponse=0",'','id_donnee','0,100'));
338
339        }
340
341}
Note: See TracBrowser for help on using the repository browser.