カレンダーをアーカイブテンプレートから分離して、再構築したカレンダーをインクルードすることを考える。カレンダーのソースが1つになるので、カレンダーを修正する場合は1つのテンプレートだけ修正すればよいことになる。さらに再構築にかかる時間も短くなるかも知れないというオマケつき。インクルードの方法にはいくつかあるが、ここでは MTInclude を採用することにし、利点、欠点、導入方法について考える。
■ ■ ■
外部のファイルを読み込むには、以下のようにいくつかの方法がある。
- IFRAME (Inline Frame) で読み込む場合
- 読み込むファイルは再構築済みであること
- 読み込むファイルは <HTML> タグを含む完全な HTML 文書であること
- SSI で読み込む場合
- 読み込むファイルは再構築済みであること
- 読み込むファイルは完全な HTML 文書ではなく、必要な部分だけであること
- PHP で読み込む場合
- MTInclude で読み込む場合
- 読み込むファイルは再構築済みであっても、MT タグを含むテンプレートのソースであってもよい
- 読み込むファイルは完全な HTML 文書ではなく、必要な部分だけであること
IFRAME は対応していないブラウザがあるので避けたい。SSI はページを表示する度に読み込みを行うので、表示が遅くなる可能性がある。また、SSI を許可していないサイトもある。PHP の案は却下(このサイトが PHP でないので)。MTInclude は利点と欠点を両方持っているが、やり方が興味深いので今回はこれを採用する。MT タグを含むソースをインクルードしても面白くないので、再構築後のカレンダーをインクルードする。
MTInclude を使用する場合の利点は以下の通り。
- 外部のファイルを再構築時に読み込むので、表示の際のパフォーマンスが良好
- ブラウザによっては表示できない、ということがない
利点だけではなく、欠点もある。
- アーカイブファイルを読み込む場合、再構築を2回しなければならない
- 月が変ったとき、記事を投稿すると再構築に失敗する
アーカイブファイルを読み込む場合、最新の表示にするには2回再構築しなければならないが、頻繁に更新するサイトであれば、厳密に考える必要はない。1回だけの再構築でも使用には耐える。月の変わり目に、再構築に失敗してしまうのは痛い。投稿できなくなってしまうのである。回避方法はあるが、それほどスマートではない。これらの2つの欠点は、MovableType が再構築する順序と深い関係がある。
一般に、記事を投稿すると、MovableType は次の順序で再構築を行うようになっている。
- 個別アーカイブ
- 日付別アーカイブ
- 月別アーカイブ、カレンダーアーカイブ (後に記述)
- カテゴリーアーカイブ
- メインインデックス
このサイトでは、日付別と月別のアーカイブは同じテンプレートから生成しており (MovableType のデフォルト)、ここにカレンダーを表示している。構築の順序は日付別が先になっているので、その時点でのカレンダーが日付別アーカイブに読み込まれ、その後、日付別の情報が反映されたカレンダーが構築される。ややこしい話なのだが、つまり最初に日付別アーカイブに読み込まれるカレンダーは古いのである。また、月が変わるとカレンダーのファイルが生成されていないので、日付別アーカイブを構築する時点でエラーが発生する。次のようなエラー表示になる。

