Migration de phpBB vers SPIP

All contributions published for previous SPIP versions

Script de migration de forums phpBB vers SPIP selon les conventions du chantier SPIP vs phpBB.

La souplesse de SPIP permet de concevoir des sites dont l’architecture est assez éloignée du magazine en ligne. Notamment, il est possible de construire des sites « portail » regroupant des services comme des galeries photos, des forums, des annuaires de sites, etc

Le travail présenté ici a été réalisé dans le cadre de la migration de Modelisme.com, actuellement constitué de la juxtaposition de plusieurs outils (phpBB, Gallery, phpNuke, ...) vers un site entièrement en SPIP avec l’avantage d’une gestion intégrée des membres et des services. Le point dur est, bien entendu, les forums (tellement dur que finalement nous sommes passés à PunBB mais c’est une autre histoire). Si je connais SPIP depuis plus d’un an, je n’avais jamais examiné de prêt le fonctionnement des forums.

L’excellent travail de Nikau, BoOz, James et Miss Mopi sur spip-contrib m’a permis de découvir les possibilités de SPIP en matière de forums.

Malgré tout, il restait le problème de la migration. Les forums de Modelisme.com comptaient environ 170000 messages et 6000 membres et il faut donc écrire un script qui va convertir la base de données de phpBB en une base de données SPIP (l’existant de la base de données SPIP cible n’est pas effacé, pas de panique ;-)).

Utilisation

Décompressez le fichier joint dans un répertoire de votre arborescence web. Le résultat de la décompression consiste en un seul fichier : phpBB2SPIP.php. Faites pointer votre navigateur sur ce script. La première page demande les identifiant de connexion à la base MySQL (notez que les deux bases doivent être sur la machine où tourne le script, par contre, on peut utiliser des identifiants différents pour la base SPIP et phpBB). Les répertoires sites sont aussi demandés pour le transfert des avatars (à ce sujet un traitement d’image personnel est appliqué).

La seconde page permet de choisir les mots-clés pour les sujets de type « annonces », « épinglés » et fermés, la rubrique où les forums seront implantés (il est nécessaire que ce soit une rubrique racine) et le statut des abonné (visiteur des forums ou rédacteur).

Le traitement des erreurs est très rustique.

La structure cible

Du côté de SPIP, j’ai repris la structure proposée dans spipBB 0.9 CSS. À savoir:
-  Une rubrique SPIP est la racine des forums;
-  Les catégories phpBB sont des sous rubriques de la rubrique racine des forums;
-  Les forums eux-même sont des articles dans les catégories.

correspondance SPIP phpBB

Toutes les tables de la base de données de phpBB ne vont pas forcément avoir un équivalent en SPIP. Le plus important est de récupérer :
-  les catégories;
-  les forums;
-  les membres (et parmi eux les modérateurs);
-  les sujets;
-  les messages.

Par ailleurs, la plus grande partie du bbcode est converti en raccourcis SPIP. Les codes suivants du bbcode ne sont pas convertis :
-  le nom de la personne que l’on site
-  les couleurs
-  les tailles de caractères

Le soulignement bbcode, qui n’existe pas en SPIP est converti en raccourcis typographiques : {_ et _}. L’exploitation de ce raccourcis nécessite l’ajout d’une fonction avant_typo et apres_typo dans ecrire/mes_options.php3.

Code à placer dans avant_typo

$texte = str_replace('{_','__SPIP_souligne_debut__',$texte);
    $texte = str_replace('_}','__SPIP_souligne_fin__',$texte);

Code à placer dans apres_typo

$texte = str_replace('__SPIP_souligne_debut__','<span style="text-decoration: underline">',$texte);
    $texte = str_replace('__SPIP_souligne_fin__','</span>',$texte);

Les catégories

La table des catégories de phpBB est simple et regroupe les informations suivantes:
l’identifiant (cat_id), le titre (cat_title) et le numéro d’ordre (cat_order). le numéro d’ordre n’existe pas en SPIP mais il suffit de préfixer le titre par ce numéro puis, dans les squelettes, de classer par num_titre et d’utiliser le filtre supprimer_numero.

Pour chaque catégorie une sous-rubrique de la rubrique racine est créée. une table est employée pour conserver la correspondance entre cat_id et l’identifiant de la sous-rubrique créée.

Les forums

Ici tout n’est pas exploité. Seuls forum_id, cat_id, forum_order (même rôle que cat_order), forum_name et forum_desc servent

Pour chaque forum, un article est créé dans la rubrique correspondant au cat_id. Comme pour les catégories, le titre est formé en concaténant forum_order et forum_name. Le descriptif reçoit forum_desc. une table de correspondance entre l’identifiant de l’article et forum_id est construite.

Les membres

Je ne vais pas lister tout ce qui est présent dans la table users de phpBB, seules les informations suivantes ont été exploitées :
-  user_regdate n’est utilisé que pour nettoyer au passage les utilisateur inscrits depuis plus de 6 mois mais jamais connectés (J’ai constaté au passage que le formulaire d’inscription à phpBB de Modelisme.com est spammé par des sites pornographiques);
-  user_lastvisit est converti vers le champ en_ligne de SPIP;
-  user_level set à calculer le statut de l’auteur SPIP. Si il est à 0, il s’agira d’un rédacteur ou d’un utilisateur de forum. Sinon, il s’agit d’un modérateur;
-  username, user_email, user_password et user_website on une correspondance directe. A noter que l’encodage du mot de passe est le même;
-  user_occ, user_from, user_interests, user_icq, user_aim, user_yim, user_msnm sont concaténés dans une liste pour former la biographie de l’auteur.

