Newer
Older
<?php
/**
* Fichier gérant l'installation et désinstallation du plugin
*
* @package SPIP\Formidable\Installation
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Installation/maj des tables de formidable...
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @param string $version_cible
* Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
* @return void
*/
function formidable_upgrade($nom_meta_base_version, $version_cible) {
// Création des tables
include_spip('base/create');
include_spip('base/abstract_sql');
$maj = array();
$maj['create'] = array(
array('maj_tables',array(
'spip_formulaires',
'spip_formulaires_reponses',
'spip_formulaires_reponses_champs',
'spip_formulaires_liens')),

cedric@yterium.com
a validé
array('formidable_importer_forms'),
array('formidable_importer_forms_donnees'),
array('formidable_associer_forms'),

cedric@yterium.com
a validé
// Ajout du choix de ce qu'on affiche à la fin des traitements
$maj['0.4.0'] = array(array('maj_tables',array('spip_formulaires')));
// Ajout d'une URL de redirection
$maj['0.5.0'] = array(array('maj_tables',array('spip_formulaires')));
// Modif du type du message de retour pour pouvoir mettre plus de chose
$maj['0.5.1'] = array(array('sql_alter','TABLE spip_formulaires CHANGE message_retour message_retour text NOT NULL default ""'));
// Passer le champ saisies en longtext pour permettre d'y stocker des formulaires longs

brunobergot@gmail.com
a validé
$maj['0.5.2'] = array(array('sql_alter','TABLE spip_formulaires CHANGE saisies saisies longtext NOT NULL default ""'));

rastapopoulos@spip.org
a validé
// Ajouter un champ date de création
$maj['0.5.3'] = array(array('sql_alter','TABLE spip_formulaires ADD date_crea datetime NOT NULL DEFAULT "0000-00-00 00:00:00"'));
// Renommer la date de création (pas d'abbréviations dans les noms)
$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"'));
// statut publie sur les formulaires sans statut
$maj['0.5.6'] = array(
array('sql_updateq', 'spip_formulaires', array('statut'=>'publie'), 'statut='.sql_quote('')),
$maj['0.6.0'] = array(
array('sql_alter','TABLE spip_formulaires_reponses_champs RENAME TO spip_formulaires_reponses_champs_bad'),
array('maj_tables',array('spip_formulaires_reponses_champs')),
array('formidable_transferer_reponses_champs'),
array('sql_drop_table','spip_formulaires_reponses_champs_bad'),
);

cedric@yterium.com
a validé
$maj['0.6.1'] = array(
array('formidable_unifier_reponses_champs'),
);
$maj['0.6.3'] = array(
array('sql_alter','TABLE spip_formulaires_reponses_champs ADD UNIQUE reponse (id_formulaires_reponse,nom)'),
);

cedric@yterium.com
a validé
$maj['0.6.4'] = array(
// champ resume_reponse
array('maj_tables',array('spip_formulaires')),
);

prigent.yohann@gmail.com
a validé
// Pouvoir rendre un champ unique
$maj['0.6.5'] = array(
// champ resume_reponse
array('maj_tables',array('spip_formulaires')),
);

cedric@yterium.com
a validé
$maj['0.6.6'] = array(
array('sql_updateq', 'spip_formulaires_reponses', array('statut' => 'refuse'), 'statut='.sql_quote('poubelle')),

cedric@yterium.com
a validé
);

rastapopoulos@spip.org
a validé
// Ajouter un champ "css" sur les formulaires
$maj['0.7.0'] = array(
array('maj_tables', array('spip_formulaires')),
);
// Migrer afficher_si_remplissage vers la checkboc
$maj['0.8.0'] = array(
array('formidable_migrer_formulaires_afficher_si_remplissage')
);

cedric@yterium.com
a validé
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}

cedric@yterium.com
a validé
function formidable_unifier_reponses_champs() {

cedric@yterium.com
a validé
$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'
);

cedric@yterium.com
a validé
do {

cedric@yterium.com
a validé
#var_dump($row);
// pour chaque reponse on recupere tous les champs
$reponse = sql_allfetsel(
'*',
'spip_formulaires_reponses_champs',
'id_formulaires_reponse='.intval($row['id_formulaires_reponse'])
);
spip_log('id_formulaires_reponse '.$row['id_formulaires_reponse'], 'formidable_unifier_reponses_champs'._LOG_INFO_IMPORTANTE);

cedric@yterium.com
a validé
// on les reinsere un par un dans la nouvelle table propre
$data = array();

cedric@yterium.com
a validé
$data[$champ['nom']][] = $champ;
}
foreach ($data as $nom => $champs) {
if (count($champs)>1) {

cedric@yterium.com
a validé
#var_dump($champs);
$keep = $champs[0]['id_formulaires_reponses_champ'];
$delete = array();
$valeurs = array();

cedric@yterium.com
a validé
$valeurs[] = $champ['valeur'];
if ($champ['id_formulaires_reponses_champ'] !== $keep) {

cedric@yterium.com
a validé
$delete[] = $champ['id_formulaires_reponses_champ'];

cedric@yterium.com
a validé
}
$valeurs = serialize($valeurs);
#var_dump($valeurs);
#var_dump($keep);
#var_dump($delete);
sql_updateq('spip_formulaires_reponses_champs', array('valeur'=>$valeurs), 'id_formulaires_reponses_champ='.intval($keep));
sql_delete('spip_formulaires_reponses_champs', sql_in('id_formulaires_reponses_champ', $delete));

cedric@yterium.com
a validé
//die();
}
}
#var_dump($data);
//die('nothing?');

cedric@yterium.com
a validé
return;

cedric@yterium.com
a validé
}

cedric@yterium.com
a validé
return;
}
} 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'));

