PowerSearchのEstraier検索結果で3点リーダー省略機能の付いたページャーを設ける
毎回同じ面倒を繰り返してるように見えるのでメモ。
PowerSearchの検索結果画面にて、次のような3点リーダーで途中のページを省略するタイプのページャーをやるとする。
<< 1...4 5 [6] 7 8 ...12 >>
標準のCMSテンプレートタグにこれを簡単にやるような機能は無い。
なので、次のようなロジックを組む必要がある。
<mt:EstraierMeta> <mt:SetVarBlock name="search_params">/search/?blog_id=<$mt:BlogID encode_html="1"$>&limit=<$mt:Var name="__limit__" encode_html="1"$>&query=<$mt:Var name="__query__" encode_html="1" encode_url="1"$><mt:EstraierTarget>&target=<$mt:Var name="__target__" encode_html="1"$></mt:EstraierTarget><mt:EstraierSuffix>&suffix=<$mt:Var name="__suffix__" encode_html="1"$></mt:EstraierSuffix>&offset=</mt:SetVarBlock> </mt:EstraierMeta> <MTEstraierBlock includeblogs="10" query="$__query__" limit="$__limit__" offset="$__offset__"> <mt:IfEstResultMatch> ... <mt:EstResultFooter> <mt:setvar name="num__display_range" value="2" /> <mt:setvar name="flag__exist_l_leader" value="0" /> <mt:setvar name="flag__exist_r_leader" value="0" /> <mt:EstResultPager> <mt:if name="__current__"> <mt:var name="__counter__" setvar="num__current_page" /> </mt:if> </mt:EstResultPager> <mt:EstResultPager> <mt:var name="flag__is_pager_start_item" value="0" /> <mt:var name="flag__is_pager_end_item" value="0" /> <MTEstResultPagerHeader> <mt:var name="flag__is_pager_start_item" value="1" /> </MTEstResultPagerHeader> <MTEstResultPagerFooter> <mt:var name="flag__is_pager_end_item" value="1" /> </MTEstResultPagerFooter> <MTEstResultPagerHeader> <ul class="pagination"> <mt:IfEstResultPrev> <li class="prev"><a href="<$mt:Var name='search_params'$><$mt:Var name='__prevoffset__'$>"><span>«</span></a></li> </mt:IfEstResultPrev> </MTEstResultPagerHeader> <mt:var name="flag__show_pager_item" value="0" /> <mt:if name="flag__is_pager_start_item" eq="1"> <mt:var name="flag__show_pager_item" value="1" /> <mt:elseif name="flag__is_pager_end_item" eq="1"> <mt:var name="flag__show_pager_item" value="1" /> <mt:elseif name="__counter__" eq="$num__current_page"> <mt:var name="flag__show_pager_item" value="1" /> <mt:elseif name="__counter__" gt="$num__current_page"> <mt:ignore>ループのフォーカス(=__counter__)がカレントページから2個以上右に離れてる時は、3点リーダーにする。</mt:ignore> <mt:var name="num__current_page" op="+" value="$num__display_range" setvar="num__threshold" /> <mt:if name="num__threshold" ge="$__counter__" > <mt:var name="flag__show_pager_item" value="1" /> <mt:else> <mt:setvar name="switch__set_leader" value="left" /> </mt:if> <mt:elseif name="__counter__" lt="$num__current_page"> <mt:ignore>ループのフォーカス(=__counter__)がカレントページから2個以上左に離れてる時は、3点リーダーにする。</mt:ignore> <mt:var name="num__current_page" op="-" value="$num__display_range" setvar="num__threshold" /> <mt:if name="__counter__" ge="$num__threshold" > <mt:var name="flag__show_pager_item" value="1" /> <mt:else> <mt:setvar name="switch__set_leader" value="right" /> </mt:if> </mt:if> <mt:if name="flag__show_pager_item" eq="1"> <mt:if name="__current__"> <li><a href="#" class="active"><span><mt:var name="__counter__" /></span></a></li> <mt:else> <li><a href="<$mt:var name="search_params"$><mt:var name="__offset__">"><span><mt:var name="__counter__" /></span></a></li> </mt:if> <mt:elseif name="switch__set_leader" eq="left"> <mt:if name="flag__exist_l_leader" ne="1"> <li><a href="#">...</a></li> <mt:setvar name="flag__exist_l_leader" value="1" /> </mt:if> <mt:elseif name="switch__set_leader" eq="right"> <mt:if name="flag__exist_r_leader" ne="1"> <li><a href="#">...</a></li> <mt:setvar name="flag__exist_r_leader" value="1" /> </mt:if> </mt:if> <MTEstResultPagerFooter> <mt:IfEstResultNext> <li class="next"><a href="<$mt:Var name='search_params'$><$mt:Var name='__nextoffset__'$>"><span>»</span></a></li> </mt:IfEstResultNext> </ul> </MTEstResultPagerFooter> </mt:EstResultPager> </mt:EstResultFooter> <mt:Else> <p>「<$mt:var name='search_keyword'$>」と一致する結果は見つかりませんでした。</p> </mt:IfEstResultMatch> </MTEstraierBlock>
num__display_range は、ページャーのフォーカスが当たってるページの前後何ページを、ページャー上のリンクとして表示するか、を指定する。
num__current_page はフォーカスの当たっているページ番号を取得する。
mt-search.cgiのようにMTCurrentPageのようなタグで一発取得出来ないので、EstResultPagerの予約変数__current__を使って取得する。
あーーーーめんどい!!