最近、MTの仕事が多くなって来て、その際に初歩的すぎて本には書かれてなくて、初心者がつまづきやすいことをメモしていこっかなと。前に悩んだこととかも思い出して書いていこうっと。
MTに詳しい人は小馬鹿に見ていくがいい(笑)。


・MTのテンプレート内で使うMT特有のタグを「テンプレートタグ」と言うんだよ。
例)<MTEntries>とか<$MTPageBody$>とか<MTIf>とかね。

・テンプレートタグにはファンクションタグと、ブロッグタグがあり、ファンクションタグにはそれ独自で書くものと、ファンクションタグで挟んで書かなくてはいけないものがある。

・テンプレートタグにはウェブページ用のものと、ブログ記事用のものがある。
フォルダ名を書き出したいとき、ウェブページは<$MTFolderBasename$>で、ブログ記事はカテゴリと紐付けさせて作っておいたフォルダを<$MTCategoryLabel$>で指定する。

・そのウェブページが表示されている(格納されている)フォルダ名を書き出したいとする。
複数のページで使いたいので、テンプレートモジュールで書きたい。

テンプレートモジュールで
<p><MTPageFolder><$MTFolderBasename$></MTPageFolder></p>

と、いきなり書いても、再構築時に
<mtInclude>タグでエラーがありました: error in module second-gnavi:
テンプレート「second-gnavi」の再構築中にエラーが発生しました: <mtPageFolder>タグでエラーがありました:
mtPageFolderをコンテキスト外で利用しようとしました。MTPagesコンテナの外部に配置していませんか?

とエラーがでる。

ええーと思って、
<p><MTPages><MTPageFolder><$MTFolderBasename$></MTPageFolder></MTPages></p>

なんてやっちゃうと、
<MTPages>といったsがついたテンプレート類は、繰り返し処理をやってくれちゃうのだ。つまり、リストを作ってくれてしまうわけなんだけど、この場合は作成してあるウェブページ用のフォルダをすべて、羅列して書き出してくれちゃうわけ。

じゃあテンプレートモジュールで、リストを書き出すんではなくて、今表示しているページを格納しているフォルダだけ表示したい場合はどうするんだ…

ここでしばし悩む。

とある本で
SetVarなどのSet系テンプレートタグで設定した変数は、それが書かれたテンプレートの中だけで有効で、他のテンプレートには継承されない

っていうのを読んで、
ここではわかりやすく、<$MTFolderBasename$>を表示しようと書いてるけど、実際には変数を設定しようとしてたの。

で、そうか、テンプレートモジュールに書いちゃいけないのか!と思ったの。

ウェブページのテンプレートそのものに
<p><MTPageFolder><$MTFolderBasename$></MTPageFolder></p>

と書いてみると、ちゃんと表示されてるウェブページが格納されているフォルダ名だけを書き出してくれる。


でも同じグローバルナビの表記をウェブページとブログアーカイブやブログ記事にそれぞれ書くのは、なんとも効率的ではない。

と考えていて、デフォルトのテンプレや、パンくずリストのサンプルとか見ていて、ふと予約変数というものに気付く。
予約変数という存在に、今まで気付いてなかったよ、あたしゃ。

予約変数を使えば、用意にブログアーカイブやウェブアーカイブなどの分岐が簡単。
な上に、予約変数で分岐した中では、リスト系のファンクションタグで囲まなくてもいい。
だって、ウェブページの場合はウェブページ用のタグを使うって指定してるわけだけど、予約変数を使わない分岐のときは、ウェブページに使うか、ブログ記事に使うのかわからないのに、ウェブページ用のタグをむりくり入れてたので文句言われた訳だからね。

というわけで、テンプレートモジュールにはこーやって書けばよかったわけだねー。
<mt:if name="page_archive">
<p><MTPageFolder><$MTFolderBasename$></MTPageFolder></p>
<MTSetVarBlockname="foldername"><MTPageFolder><$MTFolderBasename$</MTPageFolder></MTSetVarBlock>
</mt:if>