phorum2spip : convertir des forums sous « Phorum » en forums spip

Un petit script rapidement écrit mais fonctionnel permettant de convertir en forums spip des forums existants sous le script Phorum v3 et stockés dans une base MySQL.

L’essentiel des données sont conservées (titre, message, auteur, date, mail de l’auteur, dernière modification, statut (publié ou non),...). Les entrées sont renumérotées [1] mais la structure des forums est respectée (les liens id_parent et id_thread sont calculés en fonction de la renumérotation pour conserver l’arborescence des messages).

En outre, la conversion éventuelle des données de iso-latin en utf-8 est intégrée (un paramètre de la configuration définit le codage de la base de données cible).

La configuration du script se fait directement en éditant une dizaine de variables dans le fichier selon les indications qui y sont données.

On active simplement ce script en l’appelant (une seule fois !!!) depuis un navigateur (ne pas oublier de le retirer après). Si quelqu’un a envie de l’améliorer, il serait notamment utile d’écrire une petite interface web.

Il n’est possible de convertir qu’un seul forum à la fois (il faut relancer le script autant de fois que vous avez de forums à convertir, en ayant bien sûr pris soin de modifier la config avant chaque nouvelle conversion) et vous devez avoir créé préalablement l’article dans le forum duquel vont être injectées les nouvelles entrées.


Remarques importantes

  • Ce script n’est compatible qu’avec spip 1.8 : il faut en effet que le champ id_thread soit présent dans la table spip_forum.
  • Il est bien évident que ce genre de manipulation comporte des risques de pertes de données (et que le présent script ne prévoit aucument tous les cas particuliers qui pourraient se présenter). Vous veillerez donc à effectuer une sauvergarde des DES DEUX bases de données impliquées dans le processus avant de faire quoi que ce soit.

Améliorations possibles

  • Permettre au script de gérer d’autres SGBD que MySQL (Phorum n’étant pas limité à MySQL).
  • Exploiter le module d’authentification de SPIP pour limiter l’accès au script.
  • Ecrire une petite interface web pour rendre l’utilisation plus conviviale.

Notes

