« 私のポリシー (ブログ編) | メイン | CatSort ver.0.4 - カテゴリーごとのエントリー数でソート! »

●「テンプレート・コンテキスト」とは

Movable Type をプログラミング的な観点から掘り下げるシリーズ、第1回。
「テンプレート・コンテキスト」というものについて、ちょっと考えてみます。

Movable Type(以下MTと略記)のプラグインを自作したことがある方なら、少なからず意識したことのある言葉だと思います。けれども、テンプレートが少しいじれる程度だとか、難しいことは分からないから便利なプラグインを使って楽したい、という方にはあまりなじみのない言葉だと思います。
でも。
大まかな考え方を理解しておくと、テンプレートのカスタマイズや改造・自作を初め、プラグイン開発にも大きな助けとなります。
脱・初心者、必見!

言葉の解説

『コンテキスト』(context)とは、そのまま日本語訳すると「(文章の)前後関係、文脈」という意味です。
つまり「テンプレート・コンテキスト」は「テンプレートの文脈」ということになります。
って、これだけじゃ何のことやら分かりにくいですね。

例えば、「好き」という言葉を考えてみてください。
もしこの言葉が、恋人同士の間でささやかれていれば、それはつまり「愛している」という意味になります。英語で言えば"love"ですね。
恋愛感情のない人同士ならば、同じ「好き」でも友好関係を表します。英語の"like"です。
もしくは、やはり英語では"like"になりますが、「私は寿司が好きです」とか「好きな動物はカバです」というときの「好き」は、趣味・嗜好を表します。
このように同じ言葉でも、状況や場合に応じて少しずつ意味が異なることがあります。
(英語の"rice"もそうですね。田んぼの「稲」も、「お米」も、それを炊いた「ご飯」も英語では"rice"です。)
この「状況や場合によって、意味や内容が異なるもの・こと」が、『コンテキスト』という言葉のコアです。
つまり「『テンプレート・コンテキスト』を考える」ことは、「あるテンプレートのある場所における状態を考える」、ということになります。

※『コンテキスト』という言葉自体は、MTだけの特別な言葉ではなく、プログラミング(アルゴリズム)の世界で上記のような意味で普遍的に使用されているモノです。中級以上の方は覚えておきましょう。

テンプレート・コンテキストを覗く

では、具体的に「テンプレート・コンテキスト」を確認しましょう。
どうやって確認するのかというと。何も難しいことはありません。『変数タグ』(<$MT~$>)を使用すればよいのです。
ただ、闇雲に勝手な変数タグを使用すればよいと言うわけではなく、「状態を調べたいモノ」に応じた変数タグを使用することになります。

例として、<$MTEntryTitle$>を取り上げます。
つまり今から確認するのは、「いろいろなテンプレート・コンテキスト上の『エントリーのタイトル』」です。

まずは「エントリー・アーカイブ (Individual Archive)」を考えます。
「エントリー・アーカイブ」テンプレート上では、どの場所に<$MTEntryTitle$>を記述しても、生成される一つのページ内では常に同じ結果が得られます。
例えば「A」というエントリーならばどの場所にも「A」と表示されるはずです。

次に、例えば「カテゴリー・アーカイブ (category archive)」を考えてみると、どうでしょう。
<$MTEntryTitle$>は通常、<MTEntries>~</MTEntries>内に記述しますが、同じ場所に記述しても、時によって表示結果は変わります。
例えば「C」カテゴリーに「A」「E」「U」という3つのエントリーが属していた場合、「C」カテゴリーのアーカイブページには「A」「E」「U」の3つが順に表示されるはずです。
これは、<MTEntries>~</MTEntries>内では複数のエントリーが順番に現れるからです。そしてその時その場所に現れている「エントリー」に属する「タイトル」が、<$MTEntryTitle$>によって出力されるのです。
また、仮に<MTEntries>~</MTEntries>の外側に<$MTEntryTitle$>を記述してみましょう。すると、再構築時にエラーになってしまいます。
これは、「カテゴリー・アーカイブ」では<MTEntries>~</MTEntries>の外側はどのエントリーも関連づけられていないからです。
これらのことは、「カテゴリー・アーカイブ」だけではなく他のほとんどのアーカイブおよびインデックス・テンプレートで言えることです(唯一の例外はエントリー・アーカイブです)。

