CakePHP

[CakePHP] Pagination + Search ページ遷移時に検索条件を維持させる

2010/10/11 CakePHP No comments

CakeのPagenateについて。バージョンは1.3。

Pagenate使ってるときにconditionsを使うと、自動生成されるナビゲーションにはその条件が反映されない。
1ページ目は検索条件通り出てるのに2ページ目に進むとクリアされる現象が起きる。
その事についてはかなり既出のようだ。

検索条件を維持したままページ遷移するにはPagenateにクエリを渡さなければならない。

view/posts/index.ctp

<?php
//ファイルの先頭
$paginator->options(array('url' => $this->passedArgs));
?>
<?php echo $this->Form->create('Post',array('name'=>'search')); ?>
<?php echo $form->select('search.category', $category_label, NULL); ?>
<?php echo $this->Form->end('Search');?>

$category_label はfind(‘list’)で得たカテゴリーのidとラベルが入っているものとする。
(カテゴリーの選択は1記事あたりに1つのみってことで)
これで送信するとPostsControllerのindexメソッドで$this->data[‘search’]として受け取る事が出来る。

controller/posts_controller.php

var $paginate = array(
        'limit' => 25,
        'order' => array(
            'Post.id' => 'asc'
        )
    );
function index()
{
	if(is_numeric($this->data['search']['category'])){
		$this->paginate['conditions']['category'] = $this->data['search']['category'];
		$this->passedArgs['category'] = urlencode($this->data['search']['category']);
	}
	if(!empty($this->passedArgs['category'])){
		$this->paginate['conditions']['category'] =  $this->passedArgs['category'];
	}
        $this->set('posts',$this->paginate('Post'));
}

Pagenateの設定の仕方は殆どfind()と同じらしい。
$this->passedArgsに配列形式でクエリを渡せばページ移動しても検索状態が維持出来る。

渡す値は一応Sanitizeしといた方がいい気がする。

App::import('Sanitize');
Sanitize::clean($this->data['search']['category']);

[CakePHP] PagenatorのURLをGETな感じに変更したい

2010/10/10 CakePHP No comments

CakePHPのPagenationの便利さに感動したのも束の間、URL見て我が目を疑う。

http://example.com/news/page:3/sort:id/direction:asc

なにこれ!(゚Д゚lll) なんでコロン!?
世のCake使いのみなさんはこのURL気持ち悪くないんだろうか?

普通にアンバサンドとイコールで繋げてあるやつがいいんだけど…

http://example.com/news/?page=3&sort=id&direction=asc

検索しても根本的な解決方法が見つからないまま朝日を拝む始末…(今6時)

試しに後者のURLを打ち込んでみたら同じ動作になったから、
アンバサンドとイコールのURLでもソートやページングは機能するらしかった。
なら変更も出来るのじゃないかと検索していたら、変更した場合の問題についてのレスが見つかる。

(さらに…)