CakePHPでページネーションを実装する

# 対象読者
CakePHPでページネーションを実装する方法を知りたい人

# 検証環境
|ソフトウェア|バージョン|
------------|---------|
CakePHP | 4.7.5|
PHP | 8.1|

# 完成イメージ
イメージはこんな感じです。
1ページあたり表示件数を10件表示するようなページングを実装してみました。

![cakephp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/542674de-69c3-9bb4-315b-3b5e0608f692.png)

# 実装の手順
実装の手順は下記の通りとなります。
## Controllerにページネーションの機能を追加
Controllerの<b>initializeクラス(初期化クラス)</b>にページネーションを読み込ませます。

limitプロパティで、件数を指定してあげます↓
今回は、10件表示するように設定しました。
```
$this->paginate['limit'] = 10;
```
つづいて、今回は全ユーザー名を表示する画面にページネーションを付与します。
ページネーションを付与する基本的な処理の実装は下記です。

```
$this->paginate()
```

ユーザー全件表示する画面に対してページングをするので、記載はこうなります↓
```
$this->set('allUsers', $this->paginate($this->テーブル名->find('all')));
```
:::note info
<b>【処理の解説】</b>
①取得対象のテーブルからfind('all')関数を使って全件取得する。
②paginate()関数でページング機能を付与する。
:::

ここまでを踏まえて、Controllerのinitializeクラスの実装は、下記のようになります。
```RegistersController.php
<?php
declare(strict_types=1);

namespace App\Controller;

use Cake\ORM\TableRegistry;/*追加*/



/**
 * Registers Controller
 *
 * @method \App\Model\Entity\Register[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
 */
class RegistersController extends AppController
{       
    
    public function initialize(): void
    {
        parent::initialize();
        //companiesのDBを指定
        $this->usersTable = TableRegistry::get('users');
        //セッションをセットする
        $this->session = $this->getRequest()->getSession();
        //ページネーションで表示件数を指定
        $this->paginate['limit'] = 10;
    }

    ～(略)～
    /**
     * ユーザーを全権取得する
     */
    public function allusers()
    {
        //ページネーション機能を追加
        $this->set('allUsers', $this->paginate($this->usersTable->find('all')));
        //$this->set('allUsers', $this->paginate($this->usersTable->find('all')));
        $this->render(); 
    }
}
```

# 画面(ビュー)にページング機能を付与する
さいごに、画面にページング機能を作ってみましょう。

ページング機能は、paginateのオプション機能を使ってこのような感じで作ると良いです。

```
<div class="paginator">
    <ul class="pagenation" style="display:flex;list-style-type: none;"> 
        <?= $this->Paginator->first('<< ' . __('最初へ')) ?> | 
        <?= $this->Paginator->prev('< ' . __('一つ前')) ?> | 
        <?= $this->Paginator->numbers() ?> | 
        <?= $this->Paginator->next(__('次へ') . ' >') ?> | 
        <?= $this->Paginator->last(__('最後へ') . ' >>') ?> | 
    </ul>
</div>
```
これをふまえての画面のソースはこんな感じになります。

```allusers.php
<div>
    <h3>全ユーザー一覧</h3>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>NAME</th>
                <th>Password</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($allUsers as $user): ?>
                <tr>
                    <td><?=$user->id ?></td>
                    <td><?=h($user->name) ?></td>
                    <td><?=h($user->password) ?></td>
                </tr>
            <?php endforeach; ?> 
        </tbody>
    </table>
</div>

<div class="paginator">
    <ul class="pagenation" style="display:flex;list-style-type: none;"> 
        <?= $this->Paginator->first('<< ' . __('最初へ')) ?> | 
        <?= $this->Paginator->prev('< ' . __('一つ前')) ?> | 
        <?= $this->Paginator->numbers() ?> | 
        <?= $this->Paginator->next(__('次へ') . ' >') ?> | 
        <?= $this->Paginator->last(__('最後へ') . ' >>') ?> | 
    </ul>
</div>

            
```

以上です。

# スペシャルサンクス(参考にしたサイト)
■<b>CakePHP5 Paginate 表示件数(limit)を一括設定</b>

https://qiita.com/yamashita2525/items/3d8fb2f0817899ff1c9a

■<b>CakePHP ページネーション機能(Paginator)</b>

https://office-yone.com/cakephp_paginator/

■<b>【CakePHP入門】Pagenation（ページネーション）の使い方</b>

https://www.sejuku.net/blog/26859