以上をまとめると、エントリーのタイトル(というかエントリーそのもの)について、こう言うことができます。

  • エントリー・アーカイブのテンプレート・コンテキスト(<MTEntries>~</MTEntries>の外側)……エントリーのタイトルはそのエントリーに対応付けられたもの(「A」エントリーならば「A」)
  • エントリー・アーカイブ以外のアーカイブおよびインデックス・テンプレートのテンプレート・コンテキスト(<MTEntries>~</MTEntries>の外側)……エントリーのタイトル(というよりエントリーそのもの)は未定義
  • (あらゆるテンプレートの)<MTEntries>~</MTEntries>の中
    → n番目のエントリーの時のテンプレート・コンテキスト……エントリーのタイトルはそのエントリーに対応付けられたもの(「N」エントリーならば「N」)

ポイントは、<MTEntries>~</MTEntries>は「ループ構造」になっていて、その中身はエントリーの数だけ処理される、ということ。だから「コンテキスト」を考える時は、そのループを『展開』して(つまりそこに出てくる各要素(この場合各エントリー)を全て並べたものとして)考えなければならない、ということです。

どうでしょう、分かりますか? え、「そんなの当たり前」?
「当たり前」だと思う人も、「ちょっと難しくて分かりにくい」という人も、もっと他の例をいろいろ考えてor実験してみてください。例えば:

  • 色々なテンプレート・コンテキストにおける「カテゴリー名」
  • 色々なテンプレート・コンテキストにおける「ブログID」
  • <MTCategories>~</MTCategories>の中で<MTEntries>~</MTEntries>を記述した場合の、その内部でのテンプレート・コンテキストにおける「カテゴリー名」
  • 色々なテンプレート、色々な属性値で記述した<MTArchiveList archive_type="...">~</MTArchiveList>の内部でのテンプレート・コンテキストにおける「アーカイブ終了日時」(<$MTArchiveDateEnd$>)

テンプレート・コンテキストが変化するタイミング

もう一度おさらいすると、「テンプレート・コンテキスト」というのは「あるテンプレートのある場所における状態」ということでした。
では、その「状態が変化」するタイミングというのは、いつなんでしょう?
これは端的にまとめると、次のように言うことができます。

  • コンテナタグの内側(コンテンツ)に入るとき
  • コンテナタグの内側でループをするとき
  • コンテナタグの外側に出るとき

これは、先ほどのカテゴリー・アーカイブの例を考えると分かりやすいのではないでしょうか。
まず、<MTEntries>~</MTEntries>の外側(<MTEntries>はコンテナタグ、<MTEntries>~</MTEntries>の「~」の部分が内側(コンテンツ)です)では、<$MTEntryTitle$>は定義されていません。
<MTEntries>~</MTEntries>の内側に入ると、<$MTEntryTitle$>が、最初のエントリー(例えば「A」エントリー)に対応するエントリーのタイトル(この場合「A」)に変化します。
次に、まだエントリーがある場合(例えば「E」エントリー)、<MTEntries>~</MTEntries>の内側でループが発生し、<$MTEntryTitle$>の値が次のエントリーに対応するタイトル(この場合「E」)に変化してコンテンツが処理されます。
全てのエントリーについて処理が終わると、<$MTEntryTitle$>の値は再び未定義になって、<MTEntries>~</MTEntries>の外側に出て行きます。

これは分かりやすいように毎回値の変わる例を出しましたが、コンテナタグの出入りやループで、必ずテンプレート・コンテキストが変わる、というわけではありません。
より正確に言うと、そう言った場面でテンプレート・コンテキストは変わるのですが、値の変わらないもの(状態の変わらないもの)もある、ということです。
例えばカテゴリー・アーカイブ内では、<MTEntries>~</MTEntries>の内側でも外側でもループの途中でも、カテゴリー名は不変です。
(例えて言うと、「フィギュアスケート」「兼六園のの雪吊り」「紅白歌合戦」は内容が「スポーツ」「風物」「イベント」とそれぞれ違うけれど季節は全部「冬」ですよね。)
つまり、どの値(どの状態)が変わるかは、そのコンテナタグの種類によって違う、ということです。

まとめ

テンプレート・コンテキストについて、改めてまとめてみましょう。

  • 『テンプレート・コンテキスト』とは、あるテンプレートのある場所における状態のこと。
  • テンプレート・コンテキストは、『コンテナタグへの出入り』によって(そのコンテナタグが機能する対象の状態が)変化する。
  • テンプレート・コンテキストの変化を目に見えるカタチで確認できるもの、それが『変数タグ』である。

あとは、具体的にどのコンテナタグでコンテキストがどう変わるか、と言ったことを経験を積んで身に付けていきましょう。
また、オリジナルタグを提供するプラグインを開発する際は、コンテキストをどう『意図的に変化させる』か、それをどのように『目に見えるカタチで表に出す』か、そう言う観点で考えると、きっと設計がしやすくなると思います。