CodeLab技術ブログ

プログラミング技術まとめ

[CakePHP2]セッションを利用したpagenateの検索条件の引き継ぎ

pagenateヘルパーでページングは非常に簡単に実装できますが、検索条件を付けようとするといろいろ問題があります。
クッキーで引き継ぎ、URLで引き継ぎなど色々な方法がありますが、ここではsessionを利用した方法を実装します。

AppController.php に以下のメソッドを追加

	/**
	* pagenater の検索条件引引き継ぎ
	* @param	$keyword	検索条件に付ける名称。
	*						指定しない場合は自動的に($keywords+コントローラー名+アクション名+adminかどうか) がセッションキーになる
	* @return	引き継がれた検索条件
	*/
	public function takeoverPagenateConditions($keyword=''){
		
		//セッションキーの確定
		if(empty($keyword)){
			$sskey = $this->params['controller'].$this->params['action'].$this->params['admin'];
		}else{
			$sskey = $keyword;
		}
		//POSTされていたらキーを更新する
		if($this->request->is('post')){
			$this->Session->Write($sskey,$this->request->data);
			return $this->request->data;
		}
		//ソートのリンクから飛んできたらセッションから引き継ぎ
		//$this->params['named']に何か入っていたらページ遷移orソートとみなす
		if(!empty($this->params['named']) AND $this->Session->check($sskey)){
			return $this->Session->read($sskey);
		}
		return array();
	}

コントローラーのアクションの中で$this->data = $this->takeoverPagenateConditions();をコールして$this->dataの中身で検索処理を行ってもらえればOKです。
$keywordについてですが、同一アクションで2つ使いたいとか、他のアクションで共通で使いたい場合以外は指定しなくてもOK。

viewでのポイントは、$this->Form->create()で、POSTするURLにページ番号やソートなどのパラメータが入らないようにURLを指定してください。

コメントは受け付けていません。