Movable Type の全テンプレート共通で読み込む config モジュールの定数的な変数はハッシュにすると便利かも

Movable Type でサイトを構築するとき、最終的にはかなりの数のテンプレートになることが多いです。

そのため、共通して使う「定数」のようなイメージの値を config という名前のモジュールにして、ほぼ全てのテンプレートで読み込むという方法を使う方は多いと思います。僕ら bit part もそうですし。

その config モジュールに書く変数を、そのままの変数で書かずに、ハッシュにしてあげると、何かと便利になったりするので、1つのアイデアとして紹介します。

そのままの変数でセット

普通に変数名と値でセットすると config モジュールは下記のようになります。

<mt:SetVarBlock name="blogid_website_main"><mt:WebsiteID></mt:SetVarBlock>
<mt:SetVarBlock name="dateformat">%Y/%m/%d</mt:SetVarBlock>
<mt:SetVarBlock name="base_keywords">Movable Type を始めよう!</mt:SetVarBlock>

この場合、値を取り出すときは下記のようになりますね。

<mt:Include module="config">
<h1>そのまま取り出す</h1>
<ul>
  <li>blogid_website_main : <mt:Var name="blogid_website_main"></li>
  <li>dateformat : <mt:Var name="dateformat"></li>
  <li>base_keywords : <mt:Var name="base_keywords"></li>
</ul>

これはこれで問題ないのですが、以下のようにハッシュを使うことで、使い道がぐっと広がります。

ハッシュ変数にする

上記の変数を conf という名前のハッシュ変数にセットしてみます。config モジュールは下記のようになります。

<mt:SetVarBlock name="conf" key="blogid_website_main"><mt:WebsiteID></mt:SetVarBlock>
<mt:SetVarBlock name="conf" key="dateformat">%Y/%m/%d</mt:SetVarBlock>
<mt:SetVarBlock name="conf" key="base_keywords">Movable Type を始めよう!</mt:SetVarBlock>

これを取り出すときは次のようになります。

<mt:Include module="config">
<h1>ハッシュからそのまま取り出す</h1>
<ul>
  <li>blogid_website_main : <mt:Var name="conf" key="blogid_website_main"></li>
  <li>dateformat : <mt:Var name="conf" key="dateformat"></li>
  <li>base_keywords : <mt:Var name="conf" key="base_keywords"></li>
</ul>

なお、config という変数名にはしないようにしてください。config はダイナミックの際に環境変数を取り出すときに使いますので。

さて、ハッシュにすると何がお得かはこれからです。

ハッシュにしたけどそのままの変数名でも取り出せる

ハッシュにしたはいいけれど、別の変数に値を渡すためには一度変数にセットしないとダメですね。なので、一番最初のように普通に変数名で取り出したくなります。

そういった場合は、config モジュールに下記の MTLoop を追加すれば、ハッシュのキーをそのまま変数名として取り出せるようになります。

<mt:Loop name="conf">
  <mt:SetVar name="$__key__" value="$__value__">
</mt:Loop>

取り出すときは下記のようになります。

<mt:Include module="config">
<h1>キーを変数名にして取り出す</h1>
<ul>
  <li>blogid_website_main : <mt:Var name="blogid_website_main"></li>
  <li>dateformat : <mt:Var name="dateformat"></li>
  <li>base_keywords : <mt:Var name="base_keywords"></li>
</ul>

一番最初の場合と全く同じです。「じゃあ最初からそうしろよ」という声が聞こえてきそうですが、ハッシュにしておくと次のような使い方も併用できます。

DynamicMTML でも使いたい

DynamicMTML でも同様に config モジュールを使いたいこともあります。その場合は、普通にダイナミックにモジュールを読み込んでも良いのですが、それだと DynamicMTML の処理のときにいちいち DB への無駄なアクセスが増える可能性があります。それを防ぐために、あらかじめ下記のようにして DynamicMTML ように変数を書き出すようにします。

