PukiWikiのプラグイン
Rev.2を表示中。最新版はこちら。
宅内の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画面構成での表示となってしまったのです。
<?php
function plugin_test_action()
{
global $vars;
$vars['cmd'] = "read";
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"で設定してやればいいだけの事でした。




