DokuWikiのイベントリスト1)を眺めていて、AJAX_CALL_UNKNOWNというのが最初の方に出てきて気になりました。そんなものが何のためにあるのか、と。
調べてみると、DokuWiki本体が持っているlib/exe/ajax.phpというajaxをハンドリングするプログラムが発行しているイベントで、callパラメータで呼ばれる機能のうちDokuWiki自体が定義しているもの以外が指定された場合に起こります。つまり、このイベントを捕捉すれば、プラグイン独自のajax呼び出しを受け付けることができるというわけです。
プラグインのディレクトリ下にexe/ajax.phpなどを作成してそれを呼び出す方法もありますが、こちらの方がずっとスマートです。そして、最低限必要な認証などのチェック以外には何もしないので、規定されたcallパラメータ以外に何を使っても、何を出力しても構いません。これは積極的に使いたいものです。
少々脱線しましたが、これと同じようなことをプラグイン側で独自に定義したイベントで処理できないだろうかと考えました。やってみたら実に簡単で、イベントを発行する側は
$data = array(1, 2, 3);
trigger_event('HOGEHOGE_DATA_UNKNOWN', $data);
とします。呼び出し側はパラメータを配列変数に入れて呼び出すこと。これは、戻り値をパラメータで返すことを考慮しているため、直接array()をtrigger_event()のパラメータに指定してしまうと、エラーとなってしまうためです。
一方このイベントを受けて処理する側は、actionプラグインで
function register(&$controller) {
$controller->register_hook('HOGEHOGE_DATA_UNKNOWN',
'BEFORE', $this, 'hogehoge_action');
}
function hogehoge_action($event) {
print implode(',', $event->data);
}
などと処理してやればよいのです。処理側は送られたパラメータは$event→dataで受けることができます。AJAX_CALL_UNKNOWNの場合はこれはcallの値のみとなっていて、他のリクエストパラメータは受け取り側が自分で勝手に処理するようになっています。