Movable Typeでグローバルナビのテンプレートを作ってたのですが、将来的にメニューが増減したときに修正が楽なように、自動生成の仕組みを考えました。
MTも4.1以降はLoopタグが使えて便利になってるんですね。
MTSetHashVar と MTLoop を使ったグロバールナビのテンプレート
<MTIgnore><!-- リンク先のファイル名と、画像ファイル名の関係 --></MTIgnore>
<mt:SetHashVar name="baseImage">
<$mt:SetVar name="hoge" value="img_hoge.gif"$>
<$mt:SetVar name="piyo" value="img_piyo.gif"$>
<$mt:SetVar name="moge" value="img_moge.gif"$>
</mt:SetHashVar>
<div id="global_nav">
<MTIgnore><!-- あたかもハッシュをforeachで回すような処理 --></MTIgnore>
<mt:Loop name="baseImage">
<a href="<$mt:Var name="__key__"$>.html"><img src="img/<$mt:Var name="__value__"$> /></a>
</mt:Loop>
</div>
これで、<mt:SetHashVar> 〜 </mt:SetHashVar> の中身を増減すれば、新しいリンクに対応できますね!
で、めでたしめでたしかと思ったら、現在表示中のページでは、メニューの画像を別の画像に置き換えたい、とか言い出すじゃないですか。
じゃあ、MTIfで何とかするか〜と思ったら、
<mt:SetVar name="base_name" value="hoge">
<mt:Loop name="baseImage">
<MT:If name="base_name" eq="__key__">
<MTIgnore><!-- 表示中のページだったら、画像を切り替える処理 --></MTIgnore>
</MT:If>
</mt:Loop>
とかやろうとすると、動かない。
困ったなーと思って探したら、MTIfで変数と変数を比較する方法がやっと分かった。というエントリーを見つけて解決しました。
要は、__key__じゃなくて、$__key__にすれば問答無用で変数にアクセスできるみたいです。
Perlやってれば常識?
いや、むしろ「$」がエスケープされていないことにビックリですね。
ということで、以下、サンプル。
MTLoop 内で、MTIf を使ってkeyと変数を比較
<MTIgnore><!-- リンク先のファイル名と、画像ファイル名の関係 --></MTIgnore>
<mt:SetHashVar name="baseImage">
<$mt:SetVar name="hoge" value="img_hoge"$>
<$mt:SetVar name="piyo" value="img_piyo"$>
<$mt:SetVar name="moge" value="img_moge"$>
</mt:SetHashVar>
<MTIgnore><!-- 表示中のページ名を取得 --></MTIgnore>
<mt:SetVarBlock name="base_name"><$mt:PageBasename$></mt:SetVarBlock>
<div id="global_nav">
<mt:Loop name="baseImage">
<MT:If name="base_name" eq="$__key__">
<MTSetVar name="over_out" value="_over.gif">
<MT:Else>
<MTSetVar name="over_out" value="_out.gif">
</MT:If>
<a href="<$mt:Var name="__key__"$>.html"><img src="img/<$mt:Var name="__value__"$><$mt:Var name="over_out"$>" /></a>
</mt:Loop>
</div>
ハイ、できあがり。