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

Last change on this file since 108949 was 108949, checked in by cedric@…, 20 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
RevLine 
[35067]1<?php
2
[65580]3/**
4 * Fichier gérant l'installation et désinstallation du plugin
5 *
6 * @package SPIP\Formidable\Installation
7**/
8
[35067]9// Sécurité
[98144]10if (!defined('_ECRIRE_INC_VERSION')) {
11        return;
12}
[35067]13
[65580]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 */
[98144]23function formidable_upgrade($nom_meta_base_version, $version_cible) {
[65580]24        // Création des tables
25        include_spip('base/create');
26        include_spip('base/abstract_sql');
[35067]27
[65580]28        $maj = array();
29        $maj['create'] = array(
30                array('maj_tables',array(
31                        'spip_formulaires',
[65581]32                        'spip_formulaires_reponses',
33                        'spip_formulaires_reponses_champs',
[65580]34                        'spip_formulaires_liens')),
[80535]35                array('formidable_importer_forms'),
[80537]36                array('formidable_importer_forms_donnees'),
[80617]37                array('formidable_associer_forms'),
[65580]38        );
[80535]39
[65580]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 ""'));
[78011]46        // Passer le champ saisies en longtext pour permettre d'y stocker des formulaires longs
[78010]47        $maj['0.5.2'] = array(array('sql_alter','TABLE spip_formulaires CHANGE saisies saisies longtext NOT NULL default ""'));
[80347]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"'));
[80541]52        // statut publie sur les formulaires sans statut
53        $maj['0.5.6'] = array(
[98144]54                array('sql_updateq', 'spip_formulaires', array('statut'=>'publie'), 'statut='.sql_quote('')),
[80541]55        );
[80736]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        );
[80770]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        );
[84737]68        $maj['0.6.4'] = array(
69                // champ resume_reponse
70                array('maj_tables',array('spip_formulaires')),
71        );
[92670]72        // Pouvoir rendre un champ unique
73        $maj['0.6.5'] = array(
74                // champ resume_reponse
75                array('maj_tables',array('spip_formulaires')),
76        );
[95583]77        $maj['0.6.6'] = array(
[98144]78                array('sql_updateq', 'spip_formulaires_reponses', array('statut' => 'refuse'), 'statut='.sql_quote('poubelle')),
[95583]79        );
[98972]80        // Ajouter un champ "css" sur les formulaires
81        $maj['0.7.0'] = array(
82                array('maj_tables', array('spip_formulaires')),
83        );
[108854]84        // Migrer afficher_si_remplissage vers la checkboc
85        $maj['0.8.0'] = array(
86                array('formidable_migrer_formulaires_afficher_si_remplissage')
87        );
[95583]88
[65580]89        include_spip('base/upgrade');
90        maj_plugin($nom_meta_base_version, $version_cible, $maj);
[35067]91}
92
[80770]93
[98144]94function formidable_unifier_reponses_champs() {
[80770]95
[98144]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        );
[80770]105        do {
[98144]106                foreach ($rows as $row) {
[80770]107                        #var_dump($row);
108                        // pour chaque reponse on recupere tous les champs
[98144]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);
[80770]115                        // on les reinsere un par un dans la nouvelle table propre
116                        $data = array();
[98144]117                        foreach ($reponse as $champ) {
[80770]118                                $data[$champ['nom']][] = $champ;
119                        }
120
[98144]121                        foreach ($data as $nom => $champs) {
122                                if (count($champs)>1) {
[80770]123                                        #var_dump($champs);
124                                        $keep = $champs[0]['id_formulaires_reponses_champ'];
125                                        $delete = array();
126                                        $valeurs = array();
[98144]127                                        foreach ($champs as $champ) {
[80770]128                                                $valeurs[] = $champ['valeur'];
[98144]129                                                if ($champ['id_formulaires_reponses_champ'] !== $keep) {
[80770]130                                                        $delete[] = $champ['id_formulaires_reponses_champ'];
[98144]131                                                }
[80770]132                                        }
133                                        $valeurs = serialize($valeurs);
134                                        #var_dump($valeurs);
135                                        #var_dump($keep);
136                                        #var_dump($delete);
[98144]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));
[80770]139                                        //die();
140                                }
141                        }
142                        #var_dump($data);
143                        //die('nothing?');
144
[98144]145                        if (time()>_TIME_OUT) {
[80770]146                                return;
[98144]147                        }
[80770]148                }
149
[98144]150                if (time()>_TIME_OUT) {
[80770]151                        return;
[98144]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'));
[80770]154        //die('fini?');
155}
156
157
[98144]158function formidable_transferer_reponses_champs() {
[80736]159
[98144]160        $rows = sql_allfetsel('DISTINCT id_formulaires_reponse', 'spip_formulaires_reponses_champs_bad', '', 'id_formulaires_reponse', '', '0,100');
[80736]161        do {
[98144]162                foreach ($rows as $row) {
[80736]163                        // pour chaque reponse on recupere tous les champs
[98144]164                        $reponse = sql_allfetsel('*', 'spip_formulaires_reponses_champs_bad', 'id_formulaires_reponse='.intval($row['id_formulaires_reponse']));
[80736]165                        // on les reinsere un par un dans la nouvelle table propre
[98144]166                        foreach ($reponse as $champ) {
167                                sql_insertq('spip_formulaires_reponses_champs', $champ);
[80736]168                        }
169                        // et on les vire de la mauvaise
[98144]170                        sql_delete('spip_formulaires_reponses_champs_bad', 'id_formulaires_reponse='.intval($row['id_formulaires_reponse']));
171                        if (time()>_TIME_OUT) {
[80736]172                                return;
[98144]173                        }
[80736]174                }
175
[98144]176                if (time()>_TIME_OUT) {
[80736]177                        return;
[98144]178                }
179        } while ($rows = sql_allfetsel('DISTINCT id_formulaires_reponse', 'spip_formulaires_reponses_champs_bad', '', 'id_formulaires_reponse', '', '0,100'));
[80736]180}
181
[108854]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');
[108949]191        if ($res = sql_select(array('id_formulaire','saisies'), 'spip_formulaires')) {
[108854]192                        // boucler sur les resultats
[108949]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                                }
[108854]204                        }
205        }
206}
[80736]207
[108854]208
209
[65580]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 */
[98144]217function formidable_vider_tables($nom_meta_base_version) {
[35067]218
[65580]219        include_spip('inc/meta');
[35067]220        include_spip('base/abstract_sql');
[65580]221
[35067]222        // On efface les tables du plugin
[35072]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');
[65580]227
[80537]228        // on efface les champs d'import de f&t si il y a lieu
[98144]229        $trouver_table = charger_fonction('trouver_table', 'base');
230        if ($trouver_table('spip_forms')) {
231                sql_alter('TABLE spip_forms DROP id_formulaire');
[80537]232        }
[98144]233        if ($trouver_table('spip_forms_donnees')) {
234                sql_alter('TABLE spip_forms_donnees DROP id_formulaires_reponse');
[80537]235        }
[35067]236        // On efface la version entregistrée
[65580]237        effacer_meta($nom_meta_base_version);
[35067]238}
239
[80535]240/**
[80617]241 * Associer les <formXX> issus de f&t aux articles concernes
242 */
[98144]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']))) {
[80617]249                        $articles = array();
250                        $id = $form['identifiant'];
251                        #var_dump($id);
[98144]252                        $res = recherche_en_base("/<{$id}[>|]/", 'article');
[80617]253                        #var_dump($res);
[98144]254                        if (count($res) and isset($res['article'])) {
255                                foreach ($res['article'] as $id_article => $details) {
[80617]256                                        $articles[] = $id_article;
257                                }
258                        }
259                        #var_dump($form['id_formulaire']);
260                        #var_dump($articles);
[98144]261                        objet_associer(array('formulaire' => array($form['id_formulaire'])), array('article' => $articles));
[80617]262                }
[98144]263                if (time()>_TIME_OUT) {
[80617]264                        return;
[98144]265                }
[80617]266        }
267}
268
269/**
[80535]270 * Importer les formulaires de f&t
271 */
[98144]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');
[80535]276
[98144]277                include_spip('echanger/formulaire/forms');
[80535]278
[98144]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) {
[80535]281                        $formulaire = array();
282                        // configurer le formulaire (titre etc)
[98144]283                        forms_configure_formulaire($form, $formulaire);
[80535]284
[80606]285                        // identifiant formXX puisqu'on est en installation, pas de risque de conflits
286                        // et facilite la migration de modele
[98144]287                        $formulaire['identifiant'] = 'form' . $form['id_form'];
[80618]288                        // on peut faire ca aussi puisqu'on est a l'installation
289                        $formulaire['id_formulaire'] = $form['id_form'];
[80606]290
[98144]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)) {
[80535]295                                        $field['choix'] = $choix;
[98144]296                                }
[80535]297
[98144]298                                if ($saisie = forms_champ_vers_saisie($field)) {
[80535]299                                        $formulaire['saisies'][] = $saisie;
[98144]300                                }
[80535]301                        }
302
303                        // les traitements
[98144]304                        forms_configure_traitement_formulaire($form, $formulaire);
[80541]305
306                        // si ce formulaire a des reponses on le met en publie
[98144]307                        if (sql_countsel('spip_forms_donnees', 'id_form='.intval($form['id_form']))) {
[80541]308                                $formulaire['statut'] = 'publie';
[98144]309                        }
[80541]310
[80535]311                        $id_formulaire = forms_importe_en_base($formulaire);
[98144]312                        spip_log('Import spip_forms #'.$form['id_form']." en spip_formulaires #$id_formulaire", 'maj'._LOG_INFO_IMPORTANTE);
[80535]313
[98144]314                        sql_update('spip_forms', array('id_formulaire' => $id_formulaire), 'id_form='.intval($form['id_form']));
[80535]315
[98144]316                        if (time()>_TIME_OUT) {
[80535]317                                return;
[98144]318                        }
[80535]319                }
320        }
[98144]321        include_spip('inc/drapeau_edition');
[80535]322        debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
323}
[80537]324
[98144]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');
[80537]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
[98144]335                $rows = sql_allfetsel('id_form,id_formulaire', 'spip_forms', 'id_formulaire>0');
[80537]336                $trans = array();
[98144]337                foreach ($rows as $row) {
[80537]338                        $trans[$row['id_form']] = $row['id_formulaire'];
[98144]339                }
[80537]340
[98144]341                $rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100');
[80537]342                do {
[98144]343                        foreach ($rows as $row) {
[80537]344                                #var_dump($row);
345                                $reponse = array(
[98144]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'],
[80537]355                                );
356
357                                #var_dump($reponse);
[98144]358                                $id_formulaires_reponse = sql_insertq('spip_formulaires_reponses', $reponse);
[80537]359                                #var_dump($id_formulaires_reponse);
[98144]360                                if ($id_formulaires_reponse) {
[102493]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                                        );
[80770]366                                        $data = array();
[98144]367                                        foreach ($donnees as $donnee) {
[80770]368                                                $data[$donnee['nom']][] = $donnee;
369                                        }
370                                        $ins = array();
[98144]371                                        foreach ($data as $nom => $valeurs) {
372                                                if (count($valeurs) == 1) {
[80770]373                                                        $ins[] = reset($valeurs);
[98144]374                                                } else {
[80770]375                                                        $v = array();
[98144]376                                                        foreach ($valeurs as $valeur) {
[80770]377                                                                $v[] = $valeur['valeur'];
[98144]378                                                        }
[80770]379                                                        $valeurs[0]['valeur'] = serialize($v);
380                                                        $ins[] = $valeurs[0];
381                                                }
382                                        }
[98144]383                                        sql_insertq_multi('spip_formulaires_reponses_champs', $ins);
[80537]384                                        // et on marque la donnee pour ne pas la rejouer
[98144]385                                        sql_update('spip_forms_donnees', array('id_formulaires_reponse' => $id_formulaires_reponse), 'id_donnee='.intval($row['id_donnee']));
[80537]386                                }
[98144]387                                if (time()>_TIME_OUT) {
[80537]388                                        return;
[98144]389                                }
[80537]390                        }
[98144]391                        if (time()>_TIME_OUT) {
[80537]392                                return;
[98144]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'));
[80537]395        }
396}
Note: See TracBrowser for help on using the repository browser.