Movable Typeのテンプレートタグをテンプレートで生成する方法
Movable Typeのテンプレートタグをテンプレートで生成する方法を紹介します。
1.概要
MTのテンプレートタグは、テンプレート上に「<$mt:EntryTitle$>」のように記述し、テンプレートを再構築することでその内容を出力しますが、テンプレート上に直接テンプレートタグ名を記述するのではなく、テンプレート上でテンプレートタグを作りたいケースがあるかもしれません。
で、以下の記事でテンプレートタグをテンプレートを使って生成する方法が紹介されています(他にも紹介記事がありましたらすいません)が、この方法や仕組みについてこのブログでも一度まとめさせて頂きたいと思ってました。
ということで、同じような内容になってしまって恐縮ですがこのエントリーでも紹介したいと思います。
2.既存のテンプレートタグを生成する
実際に使うことはないと思いますが、まず簡単な例として、MTEntryTitleタグをテンプレート上で生成する例を紹介します。
ソースコードは次のようになります。
<mt:SetVarBlock name="tag"><$mt:EntryTitle$></mt:SetVarBlock>
<$mt:GetVar name="tag" decode_html="1" mteval="1"$>
まず、MTEntryTitleタグの元となる内容を、MTSetVarBlockタグで変数tagに設定します。このとき、MTタグの左右のブラケットは「<」と「>」はエンコードした形で設定しますエンコードしておかないとテンプレートタグとして評価されてしまうためです。
<mt:SetVarBlock name="tag"><$mt:Entry<$mt:GetVar name="tagname"$>$></mt:SetVarBlock>
そして、MTGetVarタグで変数tagの内容を取得します。
<$mt:GetVar name="tag" decode_html="1" mteval="1"$>
この行にあるdecode_htmlモディファイアによって、変数tagの内容にある「<」「>」が次のようにデコードされて、テンプレートの形になります。
<$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"><$mt:Entry<$mt:GetVar name="__value__"$>$></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"><$mt:Entry<$mt:GetVar name="__value__"$>$></mt:SetVarBlock>
この項の説明で、繰り返し処理を使って異なるテンプレートタグを生成できることが分かったと思います。
4.カスタムフィールドのテンプレートタグを生成する
ここからが本題で、次のようなカスタムフィールドのテンプレートタグを使ったテンプレートを効率的に書きたい場合に、このカスタマイズを使うメリットがあります。
MTSample1
MTSample2
MTSample3
:
MTSample100
この場合のサンプルコードは次のようになります。
<mt:Entries>
<mt:for var="i" from="1" to="100">
<mt:SetVarBlock name="tag"><$mt:Sample<$mt:GetVar name="i"$>$></mt:SetVarBlock>
<$mt:GetVar name="tag" decode_html="1" mteval="1"$>
</mt:for>
</mt:Entries>
実際にはもうちょっとHTMLタグを書き込まないと使いものになりませんが、とりあえずこれだけのコードでMTSample1~MTSample100の内容をすべて出力することができます。
この例ではテンプレートタグ名の末尾が数字なのでfor文が使えますが、末尾がアルファベットの場合であれば、3項のように配列変数またはハッシュで定義してMTLoopタグを使えば同じように実現することが可能です。
- Movable Type検索結果画面のMTIncludeタグでファイルを読み込む方法
- Movable Typeの月別コンテンツアーカイブリスト用テンプレート
- コンテンツデータでMTEntriesWithSubCategoriesの代替テンプレートタグ
- MTContentFieldタグの使い方
- Movable Typeでブログ記事一覧をカスタムフィールドでソートする方法
- MTの本文フィールドからimg要素のURLを取得する方法
- MTEntriesタグで指定した数の記事を除外して表示する方法
- Movable Typeのテンプレートタグの中でテンプレートタグを使う方法
- Movable TypeのMTEntriesタグで特定の複数ブログ記事を出力する方法
- Movable TypeでCSVデータからtable要素を作る方法
- MTIncludeタグのnameモディファイア
- Movable Type(MT)の特殊変数の入れ子
- ブロックタグにelseタグを組み込んで判定する
- Movable Type 5 におけるウェブサイトとブログの複数指定方法
- ウェブサイトとブログでグローバルナビゲーションを共有する