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']}">< 前のページ</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']}">次のページ ></a></li>
{/if}
</ul>
こんな感じで出し分けすればOKです。
作り込めばもっと本格的になりますが、その場合はちゃんとページネーションライブラリを使いましょう(笑)