V2 Migration Forum
Sommaire
Objectif
- Basculer le forum vers phpbb 3.2
- Ancien forum (à peu près) : https://github.com/Conardo/wefrag
Architecture applicative
- phpbb 3.2
- Plug-in de modération des topics créés par l'utilisateur : https://github.com/DakinQuelia/phpBB31-Moderate-Own-Topics
- Plug-in de tribune : https://www.phpbb.com/customise/db/extension/ajax_shoutbox/
- Plug-in spoiler : https://www.phpbb-fr.com/customise/db/bbcode/bbcode_spoiler/
Procédure
Analyse
- Récupérer le dump du forum.
- Installer un xampp ou équivalent
- Installer phpbb sur son poste
- Utiliser DBeaver ou tout autre autre outil équivalent pour comparer les tables phpbb avec celles du forum (travail manuel)
Transposition
- Proposition de traitement :
- Migration manuelle des catégories et forums
- Migration de tous les utilisateurs avec pour groupe registered ou admin.
- On génère les mots de passe qu'on stocke avec login et email et ancien user wefrag, on traitera le fichier en batch pour envoyer les mots de passe à chacun par mail.
- On crée une table de correspondance entre iduser wefrag et iduser phpbb et mot de passe provisoire.
- On modifie les tables des topics et posts pour mettre les bons numéros de catégorie / forums manuellement.
- On traite les topics.
- Pour chaque message de chaque topic trié par date.
- Récupérer login et mdp provisoire de l'auteur du message
- Login sur phpbb via l'api
- si premier message de topic, message de type post
- sinon, message de type reply
- Remarque : les liens vers topics et posts contenus dans les message ne peuvent pas être mis à jour car on ne connait pas à l'avance le numéro du message…
- on stocke dans un fichier le numéro du topic renvoyé par la méthode de création avec l'id de l'ancien topic pour l'utiliser sur la table de tracking de lecture (table de correspondance).
- message suivant
- Pour chaque message de chaque topic trié par date.
- On traite la table de tracking en utilisant la table de correspondance.
- Envoi par mail des mots de passe par un batch (ou outil genre mailchimp ?) en invitant l'utilisateur à le changer au premier login.
Liste des tables
Table phpbb_users
Voir pour utiliser l'API phpbb add_users
Test effectué sous github.
- user_id (int(10) unsigned) => wefrag_users.id(int(11))
- user_type(tinyint(2)) => 0
- 0 pour tous les inscrits admins compris
- 1 quand pas encore activé
- 2 pour ignorer l'utilisateur (?) ex. bot
- 3 pour les "Founders" : sorte de super-admin en god mode
- Voir https://wiki.phpbb.com/Table.phpbb_users
- group_id(mediumint(8) unsigned) => phpbb_groups.group_id
- user_permission(mediumtext) => vide
- user_perm_from(mediumint(8) unsigned) => 0
- user_ip(varchar(40)) => vide
- user_regdate(int(11) unsigned) => vide
- username(varchar(255)) => wefrag_users.login(varchar(255))
- username_clean(varchar(255)) => wefrag_users.login(varchar(255))
- user_password(varchar(255)) => wefrag_users.crypted_password(varchar(40))
- Phpbb :techno proprio?
- Wefrag : sha1 ? voir ligne 220
- user_passch (int(11) unsigned) => wefrag_user_password_resets.?
- pas forcément nécessaire
- user_email(varchar(100)) => wefrag_users.email(varchar(255))
- vérifier longueur max en table
- user_email_hash(bigint(20)) =>
- d'après ce lien : crc32(strtolower($user_email)) . strlen($user_email),
- à tester
- user_birthday(varchar(10)) => wefrag_users.birthdate(date)
- user_lastvisit(int(11) unsigned) => 0
- user_lastmark(int(11) unsigned) => 0
- user_lastpost_time(int(11) unsigned) =>
Récupérer la date du dernier post.
- user_lastpage(varchar(200)) => vide
- user_last_confirm_key(varchar(10)) => vide
- user_last_search(int(11) unsigned) => 0
- user_warnings(tinyint(4)) => 0
- user_last_warning(int(11) unsigned) => 0
- user_login_attempts(tinyint(4)) => 0
- user_inactive_reason(tinyint(2)) => 0
- user_inactive_time(int(11) unsigned) => 0
- user_posts(mediumint(8) unsigned) =>
Alimenter le nombre de posts
- user_lang(varchar(30)) => fr
- user_timezone(varchar(100)) => vide
- user_dateformat(varchar(64)) => D j M Y H:i
- user_style(mediumint(8) unsigned) => 0
- user_rank(mediumint(8) unsigned) => 0
- user_colour(varchar(6)) => vide
- user_new_privmsg(int(4)) => 0
- user_unread_privmsg(int(4)) => 0
- user_last_privmsg(int(11) unsigned) => 0
- user_message_rules(tinyint(1) unsigned)=> 0
- user_full_folder(int(11))=> -3
- user_emailtime(int(11) unsigned)=> 0
- user_topic_show_days(smallint(4) unsigned) => 0
- user_topic_sortby_type(varchar(1)) => t
- user_topic_sortby_dir (varchar(1)) => d
- user_post_show_days (smallint(4) unsigned) => 0
- user_post_sortby_type(varchar(1)) => t
- user_post_sortby_dir (varchar(1)) => a
- user_notify (tinyint(1) unsigned) => 0
- user_notify_pm (tinyint(1) unsigned) => 1
- user_notify_type (tinyint(4))=> 0
- user_allow_pm(tinyint(1) unsigned) => 1
- user_allow_viewonline(tinyint(1) unsigned) => 1
- user_allow_viewemail(tinyint(1) unsigned) => 1
- user_allow_massemail(tinyint(1) unsigned) => 1
- user_options( int(11) UNSIGNED) => 230271
- user_avatar (varchar(255)) => vide
- user_avatar_type (varchar(255)) => vide
- user_avatar_width (smallint(4) unsigned) => 0
- user_avatar_height (smallint(4) unsigned) => 0
- user_sig (mediumtext) => vide
- user_sig_bbcode_uid (varchar(8)) => vide
- user_sig_bbcode_bitfield (varchar(255)) => vide
- user_jabber (varchar(255)) => vide
- user_actkey (varchar(32)) => vide
- user_newpasswd (varchar(255)) => vide
- user_form_salt (varchar(32)) => ????
- user_new (tinyint(1)) => 1
- user_reminded (tinyint(4)) => 0
- user_reminded_time (int(11) UNSIGNED) => 0
phpbb_forums
Cette entité contient les catégories (wefrag_categories)et les forums (wefrag_forums). Il faut donc prévoir un premier passage pour les catégories et un second pour les forums, et une renumérotation des catégories avec création d'une table de correspondance.
Autre solution : saisie manuelle des catégories, mise à jour de la table wefrag_forums avec les bonnes catégories.
3ème solution : saisie manuelle des catégories et des forums, mise à jour de la table wefrag_posts avec les bonnes catégories et forums.
Catégories
- forum_id (mediumint(8) unsigned) => wefrag_categories.id (table de correspondance)
- parent_id (mediumint(8) unsigned) => 0
- left_id (mediumint(8) unsigned) => ????
- right_id (mediumint(8) unsigned) => ????
- forum_parents (mediumtext) => vide
- forum_name (varchar(255)) => wefrag_categories.title (varchar(255))
- forum_desc (text) => vide
- forum_desc_bitfield (varchar(255)) => vide
- forum_desc_options (int(11) unsigned) => 7
- forum_desc_uid (varchar(8)) => vide
- forum_link (varchar(255)) => vide
- forum_password (varchar(255)) => vide
- forum_style (mediumint(8) unsigned) => 0
- forum_image (varchar(255)) => vide
- forum_rules (text) => vide
- forum_rules_link (varchar(255)) => vide
- forum_rules_bitfield (varchar(255)) => vide
- forum_rules_options (int(11) unsigned) => 7
- forum_rules_uid (varchar(8)) => vide
- forum_topics_per_page (tinyint(4)) => 0
- forum_type (tinyint(4)) => 0
- forum_status (tinyint(4)) => 0
- forum_last_post_id (int(10) unsigned) => à mettre à jour avec l'identifiant du dernier post de la catégorie
- forum_last_poster_id (int(10) unsigned) => à mettre à jour avec l'identifiant du poster du dernier post de la catégorie
- forum_last_post_subject (varchar(255)) => à mettre à jour avec le sujet du dernier post de la catégorie
- forum_last_post_time (int(11) unsigned ) => à mettre à jour avec le datetime du dernier post de la catégorie
- forum_last_poster_name(varchar(255)) => à mettre à jour avec le login du poster du dernier post de la catégorie
- forum_last_poster_colour(varchar(6)) => à mettre à jour avec la couleur du poster du dernier post de la catégorie
- forum_flags (tinyint(4)) => 32
- display_on_index (tinyint(1) unsigned) => 1
- enable_indexing (tinyint(1) unsigned ) => 1
- enable_icons(tinyint(1) unsigned ) => 1
- enable_prune(tinyint(1) unsigned ) => 0
- prune_next (int(11) unsigned)=> 0
- prune_days (mediumint(8) unsigned)=> 0
- prune_viewed(mediumint(8) unsigned)=> 0
- prune_freq(mediumint(8) unsigned)=> 0
- display_subforum_list (tinyint(1) unsigned)=> 1
- forum_options(int(20) unsigned)=> 0
- forum_posts_approved (mediumint(8) unsigned)=> 0
- forum_posts_unapproved (mediumint(8) unsigned)=> 0
- forum_posts_softdeleted (mediumint(8) unsigned)=> 0
- forum_topics_approved (mediumint(8) unsigned)=> 0
- forum_topics_unapproved (mediumint(8) unsigned)=> 0
- forum_topics_softdeleted (mediumint(8) unsigned)=> 0
- enable_shadow_prune (tinyint(1) unsigned) => 0
- prune_shadow_days (mediumint(8) unsigned)=> 7
- prune_shadow_freq (mediumint(8) unsigned)=> 1
- prune_shadow_next int(11) => 0
Forums
- forum_id (mediumint(8) unsigned) => wefrag_forums.id (int(11))
- parent_id (mediumint(8) unsigned) => wefrag_forums.category_id (table de correspondance)
- left_id (mediumint(8) unsigned) => ????
- right_id (mediumint(8) unsigned) => ????
- forum_parents (mediumtext) => vide
- forum_name (varchar(255)) => wefrag_forums.title (varchar(255))
- forum_desc (text) => wefrag_forums.description (text)
- forum_desc_bitfield (varchar(255)) => vide
- forum_desc_options (int(11) unsigned) => 7
- forum_desc_uid (varchar(8)) => vide
- forum_link (varchar(255)) => vide
- forum_password (varchar(255)) => vide
- forum_style (mediumint(8) unsigned) => 0
- forum_image (varchar(255)) => vide
- forum_rules (text) => vide
- forum_rules_link (varchar(255)) => vide
- forum_rules_bitfield (varchar(255)) => vide
- forum_rules_options (int(11) unsigned) => 7
- forum_rules_uid (varchar(8)) => vide
- forum_topics_per_page (tinyint(4)) => 0
- forum_type (tinyint(4)) => 1
- forum_status (tinyint(4)) => 0
- forum_last_post_id (int(10) unsigned) => à mettre à jour avec l'identifiant du dernier post du forum
- forum_last_poster_id (int(10) unsigned) => à mettre à jour avec l'identifiant du poster du dernier post du forum
- forum_last_post_subject (varchar(255)) => à mettre à jour avec le sujet du dernier post du forum
- forum_last_post_time (int(11) unsigned ) => à mettre à jour avec le datetime du dernier post du forum
- forum_last_poster_name(varchar(255)) => à mettre à jour avec le login du poster du dernier post du forum
- forum_last_poster_colour(varchar(6)) => à mettre à jour avec la couleur du poster du dernier post du forum
- forum_flags (tinyint(4)) => 48
- display_on_index (tinyint(1) unsigned) => 1
- enable_indexing (tinyint(1) unsigned ) => 1
- enable_icons(tinyint(1) unsigned ) => 1
- enable_prune(tinyint(1) unsigned ) => 0
- prune_next (int(11) unsigned)=> 0
- prune_days (mediumint(8) unsigned)=> 0
- prune_viewed(mediumint(8) unsigned)=> 0
- prune_freq(mediumint(8) unsigned)=> 0
- display_subforum_list (tinyint(1) unsigned)=> 1
- forum_options(int(20) unsigned)=> 0
- forum_posts_approved (mediumint(8) unsigned)=> 1
- forum_posts_unapproved (mediumint(8) unsigned)=> 0
- forum_posts_softdeleted (mediumint(8) unsigned)=> 0
- forum_topics_approved (mediumint(8) unsigned)=> 1
- forum_topics_unapproved (mediumint(8) unsigned)=> 0
- forum_topics_softdeleted (mediumint(8) unsigned)=> 0
- enable_shadow_prune (tinyint(1) unsigned) => 0
- prune_shadow_days (mediumint(8) unsigned)=> 7
- prune_shadow_freq (mediumint(8) unsigned)=> 1
- prune_shadow_next int(11) => 0
phpbb_topics
Traitement de toutes les lignes de wefrag_posts qui ont une donnée topic_id non significative.
À étudier : utilisation de la fonction php submit_post Test effectué sous github.
- topic_id (int(10) unsigned) => wefrag_posts.id (int(11))
- forum_id (mediumint(8) unsigned) => wefrag_posts.forum_id (int(11))
- icon_id (mediumint(8) unsigned) => 0
- topic_attachment (tinyint(1) unsigned) => 0
- topic_reported (tinyint(1) unsigned) => 0
- topic_title (varchar(255)) => wefrag_posts.title
- topic_poster (int(10) unsigned) => wefrag_posts.user_id (int(11))
- topic_time (int(11) unsigned) => wefrag_posts.created_at(datetime)
- topic_time_limit (int(11) unsigned) => 0
- topic_views (mediumint(8) unsigned) => 0
- topic_status (tinyint(3)) =>
- à étudier en fonction du statut locké ou pas
- topic_type (tinyint(3)) => 0
- topic_first_post_id (int(10) unsigned) =>
- étudier la nécessité d'insérer le premier post pour avoir une valeur ici
- topic_first_poster_name (varchar(255)) =>
- récupérer le login du poster (wefrag_posts.user_id)
- topic_first_poster_colour
- récupérer la couleur du poster (wefrag_posts.user_id)
- topic_last_post_id
- mettre à jour lors du traitement des posts
- topic_last_poster_id
- mettre à jour lors du traitement des posts
- topic_last_poster_name
- mettre à jour lors du traitement des posts
- topic_last_poster_colour
- mettre à jour lors du traitement des posts
- topic_last_post_subject
- mettre à jour lors du traitement des posts
- topic_last_post_time
- mettre à jour lors du traitement des posts
- topic_last_view_time => mettre la même valeur que topic_last_post_time
- topic_moved_id (int(10) unsigned) => 0
- topic_bumped(tinyint(1) unsigned) => 0
- topic_bumper(mediumint(8) unsigned) => 0
- poll_title (varchar(255)) => vide
- poll_start (int(11) unsigned) => 0
- poll_length (int(11) unsigned) => 0
- poll_max_options (tinyint(4)) => 1
- poll_last_vote (int(11) unsigned) => 0
- poll_vote_change (tinyint(1)) => 0
- topic_visibility (tinyint(3)) => 1
- topic_delete_time (int(11) unsigned) => 0
- topic_delete_reason (varchar(255)) => vide
- topic_delete_user (int(10) unsigned) => 0
- topic_posts_approved (mediumint(8) unsigned) => 1
- topic_posts_unapproved (mediumint(8) unsigned) => 0
- topic_posts_softdeleted (mediumint(8) unsigned) => 0
phpbb_posts
Traitement de toutes les lignes de wefrag_posts.
à étudier : utilisation de la fonction php submit_post
- post_id (int(10) unsigned) => wefrag_posts.id (int(11))
- topic_id (int(10) unsigned) => wefrag_posts.topic_id (int(11))
- forum_id (mediumint(8) unsigned) => wefrag_posts.forum_id (int(11))
- poster_id (int(10) unsigned) => wefrag_posts.user_id (int(11))
- icon_id (mediumint(8) unsigned) => 0
- poster_ip (varchar(40)) => wefrag_posts.poster_ip_address(varchar(255))
- post_time (int(11) unsigned) => wefrag_posts.created_at(datetime)
- post_reported (tinyint(1) unsigned) => 0
- enable_bbcode (tinyint(1) unsigned) => 1
- enable_smilies (tinyint(1) unsigned) => 0
- enable_magic_url (tinyint(1) unsigned) => 1
- enable_sig (tinyint(1) unsigned) => 0
- post_username (varchar(255)) => vide
- post_subject (varchar(255)) => wefrag_posts.title (varchar(255))
- post_text (mediumtext) => wefrag_posts.body (text)
- post_checksum (varchar(32)) =>
- md5 du texte du message.
- post_attachment (tinyint(1) unsigned) => 0
- bbcode_bitfield (varchar(255)) => vide
- bbcode_uid (varchar(8)) => vide
- post_postcount (tinyint(1) unsigned) =>
- vérifier si ce compteur varie…
- post_edit_time (int(11) unsigned) => 0
- post_edit_reason (varchar(255)) => vide
- post_edit_user (int(10) unsigned) => 0
- post_edit_count (smallint(4) unsigned ) => 0
- post_edit_locked (tinyint(1) unsigned) => 0
- post_visibility (tinyint(3)) => 1
- post_delete_time (int(11) unsigned) => 0
- post_delete_reason (varchar(255)) => vide
- post_delete_user(int(10) unsigned) => 0
phpbb_groups
Utilisation de la table wefrag_groups. Nécessaire ou pas en fonction du nombre de groupes dans la base wefrag.
- group_id
- group_type
- group_founder_manage
- group_skip_auth
- group_name
- group_desc
- group_desc_bitfield
- group_desc_options
- group_desc_uid
- group_display
- group_avatar
- group_avatar_type
- group_avatar_width
- group_avatar_height
- group_rank
- group_colour
- group_sig_chars
- group_receive_pm
- group_message_limit
- group_legend
- group_max_recipients
phpbb_user_group
Utilisation de la table wefrag_users pour récupérer le groupe
- group_id (mediumint(8) unsigned) => wefrag_users.group_id(int(11))
- valeur à 2 pour le mettre dans le groupe registered.
- user_id (int(10) unsigned) => wefrag_users.id(int(11))
- group_leader (tinyint(1) unsigned) => 0
- user_pending (tinyint(1) unsigned) => 0
phpbb_topics_track
Utilisation de la table wefrag_user_topic_reads
- user_id => wefrag_user_topic_reads.user_id
- topic_id => wefrag_user_topic_reads.topic_id
- forum_id =>
- récupérer l'id du forum du topic
- mark_time => wefrag_user_topic_reads.read_at
phpbb_topics_posted
Table à alimenter lors de la création d'un topic (et d'un post ?) Non nécessaire si utilisation de l'api à priori.
- user_id
- topic_id
- topic_posted => 1 si topic, 0 si post ?