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

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

Corriger une erreur de structure SQL : la clé primaire sur id_formulaires_reponse,nom de la table spip_formulaires_reponses_champs empechait l'enregistrement de plusieurs réponses pour un même champ. Corrolaire : seul le premier choix des choix multiples (cases à cocher) étaient donc enregistrés.

On ajoute une clé primaire simple sur la table, ce qui a l'avantage de faire fonctionner la recherche de manière plus robuste, et on migre en renommant la table, la recreant, et transferant les donnees de l'ancienne vers la nouvelle.
Migration et installation validée en MySQL, à valider en SQLite (mais devrait être OK)

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