Oct.22, 2015 - 05h55m43s
  • ページング(晒)
このブログE/Gの記事リスト表示ページで
使用しているページングのソースです。

昔々、苦戦して書いた思い入れのある
アルゴリズムをどうぞ…

仕様の説明

ページングのレイアウトは下記の通りで
それぞれの数字がそのページへのリンク。

ページリスト表示数 >> 5
最大ページ数 >> 9ページ
の場合、1ページから9ページまで
順番に辿るとページングの動作は…

1ページ >> 1 2 3 4 5
2ページ >> 1 2 3 4 5
3ページ >> 1 2 3 4 5
4ページ >> 2 3 4 5 6
5ページ >> 3 4 5 6 7
6ページ >> 4 5 6 7 8
7ページ >> 5 6 7 8 9
8ページ >> 5 6 7 8 9
9ページ >> 5 6 7 8 9

…みたいな感じにページリストが変化。

ページリストが変化する4〜6ページは
現在のページが真ん中に居座るのがポイント。

phpソース

引数の内容は以下の通り。
$max_num >> 最大レコード数
$lim >> 1ページ内のレコード表示件数
$pg_list >> ページリスト表示数(5なら3 4 5 6 7など)
$pg >> カレントのページ
<?php
class Paging{

    public function makePageList($max_num, $lim, $pg_list, $pg){ 
        //数値の判定
        if( !is_numeric($pg) ) $pg = 1;
        //最大ページ数を取得 ---(1)
        $max_pg = ceil($max_num/$lim);
        //最大ページ数より大きな値を受け取れば1ページ目を作成
        if( $this->max_pg<$pg ) $pg = 1;

        ////ページリストを操作
        if($max_pg > $pg_list){
            //ページリスト変化の判定数値 ---(2)
            $not_move = ceil($pg_list/2);
            //ページリストが変化しない場合(min pg〜) ---(3)
            if($pg <= $not_move){
                $offset = 1;
            //ページリストが変化しない場合(〜max pg) ---(4)
            }elseif($pg > $max_pg-$not_move){
                $offset = $max_pg-$pg_list+1;
            //ページリストが変化する場合 ---(5)
            }else{
                $offset = $pg-floor($pg_list/2);
            }
        //最大ページ数 < ページリスト表示数ならループ数を調整 ---(6)
        }else{
            $pg_list = $max_pg;
            $offset  = 1;
        }
        ////ページリストを配列に格納 ---(7)
        for($i=0; $i<$pg_list; $i++){
            $loop_pg[] = $offset++;
        }
        return $loop_pg;
    }
}
?>
(1)最大ページ数を取得
>> レコード数が81件で10件ずつ表示なら9ページ必要。

(2)ページリストが変化する判定材料用の数値を取得
>> リスト表示数が5なら3が返ります。
>> 単純にリストの真ん中の値を出してるだけ。

(3)最小ページを含むリストを表示時のリスト最小値を取得
>> 上記の例なら3ページまでリストは変化せず最小値は1。
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

(4)最大ページを含むリストを表示時のリスト最小値を取得
>> 上記の例なら7ページからリストは変化せず最小値は5。
5 6 7 8 9
5 6 7 8 9
5 6 7 8 9

(5)上記(3)、(4)以外の場合のリスト最小値を取得
>> 上記の例なら4〜6ページの最小値は変化する。
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

(6)リスト表示数 > 最大ページ数ならリスト最大値を取得
>> リスト表示数が5で最大ページ数が3なら表示は1 2 3。

(7)上記より取得した値を元にページリストを配列に格納

HTMLソース

後は相変わらずSmartyのforeachでくるりんぱ。
<html>
{foreach from=$loop_pg key=key item=lp name=lp}
    {if $lp eq $pg}
    <li class='red'>{$lp}</li>
    {else}
    <li><a href='./foo.php?p={$lp}'>{$lp}</a></li>
    {/if}
{/foreach}
</html>
ifはカレントのページとページリストの値が同じ場合は
リンクを張らず、赤文字にする処理です。

そして実際に使用している完成形は以下の通り…

<< 1… 3 4 5 6 7 … 9 >>

…最少や最大、となりのページへの移動などなど
他の値も必要になってくるのでPagingクラスには
割愛したメソッドがあれこれとあります。

実を言うとどんな値を入れても正常に
表示出来るかはテストしきれてません…。

俺が使う分にはとりあえず十分って内容です。

ちなみに今現在このブログの記事リストの
表示件数は10件でページリスト表示数は5…

…なぜなら記事の数が追っつかないから… … …。