You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

293 lines
8.0 KiB

<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
// installation : migrer depuis Champs Extras 2
function iextras_upgrade($nom_meta_base_version, $version_cible){
$maj = array();
$maj['create'] = array(
array('iextras_upgrade_to_saisies'),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
// on ne supprime aucun champ lorsqu'on desinstalle le plugin
// trop risqué !
function iextras_vider_tables($nom_meta_base_version) {
effacer_meta($nom_meta_base_version);
}
// ======================================================================
//
// Migration Champs Extras 2 (Spip 2.1) -> Champs Extras 3 (SPIP 3 +)
//
//
/**
* Migration vers le plugin saisie
* On épluche l'ancienne meta stockee
* si elle existe, et si c'est le cas, on tente de migrer
* ses donnees dans la nouvelle structure
*
**/
function iextras_upgrade_to_saisies() {
include_spip('inc/config');
$old_extras = lire_config('iextras', '');
if (!$old_extras) {
// rien a faire
return true;
}
// juste pour pouvoir deserializer...
if (!class_exists('ChampExtra')) {
class ChampExtra{};
}
// logiquement, c'est bon du premier coup...
if (is_array($old_extras)) {
$oextras = $old_extras;
} else {
// autrement c'est encore sérializé ?
if (!$oextras = unserialize($old_extras)) {
// mais parfois, en cas d'import hasardeux...
// tentative avec uniquement des \n
$o = str_replace(array("\r\n","\r"), "\n", $old_extras);
if (!$oextras = unserialize($o)) {
// tentative avec des \r\n
$o = str_replace("\n", "\r\n", $o);
if (!$oextras = unserialize($o)) {
// c'est foutu !
spip_log("Erreur de mise à jour : deserialisation ratée...", "iextras");
echo _L("L'installation n'a pas réussi à restaurer les informations de la version 2.
Il vous faudra réassocier vous-même les champs extras.");
}
}
}
}
if (!$oextras) {
return false;
}
unset ($old_extras, $o);
$extras = array();
// pour chaque extra, on va l'ajouter tranquilou dans la base.
foreach ($oextras as $e) {
// on passe la classe en tableau
$te = array();
foreach ($e as $c=>$v) {
$te[$c] = $v;
}
// on ne garde pas ce qui est à false, à NULL ou ''.
foreach ($te as $c=>$v) {
if (is_array($v)) {
foreach ($v as $n=>$m) {
if (!$m) unset($v[$n]);
}
}
if (!$v) unset($te[$c]);
}
// regroupement par table sql.
$table = isset($te['_table_sql']) ? $te['_table_sql'] : table_objet_sql($te['table']);
if (!isset($extras[$table]) OR !is_array($extras[$table])) {
$extras[$table] = array();
}
$extras[$table][ $te['champ'] ] = $te;
}
unset ($oextras);
$nsaisie = array(
'bloc' => 'textarea',
'ligne' => 'input',
'auteur' => 'auteurs', // ! multiple=''
'auteurs' => 'auteurs', // ! multiple='on'
'oui-non' => 'oui_non',
'menu-radio' => 'radio',
'menu-enum' => 'selection',
'menu-cases' => 'checkbox',
);
include_spip('inc/saisies');
include_spip('inc/config');
// stocker les extras qui n'ont pas été importés totalement
$reste = array();
// pour chaque table sql
foreach ($extras as $table => $champs) {
// on recupere les champs extras declares pour la nouvelle version
$ici = isset($GLOBALS['meta']['champs_extras_' . $table]) ? unserialize($GLOBALS['meta']['champs_extras_' . $table]) : array();
$desc = sql_showtable($table);
#var_dump($table, $ici);
# var_dump($champs);
// pour chaque champs extras decrits
foreach ($champs as $champ=>$extra) {
// si la colonne SQL n'existe pas, on passe
if (!isset($desc['field'][$champ])) {
unset($champs[$champ]);
continue;
}
// si le champs est deja decrit dans la nouvelle structure, on passe
foreach ($ici as $c) {
if ($c['options']['nom'] == $champ) {
unset($champs[$champ]);
continue 2;
}
}
// nous sommes face a un champs extras ancien, non encore
// pris en compte dans la nouvelle version
// selon les anciennes saisies, on redirige sur les nouvelles
if (!isset($nsaisie[$extra['type']])) {
// saisie inconnue
echo "- Type de saisie non trouvé : $extra[type]. Passage en textarea.<br />\n";
$extra['type'] = 'bloc';
}
$nouveau = saisie_identifier(array());
$nouveau['saisie'] = $nsaisie[$extra['type']];
$nouveau['options'] = array('nom' => $champ);
// cas particulier des auteurs
if ($extra['type'] == 'auteurs') {
$nouveau['options']['multiple'] = 'on';
}
foreach (array(
'champ' => 'nom',
'label' => 'label',
'sql' => 'sql',
'explication' => 'explication',
'attention' => 'attention',
'obligatoire' => 'obligatoire',
'traitements' => 'traitements',
'rechercher' => 'rechercher',
'enum' => 'datas', //datas avec un s, car c'est ainsi que fonctionnent les constructeurs, pour ne pas tout casser)
'type' => '',
'table' => '',
'_id' => '',
'_type' => '',
'_objet' => '',
'_table_sql' => '',
'saisie_parametres/class' => 'class',
'saisie_parametres/li_class' => 'conteneur_class',
'saisie_parametres/explication' => 'explication',
'saisie_parametres/attention' => 'attention',
'__PHP_Incomplete_Class_Name' => '', // interne à unserialize PHP s'il ne trouve pas la classe
) as $old => $new) {
// si $new est vide : on utilise pas.
// si le contenu de $old est vide, on ne prend pas.
// si iextras_upgrade_to_saisies_$old() existe,
// on l'utilise pour calculer la nouvelle valeur
if (!function_exists($f = 'iextras_upgrade_to_saisies_' . str_replace('/', '_', $old))) {
$f = 'iextras_upgrade_to_saisies_all';
}
$old = explode('/', $old);
$cle = array_pop($old);
if ($rep = array_pop($old)) {
if (array_key_exists($rep, $extra)) {
if (array_key_exists($cle, $extra[$rep])) {
if ($new and $val = $f($extra[$rep][$cle])) {
$nouveau['options'][$new] = $val;
}
unset($extra[$rep][$cle]);
}
if (!$extra[$rep]) unset($extra[$rep]);
}
} else {
if (isset($extra[$cle])) {
if ($new and $val = $f($extra[$cle])) {
$nouveau['options'][$new] = $val;
}
unset($extra[$cle]);
}
}
}
// cas particuliers des classes
if (isset($nouveau['options']['class']) and $c = $nouveau['options']['class']) {
if (in_array('inserer_barre_edition', explode(' ', $c))) {
$nouveau['options']['inserer_barre'] = 'edition';
$c = trim(str_replace('inserer_barre_edition', '', $c));
}
if (in_array('inserer_barre_forum', explode(' ', $c))) {
$nouveau['options']['inserer_barre'] = 'forum';
$c = trim(str_replace('inserer_barre_forum', '', $c));
$nouveau['options']['class'] = $c;
}
if (in_array('inserer_previsualisation', explode(' ', $c))) {
$nouveau['options']['previsualisation'] = 'on';
$c = trim(str_replace('inserer_previsualisation', '', $c));
}
if ($c) {
$nouveau['options']['class'] = $c;
} else {
unset($nouveau['options']['class']);
}
}
// s'il en reste, c'est que y a des choses dont on ne sait pas
// quoi en faire...
if ($extra) {
echo "------------------------------<br />";
echo "Les attributs suivants ont etes ignores pour le champ
$champ de type $extra[type].<br />";
var_dump($extra);
echo "----- Données conservées : <br />";
var_dump($nouveau);
$reste[] = $extra;
}
// on ajoute le nouvel extra
$ici[] = $nouveau;
}
// on sauve
# var_dump($ici);
ecrire_config('champs_extras_' . $table, serialize($ici));
}
if (!$reste) {
effacer_config('iextras');
}
return true;
}
function iextras_upgrade_to_saisies_all($val) {
return $val;
}
// enum => datas (avec un s, car c'est ainsi que fonctionnent les constructeurs, pour ne pas tout casser)
function iextras_upgrade_to_saisies_enum($val) {
// le vide par defaut...
// ,-vide-\r\n1,Valeur 1....
if (md5($val) == '56517a44e77b255f38728c8625643a15') {
return '';
}
return str_replace(',','|',$val);
}