cedric@yterium.com
a validé
//die('fini?');
}
function formidable_transferer_reponses_champs() {
$rows = sql_allfetsel('DISTINCT id_formulaires_reponse', 'spip_formulaires_reponses_champs_bad', '', 'id_formulaires_reponse', '', '0,100');
// pour chaque reponse on recupere tous les champs
$reponse = sql_allfetsel('*', 'spip_formulaires_reponses_champs_bad', 'id_formulaires_reponse='.intval($row['id_formulaires_reponse']));
// on les reinsere un par un dans la nouvelle table propre
foreach ($reponse as $champ) {
sql_insertq('spip_formulaires_reponses_champs', $champ);
}
// et on les vire de la mauvaise
sql_delete('spip_formulaires_reponses_champs_bad', 'id_formulaires_reponse='.intval($row['id_formulaires_reponse']));
if (time()>_TIME_OUT) {
return;
return;
}
} while ($rows = sql_allfetsel('DISTINCT id_formulaires_reponse', 'spip_formulaires_reponses_champs_bad', '', 'id_formulaires_reponse', '', '0,100'));
/**
* Cherche tous les formulaires et migre les conditions afficher_si_remplissage
* vers le champ afficher_si + afficher_si_remplissage_uniquement coché
*
* @return void
*/
function formidable_migrer_formulaires_afficher_si_remplissage(){
// selection
include_spip('inc/saisies_migrer_afficher_si_remplissage');

cedric@yterium.com
a validé
if ($res = sql_select(array('id_formulaire','saisies'), 'spip_formulaires')) {
// boucler sur les resultats

cedric@yterium.com
a validé
while ($row = sql_fetch($res)) {
$id_formulaire = $row["id_formulaire"];
if ($saisies = unserialize($row['saisies'])) {
$saisies = saisies_migrer_afficher_si_remplissage($saisies);
$saisies = serialize($saisies);
sql_updateq(
'spip_formulaires',
array('saisies'=>$saisies),
"id_formulaire=".intval($id_formulaire)
);
}
}
}
}
/**
* Désinstallation/suppression des tables de formidable
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @return void
*/
function formidable_vider_tables($nom_meta_base_version) {
include_spip('inc/meta');
include_spip('base/abstract_sql');
// On efface les tables du plugin
sql_drop_table('spip_formulaires');
sql_drop_table('spip_formulaires_reponses');
sql_drop_table('spip_formulaires_reponses_champs');
sql_drop_table('spip_formulaires_liens');
// on efface les champs d'import de f&t si il y a lieu
$trouver_table = charger_fonction('trouver_table', 'base');
if ($trouver_table('spip_forms')) {
sql_alter('TABLE spip_forms DROP id_formulaire');
if ($trouver_table('spip_forms_donnees')) {
sql_alter('TABLE spip_forms_donnees DROP id_formulaires_reponse');
// On efface la version entregistrée
effacer_meta($nom_meta_base_version);
}
/**
* Associer les <formXX> issus de f&t aux articles concernes
*/
function formidable_associer_forms() {
include_spip('inc/rechercher');
include_spip('inc/editer_liens');
$forms = sql_allfetsel('*', 'spip_formulaires', 'identifiant REGEXP '.sql_quote('^form[0-9]+$'));
foreach ($forms as $form) {
if (!sql_countsel('spip_formulaires_liens', 'id_formulaire='.intval($form['id_formulaire']))) {
$articles = array();
$id = $form['identifiant'];
#var_dump($id);
$res = recherche_en_base("/<{$id}[>|]/", 'article');
if (count($res) and isset($res['article'])) {
foreach ($res['article'] as $id_article => $details) {
$articles[] = $id_article;
}
}
#var_dump($form['id_formulaire']);
#var_dump($articles);
objet_associer(array('formulaire' => array($form['id_formulaire'])), array('article' => $articles));

cedric@yterium.com
a validé
/**
* Importer les formulaires de f&t
*/
function formidable_importer_forms() {
$trouver_table = charger_fonction('trouver_table', 'base');
if ($trouver_table('spip_forms')) {
sql_alter('TABLE spip_forms ADD id_formulaire bigint(21) NOT NULL DEFAULT 0');

cedric@yterium.com
a validé
include_spip('echanger/formulaire/forms');

cedric@yterium.com
a validé
$forms = sql_allfetsel('*', 'spip_forms', 'id_formulaire=0 AND type_form='.sql_quote('').' OR type_form='.sql_quote('sondage'), '', 'id_form');
foreach ($forms as $form) {

cedric@yterium.com
a validé
$formulaire = array();
// configurer le formulaire (titre etc)
forms_configure_formulaire($form, $formulaire);

cedric@yterium.com
a validé

cedric@yterium.com
a validé
// identifiant formXX puisqu'on est en installation, pas de risque de conflits
// et facilite la migration de modele
$formulaire['identifiant'] = 'form' . $form['id_form'];

cedric@yterium.com
a validé
// on peut faire ca aussi puisqu'on est a l'installation
$formulaire['id_formulaire'] = $form['id_form'];

cedric@yterium.com
a validé
$fields = sql_allfetsel('*', 'spip_forms_champs', 'id_form='.intval($form['id_form']), '', 'rang');
foreach ($fields as $field) {
$choix = sql_allfetsel('*', 'spip_forms_champs_choix', 'id_form='.intval($form['id_form']).' AND champ='.sql_quote($field['champ']), '', 'rang');
if (count($choix)) {

cedric@yterium.com
a validé
$field['choix'] = $choix;

cedric@yterium.com
a validé
if ($saisie = forms_champ_vers_saisie($field)) {

cedric@yterium.com
a validé
$formulaire['saisies'][] = $saisie;

cedric@yterium.com
a validé
}
// les traitements
forms_configure_traitement_formulaire($form, $formulaire);
// si ce formulaire a des reponses on le met en publie
if (sql_countsel('spip_forms_donnees', 'id_form='.intval($form['id_form']))) {
$formulaire['statut'] = 'publie';

cedric@yterium.com
a validé
$id_formulaire = forms_importe_en_base($formulaire);
spip_log('Import spip_forms #'.$form['id_form']." en spip_formulaires #$id_formulaire", 'maj'._LOG_INFO_IMPORTANTE);

cedric@yterium.com
a validé
sql_update('spip_forms', array('id_formulaire' => $id_formulaire), 'id_form='.intval($form['id_form']));

cedric@yterium.com
a validé

cedric@yterium.com
a validé
return;

cedric@yterium.com
a validé
}
}
include_spip('inc/drapeau_edition');

cedric@yterium.com
a validé
debloquer_tous($GLOBALS['visiteur_session']['id_auteur']);
}
function formidable_importer_forms_donnees() {
$trouver_table = charger_fonction('trouver_table', 'base');
if ($trouver_table('spip_forms')) {
sql_alter('TABLE spip_forms_donnees ADD id_formulaires_reponse bigint(21) NOT NULL DEFAULT 0');
// 2 champs de plus pour ne pas perdre des donnees
sql_alter("TABLE spip_formulaires_reponses ADD url varchar(255) NOT NULL default ''");
sql_alter("TABLE spip_formulaires_reponses ADD confirmation varchar(10) NOT NULL default ''");
// table de correspondance id_form=>id_formulaire
$rows = sql_allfetsel('id_form,id_formulaire', 'spip_forms', 'id_formulaire>0');
$trans = array();
$trans[$row['id_form']] = $row['id_formulaire'];
$rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100');
#var_dump($row);
$reponse = array(
'id_formulaires_reponse' => $row['id_donnee'], // conserver le meme id par facilite (on est sur une creation de base)
'id_formulaire' => $trans[$row['id_form']],
'date' => $row['date'],
'ip' => $row['ip'],
'id_auteur' => $row['id_auteur'],
'cookie' => $row['cookie'],
'statut' => $row['statut'],
'url' => $row['url'],
'confirmation' => $row['confirmation'],
);
#var_dump($reponse);
$id_formulaires_reponse = sql_insertq('spip_formulaires_reponses', $reponse);
#var_dump($id_formulaires_reponse);
$donnees = sql_allfetsel(
"$id_formulaires_reponse as id_formulaires_reponse,champ as nom,valeur",
'spip_forms_donnees_champs',
'id_donnee='.intval($row['id_donnee'])
);

cedric@yterium.com
a validé
$data = array();

cedric@yterium.com
a validé
$data[$donnee['nom']][] = $donnee;
}
$ins = array();
foreach ($data as $nom => $valeurs) {
if (count($valeurs) == 1) {

cedric@yterium.com
a validé
$ins[] = reset($valeurs);

cedric@yterium.com
a validé
$v = array();

cedric@yterium.com
a validé
$v[] = $valeur['valeur'];

cedric@yterium.com
a validé
$valeurs[0]['valeur'] = serialize($v);
$ins[] = $valeurs[0];
}
}
sql_insertq_multi('spip_formulaires_reponses_champs', $ins);
// et on marque la donnee pour ne pas la rejouer
sql_update('spip_forms_donnees', array('id_formulaires_reponse' => $id_formulaires_reponse), 'id_donnee='.intval($row['id_donnee']));
}
} while ($rows = sql_allfetsel('*', 'spip_forms_donnees', sql_in('id_form', array_keys($trans)).' AND id_formulaires_reponse=0', '', 'id_donnee', '0,100'));