ページング

検索結果を複数のページにわたって表示させたいときは、ページネーション機能を使います。ページ送り、ページングなどと呼ばれる機能です。コントローラーのpaginateメソッドとビューのpaginatorヘルパーを使います。

コントローラ

モデルにfindメソッドを使う代わりに、コントローラのpaginateメソッドを使います。


PostsControllerの例。

    $posts = $this->paginate('Post');
    $this->set('posts', $posts);


コントローラの$paginate属性に検索対象のモデル、検索条件等のオプション・パラメータを指定する事ができます。このパラメーターはモデルのfind('all')と同様のconditions, fields, order, limit, page, contain, joins, and recursiveが利用できます。

    $this->paginate = array('POST'=>array(
                 'limit' => 25,
                 'order' => array('Post.created' => 'desc'))
        );
    $posts = $this->paginate('Post');
    $this->set('posts', $posts);


$paginate属性にあらかじめページネーションに必要なオプション・パラメータをセットしておく事もできます。

    var $paginate = array('POST'=>array('limit' => 25, 'order' => array('Post.created' => 'desc')));

ビュー

paginatorヘルパーを使用してページネーションに関する情報やナビゲーションのためのリンクを表示させます。

counter

現在何ページ目かといった情報をまとめて表示するにはcounterメソッドを使います。

echo $this->Paginator->counter(array(
'format' => '%page% / %pages% ページ,  全%count%件中%current%件, ( %start% から %end%)'));

prev, next,numbers

次のページや前のページへのリンクを作成するにはprevメソッドやnextメソッドを使います。numbersメソッドは1,2,3,,といった各ページへのリンクを作成します。

<div class="paging">
	<?php echo $this->Paginator->prev('<< 前のページへ');?>
 	<?php echo $this->Paginator->numbers();?>
	<?php echo $this->Paginator->next('次のページへ >>');?>
</div>

prevメソッド/nextメソッドのオプション

title, option, disabledTitle, disabledOptionsなどを指定できます。
disabledTitleまたはdisabledOptionsを指定すると、前あるは次のページがなくても「 前のページへ」のようなタイトルが表示されます。

prev ($title, $options, $disabledTitle, $disabledOptions)
  • title(タイトル「例:次のページ」)
  • option(オプション「class/tag,,など」)
  • disabledTitle(リンク無効時のタイトル「例:この先のページはありません」)
  • disabledOptions(リンク無効時のオプション「class/tag,,など」)
<div class="paging">
	<?php echo $this->Paginator->prev('<< 前のページへ', array(), '前はありません', array('class'=>'disabled','tag'=>'span'));?>
 	<?php echo $this->Paginator->numbers();?>
	<?php echo $this->Paginator->next('次のページへ >>', array(), '次はありません', array('class'=>'disabled','tag'=>'span'));?>
</div>

numbersメソッドのオプション

separator, modulus,urlなどを指定できます。

  • separator(区切り文字)
  • modulus(リンクの数)

sort

並び順を変更するためのリンクも作成できます。

    echo $this->Paginator->sort('Title', 'key');

'Title'という文字でkey順にソートするリンクを出力します。

options

format, separator, urlなど各オプションのデフォルト値を設定できます。


paginatorが生成するリンクのURLに検索用のキーワードを含める例。この後にpaginatorによって出力されるリンクに有効。

    echo $this->Paginator->options(array('url'=>"keyword:".urlencode($keyword)));

Group Byを使用する場合

'group'パラメータを使用していると件数取得がうまくいかず、ページングできません。件数を正しく取得できるようにモデルにモデルにpaginateCountメソッドを実装して解決できます。

Group Byしている時にpaginator->number()が表示されない件

CakePHP Note (v1.3)

Index