再構築時のエラー: テンプレートの作成に失敗しました
An error occurred:
エントリー 'カレンダーを MTInclude するには' の作成に失敗しました:
テンプレート 'Date-Based Archive' の作成に失敗しました:
月別アーカイブ構築時も同様で、カレンダーファイルがないために失敗する。それならばと、日付別・月別アーカイブを再構築しないようにして再構築をかけると、メインインデックスの構築に失敗する。メインインデックスには月別のアーカイブへのリンクがあるからである。この問題は、中身が空のカレンダーファイルをアップロードすることで回避することができる。中身がなくてもファイルさえあれば再構築は可能になる。
カレンダーテンプレートをアーカイブテンプレートから分離して、再構築後のカレンダーをアーカイブテンプレートに読み込むようにする。方針は次の通り。
- 月別アーカイブは /archives ディレクトリにあり、/archives/2004_09.html などという名前になっている
- カレンダーアーカイブ用に /archive/calendar ディレクトリを作成する
- カレンダーアーカイブは /archive/calendar/2004_09.html などという名前にする
- Date-Based Archive テンプレートからの呼び出しは <$MTInclude$> タグで行うが、月によってファイル名が異なるため、ファイル名指定に MTTagInvoke プラグインを使う
カレンダーアーカイブの作成手順は以下のようになる。PHP + IFRAME で行っている、きままにポロポロ: 月めくりカレンダー さんの方法の Berkeley DB + MTInclude 版にあたる。
- 新しくカレンダー用のテンプレートを作る
- 「テンプレートの編集」画面で、「新しいアーカイブ・テンプレートを作る」をクリックする
- 「テンプレートの名前」を「Calendar」にする
- 「テンプレートの中身」にカレンダータグ部分だけを書いて保存する (このサイトでは nlog(n) - 休日表示カレンダープラグイン を導入しているのでカレンダーのコードは複雑になっているが、ここでは単純なものを示す)
<MTCalendar> に属性 month="this" を指定している以外、特殊なディレクトリ設定等は行っていない。 <table border="0" cellspacing="0" cellpadding="2" width="160" summary="Monthly calendar with links to each day's posts">
<caption class="calendarhead">
<MTArchivePrevious>
<a href="<$MTArchiveLink$>" style="text-decoration: none;">««</a>
</MTArchivePrevious>
<$MTArchiveDate format="%B %Y"$>
<MTArchiveNext>
<a href="<$MTArchiveLink$>" style="text-decoration: none;">»»</a>
</MTArchiveNext>
</caption>
<tr>
<th abbr="Sunday" align="center"><span class="calendarweek">S</span></th>
<th abbr="Monday" align="center"><span class="calendarweek">M</span></th>
<th abbr="Tuesday" align="center"><span class="calendarweek">T</span></th>
<th abbr="Wednesday" align="center"><span class="calendarweek">W</span></th>
<th abbr="Thursday" align="center"><span class="calendarweek">T</span></th>
<th abbr="Friday" align="center"><span class="calendarweek">F</span></th>
<th abbr="Saturday" align="center"><span class="calendarweek">S</span></th>
</tr>
<MTCalendar month="this">
<MTCalendarWeekHeader><tr></MTCalendarWeekHeader>
<td style="<MTCalendarIfToday>border:solid 1px black;</MTCalendarIfToday>" align="center">
<span class="calendar">
<MTCalendarIfEntries><MTEntries lastn="1">
<a href="<$MTEntryPermalink archive_type="Daily"$>" title="<$MTEntryTitle$>"><$MTCalendarDay$></a>
</MTEntries></MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</span>
</td>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
</table>
- カレンダーテンプレートをアーカイブに追加し、ファイルの出力先を指定する
- 「BLOGの設定」画面で、「アーカイブの設定」を選択する
- 「新しく追加...」ボタンをクリック
- 「アーカイブの種類」を「Monthly」に、「テンプレート」を「Calendar」に設定し、「追加」ボタンをクリック(「追加」ボタンが見えない場合は、「Tab」キーで移動できる)
- Monthly アーカイブに「Calendar」が追加されているのを確認
- 「Calendar」の右横の「アーカイブ・ファイルのテンプレート」欄に次のように記入する
<$MTArchiveDate format="calendar/%Y_%m.html"$>
- Monthly テンプレートのラジオボタンは「Date-Based Archive」にチェックしたままにしておく
- Date-Based Archive テンプレートのカレンダーを挿入したい部分に次のコードを書く (メインインデックスには使わない)
<div class="sidetitle">
Calendar
</div>
<div align="center" class="calendar">
<MTTagInvoke tag_name="MTInclude">
<MTTagAttribute name="file">
<$MTArchiveURL$><$MTArchiveDate format="calendar/%Y_%m.html"$>
</MTTagAttribute>
</MTTagInvoke>
</div>
これで再構築すれば完了である。月が変わった場合は、記事を投稿する前に、その月のカレンダーファイルと同じ名前のファイル (例えば 2004_09.html という名前の空のファイル) を /archive/calendar ディレクトリにアップロードしておかなければならない。
MTFastInclude プラグインの説明には、「同じファイルを何度も読むという無駄な動作がなくなるため、再構築を高速化することができる」とあるが、MTタグのないファイルの読み込みに対してはあまり効果がないようである。
冷静に、利点・欠点・導入方法を眺めると、SSI によるインクルードが一番よいような気がしてきた。MTInclude の場合の欠点はどちらもなくなる。導入も難しくなく、最後の Date-Based Archive テンプレートの書き方が違うだけである。
Posted by n at 2004-09-02 02:51 | Edit | Comments (0) | Trackback(2)