4 * Fichier gérant l'installation et désinstallation du plugin
6 * @package SPIP\Formidable\Installation
10 if (!defined('_ECRIRE_INC_VERSION')) {
15 * Installation/maj des tables de formidable...
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)
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');
29 $maj['create'] = array(
30 array('maj_tables',array(
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'),
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('')),
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'),
62 $maj['0.6.1'] = array(
63 array('formidable_unifier_reponses_champs'),
65 $maj['0.6.3'] = array(
66 array('sql_alter','TABLE spip_formulaires_reponses_champs ADD UNIQUE reponse (id_formulaires_reponse,nom)'),
68 $maj['0.6.4'] = array(
69 // champ resume_reponse
70 array('maj_tables',array('spip_formulaires')),
72 // Pouvoir rendre un champ unique
73 $maj['0.6.5'] = array(
74 // champ resume_reponse
75 array('maj_tables',array('spip_formulaires')),
77 $maj['0.6.6'] = array(
78 array('sql_updateq', 'spip_formulaires_reponses', array('statut' => 'refuse'), 'statut='.sql_quote('poubelle')),
80 // Ajouter un champ "css" sur les formulaires
81 $maj['0.7.0'] = array(
82 array('maj_tables', array('spip_formulaires')),
85 include_spip('base/upgrade');
86 maj_plugin($nom_meta_base_version, $version_cible, $maj);
90 function formidable_unifier_reponses_champs() {
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',
102 foreach ($rows as $row) {
104 // pour chaque reponse on recupere tous les champs
105 $reponse = sql_allfetsel(
107 'spip_formulaires_reponses_champs',
108 'id_formulaires_reponse='.intval($row['id_formulaires_reponse'])
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
113 foreach ($reponse as $champ) {
114 $data[$champ['nom']][] = $champ;
117 foreach ($data as $nom => $champs) {
118 if (count($champs)>1) {
120 $keep = $champs[0]['id_formulaires_reponses_champ'];
123 foreach ($champs as $champ) {
124 $valeurs[] = $champ['valeur'];
125 if ($champ['id_formulaires_reponses_champ'] !== $keep) {
126 $delete[] = $champ['id_formulaires_reponses_champ'];
129 $valeurs = serialize($valeurs);
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));
141 if (time()>_TIME_OUT
) {
146 if (time()>_TIME_OUT
) {
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'));
154 function formidable_transferer_reponses_champs() {
156 $rows = sql_allfetsel('DISTINCT id_formulaires_reponse', 'spip_formulaires_reponses_champs_bad', '', 'id_formulaires_reponse', '', '0,100');
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);
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
) {
172 if (time()>_TIME_OUT
) {
175 } while ($rows = sql_allfetsel('DISTINCT id_formulaires_reponse', 'spip_formulaires_reponses_champs_bad', '', 'id_formulaires_reponse', '', '0,100'));
180 * Désinstallation/suppression des tables de formidable
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
186 function formidable_vider_tables($nom_meta_base_version) {
188 include_spip('inc/meta');
189 include_spip('base/abstract_sql');
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');
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');
202 if ($trouver_table('spip_forms_donnees')) {
203 sql_alter('TABLE spip_forms_donnees DROP id_formulaires_reponse');
205 // On efface la version entregistrée
206 effacer_meta($nom_meta_base_version);
210 * Associer les <formXX> issus de f&t aux articles concernes
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']))) {
219 $id = $form['identifiant'];
221 $res = recherche_en_base("/<{$id}[>|]/", 'article');
223 if (count($res) and isset($res['article'])) {
224 foreach ($res['article'] as $id_article => $details) {
225 $articles[] = $id_article;
228 #var_dump($form['id_formulaire']);
229 #var_dump($articles);
230 objet_associer(array('formulaire' => array($form['id_formulaire'])), array('article' => $articles));
232 if (time()>_TIME_OUT
) {
239 * Importer les formulaires de f&t
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');
246 include_spip('echanger/formulaire/forms');
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);
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'];
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');
264 $field['choix'] = $choix;
267 if ($saisie = forms_champ_vers_saisie($field)) {
268 $formulaire['saisies'][] = $saisie;
273 forms_configure_traitement_formulaire($form, $formulaire);
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';
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
);
283 sql_update('spip_forms', array('id_formulaire' => $id_formulaire), 'id_form='.intval($form['id_form']));
285 if (time()>_TIME_OUT
) {
290 include_spip('inc/drapeau_edition');
291 debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
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');
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 ''");
303 // table de correspondance id_form=>id_formulaire
304 $rows = sql_allfetsel('id_form,id_formulaire', 'spip_forms', 'id_formulaire>0');
306 foreach ($rows as $row) {
307 $trans[$row['id_form']] = $row['id_formulaire'];
310 $rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100');
312 foreach ($rows as $row) {
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'],
319 'id_auteur' => $row['id_auteur'],
320 'cookie' => $row['cookie'],
321 'statut' => $row['statut'],
322 'url' => $row['url'],
323 'confirmation' => $row['confirmation'],
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'])
336 foreach ($donnees as $donnee) {
337 $data[$donnee['nom']][] = $donnee;
340 foreach ($data as $nom => $valeurs) {
341 if (count($valeurs) == 1) {
342 $ins[] = reset($valeurs);
345 foreach ($valeurs as $valeur) {
346 $v[] = $valeur['valeur'];
348 $valeurs[0]['valeur'] = serialize($v);
349 $ins[] = $valeurs[0];
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']));
356 if (time()>_TIME_OUT
) {
360 if (time()>_TIME_OUT
) {
363 } while ($rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100'));