« おまけ: はてなダイアリー風のTrackBack受信確認を行う | メイン | おまけ: 認証処理の基本 »
2005年04月04日
おまけ: 過去ログ・カテゴリー表示機能の作成
目次を見ればわかるとおり、本書では第3章の分量が不自然に少ない。これは本来第3章に入るハズだった内容が、時間の都合等でばっさり削除されているからだ。というわけで、その欠けている部分のネタを埋めておく。まずは、本書の内容だけではあまり意味がなさげに見えるインデックスの応用例について。
現状の本書の内容では、わざわざ作成したインデックスクラスEntryIndexにあまり存在意義はない。確かにインデックスを用意することで多少速度的には有利になるが、あの程度の使い方ならば記事データディレクトリを全部なめても大したことはない。
しかしもともとはインデックスを用意したのは、過去ログ表示やカテゴリー表示などを行うための土台にすぎない。ということで、以下では具体的に過去ログ表示およびカテゴリー表示機能を作成してみることにする。
まずは過去ログ表示機能。たとえば以下のような内容となる。
archive.php
<?php
require_once 'config.php';
main();
function main() {
$index =& new EntryIndex();
$index->load();
$index->select('date', $_GET['date']);
$entry_list = array();
foreach ($index->sort('date') as $filename => $item) {
$entry_list[] = load_entry_data($filename);
}
show_template('htmlheader.tmpl', array(
'title' => '過去ログ '.$_GET['date']
));
show_template('entry_list.tmpl', array(
'entry_list' => $entry_list
));
show_template('htmlfooter.tmpl');
}
?>
これに、archive.php?date=200503のような形でdateパラメータを渡すことで、2005年3月の日付を持つ記事データをまとめて表示する機能を持つ。上記ではdateパラメータの内容チェックはしていないので、date=20050305などのように日付まで指定してもいいし、date=2005のように年だけを指定しても動作する。
続いてはカテゴリ表示機能。
category.php
<?php
require_once 'config.php';
main();
function main() {
$index =& new EntryIndex();
$index->load();
$index->select('title', '['.$_GET['category'].']');
$entry_list = array();
foreach ($index->sort('date') as $filename => $item) {
$entry_list[] = load_entry_data($filename);
}
show_template('htmlheader.tmpl', array(
'title' => 'カテゴリー表示 '.$_GET['category']
));
show_template('entry_list.tmpl', array(
'entry_list' => $entry_list
));
show_template('htmlfooter.tmpl');
}
?>
やっていることは過去ログ表示と同じだ。category.php?category=blogなどとすると、タイトルとして『[blog]記事データの構造』のように、大括弧でカテゴリー文字列を指定した記事データだけを抽出し表示する。日本語カテゴリー名を指定する場合は、categoryパラメータとしては、EUC-JPで記述した文字列をURLエンコードしたものを渡す必要がある(ツール側でカテゴリーリンクを張る場合など)。
ただし、いくらインデックスファイルを用意しておいたとしても、このように毎回select、sortを行っていては早々に(記事データ数が増えると)処理速度が鈍ってくる。そのような場合は、あらかじめよく使うパターンのselectおよびsort済みのインデックスファイルを、別名で保存しておくといいだろう。あるいは記事データの更新がない限りは、一度select、sortした結果は流用できるような、キャッシングの仕組みを追加してもいい。
まあ実際問題としては、このような処理を本格的に行いたい場合は、素直にDBを使った方がいいと思うのだが、本書ではDBは使わないということになっているので、一応こういうやり方を紹介してみた。
投稿者 ishinao : 2005年04月04日 12:24