Movable Typeのテンプレートタグをテンプレートで生成する方法

Movable Typeのテンプレートタグをテンプレートで生成する方法

Posted at October 9,2013 12:55 AM
Tag:[MovableType, TemplateTag]

Movable Typeのテンプレートタグをテンプレートで生成する方法を紹介します。

1.概要

MTのテンプレートタグは、テンプレート上に「<$mt:EntryTitle$>」のように記述し、テンプレートを再構築することでその内容を出力しますが、テンプレート上に直接テンプレートタグ名を記述するのではなく、テンプレート上でテンプレートタグを作りたいケースがあるかもしれません。

で、以下の記事でテンプレートタグをテンプレートを使って生成する方法が紹介されています(他にも紹介記事がありましたらすいません)が、この方法や仕組みについてこのブログでも一度まとめさせて頂きたいと思ってました。

ということで、同じような内容になってしまって恐縮ですがこのエントリーでも紹介したいと思います。

2.既存のテンプレートタグを生成する

実際に使うことはないと思いますが、まず簡単な例として、MTEntryTitleタグをテンプレート上で生成する例を紹介します。

ソースコードは次のようになります。

<mt:SetVarBlock name="tag">&lt;$mt:EntryTitle$&gt;</mt:SetVarBlock>
<$mt:GetVar name="tag" decode_html="1" mteval="1"$>

まず、MTEntryTitleタグの元となる内容を、MTSetVarBlockタグで変数tagに設定します。このとき、MTタグの左右のブラケットは「&lt;」と「&gt;」はエンコードした形で設定しますエンコードしておかないとテンプレートタグとして評価されてしまうためです。

<mt:SetVarBlock name="tag">&lt;$mt:Entry<$mt:GetVar name="tagname"$>$&gt;</mt:SetVarBlock>

そして、MTGetVarタグで変数tagの内容を取得します。

<$mt:GetVar name="tag" decode_html="1" mteval="1"$>

この行にあるdecode_htmlモディファイアによって、変数tagの内容にある「&lt;」「&gt;」が次のようにデコードされて、テンプレートの形になります。

<$mt:EntryTitle$>

そしてmtevalモディファイアで変数tagの内容にあるテンプレートタグが評価され、MTEntryTitleタグの内容を出力します。

この例では無駄にテンプレートタグを費やしているだけのようにしか見えませんので、とりあえず次項の説明に進んでください。

3.繰り返し処理でテンプレートタグを生成する

次に、繰り返し処理を使って次の4つのテンプレートタグを生成してみます。

  • MTEntryTitle
  • MTEntryBody
  • MTEntryExcerpt
  • MTEntryKeywords

ソースコードは次のようになります。

<$mt:SetVar name="tags[0]" value="Title"$>
<$mt:SetVar name="tags[1]" value="Body"$>
<$mt:SetVar name="tags[2]" value="Excerpt"$>
<$mt:SetVar name="tags[3]" value="Keywords"$>
 
<mt:Entries>
  <mt:loop name="tags">
    <mt:SetVarBlock name="tag">&lt;$mt:Entry<$mt:GetVar name="__value__"$>$&gt;</mt:SetVarBlock>
    <$mt:GetVar name="tag" decode_html="1" mteval="1"$>
  </mt:loop>
</mt:Entries>

まず最初の4行でテンプレートの元となるタグ名を配列変数tagsに設定します。

<$mt:SetVar name="tags[0]" value="Title"$>
<$mt:SetVar name="tags[1]" value="Body"$>
<$mt:SetVar name="tags[2]" value="Excerpt"$>
<$mt:SetVar name="tags[3]" value="Keywords"$>

次にMTEntriesタグ内(またはブログ記事テンプレートでもOK)でMTLoopタグを使って、さきほどの配列を順番に取得します。

  <mt:loop name="tags">
      :
  </mt:loop>

あとはMTLoopタグ内で2項と同じ処理を行うだけですが、1回ループするたびにタグ名が変わるよう、MTGetVarを使って配列変数の内容を取得します。そのとき、MTGetVarタグのnameモディファイアには、特殊変数「__value__」を利用します。

<mt:SetVarBlock name="tag">&lt;$mt:Entry<$mt:GetVar name="__value__"$>$&gt;</mt:SetVarBlock>

この項の説明で、繰り返し処理を使って異なるテンプレートタグを生成できることが分かったと思います。

4.カスタムフィールドのテンプレートタグを生成する

ここからが本題で、次のようなカスタムフィールドのテンプレートタグを使ったテンプレートを効率的に書きたい場合に、このカスタマイズを使うメリットがあります。

MTSample1
MTSample2
MTSample3
  :
MTSample100

この場合のサンプルコードは次のようになります。

<mt:Entries>
  <mt:for var="i" from="1" to="100">
    <mt:SetVarBlock name="tag">&lt;$mt:Sample<$mt:GetVar name="i"$>$&gt;</mt:SetVarBlock>
      <$mt:GetVar name="tag" decode_html="1" mteval="1"$>
  </mt:for>
</mt:Entries>

実際にはもうちょっとHTMLタグを書き込まないと使いものになりませんが、とりあえずこれだけのコードでMTSample1~MTSample100の内容をすべて出力することができます。

この例ではテンプレートタグ名の末尾が数字なのでfor文が使えますが、末尾がアルファベットの場合であれば、3項のように配列変数またはハッシュで定義してMTLoopタグを使えば同じように実現することが可能です。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)