📃

【Movable Type】変数を定義して利用する

2024/12/24に公開

概要

MT(PowerCMS含む、以下同)での変数の定義と使い方について解説しています。
あらかじめ定義されているブロックタグやファンクションタグだけでもテンプレートを作成するにはじゅうぶんですが、変数を定義して利用することにより、さらにより柔軟なMTML記述が可能になるかと思います。

MTで変数を定義・利用するためのタグは以下です。

  • MTVar
  • MTSetVar
  • servar(グローバルモディファイア)
  • MTSetVars
  • MTSetVarBlock
  • MTSetVarTemplate

ざっくりとした説明ですが使い方の基本としては、以下となります。

  1. MTSetVarMTSetVarBlockで変数と値を定義する
  2. MTVarで変数を呼び出して利用する(または$変数名としてモディファイアの値として利用する)

MTVar

定義した変数から値を呼び出す。

前述のとおり変数を定義するMTタグはいくつかありますが、呼び出す場合はすべてMTVarで呼び出します。

<!-- 変数を定義 -->
<mt:SetVar name="fruit" value="バナナ">

<!-- 変数を呼び出す -->
<$mt:Var name="fruit"$>

<!-- 出力結果 -->
バナナ

以下は同じものをPHPで書いた例です。echo $fruit;の記述が<$mt:Var name="fruit"$>に相当します。

$fruit = 'バナナ';
echo $fruit; //<$mt:Var name="fruit"$>に相当する箇所

とりあえず覚えておくといいモディファイア

name

変数の名前を指定する。

value

valueモディファイアを付与するとMTSetVarと同じ挙動になる。

<!-- 以下の挙動はどちらも同じ -->
<mt:SetVar name="fruit" value="バナナ">
<mt:Var name="fruit" value="バナナ">

ただし、MTVarで変数を定義してしまうと、呼び出しのMTVarと混在することになりややこしいので、MTVarは変数の呼び出しでのみ使用(nameモディファイアのみ指定)することをオススメします。

MTGetVarとの違い

これも変数を呼び出すためのタグですが、現在非推奨となっています
名前からして変数を呼び出すものとわかりやすいのですが、将来的に機能としてプログラムから削除される可能性もあるため、使用はやめておくのが無難です。

なお、PowerCMSにおいては有効です。

MTSetVar

変数と値を定義する。値はMTVarで呼び出せる。
MTSetvarで定義した値は出力されない。

<!-- 変数を定義 -->
<mt:SetVar name="fruit" value="バナナ">

以下はMTVarの項目でも書いたPHPの例です。$fruit = 'バナナ';の記述が<mt:SetVar name="fruit" value="バナナ">に相当します。

$fruit = 'バナナ'; //<mt:SetVar name="fruit" value="バナナ">に相当する箇所
echo $fruit;

また、変数として定義した値は$をつけてモディファイアの値として利用可能です。

<!-- 変数を定義 -->
<mt:SetVar name="fruit" value="バナナ">

<!-- モディファイアの値として利用-->
<mt:Entries category="$fruit">
  <!-- 処理 -->
</mt:Entries>

とりあえず覚えておくといいモディファイア

name

変数の名前を指定する。
ここで設定する値をMTVarnameの値として利用します。

value

変数の値を指定する。

グローバルモディファイアのsetvar

グローバルモディファイアのsetvarも変数を定義するモディファイアです。MTSetVarと同様、setvarを付与したMTタグの値は出力されません。
ブロックタグとファンクションタグどちらにも付与できますが、ブロックタグの場合は後述するMTSetVarBlockと同様の結果になるため、主にファンクションタグで利用します。

以下はカテゴリ名にsetvarモディファイアを付与した例です。このモディファイアを付与した場合の値は、テンプレートタグで出力される値です。

<!-- 変数を定義 -->
<$mt:CategoryLabel setvar="cat_label"$>

<!-- 変数を呼び出す -->
<$mt:Var name="cat_label"$>

実際は<$mt:CategoryLabel$>だけでカテゴリ名を表示できるので、カテゴリ名を出力する目的で上記のような利用をすることはないですが、たとえばループ出力のブロックタグで、モディファイアの値として利用できます。
以下の例では、ページの再構築日と記事の更新日を比較して、同じ月であればNEWマークを表示しています。

<!-- MTML -->
<$mt:Date format="%Y%m" setvar="rebuildDate"$>

<mt:Entries lastn="0">
  <$mt:EntryDate format="%Y%m" setvar="newDate"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$><mt:If name="rebuildDate" eq="$newDate"> <span style="color: red;">NEW</span></mt:If></a></li>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.12.18  2024年12月の記事 <span style="color: red;">NEW</span></a></li>
  <li><a href="">2024.11.17  2024年11月の記事</a></li>
  <li><a href="">2024.10.16  2024年10月の記事</a></li>
  <li><a href="">2024.09.15  2024年9月の記事</a></li>
  <li><a href="">2024.08.14  2024年8月の記事</a></li>  
</ul>

MTSetVars

複数の変数と値をまとめて定義する。それぞれの値はMTVarで呼び出せる。 MTSetVarsの中ではMTタグを利用できる。
MTSetvarsで定義した値は出力されない。

