MyBB merge (1.6.10) 不具合

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を取り除いてインポートすべき。

http://domain.com/

対策

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

タイトルとURLをコピーしました