CakePHPで高速Webアプリ開発

第15回 Paginationで面倒なページ繰り処理とおさらばしよう

この記事を読むのに必要な時間:およそ 3 分

Pagination例その2:検索条件や取得フィールドなどを指定する

取得するレコードの検索条件の指定や,取得するフィールドの絞り込み,recusive値などを指定することもできます。

<?php
class SampleController extends AppController {
  var $name = 'Sample';
  var $uses = array('Post');
  var $paginate = array(
    'conditions' => array(
      'Post.status' => 'active',
    ),
    'fields' => 'Post.id, Post.title, Post.created',
    'order' => 'Post.id desc',
    'recursive' => -1,
  );
  functon posts() {
    $this->set('posts', $this->paginate('Post'));
  }
}

パラメータの形式はModel::find()メソッドの引数と同じです。

Pagination例その3:URLからのパラメータも引き継ぐ

URLから受け取ったパラメータを引き継ぎたいときは,ひと手間必要です。

例は,カテゴリーIdをURLから受け取れるようにして,http://example/sample/posts/123といったURLでアクセスする場合です。引き継ぎたい値をsetメソッドでビューに渡します。

<?php
class SampleController extends AppController {
  var $name = 'Sample';
  var $uses = array('Post');

  functon posts($category_id) {
    $this->paginate = array(
      'conditions' => array(
        'Post.category_id' => $category,
      ),
      'order' => 'Post.id desc',
    );
    $this->set('posts', $this->paginate('Post'));
    $this->set('paginator_option', array('url' => array($category_id)));
  }

ビュー側では,prev,next,numbersなどのメソッドの引数に引き継ぎたいパラメータを渡します。

<?php
  echo $paginator->prev('前へ', $paginator_option));
  echo $paginator->numbers($paginator_option);
  echo $paginator->next('次へ', $paginator_option);
?>

出力結果は以下のようになります。

| <span class="current">1</span> | <span><a href="/sample/posts/123/page:2">2</a></span> | <span><a href="/sample/posts/123/page:3">3</a></span> | <a href="/sample/posts/123/page:2">次へ</a>

また,⁠array($category_id)」の部分を「array('category_id' => $category_id)」とすれば,URLは「/sample/posts/category_id:123/page:2」になります。全てのURLに対応するにはルーティングの設定が必要になることがありますが,不可能ではありません。ちょっと複雑ですが,Paginationの恩恵は大きいので,ぜひマスターしたいところです。

まだまだある,PaginatorHelperのメソッド群

Paginatorができるのは前後のリンクとページ番号だけではありません。PaginatorHelperのメソッド群を利用すればかなり複雑なページ繰り表示にも自由に対応できます。メソッド群の一部を表にしました。

counter()「1ページ目を表示 4ページ中」といった表示
current()現在のページ番号
first()最初のページへのリンク
last()最後のページへのリンク
hasNext()次のページがあるか (true or false)
hasPrev()前のページがあるか (true or false)
hasPage($page)指定のページ番号のページがあるか (true or false)
$paramsページ数などの情報やパラメータが詰まった連想配列。例えば $paginator->params['paging']['Post']['count'] で件数を取得できる。

とくに$paginator->params変数の中身は,自由なページ繰り表示には欠かせませんので,var_dumpするなどして一度構造を確認しておくと良いでしょう。

著者プロフィール

秋田真宏(あきたまさひろ)

株式会社ロケットスタート エンジニア。個人ブログは「akiyan.com」。1981年生まれ。

URLhttp://www.akiyan.com/

著書