<mt:If name="is_dynamic">
  <mt:Loop name="conf" replace="dmt:","mt:">
    <mt:Ignore><!-- ハッシュからそのまま取り出す --></mt:Ignore>
    <dmt:SetVarBlock name="conf" key="<mt:Var name="__key__">"><mt:Var name="__value__"></dmt:SetVarBlock>
    <mt:Ignore><!-- キーを変数名にして取り出す --></mt:Ignore>
    <dmt:SetVarBlock name="<mt:Var name="__key__">"><mt:Var name="__value__"></dmt:SetVarBlock>
  </mt:Loop>
</mt:If>

2015/11/25 追記ここから

ここでは mt:Loop タグに replace="dmt:","mt:" というモディファイアを付けて、最終的に出力するファイルにMTタグを書き出す方法を取っています。しかし、この方法では、

「dmt:SetVarBlock」タグは タグ名でテンプレートの検索をかけてもヒットしない可能性があるし、キーや値に「dmt」が含まれてたらどうなんだとか。

アルファサード野田さんよりFbへのコメントにて

という可能性もあります。したがって、この replace 部分を regex_replace にしてより正確に置換するか、もしくは別の接頭辞( _mt: など)にするか、など検討する必要があります。

2015/11/25 追記ここまで

ここでは is_dynamic という変数がセットされている場合だけ書き出すようにしています。あとは DynamicMTML 環境下のテンプレート(ファイル)で、次のようにして config モジュールを読み込めば、DynamicMTML 環境下でも無駄な負荷をかけることなく config モジュールの変数を使えるようになります。

<mt:Include module="config" is_dynamic="1">
<mt:DynamicMTML>
<h1>ハッシュからそのまま取り出す</h1>
<ul>
  <li>blogid_website_main : <mt:Var name="conf" key="blogid_website_main"></li>
  <li>dateformat : <mt:Var name="conf" key="dateformat"></li>
  <li>base_keywords : <mt:Var name="conf" key="base_keywords"></li>
</ul>
<h1>キーを変数名にして取り出す</h1>
<ul>
  <li>blogid_website_main : <mt:Var name="blogid_website_main"></li>
  <li>dateformat : <mt:Var name="dateformat"></li>
  <li>base_keywords : <mt:Var name="base_keywords"></li>
</ul>
</mt:DynamicMTML>

これで conf ハッシュ変数からでも、普通の変数からでの取り出せます。

つまり、ハッシュにセットしておくことで、数通りの使い方ができるということになります。

まとめ

これまでの説明をまとめると、config モジュールは下記のようになります。

<mt:Ignore><!-- ハッシュ変数をセット --></mt:Ignore>
<mt:SetVarBlock name="conf" key="blogid_website_main"><mt:WebsiteID></mt:SetVarBlock>
<mt:SetVarBlock name="conf" key="dateformat">%Y/%m/%d</mt:SetVarBlock>
<mt:SetVarBlock name="conf" key="base_keywords">Movable Type を始めよう!</mt:SetVarBlock>
<mt:Ignore><!-- ハッシュのキーを変数名としてセット --></mt:Ignore>
<mt:Loop name="conf">
  <mt:SetVar name="$__key__" value="$__value__">
</mt:Loop>
<mt:Ignore><!-- DynamicMTML 対応 --></mt:Ignore>
<mt:If name="is_dynamic">
  <mt:Loop name="conf" replace="dmt","mt">
    <mt:Ignore><!-- ハッシュからそのまま取り出す --></mt:Ignore>
    <dmt:SetVarBlock name="conf" key="<mt:Var name="__key__">"><mt:Var name="__value__"></dmt:SetVarBlock>
    <mt:Ignore><!-- キーを変数名にして取り出す --></mt:Ignore>
    <dmt:SetVarBlock name="<mt:Var name="__key__">"><mt:Var name="__value__"></dmt:SetVarBlock>
  </mt:Loop>
</mt:If>

スタティックに使いたいときは、

<mt:Include module="config">

DynamicMTML 環境でも変数を使いたいときは、

<mt:Include module="config" is_dynamic="1">

以上です。ハッシュや mt:Loop のご利用は計画的に。

  • このエントリーをはてなブックマークに追加
Just a second...