印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType カレンダーを MTInclude するには

カレンダーをアーカイブテンプレートから分離して、再構築したカレンダーをインクルードすることを考える。カレンダーのソースが1つになるので、カレンダーを修正する場合は1つのテンプレートだけ修正すればよいことになる。さらに再構築にかかる時間も短くなるかも知れないというオマケつき。インクルードの方法にはいくつかあるが、ここでは MTInclude を採用することにし、利点、欠点、導入方法について考える。

■ ■ ■

外部のファイルを読み込むには、以下のようにいくつかの方法がある。

  • IFRAME (Inline Frame) で読み込む場合
    • 読み込むファイルは再構築済みであること
    • 読み込むファイルは <HTML> タグを含む完全な HTML 文書であること
  • SSI で読み込む場合
    • 読み込むファイルは再構築済みであること
    • 読み込むファイルは完全な HTML 文書ではなく、必要な部分だけであること
  • PHP で読み込む場合
    • SSI の場合と同じ
  • MTInclude で読み込む場合
    • 読み込むファイルは再構築済みであっても、MT タグを含むテンプレートのソースであってもよい
    • 読み込むファイルは完全な HTML 文書ではなく、必要な部分だけであること

IFRAME は対応していないブラウザがあるので避けたい。SSI はページを表示する度に読み込みを行うので、表示が遅くなる可能性がある。また、SSI を許可していないサイトもある。PHP の案は却下(このサイトが PHP でないので)。MTInclude は利点と欠点を両方持っているが、やり方が興味深いので今回はこれを採用する。MT タグを含むソースをインクルードしても面白くないので、再構築後のカレンダーをインクルードする。

MTInclude を使用する場合の利点は以下の通り。

  • 外部のファイルを再構築時に読み込むので、表示の際のパフォーマンスが良好
  • ブラウザによっては表示できない、ということがない

利点だけではなく、欠点もある。

  • アーカイブファイルを読み込む場合、再構築を2回しなければならない
  • 月が変ったとき、記事を投稿すると再構築に失敗する

アーカイブファイルを読み込む場合、最新の表示にするには2回再構築しなければならないが、頻繁に更新するサイトであれば、厳密に考える必要はない。1回だけの再構築でも使用には耐える。月の変わり目に、再構築に失敗してしまうのは痛い。投稿できなくなってしまうのである。回避方法はあるが、それほどスマートではない。これらの2つの欠点は、MovableType が再構築する順序と深い関係がある。

一般に、記事を投稿すると、MovableType は次の順序で再構築を行うようになっている。

  1. 個別アーカイブ
  2. 日付別アーカイブ
  3. 月別アーカイブ、カレンダーアーカイブ (後に記述)
  4. カテゴリーアーカイブ
  5. メインインデックス

このサイトでは、日付別と月別のアーカイブは同じテンプレートから生成しており (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 版にあたる。

  1. 新しくカレンダー用のテンプレートを作る
    1. 「テンプレートの編集」画面で、「新しいアーカイブ・テンプレートを作る」をクリックする
    2. 「テンプレートの名前」を「Calendar」にする
    3. 「テンプレートの中身」にカレンダータグ部分だけを書いて保存する (このサイトでは 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;">&laquo;&laquo;</a>&nbsp;&nbsp;
      </MTArchivePrevious>
      <$MTArchiveDate format="%B %Y"$>
      <MTArchiveNext>
      &nbsp;&nbsp;<a href="<$MTArchiveLink$>" style="text-decoration: none;">&raquo;&raquo;</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>&nbsp;</MTCalendarIfBlank>
      </span>
      </td>
      <MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
      </MTCalendar>
      </table>
  2. カレンダーテンプレートをアーカイブに追加し、ファイルの出力先を指定する
    1. 「BLOGの設定」画面で、「アーカイブの設定」を選択する
    2. 「新しく追加...」ボタンをクリック
    3. 「アーカイブの種類」を「Monthly」に、「テンプレート」を「Calendar」に設定し、「追加」ボタンをクリック(「追加」ボタンが見えない場合は、「Tab」キーで移動できる)
    4. Monthly アーカイブに「Calendar」が追加されているのを確認
    5. 「Calendar」の右横の「アーカイブ・ファイルのテンプレート」欄に次のように記入する
      <$MTArchiveDate format="calendar/%Y_%m.html"$>
    6. Monthly テンプレートのラジオボタンは「Date-Based Archive」にチェックしたままにしておく
  3. 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)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
MT アーカイブ連動カレンダー テンプレート
月間移動可能なカレンダーはすでに提案されているのですが、カレンダーでそのまま A... Trackbacked from: Idea&&Technology->Blog at September 12, 2004 16:02
月めくりカレンダーにしたよ!
サイドバーにあるカレンダーを新しくしました。 ・月送りができるようにしたい ・個... Trackbacked from: Diario at January 16, 2006 11:02
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?