les modérateurs deviennent des administrateurs restreints à la rubrique d’implantation des forums.

ici aussi, une table de correspondance entre les identifiants phpBB et SPIP est construite.

l’avatar est aussi copié dans le logo de l’auteur. Actuellement, un traitement qui consiste à mettre le logo en niveau de gris et le logo pour survol en couleur est appliqué.

Les topics et les posts

phpBB possède une table pour regrouper les messages (posts) par sujet (topic). Du côté de SPIP, on va, comme dans spipBB 0.9 CSS, considérer qu’un message qui répond directement à un article est un sujet et que les messages qui répondent à un message sont des messages dans le sujet.

La traduction est assez directe.

Les sujets «annonces», les sujets «épinglés» et les sujets fermés

Ces trois types de sujets sont pris en compte via des mots-clés. Lors de la configuration de la traduction, les mots-clés pouvant être affectés par les visiteurs sont lus de la base de données SPIP et proposé (il est donc nécessaire de les définir avant la traduction).

En conclusion

Le script a été testé pour traduire les forums phpBB de Modelisme.com.

Note : je ne peux être tenu pour responsable des pertes de données qui pourraient résulter de l’exécution de ce script.

Pensez à augmenter le time-out de PHP selon la taille de la base phpBB. Pour 170000 messages et 5000 auteurs, la traduction prend 6 minutes sur un PowerBook G4 1GHz.

En chantier pour la prochaine version :
-  conversion vers l’UTF-8 pour les sites utilisant cet encodage

updated on 25 October 2006

Discussion

3 discussions

  • 1

    Un petit problème subsiste (en tout cas avec SPIP 1.9) : le fait que id_thread ne soit pas renseigné ...
    Deux solutions possible :
    -  soit modifier le php fourni avec quelque chose du style :

    if (empty($id_parent)) {$id_thread=$insert_id;} else {$id_thread=$id_parent;}
    $query = "UPDATE spip_forum SET (id_thread='$id_thread') WHERE id_forum='$id_parent'" ;
    mysql_query($query,$spip_connect) or die("<p>$query<br />".mysql_error($spip_connect)."</p>");

    A mettre juste après la ligne : $insert_id = mysql_insert_id($spip_connect); dans le fichier phpBB2SPIP.php (avant de l’exécuter évidemment).

    -  soit (si ça n’a pas été fait) de faire un post traitement SQL sur la base (avec phpmyadmin par exemple) avec les deux actions suivantes :

    UPDATE spip_forum SET id_thread=id_parent WHERE id_thread=0 ;
    UPDATE spip_forum SET id_thread=id_forum WHERE id_thread=0 ;
    • Je corrige une erreur dans la proposition de modification du script, il faut lire (erreur dans la clause WHERE) :

      if (empty($id_parent)) {$id_thread=$insert_id;} else {$id_thread=$id_parent;}
      $query = "UPDATE spip_forum SET (id_thread='$id_thread') WHERE id_forum='$insert_id'" ;
      mysql_query($query,$spip_connect) or die("<p>$query<br />".mysql_error($spip_connect)."</p>");

    Reply to this message

  • 2

    Salut,

    Je suis en train d’essayer ton script, mais ça n’a pas l’air de marcher.

    Les deux étapes de config ont l’air de bien se passer, puis je reçois le message suivant et il ne s’est rien passé, semble-t-il, dans ma base.

    Traduction en cours...

    Implantation des forums dans la rubrique 95

    Les annonces recevront le mot clé

    Les post its recevront le mot clé

    Les sujets clos recevront le mot clé

    ok

    [0].

    [0].

    Est-ce que tu as une idée de ce dont il pourrait s’agir ?

    Merci

    François

    PS : Je suis sous une version 1.8.2e de SPIP (quand à phpBB, j’en ignore tout, je n’ai jamais utilisé ce script; j’ai seulement une base de données à récupérer).

    • Bonsoir

      As-tu défini les mots-clé pour les annonces, les post-its et les sujets clos dans ton installation de SPIP avant de lancer la traduction ?

    • Merci de ta réponse. Ca doit être l’explication; mais j’ai renoncé à transférer ce forum en me rendant compte qu’il ne contenait qu’une dizaine de messages :)

      FS

    Reply to this message

  • 1
    CineFlashe

    Bonjour et desolee si je ne suis pas au forum adequat, je ne sais pas encore utiliser cet espace .
    J’ai un forum en phpBB et je souhaite ajouter un portail SPIP.
    Ma question: y a t il des incompatibilite entre phpBB et SPIP ?
    Est ce que je risque des dysfoctionnements au niveau de phpMyadmin?
    D’avance merci ++. Vous pouvez me repondre par mail ?
    cineflashe@yahoo.fr
    CineFlashe.

    • Christophe-31

      Pour que tout le monde est une réponse.
      J’ai fais parfaitement cohabiter des clefs SPIP et PHBB sur la même database. J’ai manipulé le tout avec php my admin sans aucun problème, je ne vois d’ailleur pas quel type de problème il pourrait exister à ce niveau.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom