MTSetVarTemplateを用いた演算パッキングの例
MTSetVarTemplateテンプレートタグの特性を用いた、演算機能パッキングの例を紹介します。
MTSetVarBlockとMTSetVarTemplateの機能の相違点は次のようになります。
- MTSetVarBlock
- 再構築時には必ず実行される。
- MTSetVarTemplate
- 再構築時に、MTSetVarTemplateで定義された変数が参照されたときのみ実行される。
例1:普通に演算コードを書いてみる
以下の例では、tmpVal1とtmpVal2の値を足し合わせ、結果を2で割り、整数丸めを行っています。演算結果がマイナスになった場合は、演算結果を0で置き換えます。
なお、tmpVal1とtmpVal2の値は、3セット準備されています。
※このような演算は、CSSで定義された、とあるブロック内に配置する画像のpaddingを、変数を用いて自動演算させたい場合に考えられます。
<MTSetVar name="tmpVal1" value="50">
<MTSetVar name="tmpVal2" value="33">
<MTSetVar name="tmpVal1" op="-" value="$tmpVal2">
<MTSetVar name="tmp" value="$tmpVal1">
<MTSetVar name="tmp" op="/" value="2">
<MTIf name="tmp" lt="0">
<MTSetVar name="tmp" value="0">
</MTIf>
<p>1個目の計算値:<MTGetVar name="tmp" sprintf="%d"></p>
<MTSetVar name="tmpVal1" value="200">
<MTSetVar name="tmpVal2" value="100">
<MTSetVar name="tmpVal1" op="-" value="$tmpVal2">
<MTSetVar name="tmp" value="$tmpVal1">
<MTSetVar name="tmp" op="/" value="2">
<MTIf name="tmp" lt="0">
<MTSetVar name="tmp" value="0">
</MTIf>
<p>2個目の計算値:<MTGetVar name="tmp" sprintf="%d"></p>
<MTSetVar name="tmpVal1" value="70">
<MTSetVar name="tmpVal2" value="200">
<MTSetVar name="tmpVal1" op="-" value="$tmpVal2">
<MTSetVar name="tmp" value="$tmpVal1">
<MTSetVar name="tmp" op="/" value="2">
<MTIf name="tmp" lt="0">
<MTSetVar name="tmp" value="0">
</MTIf>
<p>3個目の計算値:<MTGetVar name="tmp" sprintf="%d"></p>
Movable Type 4以降で準備された変数演算は、便利ではあるものの、このような簡単な演算にも多数行に渡る「同じような」コードを書かねばならず、コードを書く効率が悪いですし、ソースの見通しが悪いです。
例2:MTSetvarTemplateで書き換えてみる
例1のコードをMTSetVarTemplateテンプレートタグで同等に書き換えた例が以下コードです。
<MTSetVarTemplate name="getpad">
<MTSetVar name="tmpVal1" op="-" value="$tmpVal2">
<MTSetVar name="tmp" value="$tmpVal1">
<MTSetVar name="tmp" op="/" value="2">
<MTIf name="tmp" ge="0">
<MTGetVar name="tmp" sprintf="%d">
<MTElse>
<MTSetVar name="tmp" value="0">
<MTGetVar name="tmp" sprintf="%d">
</MTIf>
</MTSetVarTemplate>
...(中略)...
<MTSetVar name="tmpVal1" value="50">
<MTSetVar name="tmpVal2" value="33">
<p>1個目の計算値:<MTGetVar name="getpad"></p>
<MTSetVar name="tmpVal1" value="200">
<MTSetVar name="tmpVal2" value="100">
<p>2個目の計算値:<MTGetVar name="getpad"></p>
<MTSetVar name="tmpVal1" value="70">
<MTSetVar name="tmpVal2" value="200">
<p>3個目の計算値:<MTGetVar name="getpad"></p>
MTSetVarTemplateタグで囲まれた部分が、変数演算機能をパッキングした部分で、計算のたびに同じコードが使用されます。
「...(中略)...」より下の部分で、演算機能を利用するときのコードを書きます(が、ここには演算コードはひとつも書きません)。tmpVal1変数とtmpVal2へ値を代入し、<MTGetVar name="getpad">と書いてgetpad変数を参照すると、MTSetVarTemplateで括られた(これには変数名nameにgetpadが指定されている)部分が実行されるわけです。
MTSetVarTemplateで定義されたgetpad変数が一度も参照されなかった場合は、MTSetVarTemplateで括られたコード群は一度も実行されませんし、100回参照されれば100回実行されます。演算機会が多ければ多いほどその真価を発揮します。
この演算の頻度が非常に多い場合は、このMTSetvarTemplateの部分は個別にモジュール化し、テンプレート先頭付近でそのモジュールをインクルードさせると更にすっきりします。
Movable Typeでは変数はグローバル変数(どこからでも参照できる)で扱われます。他のモジュールから参照することができます。同時に、意図しない変数の書き換えを行ってしまわないように注意が必要です。
- カテゴリ:Tips系