【Movable Type】変数を定義して利用する
概要
MT(PowerCMS含む、以下同)での変数の定義と使い方について解説しています。
あらかじめ定義されているブロックタグやファンクションタグだけでもテンプレートを作成するにはじゅうぶんですが、変数を定義して利用することにより、さらにより柔軟なMTML記述が可能になるかと思います。
MTで変数を定義・利用するためのタグは以下です。
MTVar
MTSetVar
-
servar
(グローバルモディファイア) MTSetVars
MTSetVarBlock
MTSetVarTemplate
ざっくりとした説明ですが使い方の基本としては、以下となります。
-
MTSetVar
やMTSetVarBlock
で変数と値を定義する -
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
変数の名前を指定する。
ここで設定する値をMTVar
のname
の値として利用します。
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
の利用については以前記事を書いていたので、こちらもご参考ください。
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
変数の名前を指定する。
ここで設定する値をMTVar
のname
の値として利用します。
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
の場合は呼び出されたタイミングで内容が処理されます。筆者の所感では、MTSetVarTemplate
はMTVar
での出力を動的に処理するようなもの(公式リファレンスにもある検索結果など)に利用するイメージです。
通常のテンプレートで利用する場合は、MTSetVarBlock
で問題ないかと思います。
定義した変数をモディファイアの値として利用する際の注意点
前述の通り、変数として定義した値は$
をつけてモディファイアの値として利用可能です。
ただし、変数の名前にハイフンを利用すると、$
を利用したモディファイアを正常に評価できないようです。変数を定義する際に文字を繋ぐ場合は、ハイフンの代わりにアンダーバーもしくはキャメルケースを利用してください。
<!-- ハイフン(-)は利用せず -->
<mt:SetVar name="fruit-banana" value="バナナ">
<!-- アンダーバー(_)やキャメルケースを利用する -->
<mt:SetVar name="fruit_banana" value="バナナ">
<mt:SetVar name="fruitBanana" value="バナナ">
公式リファレンス
MT
- https://www.movabletype.jp/documentation/appendices/tags/var.html
- https://www.movabletype.jp/documentation/appendices/tags/setvar.html
- https://www.movabletype.jp/documentation/appendices/tags/setvars.html
- https://www.movabletype.jp/documentation/appendices/tags/setvarblock.html
- https://www.movabletype.jp/documentation/appendices/tags/setvartemplate.html
- https://www.movabletype.jp/documentation/appendices/modifiers/setvar.html
PowerCMS
- https://www.powercms.jp/products/document/template-tags/var.html
- https://www.powercms.jp/products/document/template-tags/setvar.html
- https://www.powercms.jp/products/document/template-tags/setvars.html
- https://www.powercms.jp/products/document/template-tags/setvarblock.html
- https://www.powercms.jp/products/document/template-tags/setvartemplate.html
- https://www.powercms.jp/products/document/modifiers/setvar.html
Discussion