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