以下のように、変数と値を=(イコール)で繋いで定義します。

<!-- 変数を定義 -->
<mt:SetVars>
  siteName=<mt:WebsiteName>
  siteUrl=<mt:WebsiteURL>
  siteDescription=<mt:WebsiteDescription>
</mt:SetVars>

<!-- 条件分岐を利用する例 -->
<mt:SetVars>
  <mt:If name="main_index">
    template_type_custom=main_index
  <mt:ElseIf name="datebased_archive">
    template_type_custom=datebased_archive
  <mt:ElseIf name="category_archive">
    template_type_custom=category_archive
  <mt:ElseIf name="entry_archive">
    template_type_custom=entry_archive
  <mt:ElseIf name="page_archive">
    template_type_custom=page_archive
  <mt:ElseIf name="contenttype_archive">
    template_type_custom=contenttype_archive
  <mt:ElseIf name="contenttype_archive_listing">
    template_type_custom=contenttype_archive_listing
  <mt:ElseIf name="search_results">
    template_type_custom=search_results
  </mt:If>
</mt:SetVars>

また、変数として定義した値は$をつけてモディファイアの値として利用可能です。

<!-- 変数を定義 -->
<mt:SetVars>
  blogID_parent=2
  blogID_news=3
</mt:SetVars>

<!-- モディファイアの値として利用-->
<mt:Entries blog_ids="$blogID_parent">
  <!-- 処理 -->
</mt:Entries>

コンテンツや設定する値ごとにMTSetVarsでグルーピングしておくと管理がしやすいです。
MTSetVarsの利用については以前記事を書いていたので、こちらもご参考ください。

https://zenn.dev/srkkr/articles/5a602f2e9b432c#定数をセットして使う

MTSetVarBlock

このブロック内で処理された結果が変数の値となる。値はMTVarで呼び出せる。
MTSetVarBlockの中ではMTタグを利用できる。
MTSetVarBlockで定義した値は出力されない。

以下の例では、一番最新の記事の日付を変数newDateの値として定義しています。

<!-- 変数を定義 -->
<mt:SetVarBlock name="newDate">
  <mt:Entries lastn="1">
    <$mt:EntryDate format="%Y%m%d"$>
  </mt:Entries>
</mt:SetVarBlock>

<!-- 変数を呼び出す -->
<$mt:Var name="newDate"$>

以下はPHPの例です。function sum($a, $b) { ... }の部分が<mt:SetVarBlock></mt:SetVarBlock>に相当します。

function sum($a, $b) { //MTSetVarBlockに相当
  $result = $a + $b;
  return $result;
}
echo sum(100, 200); //MTVarに相当

また、変数として定義した値は$をつけてモディファイアの値として利用可能です。

MTSetVarBlockを利用すると、記事の出力などMTで処理された結果を値として変数で定義できるので、使いこなすことでテーマ制作の幅が広がるかと思います。

とりあえず覚えておくといいモディファイア

name

変数の名前を指定する。
ここで設定する値をMTVarnameの値として利用します。

MTSetVarBlockの処理がうまくいかないときは

MTMLの記述間違いもないのに処理が変数の値として定義されない場合、MTSetVarBlock内の改行が原因ということがあるようです(ときどき筆者も遭遇していました)
その場合は、1行にコードを圧縮してみると、解決するかもしれません。

<!-- これを -->
<mt:SetVarBlock name="newDate">
  <mt:Entries lastn="1">
    <$mt:EntryDate format="%Y%m%d"$>
  </mt:Entries>
</mt:SetVarBlock>

<!-- 1行に圧縮する -->
<mt:SetVarBlock name="newDate"><mt:Entries lastn="1"><$mt:EntryDate format="%Y%m%d"$></mt:Entries></mt:SetVarBlock>

MTSetVarTemplateとの違いについて

MTSetVarBlockと似たような処理をするMTSetVarTemplateというタグがあります。これは主に管理画面で利用されますが、違いは以下の通りです。

  • MTSetVarBlock:囲んだ内容が処理された結果が変数の値となる
  • MTSetVarTemplate:囲んだ内容は処理されず、そのまま変数の値となる

どちらもMTVarで呼び出して利用しますが、MTSetVarTemplateの場合は呼び出されたタイミングで内容が処理されます。筆者の所感では、MTSetVarTemplateMTVarでの出力を動的に処理するようなもの(公式リファレンスにもある検索結果など)に利用するイメージです。
通常のテンプレートで利用する場合は、MTSetVarBlockで問題ないかと思います。

定義した変数をモディファイアの値として利用する際の注意点

前述の通り、変数として定義した値は$をつけてモディファイアの値として利用可能です。
ただし、変数の名前にハイフンを利用すると、$を利用したモディファイアを正常に評価できないようです。変数を定義する際に文字を繋ぐ場合は、ハイフンの代わりにアンダーバーもしくはキャメルケースを利用してください。

<!-- ハイフン(-)は利用せず -->
<mt:SetVar name="fruit-banana" value="バナナ">

<!-- アンダーバー(_)やキャメルケースを利用する -->
<mt:SetVar name="fruit_banana" value="バナナ">
<mt:SetVar name="fruitBanana" value="バナナ">

公式リファレンス

MT

PowerCMS

Discussion