MTSetVarTemplate タグを function のように使ってみる

これは Movable Type Advent Calendar 2015 の1日目の記事です。

さて、先週末に開催された MTDDC Meetup TOKYO 2015 に参加してきました。
かなりドキドキしながら野田さんのセッションを聞いたところ、確かに改善できる点が多々あるなと痛感。。。

やはりお前らのMTMLは間違っている! - Junnama Online:
http://junnama.alfasado.net/online/2015/11/mtml.html

とは言え、凹んでばかりもいられないので、すぐにでも実践できそうなアイデアを考えてみました。

そもそも、何が間違っていたのか?

細かい内容は前述のリンク先にあるスライドを見ていただきたいのですが、特に響いたのは下記の2点でした。

  • 自由に書ける MTML の記述でも、MVC を意識した作りにする
  • 極力、誰が見ても判りやすいコードにする

「note モディファイアに日本語で変数の説明などを書く」のはすぐにできるものの、ビューとロジックを分けたくてもプラグインを自作できない現状だと MTML を上手く使うしかありません。

そこで、タイトルの通り「MTSetVarTemplate タグを function っぽく使う」方法で改善してみようと思います。

やってみる

意図したのは、下記のような使い方ができないか?ということ。

<?php
  function foo($params){
    $string = '例えば' . $params . 'です';
    echo $string;
  }

  foo('こんな感じ');
?>

MTSetVarTemplete でそれっぽく記述してみると、こうなります。

<mt:SetVarTemplate name="_function" key="foo" note="_function{foo}の定義">
  <mt:LocalVars>
    <mt:SetVarBlock name="string">例えば<mt:Var name="_params" />です</mt:SetVarBlock>
    <mt:Var name="string" note="変数:string をここで出力" />
  </mt:LocalVars>
  <mt:DeleteVars name="key","_params" note="実行後に不要な変数を削除" />
</mt:SetVarTemplate>

<mt:Var name="_function" key="foo" _params="こんな感じ" note="_function{foo}を実行" />

ポイントは、以下の4点。

  • MTSetVarTemplate が function 定義になるイメージ。名称を key で指定するため、グローバル変数は共通
  • ブロック内で必要な変数は、MTLocalVars タグでローカル変数として追加
  • 処理を終える際、ブロック外で不要となるグローバル変数を MTDeleteVars タグで除去
  • 実行時は、_params モディファイアで引数にあたる変数をセット

実際には _function に含める MTSetVarTemplate をモジュール化することになりそうですが、ロジックの記述先を一元化できるので多少は判りやすいハズ。。。

なお、MTLocalVars タグと MTDeleteVars タグの利用には GetHashVar プラグインが必要です。

テンプレート変数が配列やハッシュの時に値を取得する GetHashVar プラグイン | PowerCMS ブログ:
http://www.powercms.jp/blog/2015/10/gethashvar.html

余談

今更ながらに「MTSetVarTemplate で key を指定できること」と「MTVar でリファレンスにないモディファイアを指定したとき、MTSetVarTemplate 内で変数として値を参照できること」に初めて気がつきました。

プラグインの導入でローカル変数を使えるようになることとあわせて、上手く使い分けつつ、判りやすい MTML を書けるよう日々精進したいと思います。

もちろん、あわよくば思う様プラグイン開発できるようになりたいのですが、いつになることやら(。-_-。)