menu.inc.php

Top > Hack > menu.inc.php
Table of Contents

MenuBar をあらかじめ変換しておく(本体改変)

現在の PukiWiki の慣習では MenuBar はスキンファイル実行時に convert_html (html変換)されます。 それに対し、通常のページはスキンファイル実行前に convert_html されます。 この違いにより、通常ページでは動作するが、MenuBar では動作しないプラグインというものがでてきます。 例えば skin.inc.php や header('Location: ...'); でリダイレクトさせるプラグインなどです。

特に skin.inc.php の場合、MenuBar に設置できれば編集画面においても skin.inc.php を適用できるようにできるので快適です。 拙作 Plugin/submenu.inc.php と併用して一度に複数ページに適用できるようになるので快適です。

通常のページと同様に MenuBar ページをスキン php ファイル実行前に convert_html するようにしてみるハックです。

改変コード

Plus!

html.php#catbody 中の最終行の

require(....);

の前に

$tmp = $GLOBALS['filter_rules'];
unset($GLOBALS['filter_rules']["#skin(.*)$"]);
if (exist_plugin_convert('menu')) do_plugin_convert('menu');
$GLOBALS['filter_rules'] = $tmp;

を追加。Plus! のデフォルトでは MenuBar には skin.inc.php を置けないことになっているので制限を取り除いている。

常に変換するのでスキンで MenuBar の html が表示されない場合でも実行されます。

技術的詳細(調査ログ)

動機:skin.inc.php を編集画面に適用できない。編集画面にも適用するには MenuBar に設置、一部のページのみに適用するには拙作 Plugin/submenu.inc.php と併用すればよさそう。

方針:スキンはいじらずに本体だけの改変でやりくりする。スキン切り替えをしたいということは、複数のスキンを持っているわけなので、それらすべてを編集するのは大変なため。

  • MenuBar ページの変換は通常 skin.php 内で実行されている。
  • よって、MenuBar に #skin プラグインを記述し、別のスキンを指定しても、すでにスキンファイルを実行している途中なので意味がない。
  • よって、MenuBar ページの変換をスキンファイル実行前に行う必要がある。

html.php#catbody 内で menu プラグインを呼び、MenuBar を変換させておき、スキン中では変換後の HTML を出力するだけにする。

  • 幸いなことにデフォルトの menu.inc.php に static $menuhtml という値があり、同じことを試そうとしたことがあったのではないかというほどの痕跡があったので、それを使用する。menu.inc.php は変更しないですむようだ。
  • menu.inc.php 中で filter_rules という関数を呼んでおり、rules.ini.php 中の $filter_rules で設定している文字を消してしまっている。デフォルトで #skin が消えるように設定されている。
  • $filter_rules は include プラグインでも使用される変換ルールである。include の際スキンは取り込んだページのものではなく、大本のページのスキンに依存したいので、$filter_rules はデフォルトのままとっておく。
  • html.php@catbody 中で一時的に #skin を許可する(制限を削除する)コードを書くことにした。

結果

+$tmp = $GLOBALS['filter_rules'];
+unset($GLOBALS['filter_rules']["#skin(.*)$"]);
+if (exist_plugin_convert('menu')) do_plugin_convert('menu');
+$GLOBALS['filter_rules'] = $tmp;
require(....);

MenuBar を表示しないスキンの場合でも、MenuBar ページの変換を行っているので、スキンによらずスキンの切り替えが有効、ということになる。