libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

ページネーション (1/5)

作成:2015-10-10 09:25
更新:2015-10-10 09:25

■ページネーションとPagenator

多量のデータを表示するとき、一度に何千何万ものリストを表示する、なんていうのは避けたいところです。こういう場合に用いられるのが「ページ分け(ページネーション)」です。データを一定数ごとにページ分けし、1ページずつ表示していくのですね。

このページネーションは、まぁ自分で実装することも可能です。CakePHPではデータベースアクセスに「offset」「limit」というものが用意されていましたね。これを使うことで、指定の位置から一定数だけを取り出していくことができます。こんな具合に値を設定するわけです。
offset = n * p, limit = p
(p = ページ数。n = 1ページあたりの表示数)

これで一定数ごとにページ分けして表示することは可能です。が、正直いって面倒くさいのは確かですね。そこでCakePHPでは、こうしたページネーションに関する機能をフレームワーク側で提供するようにしました。

●コンポーネントのロード
$this->loadComponent('Paginator');
ページネーションは、「Paginator」というコンポーネントとして用意されています。これを利用するには、コントローラー側のinitializeメソッドなどで、loadComponentを使ってロードしておきます。

●エンティティの取得
$this->paginate();
ページのエンティティは、コントローラーの「paginate」メソッドで取り出します。単にこれでエンティティを取り出すだけで、そのページに表示するエンティティがまとめて取り出せます。あとはビューテンプレート側でforeachなどでエンティティを取り出し処理していくだけです。

では、実際にやってみましょう。前回まで使ったPersonsをそのまま利用します。まずは、テンプレート(index.ctp)を以下のように用意しておきましょう。ここでは、単純に$personsで渡された値からエンティティをforeachで繰り返し取り出し、中身を表示する、というだけのシンプルなものを用意しておきます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

<div>
    <h3>List Persons</h3>
    <table>
    <thead>
        <tr>
            <th>ID</th>
            <th>NAME</th>
            <th>AGE</th>
            <th>MAIL</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($persons as $person): ?>
        <tr>
            <td><?= h($person->id) ?></td>
            <td><?= h($person->name) ?></td>
            <td><?= h($person->age) ?></td>
            <td><?= h($person->mail) ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
    </table>
</div>

※関連コンテンツ

「初心者のためのCakePHP3 プログラミング入門」に戻る