MTSetVarTemplateを使い倒す

@言う間に大晦日ですね。

今年、Movable Type 5をいじくり倒すのに超活躍した、MTSetVarTemplateタグの便利な使い方、以下の3つをご紹介します。

  • MTSetVarTemplateでテーマ(テンプレート)専用の独自タグを作る
  • MTSetVarTemplateでMT○○Recurse(再帰処理)を実行する
  • MTSetVarTemplateでテンプレートモジュールをすっきりさせる

まずは軽くMTSetVarTemplateタグについての説明です。

MTタグや条件分岐の実行結果を変数化するのにはMTSetVarBlockタグを使いますが、このMTSetVarBlockタグは処理される順番が来たら、その時点で内容を変数化します。

対して、MTSetVarTemplateタグは、MTタグや条件分岐そのものを変数化し、MTGetVarタグで呼び出された時点で内容を処理します。

この違いが重要です。

MTSetVarTemplateでテーマ(テンプレート)専用の独自タグを作る

CMSの比較で、Movable Typeの引き合いによく出されるWordPressですが、このWordPressにはfunctions.phpというテンプレートがあります。

functions.phpには、そのテーマ独自の関数を書くために使います。もっと具体的に言えば、テーマ独自のテンプレートタグなんかを作ることができるんです。

これと似たことが、MTSetVarTemplateタグでMTにも再現できるんです。

MTEntryPermalinkタグの相対パスバージョンを作る

MTEntryPermalinkタグなんかで出力されるURLって絶対パス(http://から始まるURL)なんですよね。だからMTで構築されたウェブページのソースを覗くと、URLが長くて正直くどい。

しかし、MTのテンプレートタグで相対パスを出力するものはMTBlogRelativeURLタグぐらいしかありません。そんなときMTSetVarTemplateタグの出番です。

<MTSetVarTemplate name="EntryRelativeURL">
  <MTBlogURL setvar="blog_url">
  <MTBlogRelativeURL setvar="blog_relative_url">
  <MTEntryPermalink replace="$blog_url","$blog_relative_url">
</MTSetVarTemplate>

注: 上記のコードは見易さを考慮して、改行を入れています。実際に使うときは改行は入れないでください。

このように、EntryRelativeURLといった変数(これが独自タグ)をつくり、あとはテンプレート内の<MTEntryPermalink>の部分を<MTGetVar name="EntryRelativeURL">に置き換えるだけです。

呼び出された時点でMTSetVarBlockタグの内容が処理されるので、MTEntryPermalinkタグが使える様々な部分でこの独自タグが使えます。

MovableTypeでサイト制作する際によく行う処理を独自タグにして使いまわせば、テンプレート内がすっきりすること間違い無し!

ちなみ、例に挙げたコードを解説すると、MTEntryPermalinkタグのブログの絶対パスの部分(blog_url = http://xxxx.yyyy/zzzz/)をブログの相対パス(blog_relative_url = /zzzz/)にグローバル・モディファイアのreplaceによって置き換えてやるってことです。

MTSetVarTemplateでMT○○Recurse(再帰処理)を実行する

MTタグの中に、ブロックタグの内容を再帰的に処理するMTCommentRepliesRecurseタグ、MTSubCatsRecurseタグ、MTSubFolderRecurseタグがあります。

これらのMTタグと同じ処理がMTSetVarTemplateタグでもできます。例えば、MTSubCategoriesタグ内でMTSubCatsRecurseタグを使わずに再帰処理する場合は以下のように書きます。

<MTSetVarTemplate name="category_recurse">
  <MTSubCategories>
    <MTSubCatIsFirst>
      <ul>
    </MTSubCatIsFirst>
        <li>
          <a href="<MTCategoryArchiveLink>"><MTCategoryLabel></a>
          <MTGetVar name="category_recurse">
        </li>
    <MTSubCatIsLast>
      </ul>
    </MTSubCatIsLast>
  </MTSubCategories>
</MTSetVarTemplate>
<MTGetVar name="category_recurse">

ポイントはMTSetVarTemplateタグの中でMTSetVarTemplateの変数をMTGetVarで呼び出す部分です。上の例の場合ではサブカテゴリが存在しなくなるまで処理され続けます。

応用すると、MT○○Recurse系のタグ以外でも再起処理が可能になります。

MTSetVarTemplateでテンプレートモジュールをすっきりさせる

実は、これが最も書きたかった内容なんです。

Movable Typeのデフォルトテーマにはいくつもテンプレートモジュールがありますよね?
テーマを新たに制作する場合でも、いくつもテンプレートモジュールを作っているはず。

でも、MTSetVarTemplateタグをうまく使えば、テンプレートモジュールを1つにまとめることができるんです!

名付けてファンクションモジュール!やり方は簡単!

  1. テンプレートモジュールにファンクションモジュールを追加する。
  2. それぞれのテンプレートモジュールの内容をMTSetVarTemplateで変数化してファンクションモジュールにコピー&ペーストで移す。
  3. 移し終えたテンプレートモジュールを削除する。
  4. 各種テンプレートの上部にファンクションモジュールをインクルードする。
  5. 読み込みたい変数をMTGetVarタグで呼び出す。

出力結果は通常と全く同じだけど、読み込むテンプレートモジュールは1つで済みます。

メリットはそれだけではございません!

Movable Typeで作ったウェブサイトの内容をブログで共有する場合、このファンクションモジュールをインクルードしてMTGetVarタグで呼び出せば共有化完了!

更に更に、「MTSetVarTemplateでテーマ(テンプレート)専用の独自タグを作る」と「MTSetVarTemplateでMT○○Recurse(再帰処理)を実行する」で作った変数(独自タグ)もファンクションモジュールに書いちゃえば、全く同じ処理も共有化できる!

但し、注意点が1つ。ウェブサイトの内容をブログで共有化するときは一手間加える必要が出てきます。

例えば、単純にMTBlogNameタグをMTSetVarTemplateタグで共有化した場合、ウェブサイトのテンプレートではウェブサイトの名称、ブログのテンプレートではブログの名称になってしまいます(呼び出された時点で処理されるので)。

なので、ウェブサイトの場合とブログの場合で出力内容を統一するような対策が必要です。
例えば、こんな感じで。

<MTIf tag="IfWebsite">
  <MTWebsiteID setvar="website_id">
<MTElse>
  <MTBlogParentWebsite>
    <MTWebsiteID setvar="website_id">
  </MTBlogParentWebsite>
</MTIf>
<MTBlogs include_child="$website_id"><MTBlogName></MTBlogs>

あらかじめ、よく使われそうなMTWebsiteIDタグなどをウェブサイトとブログの両方で同じ結果になるよう変数化しとくと便利ですね。

今回はここまで。それでは良いお年を!