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のツール&メンテナンス>キャッシュマネージャで、ユーザグループとユーザタイトルのキャッシュを再構築しておく。
