お知らせ

ブログ簡単パワーアップ FC2ブログスーパーカスタマイズテクニック2008年1月11日

拙著新刊の「ブログ簡単パワーアップ FC2ブログスーパーカスタマイズテクニック」が発売されました。
FC2ブログのさまざまなカスタマイズ方法を解説しています。
FC2ブログユーザーの皆様はぜひお買い求めください。

他にも多数書籍を執筆しています。
こちらもぜひご覧ください。

MTSetVarBlockタグの落とし穴

| コメント(2) | トラックバック(0)

Movable Type 4では、テンプレート内で変数を使う機能が強化されていて、変数の値で条件判断を行って出力内容を変えるなどのことができます。

変数を使う際には、テンプレートタグの再構築結果を変数に代入するために、「MTSetVarBlock」というタグを使うことがよくあります。
しかし、このタグには「改行」の落とし穴があります。
この落とし穴にはまる方が結構いるようですので、対処法を解説します。

1.改行が問題になる例

まず、ブログ記事リストテンプレートで、以下のようにタグを組むとします。
「hoge」という名前のカテゴリーだけ、出力する内容を変えようというものです。

<MTSetVarBlock name="catlabel">
<$MTCategoryLabel$>
</MTSetVarBlock>

<MTIf name="catlabel" eq="hoge">
カテゴリー名がhogeの時に出力する内容
<MTElse>
それ以外の時に出力する内容
</MTIf>

ところが、このタグの書き方では、思い通りの動作にはなりません。
この書き方だと、MTSetVarBlockの後の改行と、MTCategoryLabelタグの後の改行も、変数catlabelに代入されます。
つまり、変数の値は、「改行」+「カテゴリー名」+「改行」のような文字列になります。

hogeカテゴリーのページを再構築したときには、変数catlabelの値は「改行hoge改行」になります。
それをMTIfタグで「hoge」と比較しても、「一致していない」と判断されることになります。
その結果、思い通りの出力になりません。

2.MTSetVarBlockタグの中では改行を使わない

MTSetVarBlockタグを使って、テンプレートタグの値を変数に代入する場合は、MTSetVarBlockタグのブロックの中に改行を入れないようにします。
前述の例だと、以下のように書き換えれば、思い通りの動作になります。

<MTSetVarBlock name="catlabel"><$MTCategoryLabel$></MTSetVarBlock>

<MTIf name="catlabel" eq="hoge">
カテゴリー名がhogeの時に出力する内容
<MTElse>
それ以外の時に出力する内容
</MTIf>

3.変数内の改行を調べる

ある変数の中に改行が含まれているかどうかを確認するには、変数に値を代入する行の後に、以下のような行を入れてみると良いでしょう。
これは、変数の中の改行を「[br]」に置換して、HTMLのコメントにして出力するものです。

<!-- 変数名 = <MTVar name="変数名" regex_replace="/\n/g","[br]"> -->

例えば、変数fooに改行が含まれているかどうかを調べたい場合は、以下のようにします。

<!-- foo = <MTVar name="foo" regex_replace="/\n/g","[br]"> -->

トラックバック(0件)

このブログ記事を参照しているブログ一覧: MTSetVarBlockタグの落とし穴

このブログ記事に対するトラックバックURL: http://www.h-fj.com/mt/mt-tb.cgi/1045.

コメント(スレッド1件,コメント2件)

コメントはスレッド表示になっています。
また、スレッドの先頭のコメントに対する返信には、先頭に矢印を表示しています。

No.1 TAEKO : (無題)

こんにちは。
MT4になってからMTSetVarBlock使いまくり人間になっていたので大変参考になりました。

それで自分の書いたタグを調べてみたところ、ダイナミックとスタティックでは動作が違うケースもあることが分かりました。スタティックなら改行が入るのにダイナミックなら入らないとか、改行が入る場合も後ろに1つだけとか。
そのため、スタティックなら思い通りにならなかったりエラーになるケースでもダイナミックなら問題なく表示されてしまっていて、このことに気付かなかったようです。

常日頃からほとんどダイナミックオンリーで動かしているため、スタティックでの動作確認を行わないまま記事にしてしまうことも多かったので、これからは気をつけたいと思います。

No.2  Author Profile Page: (無題)

>TAEKOさん
こんにちは。

ダイナミックとスタティックではテンプレートエンジンが違うので、動作が100%同じにならないのも無理はないです。
ダイナミックとスタティックを組み合わせて使う場合、両者の違いを細かく把握していないと、思わぬ落とし穴にはまることもあるかと思います。

コメントする

管理者のみにコメントを送信したい場合は、「コメントを秘密にする」のチェックをオンにしてコメントを送信するか、メールフォームからメールをお送りください。

ブログ全体の感想など、この記事に直接に関係しないコメントは、ゲストブックにお気軽に投稿してください。


アーカイブ

ブログパーツ

ステータス