Movable Typeの検索結果で 「○件中 ○件-○件を表示中」を実現する

久々にMTネタです。内容はタイトルの通りです。

たまたま表示の必要があって調べたところ、MTにおいては

「検索結果 全7ページ中 5ページ目を表示」

と表示する機能はデフォルトで備わっておりますが、

「検索結果 全95件中 21-40件目を表示」

という、いかにも需要がありそうな表示を実現するタグ類は有りませんでした。

同じように悩む人もいらっしゃると思ったので、サンプルコードを記述します。

<mt:Ignore>○件中 ○-○件 表示のための変数取得 </mt:Ignore>

<mt:SetVarBlock name="current"><mt:CurrentPage /></mt:SetVarBlock>

<mt:SetVarBlock name="maxresult"><mt:SearchMaxResults /></mt:SetVarBlock>

<mt:SetVarBlock name="last_page_num"><mt:GetVar name="current" value="$maxresult" op="*"></mt:SetVarBlock>

<mt:SetVarBlock name="SearchResultCount"><mt:SearchResultCount /></mt:SetVarBlock>

<mt:SetVarBlock name="first_page_num"><mt:CurrentPage /></mt:SetVarBlock>

<mt:SetVar name="first_page_num" value="1" op="-">

<mt:SetVar name="first_page_num" value="$maxresult" op="*">

<mt:SetVar name="first_page_num" value="1" op="+">

<mt:Ignore>変数取得 ここまで</mt:Ignore>


<mt:SearchResultCount />件

<mt:Unless name="SearchResultCount" eq="0">中</mt:Unless>

<mt:Unless name="SearchResultCount" eq="0">

<mt:Var name="first_page_num" />―

<mt:If name="last_page_num" ge="$SearchResultCount">

<mt:SearchResultCount />

<mt:else>

<mt:var name="last_page_num">

</mt:If>件

</mt:Unless>

上記のソースを、検索結果のテンプレートに貼りつければ、表示されます。

こんな感じになります。

count

検索結果画面で利用できるMTタグ

MTの検索結果画面で利用できるタグはいくつかありますが、今回使うのは以下。

<mt:CurrentPage />
現在表示中のページは検索結果の総ページの何番目かを出力します。

<mt:SearchMaxResults />
検索結果を表示する1ぺーじの最大数を表示します。デフォルトは20件。

<mt:SearchResultCount />
検索の条件に合致した結果の件数を表示します。サンプル画像で言うと、63件がこれに当たります。

上記の3つの数を元に、表示を制御します。

以下、ソース解説です。

<mt:SetVarBlock name="current"><mt:CurrentPage /></mt:SetVarBlock>

<mt:SetVarBlock name="maxresult"><mt:SearchMaxResults /></mt:SetVarBlock>

<mt:SetVarBlock name="last_page_num"><mt:GetVar name="current" value="$maxresult" op="*"></mt:SetVarBlock>

まず、

・現在が何ページ目か
・現在のページの最後件数(サンプル画像では「40件」)

を取得します。

この画像では、20件目-40件目なので、検索結果ページ数で言うと2ページ目に当たります。これをcurrentという変数に一時保存。

次に、最大件数を変数maxresultに一時保存。

currentとmaxresultをかけると、当該ページの末尾件数が取得できます。サンプルでは「1ページあたり20件表示、現在は検索結果の2ページ目、つまり、末尾件数は2×20=40件」となります。

<mt:SetVarBlock name="first_page_num"><mt:CurrentPage /></mt:SetVarBlock>

<mt:SetVar name="first_page_num" value="1" op="-">

<mt:SetVar name="first_page_num" value="$maxresult" op="*">

<mt:SetVar name="first_page_num" value="1" op="+">

次に、

・現在のページの最初件数(サンプル画像では「21件」)

を取得して、変数first_page_numに格納します。

現在ページの最初件数を取得する場合

(現在ページ数-1)×1ページの表示件数+1

で表せます。サンプル画像の場合

(現在2ページ目-1)×20件+1=21件

となります。これを表したのが上記のソースとなります。

<mt:SearchResultCount />件

<mt:Unless name="SearchResultCount" eq="0">中</mt:Unless>

<mt:Unless name="SearchResultCount" eq="0">

<mt:Var name="first_page_num" />―

<mt:If name="last_page_num" ge="$SearchResultCount">

<mt:SearchResultCount />

<mt:else>

<mt:var name="last_page_num">

</mt:If>件

</mt:Unless>

最後に、

<mt:SearchResultCount /> 件中 <mt:Var name="first_page_num">-<mt:last_page_num>件

と記述してしあげます。ただし、この場合、検索結果が0件の場合

0件中 0-0件

と表示されて、あまり格好良くないため、「0件の時には 0-0件を表示しない」ために、<mt:unless>で真偽判定をしておきます。

また、検索結果の最後のページの場合、このままだと

63件中 61-80件

となってしまうため、

「変数last_page_numの数が検索件数を超えた場合、検索件数を表示。それ以外はlast_page_numを表示」

という条件判定をします。

というわけで、参考になれば幸いです。