top

ダイナミック・パブリッシングで頁分割(11) Smarty版バリエーション編(2)

メインサイトの頁分割を少し変更したので覚え書き。記事数が多くなってくると分割頁も増大して、分割リンクが果てしなくズラズラ並び続けて見た目もあまりよろしくなくなります。そこで常に指定した数だけの分割リンクになるようカスタマイズ。公式編でやってみたことのSmarty版です。もっといい書き方もあると思いますが、取りあえず現状動作確認できたものを。

1.1頁に表示させる件数の設定
<MTEntries>を以下のように書き換えます。

{{assign var="epp" value=10}}
<MTEntries lastn="10" offset="`$smarty.request.offset`">

赤字の数字の部分で1頁に表示する件数を決めます。2か所とも同じ数字にします。

2.分割用のコード
赤字の部分はテンプレートによって変更を。

●サンプル1 « < 2 3 4 5 6 7 8 9 > »
前後4件を表示する基本のパターン。

{{capture assign="count"}}<$MTBlogEntryCount$>{{/capture}}
{{if $count > $epp}}
 
{{if $smarty.request.offset > 0}}
<a href="?offset=0">&laquo;</a>
<a href="?offset={{$smarty.request.offset-$epp}}">&lt;</a> 
{{else}}
&laquo; &lt;
{{/if}}
 
{{math equation="floor(($count-1)/$epp)+1" assign="numloop"}}
{{section name=npage loop=$numloop}}
 
{{if $smarty.request.offset+1 < ($smarty.section.npage.index+5)*$epp && $smarty.request.offset+1 > ($smarty.section.npage.index-4)*$epp }}
{{if $smarty.request.offset+1 < ($smarty.section.npage.index+1)*$epp && $smarty.request.offset+1 > $smarty.section.npage.index*$epp }}
{{$smarty.section.npage.index+1}}
{{else}}
<a href="?offset={{$smarty.section.npage.index*$epp}}">{{$smarty.section.npage.index+1}}</a>
{{/if}}{{/if}}
 
{{/section}}
 
{{if $smarty.request.offset < $count-$epp}}
<a href="?offset={{$smarty.request.offset+$epp}}">&gt;</a> 
<a href="?offset={{($numloop-1)*$epp}}">&raquo;</a>
{{else}}
&gt; &raquo;
{{/if}}
 
{{/if}}

青字の部分で前後に出す件数を指定出来ます。単純に前後4件を出しているだけなので、最初は « < 1 2 3 4 5 > » という形で始まります。頁数が増えるにつれてサンプル例の形になります。

●サンプル2 < 1 ... 11 12 13 14 15 16 17 18 19 ... 40 >
最初と最後へのリンクを頁数にしてみた例。

{{capture assign="count"}}<$MTBlogEntryCount$>{{/capture}}
{{if $count > $epp}}
 
{{if $smarty.request.offset > 0 && $smarty.request.offset < 5*$epp}}
<a href="?offset={{$smarty.request.offset-$epp}}">&lt;</a>
{{elseif $smarty.request.offset > 4*$epp}}
<a href="?offset={{$smarty.request.offset-$epp}}">&lt;</a>
<a href="?offset=0">1</a> ... 
{{else}}
&lt;
{{/if}}
 
{{math equation="floor(($count-1)/$epp)+1" assign="numloop"}}
{{section name=npage loop=$numloop}}
 
{{if $smarty.request.offset+1 < ($smarty.section.npage.index+5)*$epp && $smarty.request.offset+1 > ($smarty.section.npage.index-4)*$epp }}
{{if $smarty.request.offset+1 < ($smarty.section.npage.index+1)*$epp && $smarty.request.offset+1 > $smarty.section.npage.index*$epp }}
{{$smarty.section.npage.index+1}}
{{else}}
<a href="?offset={{$smarty.section.npage.index*$epp}}">{{$smarty.section.npage.index+1}}</a>
{{/if}}{{/if}}
 
{{/section}}
 
{{if $smarty.request.offset > ($numloop-6)*$epp && $smarty.request.offset < $count-$epp}}
<a href="?offset={{$smarty.request.offset+$epp}}">&gt;</a>
{{elseif $smarty.request.offset < ($numloop-5)*$epp}}
... <a href="?offset={{($numloop-1)*$epp}}">{{$numloop}}</a>
<a href="?offset={{$smarty.request.offset+$epp}}">&gt;</a>
{{else}}
&gt;
{{/if}}
 
{{/if}}

最初と最後へのリンク(1 ... の部分)は現在の頁が最初と最後の時は表示されません。

●サンプル3 « 1 2 3 4 5 6 7 8 9 10 »
常に10件分を表示します。最初と最後でも表示件数を揃えたい場合に。

{{capture assign="count"}}<$MTBlogEntryCount$>{{/capture}}
{{if $count > $epp}}
 
{{if $smarty.request.offset > 0}}
<a href="?offset=0">&laquo;</a>
{{else}}&laquo;{{/if}}
 
{{math equation="floor(($count-1)/$epp)+1" assign="numloop"}}
{{section name=npage loop=$numloop}}
 
{{if $smarty.request.offset+1 < 5*$epp }}
{{assign var="fpage" value="0"}}{{assign var="mpage" value="11"}}
{{elseif $smarty.request.offset+1 > ($numloop-6)*$epp }}
{{assign var="fpage" value="`$numloop-10`"}}{{assign var="mpage" value="`$numloop+1`"}}
{{else}}
{{capture assign="fpage"}}{{($smarty.request.offset-(4*$epp))/$epp}}{{/capture}}
{{capture assign="mpage"}}{{($smarty.request.offset+(7*$epp))/$epp}}{{/capture}}
{{/if}}
 
{{if $smarty.section.npage.index+1 > $fpage && $smarty.section.npage.index+1 < $mpage }}
{{if $smarty.request.offset+1 < ($smarty.section.npage.index+1)*$epp && $smarty.request.offset+1 > $smarty.section.npage.index*$epp }}
{{$smarty.section.npage.index+1}}
{{else}}
<a href="?offset={{$smarty.section.npage.index*$epp}}"> {{$smarty.section.npage.index+1}}</a>
{{/if}}{{/if}}
 
{{/section}}
 
{{if $smarty.request.offset < $count-$epp}}
<a href="?offset={{($numloop-1)*$epp}}">&raquo;</a>
{{else}}&raquo;{{/if}}
 
{{/if}}

公式タグもあるけれど、SmartyにしておけばMTのバージョンに関係なく確実に動作するというのはある…。