MTのテンプレート判別・分岐でハマったところ

MovableType使ってると、テンプレートの種別を判別して、表示内容を変えることは良く(?)使うかと思います。
私は良く、分岐用のモジュール1つ作って、全部のテンプレートに読み込ませて判断させたりしてるんですが、そこでちょびっとハマった事がありました。

今回のはMT4なので、MT5ではどうなってるか判りません。
また、条件がちょっと特殊なので、普通に使ってる分には気にしなくて良いです。
というワケで、ぶつかったのは以下の条件の時。

  • 1つのテンプレート・モジュールに、テンプレートの種別を判断する条件文を書いてる時
  • 上のテンプレート・モジュールを読み込ませて、表示内容を変更する時
  • ※同じ内容のインデックスやアーカイブを、複数利用する時
  • アーカイブの優先度チェックを入れていないテンプレートの場合

「※」の項目については、例えば「ブログ記事」アーカイブを、「ブログ記事サブ」とかの名前でもう1つ作って使うような場合です。
アーカイブマッピングが「ブログ記事」のものが2つある状態ですね。
また、1つの「ブログ記事」アーカイブで2つのマッピングを行っている状態ではなく、あくまで2つのブログ記事アーカイブを利用している時です。

なので状況としては、1つのサイトのファイルを2種類のURLで生成してる時、って思って貰うと良いです。

テンプレートの判別がうまくいかない状態

以下の記述を1つのテンプレート・モジュールに書いて、各インデックスやアーカイブ等のテンプレートで読み込ませます。

<mt:If name="main_index">
<mt:SetVarBlock name="hoge">トップの時</mt:SetVarBlock>
<mt:ElseIf name="archive_index">
<mt:SetVarBlock name="hoge">アーカイブ用インデックスの時</mt:SetVarBlock>
<mt:ElseIf name="entry_archive">
<mt:SetVarBlock name="hoge">エントリーの時</mt:SetVarBlock>
<mt:ElseIf name="page_archive">
<mt:SetVarBlock name="hoge">ウェブページの時</mt:SetVarBlock>
<mt:Elseif name="category_archive">
<mt:SetVarBlock name="hoge">カテゴリの時</mt:SetVarBlock>
<mt:ElseIf name="datebased_archive">
<mt:SetVarBlock name="hoge">月や年アーカイブの時</mt:SetVarBlock>
<mt:else>
<mt:SetVarBlock name="hoge">その他</mt:SetVarBlock>
</mt:If>

そして、表示させる際には以下ですね。

<$mt:GetVar name="hoge"$>

ところが、追加作成したインデックス(カスタム・インデックス)やテンプレートにおいて、$hogeの箇所がすべて「アーカイブ用インデックスの時」が表示されてしまいます。

それならと、各インデックスの場合は、アーカイブテンプレートに設定される予約変数を設定。
カスタム・インデックスのテンプレートの先頭辺りに以下を追加。で、解決。

<$MTSetVar name="main_index" value="1"$>

テンプレートに設定する予約変数についてはこちら。
アーカイブテンプレートに設定される予約変数

だけど弱ったのは、カスタム・インデックスの方は解決しても、各アーカイブの方が正しく判別されない。。。予約変数書いてもダメっぽい。
追加した各アーカイブ自体は、ブログ記事やカテゴリなど、その種類はもちろん設定されている。
だけど、表示内容が <mt:ElseIf name="archive_index"> の時になってしまう状態。

解決方法は順序の入れ替え?

ひょっとして、と思って、ElseIfで分岐させている順番を入れ替えてみたところ、判別がうまく稼働するようになりました。
先のコードでいえば、こんな状態。

<mt:If name="main_index">
<mt:SetVarBlock name="hoge">トップの時</mt:SetVarBlock>
<mt:ElseIf name="entry_archive">
<mt:SetVarBlock name="hoge">エントリーの時</mt:SetVarBlock>
<mt:ElseIf name="page_archive">
<mt:SetVarBlock name="hoge">ウェブページの時</mt:SetVarBlock>
<mt:Elseif name="category_archive">
<mt:SetVarBlock name="hoge">カテゴリの時</mt:SetVarBlock>
<mt:ElseIf name="datebased_archive">
<mt:SetVarBlock name="hoge">月や年アーカイブの時</mt:SetVarBlock>
<mt:ElseIf name="archive_index">
<mt:SetVarBlock name="hoge">アーカイブ用インデックスの時</mt:SetVarBlock>
<mt:else>
<mt:SetVarBlock name="hoge">その他</mt:SetVarBlock>
</mt:If>

archive_indexの位置を最下部にしてみました。
すると、テンプレート判別が稼働するようになりました。

ちょこっとまとめてみる

アーカイブの優先度チェックを入れているアーカイブ・テンプレートには、予約変数がきちんと設定される。
けれども、追加して優先度チェックを入れていないアーカイブの場合は、たとえアーカイブ・マッピングの種類が設定されていたとしても、その種類に適用されるハズの予約変数が設定されない、ということになるのかなぁ。。。

と、一瞬考えてしまったけど、判別出来てるじゃないか!と自分にツッッッコミひとつ。

で、アーカイブの優先度チェックを入れていないテンプレートの場合は、その予約変数が、もともと設定されるはずのものより、archive_index の方が優先されてしまうのかなぁ。。。と思いました。

というワケで、条件分岐を利用する際には、

  • 出来るだけ予約変数を宣言しましょう。
  • カスタム・インデックスの時には、任意の変数作って、おいておきましょう。
  • 念の為、archive_index 判定時には、これは分岐の最後に置きましょう。

とする事で、混乱するもとを少なくする事が出来そうだ、と思いました。
主に自分のために。。。(汗

あとがき

MTのサイトを制作する際は、ローカルで編集して生成させつつ進めます。
その際、私のローカルxamppでは動作が遅いので、以下のプラグインを利用させて貰い、再構築せずにやっちゃう事があります。
Perl版ダイナミック・パブリッシング(MT4.2用) - The blog of H.Fujimoto

どうやら5版もあるみたいですね。
このプラグインは本当に便利です。ダイナミック・パブリッシングに一度挫けた自分でも導入出来ました!と、宣伝したくなるくらいです。
似たような環境で制作してるひとは、ぜひ一度使ってみると良いと思います。
このおかげで、リロードするだけで変数の動きを確認する事が出来ました。
素晴らしいです丶(・ω・)ノ

▲ to Top

トラックバック(0)

▲ to Top