CakePHP ページネーション機能(Paginator)

基本

コントローラ

設定

public $paginate = [
 'limit' => 5,
 並び順設定はデータ取得時に実施する方が自由度が高いのでここでは行わない
 'order' => [
   'id' => 'DESC'
 ],
 アソシエーションデータ取得時に実施する方が自由度が高いのでここでは行わない
 'contain' => ['People']
];

Paginatorコンポーネント読み込み

public function initialize(){
 parent::initialize();
 ↓ は不要(デフォルトで使用できる)
 $this->loadComponent('Pagenator');
}

ページネーションを利用したデータ取得

public function list(){
 $lists = $this->paginate(
  $this->Products
   ->find()
   ->contain(['~'])
   ->where(['~ !=' => '0'])
   ->order(['~' => 'DESC', '~' => 'DESC'])
   );
  $this->set(compact('lists'));
}

ビュー

ページ移動

※~\src\Template\(コントローラ名)\(ビュー名).ctp
<div class="paginator">
 <ul class="pagination">
  <?= $this->Paginator->first('<< ' . '最初') ?>
  <?= $this->Paginator->prev('< ' . '前へ') ?>
  <?= $this->Paginator->numbers() ?>
  <?= $this->Paginator->next('次へ' . ' >') ?>
  <?= $this->Paginator->last('最後' . ' >>') ?>
 </ul>
</div>

ページ番号

【通常】
<?= $this->Paginator->numbers() ?>

【オプション】
<?=
  $this->Paginator->numbers([
    現ページより前のページがあれば'<<'を表示
    'before' => $this->Paginator->hasPrev() ?
     $this->Paginator->first('<<') : '',
    現ページより後のページがあれば'>>'を表示
    'after' => $this->Paginator->hasNext() ?
     $this->Paginator->last('>>')
    'modules' => 4
    'separator' => '|'
  ]);
?>

設定項目 機能
before 最初のリンクの前に表示する内容
after 最後のリンクの前に表示する内容
modules カレントページ番号を除いた表示リンク数
2の場合→1,2(カレント),3
separator リンク間区切り文字

カウンター

<?=
 $this->Paginator->counter([
  'format' => 'ページ {{page}} / {{pages}}, レコード {{current}} / {{count}} '])
?>

メソッド

メソッド 機能
next
prev
first 最初
last 最後
counterRange カウンター(format=rangeの場合)
counterPages カウンター(format=pagesの場合)
numbers ページ番号
current 現在ページ番号
sort ソートヘッダー(並び順未指定)
sortAsc ソートヘッダー(昇順)
sortDesc ソートヘッダー(降順)

組込変数

変数名 機能
{text} ページ番号
{url} 遷移先URL
{page} 現ページ番号
{pages} 総ページ数
{current} 現ページでのレコード数
{count} 総レコード数

独自リンク

テンプレート

※~\config\my-paginator-temp.php
<?php

$number  = '<span style="';
$number .= 'border: solid 1px black; ';
$number .= 'padding: 10px; ';
$number .= 'margin: 1px; ">';
$number .= '<a href="{{url}}">{{text}}</a>';
$number .= '</span>';

$current  = '<span style="';
$current .= 'background-color: black; ';
$current .= 'color: white; ';
$current .= 'border: solid 1px black; ';
$current .= 'padding: 10px; ';
$current .= 'margin: 1px; ">';
$current .= '{{text}}';
$current .= '</span>';

return [
 'number' => $number,
 'current' => $current
];

テンプレート読み込み

※~\src\View\AppView.php
class AppView extends View
{
 public function initialize()
 {
  $this->loadHelper(
   'Paginator', [
    'templates' => 'my-paginator-temp'
   ]);
 }
}