かばだんなさん かく語りぬ Header Image

CakePHPのPaginatorに独自のパラメータを追加(CakePHP2.3)

しばらく前に「CakePHPのPaginatorに独自のパラメータを追加」なんて記事を書きましたが、あれから2年もたちまして、PaginatorHelperも少しインターフェースが変わりました。ということで、同じことをCakePHP2.3系で書いたらどうなるかというのを書いてみましょう。

※ 詳しくは拙書「はじめてのCakePHP」(p.163)に書いておりますのでそちらをご覧ください。

【今回の要件】

例えば、会議予定の一覧画面で、[全て|今日の会議だけ]みたいなスイッチで絞り込みをしたいとしましょう。

やり方は色々あるのですが、どうせなら通常「http://あああ.com/・・・/index/page:2/sort:name/derection:asc」とかなってるURLにさらに「/today:1」みたいな独自のパラメータが追加できればいいですよね。

【namedパラメータが途中で消えないようにしよう(View編)】

この場合は Viewファイルに

<?php // 絞り込み条件リンクを作成 

	// 初期値セット
	$isOnlyToday = false;
	if (isset($this->params['named']['today'])) {
		$isOnlyToday= $this->params['named']['today'];
	}
	// リンク作成
	if ($isOnlyToday== true ) {
		$str1 = $this->Paginator->link('全て', array('today'=>true));
		$str2 = '今日の会議だけ';
	} else {
		$str1 = '全て';
		$str2 = $this->Paginator->link('今日の会議だけ', array('today'=>false));
	}
	echo sprintf("絞り込み条件:[ %s | %s ]", $str1, $str2);
?>

と書きます。これでページが変わろうとソート順が変わろうと、絞り込み条件はパラメータとして引き継がれ続けます。

もちろん同じような絞り込み条件を複数書いても、両方のパラメータがセットされます。でなきゃ実戦で使えませんからね(笑。

【引き継がれた条件で絞り込み検索(Controller編)】

次はコントローラ側です。ここではリクエストパラメータを受け取って絞り込み検索を行います。Bakeで焼いただけの自動生成されたソースでは

	$this->set('modelNames', $this->paginate());

となっていると思います。これを


	// 「今日分だけ」パラメータがセットされていれば条件追加
	// リスト6-11 (p.164)
	$scope = array();
	if (isset($this->request->params['named']['today'])
	 && $this->request->params['named']['today'] == true) {
		$today_str = date('Y-m-d');		// 今日の日付
		$scope = array('start_time LIKE '=> $today_str . ' %');
	}

	$this->Meeting->recursive = 0;
	$this->set('meetings', $this->paginate(null, $scope));

といった感じで書き換えればOKです。


コメントを残す