MyBB merge (1.6.10) で見つけた不具合についてのメモ+α。いずれもphpBB 3.0からのマージで起きるもの。
BBcodeのlistが閉じられない
BBcodeで黒丸リスト(番号つきでないリスト、つまり[list])を使っている場合に閉じコードが [/list:u] となってしまい、インポートしたMyBBではリストが正常に表示できない。
原因
phpBBがデータベースに記事を保存する際、BBcodeを内部的に[/list:u]と変換しているが、それをインポート時にMyCodeに変換していないため。正しくは[/list]に置き換えるべき。
対策
merge/boards/phpbb3/bbcode_parser.phpを次のように変更。
29c29 < $text = str_replace(array(':'.$uid, '[/*:m]', '[/list:o]'), array('', '', '[/list]'), utf8_unhtmlentities($text)); --- > $text = str_replace(array(':'.$uid, '[/*:m]', '[/list:o]', '[/list:u]'), array('', '', '[/list]', '[/list]'), utf8_unhtmlentities($text));
ベタ書きURLが勝手にHTMLに書き換わる
原因
記事内にBBcodeを使わずにベタで書かれたURLは、phpBBのデータベースでは次のように置き換えて保存されるているが、インポート時にこれをテキストに戻す際の正規表現に不具合があり、正しく戻せていないため。
<!-- m --><a class="postlink" href="http://domain.com/">http://domain.com/</a><!-- m -->
本来は次のようにHTMLを取り除いてインポートすべき。
対策
merge/boards/phpbb3/bbcode_parser.phpを次のように変更。
31,32c31,32 < $text = preg_replace('#<!\-\- (.*?) \-\-><a(.*?)href="(.*?)" \/>(.*?)<\/a><!\-\- \1 \-\->#', '\2', $text); < $text = preg_replace('#<!\-\- (.*?) \-\-><a(.*?)href="(.*?)" \/><!\-\- \1 \-\->#', '\2', $text); --- > $text = preg_replace('#<!-- (.*?) --><a(.*?)href="(.*?)"(.*)>(.*?)<\/a><!-- \1 -->#', '\3', $text); > $text = preg_replace('#<!-- (.*?) --><a(.*?)href="(.*?)"(.*)\/><!-- \1 -->#', '\3', $text);
インライン表示した添付ファイルが置き換わらない
原因
phpBBではBBcodeで添付ファイルを指定する際、添付ファイルIDではなく、記事への添付順に0から割り当てる相対IDを使用する。MyCodeでは記事内IDを持たず添付ファイルIDを使用するため、IDを書き換えないと不整合が起きて表示ができない。
対策
これは面倒くさい…。
MyBBのマージツールに手を加える方法だと改造量が大きくなりそうなので、インポート完了後にスクリプトを動かす方法で対処する。
次のPHPスクリプトを作成し、PHPコマンドに食わせて実行する。(データベースにMySQLを使用している場合。MySQLiやSQLiteなど別のデータベースを使っている場合はデータベース関数部分の書き換えが必要。)
<?php // MySQL credentials $username = "your_username"; $password = "your_password"; $hostname = "localhost"; // MyBB database $mybb_database = "your_database"; $mybb_prefix = "your_prefix_"; $dbh = mysql_connect($hostname, $username, $password) or die("Unable to connect to MySQL"); mysql_set_charset('utf8',$dbh); $selected = mysql_select_db($mybb_database,$dbh) or die("Could not select database"); $query = 'SELECT aid, pid from '.$mybb_prefix.'attachments ORDER BY aid DESC;'; $result = mysql_query($query) or die ("No attachment found"); $attachments = array(); while ($row = mysql_fetch_array($result)) { $pid=$row['pid']; $count = count($attachments[$pid]['search']); $attachments[$pid]['search'][] = '[attachment='.$count.']'; $attachments[$pid]['replace'][] = '[attachment='.$row['aid'].']'; } foreach ($attachments as $pid => $attachment_bbcode) { $query = 'SELECT message from '.$mybb_prefix.'posts where pid='.$pid.';'; $result = mysql_query($query); if (!$result) continue; $row = mysql_fetch_array($result); $message = str_replace($attachment_bbcode['search'], $attachment_bbcode['replace'], $row['message']); $query = 'UPDATE '.$mybb_prefix.'posts SET message="'.$message.'" WHERE pid='.$pid.';'; $result = mysql_query($query); if (!$result) echo "update failed\n"; } ?>
ユーザの表示タイトルを所属グループにしたい
勝手にユーザタイトルが設定されているので、これを所属グループに一括変換したい場合。ユーザの表示グループをプライマリグループに変更し、グループの表示タイトルをグループ名にする。
# mysql -u root -p Enter password: mysql> update mybb_users set displaygroup=usergroup; mysql> update mybb_usergroups set usertitle=title;
管理者CPのツール&メンテナンス>キャッシュマネージャで、ユーザグループとユーザタイトルのキャッシュを再構築しておく。