日別,月別アーカイブの PHP 化は問題なく動作しているのではあるが,仕様を変更することにした。
記事の再構築時間を短縮するために,アーカイブを一部 PHP 化してきた。日別(nlog(n): 長年日記を PHP で実装する),月別(nlog(n): 月別アーカイブを PHP で表示する)共に上手くいっている。「ならば次はカテゴリアーカイブだ」と意気込んだが,不可能なことが判明。設計ミスである。そこで,仕様を変更することにした。ただし,日別,月別の PHP のコードは変更なしでそのまま使える(実はそのまま使えるようにちょと直した)。
今までは,ファイル名の形式を「abstract/YYYY_MM_DD.html」にして,アーカイブの種類としては「Daily」にしていたが,これを次のように変更する。
ファイル名の形式 | abstract/YYYY_MM_DD_nnnnnn_Category_.html |
YYYY_MM_DD | 年月日 (YYYYは4桁の年,MMは2桁の月,DDは2桁の日) |
nnnnnn | 6桁の記事番号 (桁数が6桁に満たない場合は「0」でパディングする) |
Category | カテゴリ名 (複数ある場合はアンダースコア「_」でつないで並べる) |
アーカイブの種類 | Individual |
PHP を使ってカテゴリアーカイブに表示するには,ファイル名にカテゴリが入っていなければならない。しかし,日付にカテゴリをつけただけでは,同じ日に同じカテゴリの記事を書いたときに衝突が起こってしまう。衝突しないようにするには,記事番号を入れる必要がある。日付でソートするので,記事番号は日付より後でなければならない。ということで,上のような形式になった。
アーカイブに関連したテンプレートを新たに作り,テンプレート名を例えば「Individual Entry Archive Abstract」にする。内容は,もとの「Individual Entry Archive」の <Entries>〜</Entries> 部分のみである。ただし,最初の <Entries> と最後の </Entries> は削除しておくことが重要。これがあると,全ての記事が1つのファイルに出力されてしまう。
blogbody の div には次のように書いておくというのは同じである。
テンプレートの追加が終わったら,アーカイブの設定を行う。「ブログの設定」→「アーカイブの設定」でアーカイブを新しく追加し,アーカイブの種類を「Individual」にする。各記事毎にファイルを出力するからだ。アーカイブファイルのテンプレート欄には,次のように書いておく。
「こんなのは初めて見たよ」くらい長い。カテゴリが複数ある場合にも対応している。カテゴリは encode_url を通しているので,カテゴリ名に空白がある場合は「%20」に変換される。ちなみに,Movable Type 2.661 のカテゴリアーカイブのファイル名は dirify フィルタを通して生成されてているので,空白は「_」に,大文字は小文字に変換される。上記で dirify ではなく encode_url を使ったのは,dirify では空白もアンダースコアもどちらもアンダースコア「_」に変換されてしまうからである。まあ,この辺は趣味の問題でもある。
以上で完了である。個別記事を全て再構築すれば,abstract ディレクトリ以下にファイルが生成される。日別アーカイブと月別アーカイブの PHP のコードはそのままでよい。
もし,nlog(n): 長年日記を PHP で実装する にしたがってファイルを生成している場合は,次のことを行う必要がある。
ファイルを生成して,PHP で動的に読み込んで表示する方法には注意点がある。一旦公開してから,日付を変更すると,変更前のファイルは削除されずに新たにファイルが生成されるため,日付だけが違うファイルが2つ出来てしまう。カテゴリを変更した場合も同様である。日付やカテゴリを変更した場合は,古いファイルを手で削除する必要がある。
Linux なら,次のコマンドで重複ファイルを見つけることができる。
uniq には,最初の11文字をスキップし,続く6文字を比較の対象とし,重複行をすべて表示するオプションをつけている(Manpage of UNIQ)。
Posted by n at 2007-04-06 01:59 | Edit | Comments (0) | Trackback(0)
Master Archive Index
Total Entry Count: 1957