ページング
検索結果を複数のページにわたって表示させたいときは、ページネーション機能を使います。ページ送り、ページングなどと呼ばれる機能です。コントローラーの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メソッドを実装して解決できます。