test

CakePHP Note

ページネーション

UPDATE:2010.01.12

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

コントローラ

モデルにfindメソッドを使う代わりに、コントローラのpaginateメソッドを使います。paginateメソッドでは検索対象のモデル、検索条件等を引数で指定します。

PostsControllerの例。

    $posts = $this->paginate('Post');
    // $this->paginate('Post',$conditions,$whitelist);検索条件を指定する場合
    $this->set('posts', $posts);


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

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

ビュー

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

counter

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

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

prev, next,numbers

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

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

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

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

  • title(タイトル「例:次のページ」)
  • option(オプション「class/tag,,など」)
  • disabledTitle(リンク無効時のタイトル「例:この先のページはありません」)
  • disabledOptions(リンク無効時のオプション「class/tag,,など」)


<div class="paging">
	<?php echo $paginator->prev('<< 前のページへ', array(), '前はありません', array('class'=>'disabled','tag'=>'span'));?>
 	<?php echo $paginator->numbers();?>
	<?php echo $paginator->next('次のページへ >>', array(), '次はありません', array('class'=>'disabled','tag'=>'span'));?>
</div>


numbersメソッドのオプション

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

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


sort

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

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

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

options

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

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

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