条件をつけたpaginator

paginator便利ですよねー。
ところが条件づけをやるとうまくいかないことがあります。
特に、ページ繰りでURLに条件をつっこめないなど。

“条件をつけたpaginateでページ繰りができない” フォーラム – CakePHP Users in Japan
ここでいろいろ話になってますが、正しくはこうすればいいようです。

●コントローラ(filter引数のみ抜粋)

if( isset( $this->params["named"]["filter"] ) ) {
    $filter = $this->params["named"]["filter"] ;
} else {
    $filter = null ;
}
$this->set( "filter_cond" , $filter ) ;

●ビュー(paginatorのページ処理だけ抜粋)

if ( $filter_cond !== null ) {
    $u_filter = array( "url" => array( "filter:" . $filter_url ) ) ;
} else {
    $u_filter = array() ;
}
echo $paginator->prev('<< '.__('previous', true), $u_filter , null, array( 'class'=>'disabled'));
echo $paginator->numbers( $u_filter );
echo $paginator->next(__('next', true).' >>', $u_filter , null, array('class' => 'disabled'));

prev,nextは、2番目の引数にURLのオプションを指定します。

2番目が$optionsなんですよね。
ちなみに$optionsは、prev/next関数が呼ばれてる、__pagingLink関数の中でこう扱われています。

$options = array_merge($_defaults, (array)$options);

この$optionsから$urlを作っています。
ですからoptionsの2番目に設定しないとだめです。

cake/libs/view/helpers/paginator.php の、prev / next 関数から呼ばれてる、__pagingLink 関数を参照してみてください。



追記。$paginator->optionsでよかったのかよ。

$paginator->options( array( "url" => array( "filter:" . $filter_cond ) ) )  ;

参考文献
CakePHP1.2 RC2 Paginate で検索条件をURLで引き継ぐ – 忍び歩く男 – SLYWALKER とか
Abstract Sunriseな日々 | [CakePHP]paginatorで楽にパラメータを引き継ぐ あたり。

Comments are closed.