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

Last change on this file since 108854 was 108854, checked in by maieul@…, 21 months ago

La nouvelle version de saisie ne propose plus l'option
afficher_si_remplissage.
A la place, on a une case à cocher pour dire qu'afficher_si ne
s'applique qu'au remplissage.
On incorpore un outil de migration dans formidable.

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