2015/01/24(土)PukiWiki bodycache patch副作用:id重複
PukiWiki bodycache patch副作用:id重複
たまたま気が付いたのですが、ECO-Wikiのメニューバーと本文それぞれの見出しのidが重複していました。
例えば、ECO-Wiki (acronia) トップページでは、メニューバーの「ECO攻略Wiki」と本文の「ECO-Wiki (acronia):エミル・クロニクル・オンライン攻略情報wiki」に同じid="content_1_0"が振られています。
原因を追ってみたところ、どうやらbodycacheパッチの副作用のようです。
- 発生条件
- PukiWiki bodycacheパッチを適用している。
- MenuBarと本文の両方で見出しを使用している。
- 原因
- bodyキャッシュを読み込んだときは、本文に対するconvert_htmlの実行はスキップされる。その結果、convert_html内の$contents_idがインクリメントされなくなるため、メニューバー生成時のconvert_htmlの実行結果に影響を与えてしまう。
function convert_html($lines) { //省略 static $contents_id = 0; //省略 $body = & new Body(++$contents_id); //この$contents_idのインクリメントが必要 //省略 }
- bodyキャッシュを読み込んだときは、本文に対するconvert_htmlの実行はスキップされる。その結果、convert_html内の$contents_idがインクリメントされなくなるため、メニューバー生成時のconvert_htmlの実行結果に影響を与えてしまう。
- 対策
- 場当たり的な対応ですが、$bodycache_statusが'cached'になっていたら、bodycacheによりconvert_htmlの実行がスキップされたと見なして、$contents_idをインクリメントするコードを追加しました。
function convert_html($lines) { //省略 static $contents_id = 0; global $bodycache_status; if ( $bodycache_status === 'cached' ) { //bodycacheから取得済み ++$contents_id; } //省略 $body = & new Body(++$contents_id); //省略 }
- 場当たり的な対応ですが、$bodycache_statusが'cached'になっていたら、bodycacheによりconvert_htmlの実行がスキップされたと見なして、$contents_idをインクリメントするコードを追加しました。
追記
改良したbodycache patchを公開しました。