MTSearchResultsタグ内で__odd__等の変数を利用する

mixiのMovable Typeのコミュニティで、以下のような質問を見かけました。

<mt:Entries>で使える奇数偶数や開始終了を判定する__odd__、__last__等の変数は<mt:SearchResults>内で使用できないのでしょうか?
使えない場合、同等の判定をするやり方はあるのでしょうか?

この質問に答えてみます。

1.MTSearchResultsタグのブロックでは__odd__等の変数を使えない

Movable Type 4以降では、繰り返し系のブロックタグの中で、__counter__/__first__/__last__/__odd__/__even__の5種類の変数を使うことができます(こちらの記事を参照)。
ただ、ブロックタグによっては、上記の変数を使えるようにするための処理が入っていないタグもあります。

MT4.261のソースコードでMTSearchResultsタグの処理を調べてみたところ、__odd__等の変数を使えるようになっていませんでした。

2.__first__/__last__の代わりにMTSearchResultsHeader/MTSearchResultsFooterタグを使う

MTSearchResultsテンプレートタグのブロックの中では、繰り返しの最初/最後を判断するテンプレートタグとして、MTSearchResultsHeader/MTSearchResultsFooterを使うことができます。
__first__と__last__の変数の代わりに、これらのテンプレートタグを使うことができます。

具体的なタグの組み方は以下の通りです。

<mt:SearchResults>
・
・
・
  <mt:SearchResultsHeader>
    繰り返しの最初の時だけ出力する内容
  </mt:SearchResultsHeader>
・
・
・
  <mt:SearchResultsFooter>
    繰り返しの最後の時だけ出力する内容
  </mt:SearchResultsFooter>
・
・
・
</mt:SearchResults>

ちなみに、MTSearchResultsHeader/MTSearchResultsFooterタグのドキュメントは、日本語版のヘルプ(MOVABLETYPE.JPのサイト)にはないようでした。
英語版のヘルプ(MOVABLETYPE.ORG)にはドキュメントされています。

3.__counter__/__odd__/__even__のエミュレーション

一方、__counter__/__odd__/__even__の各変数は、テンプレートタグでエミュレーションすることができます。
具体的には、MTSearchResultsタグのブロックを以下のように組みます。

<$mt:Setvar name="__counter__" value="1"$>  
<$mt:SetVar name="__odd__" value="1"$>
<$mt:SetVar name="__even__" value=""$>
<mt:SearchResults>
  ・
  ・(各検索結果を出力するタグ等)
  ・
  <$mt:SetVar name="__counter__" op="++"$>
  <mt:If name="__odd__" eq="1">
    <$mt:SetVar name="__odd__" value=""$>
  <mt:Else>
    <$mt:SetVar name="__odd__" value="1"$>
  </mt:If>
  <mt:If name="__even__" eq="1">
    <$mt:SetVar name="__even__" value=""$>
  <mt:Else>
    <$mt:SetVar name="__even__" value="1"$>
  </mt:If>
</mt:SearchResults>

3-1.初期化

1~3行目は、ブロックに入る前に、__counter__/__odd__/__even__の各変数を初期化する処理です。

__counter__は繰り返しの回数をカウントする変数で、繰り返しの1回目では1になります。
したがって、初期値として1を代入します。

__odd__は、繰り返しの奇数回目では1、偶数回目では空の値になります。
繰り返しの1回目は奇数回なので、初期値として1を代入します。

また、__even__は__odd__の逆で、偶数回目に1、奇数回目は空の値になります。
そこで、初期値として空の値を代入します。

3-2.変数の値を変化させる

8~18行目は、ブロックの最後で、__counter__/__odd__/__even__の各変数を、次の繰り返しのために変化させる処理です。

__counter__は繰り返しが1回進むたびに1増えます。
そこで、MTSetVarタグの「op="++"」のモディファイアを使って、値を1増やします。

__odd__は、繰り返しが1回進むたびに、1と空値を交互に取ります。
そこで、9~13行目のMTIfタグを使って、以下のような流れに沿って値を変化させます。


変数__odd__の値を変える処理(クリックで大きく表示)

__odd__の値が1になっているとき(繰り返しの奇数回目)では、MTIfタグの条件が成立します。
そのため、<$mt:SetVar name="__odd__" value=""$>のタグが処理されて、__odd__の値は空値になります。

一方、__odd__の値が空値になっているとき(繰り返しの偶数回目)では、MTIfタグの条件が成立しません。
そのため、<$mt:SetVar name="__odd__" value="1"$>のタグが処理されて、__odd__の値は1になります。

同様の手順で、14~18行目で__even__の値も変化させます。