MTでグローバルナビを自動生成

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>

ハイ、できあがり。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です