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');
include_spip('inc/formidable_migrer_depuis_ft');
$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 checkbox
$maj['0.8.0'] = array(
array('formidable_migrer_formulaires_afficher_si_remplissage')
);
$maj['0.9.0'] = array(
array('formidable_migrer_resume_reponse')
);
$maj['0.10.0'] = array(
array('formidable_migrer_reglage_champ_unique')
);

maieul@maieul.net
a validé
$maj['0.11.0'] = array(
array('formidable_migrer_anonymisation')
);

maieul@maieul.net
a validé
$maj['0.12.0'] = array(
array('formidable_migrer_config')
);

maieul@maieul.net
a validé
$maj['0.15.0'] = array(
array('formidable_effacer_traitement_enregistrer_sans_option')
);
$maj['0.17.1'] = array(
array('sql_alter','TABLE spip_formulaires_reponses CHANGE variable_php variable_php VARCHAR(255) NOT NULL default ""')
);
$maj['0.20.0'] = array(
array('sql_alter','TABLE spip_formulaires_reponses ADD column `date_envoi` datetime NOT NULL default "0000-00-00 00:00:00" AFTER `date`'),
array('sql_update', 'spip_formulaires_reponses', array('date_envoi' => 'date')),
);
$maj['0.23.0'] = array(
array('formidable_saisies_identifier')
);
RastaPopoulos
a validé
// Ajouter un champ "vu" pour les liaisons
$maj['1.0.0'] = array(
array('maj_tables', array('spip_formulaires_liens')),
RastaPopoulos
a validé
array('formidable_verifier_liens_vu'),
RastaPopoulos
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'));

maieul@maieul.net
a validé
* Déplace les réglages sur les tests d'unicité depuis des colonnes vers des sous options du traitement "enregistrer"
*
*
* @return void
*/
function formidable_migrer_reglage_champ_unique() {
include_spip('inc/sql');
$res = sql_select('id_formulaire,unicite,message_erreur_unicite,traitements','spip_formulaires');
while ($row = sql_fetch($res)) {
$traitements = unserialize($row['traitements']);
if ($row['unicite'] != '') {
if (!isset($traitements['enregistrement'])) {
$traitements['enregistrement'] = array();
}
$traitements['enregistrement']['unicite'] = $row['unicite'];
}
if ($row['message_erreur_unicite'] != '') {
if (!isset($traitements['enregistrement'])) {
$traitements['enregistrement'] = array();
}
$traitements['enregistrement']['message_erreur_unicite'] = $row['message_erreur_unicite'];
}
$traitements = serialize($traitements);
sql_updateq('spip_formulaires',array('traitements'=>$traitements),'id_formulaire='.$row['id_formulaire']);
}
sql_alter("TABLE spip_formulaires DROP message_erreur_unicite, DROP unicite");
}
/**
* 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
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)
);

maieul@maieul.net
a validé
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
/**
* Convertit la config d'anonymisation des réponses des formulaires qui l'avaient activés.
* Le but étant de séparer l'anonymisation et l'identification par valeur PHP.
* C'est à dire, pour ces formulaires:
* 1. Change le nom de la variable de config.
* 2. Si jamais la identification était par id_auteur, la transforme en par valeur php.
* 3. Conserve l'anonymat des réponses
* Et aussi
* 1. Avant toute chose, crée une colonne variable_php
* 2. Migre, pour les formulaires concernées, id_auteur vers variable_php
* @return void
**/
function formidable_migrer_anonymisation() {
sql_alter("TABLE spip_formulaires_reponses ADD column `variable_php` bigint(21) NOT NULL default 0 AFTER `cookie`");
sql_alter("TABLE spip_formulaires_reponses ADD INDEX (variable_php)");
$res = sql_select("id_formulaire, traitements", "spip_formulaires");
while ($row = sql_fetch($res)) {
$id_formulaire = $row["id_formulaire"];
$traitements = unserialize($row["traitements"]);
$enregistrement = isset($traitements["enregistrement"]) ? $traitements["enregistrement"] : array();
// A-ton l'option d'anonymisation activée? alors on migre, sinon rien à changer
if (isset($enregistrement['anonymiser']) and $enregistrement["anonymiser"] == "on") {
$enregistrement["variable_php"] = isset($enregistrement["anonymiser_variable"]) ? $enregistrement["anonymiser_variable"] : '';
unset($enregistrement["anonymiser_variable"]);
if (isset($enregistrement["identification"]) and $enregistrement["identification"] == "id_auteur") {
$enregistrement["identification"] = "variable_php";
}
// Mettre à jour le traitement
$traitements["enregistrement"] = $enregistrement;
$traitements = serialize($traitements);
sql_updateq("spip_formulaires", array("traitements" => $traitements), "id_formulaire=$id_formulaire");
// Mettre à jour les réponses
$res_reponse = sql_select("id_auteur,id_formulaires_reponse", "spip_formulaires_reponses", "id_formulaire=$id_formulaire");
while ($raw_reponse = sql_fetch($res_reponse)) {
$id_formulaires_reponse = $raw_reponse["id_formulaires_reponse"];
sql_updateq("spip_formulaires_reponses", array("variable_php"=>$raw_reponse["id_auteur"], "id_auteur" => 0), "id_formulaires_reponse=$id_formulaires_reponse");
}
}
}
}
/**
* Cherche tous les formulaires et migre le champ resume_reponse vers une option du traitement "enregistrer"
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
*
* Supprime ensuite ce champ de la structure de table
* @return void
*/
function formidable_migrer_resume_reponse() {
if ($res = sql_select(array('id_formulaire','traitements','resume_reponse'), 'spip_formulaires')) {
while ($row = sql_fetch($res)) {
$id_formulaire = $row['id_formulaire'];
$traitements = unserialize($row['traitements']);
$resume_reponse = $row['resume_reponse'];
if ($resume_reponse) {
if (isset($traitements['enregistrement'])) {
$traitements['enregistrement']['resume_reponse'] = $resume_reponse;
} else {
$traitements['enregistrement'] = array('resume_reponse' => $resume_reponse);
}
sql_updateq(
'spip_formulaires',
array('traitements'=>serialize($traitements)),
"id_formulaire=$id_formulaire"
);
}
}
}
// suppression du champ
sql_alter("TABLE spip_formulaires DROP COLUMN resume_reponse");
}

maieul@maieul.net
a validé

maieul@maieul.net
a validé
/**
* https://zone.spip.net/trac/spip-zone/changeset/111847/ avait créer des traitements enregistrer sans options
* C'était un bug
* Cela ne devrait pas exister
* En outre, cela créait des enregistrements indus
* On annule ces traitements enregistrer vide

maieul@maieul.net
a validé
function formidable_effacer_traitement_enregistrer_sans_option() {
include_spip('inc/sql');
$res = sql_select('id_formulaire,traitements','spip_formulaires');
while ($row = sql_fetch($res)) {
$traitements = unserialize($row['traitements']);
if ($traitements['enregistrement'] === array()) {
unset($traitements['enregistrement']);
}
$traitements = serialize($traitements);
sql_updateq('spip_formulaires',array('traitements'=>$traitements),'id_formulaire='.$row['id_formulaire']);
}
}

maieul@maieul.net
a validé
/**
* Migre la config depuis formidable/analyse vers formidable

maieul@maieul.net
a validé
function formidable_migrer_config() {
include_spip('inc/config');
$config = lire_config("formidable/analyse");
effacer_config("formidable/analyse");
ecrire_config("formidable", $config);
}
RastaPopoulos
a validé
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
/**
* Tester les liens existants et pour chacun voir si on doit mettre vu=oui
*/
function formidable_verifier_liens_vu() {
include_spip('action/editer_liens');
include_spip('formidable_pipelines');
// Chercher tous les liens de form pas marqué comme vu
if ($liens = objet_trouver_liens(array('formulaire' => '*'), array('*' => '*'), array('vu="non"'))) {
foreach ($liens as $lien) {
$table = table_objet_sql($lien['objet']);
$cle = id_table_objet($lien['objet']);
$contenu = sql_fetsel('*', $table, "$cle=".intval($lien['id_objet']));
$contenu = implode(' ', $contenu);
// On cherche les modèles insérés dans les textes du contenu
$formulaires = formidable_trouve_liens($contenu);
// Est-ce qu'on trouve le form de ce lien dans les modèles trouvés
if (isset($formulaires[$lien['id_formulaire']])) {
// On lui ajoute vu=oui
objet_qualifier_liens(array('formulaire' => $lien['id_formulaire']), array($lien['objet'] => $lien['id_objet']), array('vu' => 'oui'));
}
}
}
}
/**
* 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('inc/config');
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');

maieul@maieul.net
a validé
// Effacer les PJ
include_spip('inc/formidable_fichiers');
supprimer_repertoire(_DIR_FICHIERS_FORMIDABLE);
effacer_config("formidable");
effacer_meta($nom_meta_base_version);
}
/**
* Identifier toutes les saisies en base
**/
function formidable_saisies_identifier() {
include_spip('inc/saisies');
$res = sql_select('id_formulaire, saisies', 'spip_formulaires');
while ($row = sql_fetch($res)) {
$saisies = unserialize($row['saisies']);
$saisies = saisies_identifier($saisies);
$saisies = serialize($saisies);
sql_updateq('spip_formulaires', array('saisies' => $saisies), 'id_formulaire='.$row['id_formulaire']);
}
}