[1Ceci est inévitable : outre l’éventuel conflit avec des données déjà présentes dans la base spip, phorum stocke chaque forum dans une table différente (et même dans deux en fait) tandis que spip centralise tous les forums publics dans une seule table.

Discussion

Une discussion

  • Attention, le script fourni plus haut ne fonctionne pas pour PHORUM5.

    J’ai réalisé une version pour PHORUM5 que j’ai testé avec succès sur mon site. Je ne garantis rien et ne me poser pas (trop de) de questions car je suis nul en PHP/MySql

    <?php
    
    /*
     * Phorum2Spip
     * Convertit un forum de "Phorum" sous MySQL en forum SPIP
     * (injecte les données d'un forum sous phorum dans le forum d'un article spip)
     *
     * Fonctionnalités:
     * - tranfert de toutes données (titres, messages, auteurs, date, statut des messages,...)
     * - respect de la structure des forums (mais renumérotation des entrées)
     * - traduction en utf-8 (vers spip) si nécessaire
     *
     * Restrictions:
     * - ne fonctionne que depuis une base de données "phorum" sous MySQL codée en iso-latin
     *
     * Utilisation:
     * Après avoir configuré le script, placez-le en ligne et appelez-le (une seule
     * fois!) avec un navigateur/ Retirez-le immédiatement après.
     *
     * Script diffusé sous licence GNU/GPL
     * Auteur: François Schreuer <francois <at> schreuer.org>
     * http://francois.schreuer.org/
     *
     * Mise à jour pour Phorum5 : Bruno CAILLARD
     *
     */
    
    
    /************************************************************************************
    Configuration
    *************************************************************************************/
    
    // Numéro de l'article dans le forum duquel on va injecter les données
    // Attention: vous devez avoir créé cet article préalablement
    $id_article = 285;
    
    // Nom du forum phorum (le nom de la table contenant les entêtes de ce forum)
    $phorum = "phorum";
    
    // Coordonnées de la base de données spip
    $spip_host = "sql.free.fr";
    $spip_user = "login";
    $spip_pass = "mot de passe";
    $spip_base = "base SQL de spip";
    $spip_table = "spip_forum";	// Ne changer cette valeur que si vous avez modifié le préfixe des tables
    $spip_charset = "utf-8";	// Le type de codage de votre site spip
    				// valeurs possibles: utf8 / iso-latin
    
    // Coordonnées de la base de données phorum
    $phorum_host = "sql.free.fr";
    $phorum_user = "votre login";
    $phorum_pass = "votre mot de passe";
    $phorum_base = "nom de la base SQL de phorum";
    
    
    
    /************************************************************************************
    Fin de la config
    *************************************************************************************/
    
    print("<html>
    <head>
    	<meta http-equiv=\"Content-Type\" content=\"text/html; charset=".$spip_charset."\">
    	<title>Convertisseur phorum2spip</title>
    </head>
    
    <body>");
    
    //
    // Connexion aux deux bases de données
    //
    
    $connexion_phorum = mysql_pconnect($phorum_host, $phorum_user, $phorum_pass);
    $db_phorum = mysql_select_db($phorum_base, $connexion_phorum) or die("erreur SQL: ". mysql_error());
    
    // On récupère le corps de tous les messages et on stocke ça dans un tableau
    // (pour éviter une requête mysql à chaque message)
    
    $phorum_bodies = $phorum."_messages";
    $r_bodies = mysql_query("SELECT message_id,body FROM $phorum_bodies", $connexion_phorum);
    while($a_bodies = mysql_fetch_array($r_bodies))
    {
    	if($spip_charset == "utf-8") $a_bodies['body'] = utf8_encode($a_bodies['body']);
    	// Il est éventuellement possible d'ajouter un traitement typographique du texte ici
    	$bodies[$a_bodies['message_id']] = $a_bodies['body'];
    }
    
    $r_main = mysql_query("SELECT * FROM $phorum_bodies ORDER BY parent_id",$connexion_phorum);
    mysql_close($connexion_phorum);
    
    // Maintenant, on se connecte à SPIP
    $connexion_spip = mysql_pconnect($spip_host, $spip_user, $spip_pass);
    $db_spip = mysql_select_db($spip_base, $connexion_spip) or die("erreur SQL-FEhler: ". mysql_error());
    while($a = mysql_fetch_array($r_main))
    {
    	// On traduit le statut du message (on récupère aussi bien les messages publics que les autres)
    	if($a['status'] == 2) $statut = "publie";
    	else $statut = "off";
    
    	// Quelques petits nettoyages
    	if($spip_charset == "utf-8") $a['subject'] = utf8_encode($a['subject']);
    	$titre = trim(addslashes($a['subject']));
    	if($spip_charset = "utf-8") $a['author'] = utf8_encode($a['author']);
    	$auteur = trim(addslashes($a['author']));
    	// Gestion des citations et suppression des signatures à la barbare
    	// Il faudra remplacer les lignes préfixées par de jolis "<quote>"
    	$corps = trim(addslashes(str_replace("\n> ","\n_ > ",str_replace("[%sig%]","",$bodies[$a['message_id']]))));
    	$date = Date("Y-m-d H:i:s", $a['datestamp']);
    	$courriel = $a['email'];
    	$lastmod = Date("Y-m-d H:i:s", $a['modifystamp']);
    
    	// On traduit id_parent dans la nouvelle numérotation
    	if($a['parent_id'] == 0) $id_parent = 0;
    	else $id_parent = $trad_id[$a['parent_id']]; // Ce tableau contient la correspondance entre les anciens identifiants et les nouveaux
    
    	// Et on injecte le tout dans la base de données de SPIP
    	mysql_query("INSERT
    		INTO $spip_table(id_parent,id_rubrique,id_article,id_breve,date_heure,titre,texte,auteur,email_auteur,statut,maj)
    		VALUES('$id_parent','0','$id_article','0','$date','$titre','$corps','$auteur','$courriel','$statut','$lastmod')",
    		$connexion_spip);
    
    	// On récupère id_forum de l'entrée qu'on vient d'ajouter et on stocke cette valeur dans le tableau de "traduction"
    	$retro = mysql_query("SELECT id_forum FROM $spip_table ORDER BY id_forum DESC LIMIT 1",$connexion_spip);
    	$id_forum_array = mysql_fetch_array($retro);
    	$id_forum = $id_forum_array['id_forum'];
    	$trad_id[$a['message_id']] = $id_forum;
    
    	// On calcule id_thread et on l'ajoute dans la table
    	if($a['message_id'] == $a['thread']) $id_thread = $id_forum;
    	else $id_thread = $trad_id[$a['thread']];
    	mysql_query("UPDATE $spip_table SET id_thread='$id_thread' WHERE id_forum='$id_forum' LIMIT 1", $connexion_spip);
    
    	// On envoie un message de confirmation
    	print("\nLe message \"".$titre."\" a &eacute;t&eacute; transf&eacute;r&eacute;<br />");
    }
    mysql_close($connexion_spip);
    
    // Fini
    print("<p><b>Fini</b></p>
    </body>
    </html>");
    
    ?>

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom