【CakePHP】ページネーションの基礎の基礎

ページネーションとは?

たくさん並んだデータをページ分けして、任意のページを開きやすくすることです。


わかりやすい例はGoogleの検索結果です。
ふつうGoogleの検索結果は、クエリにもよりますが膨大な件数で返ってきます。
ところが実際に画面に表示されるのは上位10件ほどで、残りは画面下方にあるページ選択を押すことでアクセスできます。

CakePHPでのページネーションとは、データベースに問い合わせて返ってきた結果を
一度に全て表示するのではなく、
上位数件のみを表示させ、残りを他のページへのジャンプ用リンクを使って表示させることをいいます。

 

今回はごくシンプルに、レコードをid昇順で表示させた上での
ページネーションをやってみます。

 

コントローラへの記述

public $paginate = array( 'limit' => 5, 'sort' => 'id', );

public
function index() { $this->set('items', $this->paginate()); }

$pagenateという配列を定義します。
limitには一度に表示する件数、'sort'には並び替えのキーにしたいフィールド名を入れておきます。

続いてthis->setでビューにページ分けされたレコードを送ります。

 

ビューへの記述

<table>
<tr>
<?php foreach ($items as $item): ?>
<td><?php echo $item['Item']['field_1']; ?></td>
<td><?php echo $item['Item']['field_2']; ?></td>
<td><?php echo $item['Item']['field_3']; ?></td>
<?php endforeach; ?>
</tr>
</table>

<?php echo $this->Paginator->numbers ( array ( 'before' => $this->Paginator->hasPrev() ? $this->Paginator->first('<<') : '', 'after' => $this->Paginator->hasNext() ? $this->Paginator->last('>>') : '', ) ); ?>

いつものようにforeach等でレコードを表示させたあと、Paginator->numbersでジャンプ用リンクを作ります。
これだけでもページ番号の数字は表示されますが、
beforeとafterを設定することで数字の前後のボタン(最初や最後にジャンプ、など)を設定できます。

 

ここではhasPrev(),hasNext()を使って、現在の表示ページよりも
前のページ、もしくは後ろのページがあれば''<<"というリンクを表示させています。

 

参考

https://book.cakephp.org/3.0/ja/controllers/components/pagination.html

http://cakephp.popotoo.com/other/310/