PukiWikiのプラグイン
宅内のPukiWikiベースのプライベートのシステムを更新しています。PukiWikiベースというのは、各システムを外部リンクで参照しているだけ、今回この各システムをプラグイン化するのが目的でした。そこでハマってしまいました。
プラグインその物の構造は簡単です。testのブロック型プラグインとすると、./plugin配下にtest.inc.phpのファイル名で記述していきます。まず、プラグインが呼ばれた時に呼び出される関数を、plugin_test_convert()で定義し、必要ならFORMのactionで呼び出された関数をplugin_test_action()で定義します。そして、それぞれの関数で出力するhtmlを返すだけです。
で、ハマったと言うのはplugin_test_action()でした。通常PukiWikiの画面構成は、top.menu,bodyの3画面となっています。plugin_test_convert()の出力結果は、3画面で表示してくれるのですが、plugin_test_action()では、menuの表示されない2画面構成での表示となってしまったのです。
if (arg_check('read') && exist_plugin_convert('menu'))の条件に成立する場合に、menuページおよび$bodyが表示され、そうでない$bodyだけが表示されています。exist_plugin_convert('menu')はtrueです。arg_check('read')がfalseを返していることになります。
プラグインその物の構造は簡単です。testのブロック型プラグインとすると、./plugin配下にtest.inc.phpのファイル名で記述していきます。まず、プラグインが呼ばれた時に呼び出される関数を、plugin_test_convert()で定義し、必要ならFORMのactionで呼び出された関数をplugin_test_action()で定義します。そして、それぞれの関数で出力するhtmlを返すだけです。
で、ハマったと言うのはplugin_test_action()でした。通常PukiWikiの画面構成は、top.menu,bodyの3画面となっています。plugin_test_convert()の出力結果は、3画面で表示してくれるのですが、plugin_test_action()では、menuの表示されない2画面構成での表示となってしまったのです。
<?php function plugin_test_action() { global $vars; return array('body' => $vars['input']); } function plugin_test_convert() { $script = get_script_uri(); return <<<EOD <form action="$script" method="get"> <input type="hidden" name="cmd" value="test" /> <input type="input" name="input" value="" /> <input type="submit" value="submit" /> </form> EOD; } ?>ページを表示する処理は、skin/pukiwiki.skin.php内の以下の処理で行っています。
if (arg_check('read') && exist_plugin_convert('menu'))の条件に成立する場合に、menuページおよび$bodyが表示され、そうでない$bodyだけが表示されています。exist_plugin_convert('menu')はtrueです。arg_check('read')がfalseを返していることになります。
<?php if (arg_check('read') && exist_plugin_convert('menu')) { ?> <table border="0" style="width:100%"> <tr> <td class="menubar"> <div id="menubar"><?php echo do_plugin_convert('menu') ?></div> </td> <td valign="top"> <div id="body"><?php echo $body ?></div> </td> </tr> </table> <?php } else { ?> <div id="body"><?php echo $body ?></div> <?php } ?>arg_check()はlib/func.phpに定義されていて,$var['cmd']が引数のデータが設定されているかチェックしているだけです。この場合readになるわけです。
function arg_check($str) { global $vars; return isset($vars['cmd']) && (strpos($vars['cmd'], $str) === 0); }結論として、plugin_test_action()で、$vars['cmd'] = "read"で設定してやればいいだけの事でした。
function plugin_test_action() { global $vars; $vars['cmd'] = "read"; return array('body' => $vars['input']); }