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

Last change on this file since 108949 was 108949, checked in by cedric@…, 19 months ago

Fix warning si la saisie du formidable est vide ou invalide + nommage conventionnel res/row du sql_select/sql_fetch

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 ($res = sql_select(array('id_formulaire','saisies'), 'spip_formulaires')) {
192                        // boucler sur les resultats
193                        while ($row = sql_fetch($res)) {
194                                $id_formulaire = $row["id_formulaire"];
195                                if ($saisies = unserialize($row['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=".intval($id_formulaire)
202                                        );
203                                }
204                        }
205        }
206}
207
208
209
210/**
211 * Désinstallation/suppression des tables de formidable
212 *
213 * @param string $nom_meta_base_version
214 *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
215 * @return void
216 */
217function formidable_vider_tables($nom_meta_base_version) {
218
219        include_spip('inc/meta');
220        include_spip('base/abstract_sql');
221
222        // On efface les tables du plugin
223        sql_drop_table('spip_formulaires');
224        sql_drop_table('spip_formulaires_reponses');
225        sql_drop_table('spip_formulaires_reponses_champs');
226        sql_drop_table('spip_formulaires_liens');
227
228        // on efface les champs d'import de f&t si il y a lieu
229        $trouver_table = charger_fonction('trouver_table', 'base');
230        if ($trouver_table('spip_forms')) {
231                sql_alter('TABLE spip_forms DROP id_formulaire');
232        }
233        if ($trouver_table('spip_forms_donnees')) {
234                sql_alter('TABLE spip_forms_donnees DROP id_formulaires_reponse');
235        }
236        // On efface la version entregistrée
237        effacer_meta($nom_meta_base_version);
238}
239
240/**
241 * Associer les <formXX> issus de f&t aux articles concernes
242 */
243function formidable_associer_forms() {
244        include_spip('inc/rechercher');
245        include_spip('inc/editer_liens');
246        $forms = sql_allfetsel('*', 'spip_formulaires', 'identifiant REGEXP '.sql_quote('^form[0-9]+$'));
247        foreach ($forms as $form) {
248                if (!sql_countsel('spip_formulaires_liens', 'id_formulaire='.intval($form['id_formulaire']))) {
249                        $articles = array();
250                        $id = $form['identifiant'];
251                        #var_dump($id);
252                        $res = recherche_en_base("/<{$id}[>|]/", 'article');
253                        #var_dump($res);
254                        if (count($res) and isset($res['article'])) {
255                                foreach ($res['article'] as $id_article => $details) {
256                                        $articles[] = $id_article;
257                                }
258                        }
259                        #var_dump($form['id_formulaire']);
260                        #var_dump($articles);
261                        objet_associer(array('formulaire' => array($form['id_formulaire'])), array('article' => $articles));
262                }
263                if (time()>_TIME_OUT) {
264                        return;
265                }
266        }
267}
268
269/**
270 * Importer les formulaires de f&t
271 */
272function formidable_importer_forms() {
273        $trouver_table = charger_fonction('trouver_table', 'base');
274        if ($trouver_table('spip_forms')) {
275                sql_alter('TABLE spip_forms ADD id_formulaire bigint(21) NOT NULL DEFAULT 0');
276
277                include_spip('echanger/formulaire/forms');
278
279                $forms = sql_allfetsel('*', 'spip_forms', 'id_formulaire=0 AND type_form='.sql_quote('').' OR type_form='.sql_quote('sondage'), '', 'id_form');
280                foreach ($forms as $form) {
281                        $formulaire = array();
282                        // configurer le formulaire (titre etc)
283                        forms_configure_formulaire($form, $formulaire);
284
285                        // identifiant formXX puisqu'on est en installation, pas de risque de conflits
286                        // et facilite la migration de modele
287                        $formulaire['identifiant'] = 'form' . $form['id_form'];
288                        // on peut faire ca aussi puisqu'on est a l'installation
289                        $formulaire['id_formulaire'] = $form['id_form'];
290
291                        $fields = sql_allfetsel('*', 'spip_forms_champs', 'id_form='.intval($form['id_form']), '', 'rang');
292                        foreach ($fields as $field) {
293                                $choix = sql_allfetsel('*', 'spip_forms_champs_choix', 'id_form='.intval($form['id_form']).' AND champ='.sql_quote($field['champ']), '', 'rang');
294                                if (count($choix)) {
295                                        $field['choix'] = $choix;
296                                }
297
298                                if ($saisie = forms_champ_vers_saisie($field)) {
299                                        $formulaire['saisies'][] = $saisie;
300                                }
301                        }
302
303                        // les traitements
304                        forms_configure_traitement_formulaire($form, $formulaire);
305
306                        // si ce formulaire a des reponses on le met en publie
307                        if (sql_countsel('spip_forms_donnees', 'id_form='.intval($form['id_form']))) {
308                                $formulaire['statut'] = 'publie';
309                        }
310
311                        $id_formulaire = forms_importe_en_base($formulaire);
312                        spip_log('Import spip_forms #'.$form['id_form']." en spip_formulaires #$id_formulaire", 'maj'._LOG_INFO_IMPORTANTE);
313
314                        sql_update('spip_forms', array('id_formulaire' => $id_formulaire), 'id_form='.intval($form['id_form']));
315
316                        if (time()>_TIME_OUT) {
317                                return;
318                        }
319                }
320        }
321        include_spip('inc/drapeau_edition');
322        debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
323}
324
325function formidable_importer_forms_donnees() {
326        $trouver_table = charger_fonction('trouver_table', 'base');
327        if ($trouver_table('spip_forms')) {
328                sql_alter('TABLE spip_forms_donnees ADD id_formulaires_reponse bigint(21) NOT NULL DEFAULT 0');
329
330                // 2 champs de plus pour ne pas perdre des donnees
331                sql_alter("TABLE spip_formulaires_reponses ADD url varchar(255) NOT NULL default ''");
332                sql_alter("TABLE spip_formulaires_reponses ADD confirmation varchar(10) NOT NULL default ''");
333
334                // table de correspondance id_form=>id_formulaire
335                $rows = sql_allfetsel('id_form,id_formulaire', 'spip_forms', 'id_formulaire>0');
336                $trans = array();
337                foreach ($rows as $row) {
338                        $trans[$row['id_form']] = $row['id_formulaire'];
339                }
340
341                $rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100');
342                do {
343                        foreach ($rows as $row) {
344                                #var_dump($row);
345                                $reponse = array(
346                                        'id_formulaires_reponse' => $row['id_donnee'], // conserver le meme id par facilite (on est sur une creation de base)
347                                        'id_formulaire' => $trans[$row['id_form']],
348                                        'date' => $row['date'],
349                                        'ip' => $row['ip'],
350                                        'id_auteur' => $row['id_auteur'],
351                                        'cookie' => $row['cookie'],
352                                        'statut' => $row['statut'],
353                                        'url' => $row['url'],
354                                        'confirmation' => $row['confirmation'],
355                                );
356
357                                #var_dump($reponse);
358                                $id_formulaires_reponse = sql_insertq('spip_formulaires_reponses', $reponse);
359                                #var_dump($id_formulaires_reponse);
360                                if ($id_formulaires_reponse) {
361                                        $donnees = sql_allfetsel(
362                                                "$id_formulaires_reponse as id_formulaires_reponse,champ as nom,valeur",
363                                                'spip_forms_donnees_champs',
364                                                'id_donnee='.intval($row['id_donnee'])
365                                        );
366                                        $data = array();
367                                        foreach ($donnees as $donnee) {
368                                                $data[$donnee['nom']][] = $donnee;
369                                        }
370                                        $ins = array();
371                                        foreach ($data as $nom => $valeurs) {
372                                                if (count($valeurs) == 1) {
373                                                        $ins[] = reset($valeurs);
374                                                } else {
375                                                        $v = array();
376                                                        foreach ($valeurs as $valeur) {
377                                                                $v[] = $valeur['valeur'];
378                                                        }
379                                                        $valeurs[0]['valeur'] = serialize($v);
380                                                        $ins[] = $valeurs[0];
381                                                }
382                                        }
383                                        sql_insertq_multi('spip_formulaires_reponses_champs', $ins);
384                                        // et on marque la donnee pour ne pas la rejouer
385                                        sql_update('spip_forms_donnees', array('id_formulaires_reponse' => $id_formulaires_reponse), 'id_donnee='.intval($row['id_donnee']));
386                                }
387                                if (time()>_TIME_OUT) {
388                                        return;
389                                }
390                        }
391                        if (time()>_TIME_OUT) {
392                                return;
393                        }
394                } while ($rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100'));
395        }
396}
Note: See TracBrowser for help on using the repository browser.