2008/11時点でのYakiBikiは、デフォルトではPermalinkをサポートしていません。
これはmod_rewrite相当の機能が搭載されていないWebサーバーでも実行できるようにするために、やむなく断念しました。(*1)
ですが折角mod_rewrite相当の機能が搭載されているのであれば、使いたいよね・・・ということで、早速自分で調整してみました。
.htaccessにこんな感じのmod_rewriteの設定を付け足しました。
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} -d [OR] RewriteCond %{REQUEST_FILENAME} -f RewriteRule .* - [L] RewriteRule ^$ index.php [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f # view mode RewriteRule ^view\/([0-9]+)$ index.php?mdl=view&id=$1 [L] RewriteRule ^view\/([0-9]+)\/$ index.php?mdl=view&id=$1 [L] RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
viewモジュール・・・つまり通常のページ詳細表示の場合だけに対応を絞り込みました。YakiBiki内での「記事へのリンク」は通常、viewモジュールへのリンクになるからです。
この段階でURLから ".../view/10" とかしたりして、ちゃんと表示されるか確認してみます。
yakibikiの plugins/hook ディレクトリに
yb_hook_make_url.php
というのがありますが、これがYakiBiki内のURLを生成する関数のデフォルト実装です。
plugins/hook 以下にはユーザが挙動をカスタマイズ出来るようなフックポイントを置く・・・筈なのですが、2008/11時点の 0.0.1-alpha3 時点ではまだこれ1つだけなんです・・・。
とまれ、まずはこれをコピーし、適当な名前にします。今回であれば
yb_hook_my_make_url.php
とします。
続いてyb_hook_my_make_url.phpの中の関数名を直します。
function yb_hook_make_url() → function yb_hook_my_make_url()
細かいコードの説明は省きますが、コピーした方で関数からreturnする直前を次のように修正します。
【修正前】
if (count($_params) > 0) { $base .= $_query; } return $base;
【修正後】
if (count($_params) > 0) { $base .= $_query; } // ここのifブロックを挿入 if ($module == 'view') { if (isset($query_params['id']) && is_numeric($query_params['id'])) { $base = _YB('url') . 'view/' . $query_params['id']; } } return $base;
追加した新しいmy_make_urlフックに付け替えるには、config.phpに以下の行を付け足します。
_YB('hook.convert.make_url', 'my_make_url');
少し解説します。フックを使用する場合、次のようにyb_Util::hook()を実行します。(2008/11, 0.0.1-alpha3時点)
$ret = yb_Util::hook('フック名', $args);
ここで _YB('hook.convert.フック名') が指定されていない場合、
plugins/hook/yb_hook_フック名.php
をロードして、
yb_hook_フック名()
を実行します。
もしも _YB('hook.convert.フック名') が指定されていて、'my_フック名'となっていれば、
plugins/hook/yb_hook_my_フック名.php
をロードして、
yb_hook_my_フック名()
を実行します。
この仕掛けを使用して、''YakiBikiのデフォルト実装を残したまま''、ユーザーのカスタマイズフックを有効化できます。
以上でviewモードについてはPermalinkを作る事が出来ました。YakiBikiは内部リンクについては全て動的に生成していますのでWikiキャッシュの影響はありません(=キャッシュクリアは不要)。
コメント