CodeIgniterのCI_Paginationを使わないで自作でページネーションを行う

CodeIgniterに同梱されているページネーション、Laravelと違ってDBなどと連携してくれないので、個人的には今ひとつ使いづらいのです。

$this->load->library('pagination');

$config['base_url'] = '/hogehoge/';
$config['total_rows'] = 100;
$config['per_page'] = 10;

$this->pagination->initialize($config);

$this->smarty->assign('pagination', $this->pagination->create_links());

こんな感じでリンクを作ってview側で表示する感じになるのですが、結局、GETでのデータ受け入れやらDB連携やらやら細かく整えて行く必要があり、手間もそこそこかかってきます。

求められるものが簡単なものなので、結局、自作したロジック作っちゃおうと。

求める画面出力

< 前のページ  1 / 2    次のページ >

これぐらいのページネーションで十分。

ページネーション作成処理

protected $per_page = 20;

public function get_pagination( $all_count, $page )
{
    $previous_page = null;
    $next_page = null;
    $total_page = null;

    if( $all_count > 1 ) {

        $total_page = floor(( $all_count - 1 ) / $this->per_page) + 1;

        if ($page != $total_page) {
            $next_page = $page + 1;
        }

        if ($page != 1) {
            $previous_page = $page - 1;
        }

    }

    return [
        'page' => $page,
        'total_page' => $total_page,
        'previous_page' => $previous_page,
        'next_page' => $next_page,
    ];
}

こんな感じで書いてみました。

全データ件数と今のページ番号を渡せば、トータルページ数と次のページ、前のページ(なければnull)を返してくれます。

DBへのアクセス

public function getList( $offset, $limit )
{
    return $this->db->offset($offset)->limit($limit)->get()->result_array();
}

modelファイルの呼び出し時に、今のページ番号から割り出したoffsetとlimitを渡してあげること。

$offset = $this->per_page * ($page - 1); // protected $per_page = 20;
$list = $this->hogehoge_svc->getList( $offset, $this->per_page );

viewは適当に

<ul>
    {if $pagination['previous_page']}
        <li><a href="/hogehoge/{$pagination['previous_page']}">&lt; 前のページ</a></li>
    {/if}
    {if $pagination['total_page']}
        <li>{$pagination['page']} / {$pagination['total_page']} ページ</li>
    {/if}
    {if $pagination['next_page']}
        <li><a href="/hogehoge/{$pagination['next_page']}">次のページ &gt;</a></li>
    {/if}
</ul>

こんな感じで出し分けすればOKです。

作り込めばもっと本格的になりますが、その場合はちゃんとページネーションライブラリを使いましょう(笑)