Üdv,
Hosszas kutakodás eredménye képpen arra jutottam, hogy a korábban beüzemelt, PostNuke 0.708 alapú portál XForum (1.81.1-es verzió) adatainak konverzióját nem lesz könnyű megoldani. Erre utalt a drupal.org alábbi fórumszála is.
Nem lévén más megoldás, egy kis php-szkriptet írtam hozzá, mely -- eddigi tapasztalataim szerint -- szépen áthozott minden adatot. Csak annyit tudok megjegyezni róla, hogy nálam minden adat a helyére került, mindenki használja backup-olás után egészséggel.
Néhány alapfeltétel, ami eszembe jut:
- előszöris én egyszerűen betettem az XForum által használt 3 táblát a drupal adatbázisába
- másodszoris feltétel, hogy csak akkor fogják a fórumtémák megtalálni a helyüket, ha a Kategóriákban (Taxonomy) a drupal fórumtémái betűre ugyanazok, mint a régi, XForum-os témái
- mivel a fórumok a felhasználók neveit is tartalmazzák, előtte a korábbi felhasználói adatokat át kell hozni, és ebbe beletartoznak a felhasználók által megadott valódi nevek is...
<?php require ('config.php'); // egy teljesen primitív adatbáziskapcsolat-készítő 3 sor if(!isset($config)) include("config.php"); dbconnect(); $threads_query = "SELECT * FROM `nuke_XForum_threads`"; $threads_list = mysql_query($threads_query); while($threads = mysql_fetch_array($threads_list)) { $nid_query = "SELECT id FROM sequences WHERE name = 'node_nid'"; $nid_list = mysql_query($nid_query); $_nid = mysql_fetch_array($nid_list); $nid = $_nid['id'] + 1; $update_seq_nid = "UPDATE sequences SET id = '".$nid."' WHERE name = 'node_nid'"; echo $update_seq_nid; // csak hogy lássam is, mi történik $q1 = mysql_query($update_seq_nid) or die("Hiba: q1 - ".mysql_error()); echo "<br>"; $vid_query = "SELECT id FROM sequences WHERE name = 'node_revisions_vid'"; $vid_list = mysql_query($vid_query); $_vid = mysql_fetch_array($vid_list); $vid = $_vid['id'] + 1; $update_seq_vid = "UPDATE sequences SET id = '".$vid."' WHERE name = 'node_revisions_vid'"; echo $update_seq_vid; $q2 = mysql_query($update_seq_vid) or die("Hiba: q2 - ".mysql_error()); echo "<br>"; $user_query = "SELECT uid FROM users WHERE name = '".$threads['author']."'"; // ez feltételezi, hogy korábban a régi nuke rendszer users tábláit is beemeltük $user_list = mysql_query($user_query); $user = mysql_fetch_array($user_list); $changed = explode('|', $threads['lastpost']); $insert_node = "INSERT INTO node SET nid = '".$nid."', vid = '".$vid."', type = 'forum', title = '".$threads['subject']."', ". " uid = '".$user['uid']."', status = '1', ". " created = '".$threads['dateline']."', changed = '".$changed[0]."'" ; echo $insert_node; $q3 = mysql_query($insert_node) or die("Hiba: q3 - ".mysql_error()); echo "<br>"; $insert_node_rev = "INSERT INTO node_revisions SET nid = '".$nid."', vid = '".$vid."', uid = '".$user['uid']."', ". " title = '".$threads['subject']."', body = '".$threads['message']."', teaser = '".$threads['message']."', timestamp = '".$changed[0]."', format = '1'"; echo $insert_node_rev; $q4 = mysql_query($insert_node_rev) or die("Hiba: q4 - ".mysql_error()); echo "<br>"; $posts_query = "SELECT * FROM nuke_XForum_posts WHERE fid = '".$threads['fid']."' AND tid = '".$threads['tid']."' ORDER BY dateline DESC"; echo $posts_query; echo "<br>"; $posts_count = 0; $posts_lists = mysql_query($posts_query); while($posts = mysql_fetch_array($posts_lists)) { $cid_query = "SELECT id FROM sequences WHERE name = 'comments_cid'"; $cid_list = mysql_query($cid_query); $_cid = mysql_fetch_array($cid_list); $cid = $_cid['id'] + 1; $update_seq_cid = "UPDATE sequences SET id = '".$cid."' WHERE name = 'comments_cid'"; echo $update_seq_cid; echo "<br>"; $q5 = mysql_query($update_seq_cid) or die("Hiba: q5 - ".mysql_error()); $user_query = "SELECT uid FROM users WHERE name = '".$posts['author']."'"; $user_list = mysql_query($user_query); $user = mysql_fetch_array($user_list); $subject = explode(' ', $posts['message']); // ez talán nem a legszebb megoldás, de így kerül valami a hozzászóás tárgyába $comment_insert = "INSERT INTO comments SET cid = '".$cid."', pid = '".$posts['pid']."', nid = '".$nid."', uid = '".$user['uid']."', subject = '".$subject[0].' '.$subject[1]."...', ". "comment = '".$posts['message']."', hostname = '".$posts['useip']."', timestamp = '".$posts['dateline']."', format = '1', ". "name = '".$posts['author']."'"; echo $comment_insert; $q6 = mysql_query($comment_insert) or die("Hiba: q6 - ".mysql_error()); echo "<br>"; $posts_count++; } $forum_query = "SELECT td.tid FROM term_data td, nuke_XForum_forums x, nuke_XForum_threads t ". "WHERE td.name = x.name AND t.fid = x.fid AND td.vid >= 3 AND t.fid = '".$threads['fid']."'"; // a td.vid-re vonatkozó szűkítés csak az én rendszeremben igaz így! (Logikus módon a megfelelő vocabulary_id-re kell szűkíteni $forum_list = mysql_query($forum_query); $forum = mysql_fetch_array($forum_list); $insert_forum = "INSERT INTO forum SET nid = '".$nid."', vid = '".$vid."', tid = '".$forum['tid']."'"; echo $insert_forum; $q7 = mysql_query($insert_forum) or die("Hiba: q7 - ".mysql_error()); echo "<br>"; $insert_term_node = "INSERT INTO term_node SET nid = '".$nid."', tid = '".$forum['tid']."'"; echo $insert_term_node; $q8 = mysql_query($insert_term_node) or die("Hiba: q8 - ".mysql_error()); echo "<br>"; $lasttimestamp_query = "SELECT c.uid, c.timestamp, p.value FROM comments c LEFT JOIN (profile_values p) ON (c.uid = p.uid AND p.fid = '1') WHERE c.nid = '".$nid."' ORDER BY timestamp DESC LIMIT 1"; // valószínűleg a LIMIT 1 sem gyönyörű megoldás, de hasznos, hogy az "utolsó hozzászólás" mező kis kitöltésre kerülhessen $lasttimestamp_list = mysql_query($lasttimestamp_query); $lastts = mysql_fetch_array($lasttimestamp_list); if($lastts['value'] == '') { $last_comment_name = 'NULL'; } else { $last_comment_name = $lastts['value']; } $insert_node_comments_count = "INSERT INTO node_comment_statistics SET nid = '".$nid."', ". "last_comment_timestamp = '".$lastts['timestamp']."', last_comment_name = '".$last_comment_name."', last_comment_uid = '".$lastts['uid']."', comment_count = '".$posts_count."'"; echo $insert_node_comments_count; $q9 = mysql_query($insert_node_comments_count) or die("Hiba: q9 - ".mysql_error()); echo "<br>"; $update_node = "UPDATE node SET comment = '".$posts_count."' WHERE nid = '".$nid."'"; echo $update_node; $q10 = mysql_query($update_node) or die("Hiba: q10 - ".mysql_error()); echo "<br><hr>"; } ?>
Mivel a fenti konvertálás lefuttatása sok próbálkozás eredménye, közzéteszem azokat az sql-orokat is, amivel a feleslegesen betöltött sorokat lehetett törölni:
DELETE FROM comments WHERE cid > 1; -- mert ezek lesznek az első kommentek DELETE FROM forum WHERE vid > 117; -- mert 117 sor már korábban volt a _revisions táblában DELETE FROM node WHERE vid > 117; -- mert 117 sor már korábban volt a _revisions táblában DELETE FROM node_revisions WHERE vid > 117; -- mert 117 sor már korábban volt a _revisions táblában DELETE FROM node_comment_statistics WHERE nid > '63'; -- mert 63 node más tartalommal már korábban elkészült UPDATE sequences SET id = '63' WHERE name = 'node_nid'; -- mert 63 node más tartalommal már korábban elkészült UPDATE sequences SET id = '117' WHERE name = 'node_revisions_vid'; UPDATE sequences SET id = '1' WHERE name = 'comments_cid'; DELETE FROM term_node WHERE nid > 63; -- mert 63 node más tartalommal már korábban elkészült
Üdv,
P.