2010/02/06(土)

「blosxomのpagingプラグインがカテゴリ移動してくれない問題」解決

■ blosxomとは
このブログは、フリーのウェブログCGIアプリケーション「blosxom」で構築されています。
blosxom自体は非常にシンプルな動作しかしませんが、プラグインを追加する事で色々な機能を追加する事が出来ます。

例えば「categories」プラグインは各エントリを任意のカテゴリ単位でまとめる事が出来ますし、「paging」プラグインはページめくり機能を実現します。

 

■ pagingプラグインの問題点
このpagingプラグインですが、トップカテゴリ以外からページ移動しようとするとうまく動作しません。

<うまく移動できる例>
トップページ(http://www.m-fo.com)から2ページ目に移動する時のリンク

http://www.m-fo.com/?page=2

<うまく移動できない例>
コミティアカテゴリ1ページ目(http://www.m-fo.com/comitia/)から、同じコミティアカテゴリの2ページ目に移動する時のリンク

http://www.m-fo.com/?page=2

※本当なら http://www.m-fo.com/comitia/?page=2

要はリンクのURLにディレクトリが含まれないため、常にトップページから○ページ目に移動してしまいます。
このブログを公開してから既に5年以上経ちますが、実はこの不具合に気が付いたのはけっこう最近だったりします。

■ pagingプラグインのソースを解析
という訳で、pagingプラグインのソースを見てみます。
blosxom本体およびプラグインはperlで記述されています。
(pagingプラグインはこちらで配布されています。)

プラグインの中で、リンクURL生成は

$url = url(-absolute => 1, -path_info => 1, -query => 1);

という様に記述されています。
変数「$url」にリンクURLが格納されます。
CGIモジュールのurlメソッドに「path_info」オプションが指定されているので、なんとなくディレクトリ込みのURLが取得できてそうに思うけど、実際にはできてません。
「query」オプションで「?page=○」は取得できています。
「absolute」オプションで相対パス指定になるので、変数$urlには「/?page=○」のみが格納されます。

■ ソースを修正
$url変数にディレクトリが入れば良い、という事までわかりましたので、pagingプラグインのソースを修正します。
blosxomプラグインで使用できる共通変数のひとつに「$path_info」があります。
この変数にはperlの環境変数「PATH_INFO」の内容が格納されます。
環境変数「PATH_INFO」にはCGIでURLに付加したパス情報が格納されます。
こちらを使用する事で、categoriesプラグインで付加したディレクトリ情報込みのURLを取得できそうです。
こんな感じで修正します。(赤字が追加部分)

sub head {
    my ($pkg, $currentdir, $head_ref) = @_;
    my $url;
    my $dirpath;
    $dirpath = "/$blosxom::path_info"; # 変数$dirpathに現在の相対パスを格納

    $url = url(-absolute => 1, -path_info => 1);
    $url = "$dirpath$url"; # 相対パスと結合
    $url =~ s/\/\//\//; # パス内でスラッシュが連続する箇所を削除

pagingプラグインでリンクURLの生成は5カ所(先頭ページ、前のページ、○ページ目、次のページ、最終ページ)あります。
それぞれに上記の相対パス結合処理を追加します。

結果、うまくカテゴリ単位でのページめくりが機能する様になりました!

Powered by blosxom 2.0