CakePHP ページャ pagenate

CakePHPねたです。

——————————————————————————————————————–
CakePHPのページング機能は、1.2から標準で入っているようで、特にコンポーネントを取り込む必要はないようです。これで、通常コントローラで使う分には問題ないです。

//基本的なページングの条件
$this->paginate = array(
		'limit' => 25,
        	'order' => array('User.created' => 'desc'),
		'recursive' => 1,
  		);

// Userモデルの検索条件を設定する。$hogeは、事前に何か設定されていると仮定する。
$conditions = "User.name LIKE '%{$hoge}%'";

// $this->pageneteで、find検索とほぼ同じ。(ただし、設定された整列、条件で検索)
$this->data = $this->paginate('User', $conditions);

で、ビューに下記のコードを書くと・・。

<?php echo $paginator->prev('« Previous ', null, null, array('class' => 'disabled')); ?>
<?php echo $paginator->numbers(); ?>
<?php echo $paginator->next(' Next »', null, null, array('class' => 'disabled')); ?>

こんな感じで表示されます。(それぞれ、リンクが張られます。)

« Previous
1 | 2 | 3
Next »

で、2ページ目をクリックしたとき、URLは、こんな感じで飛んでいきます。
http://~~~.~~~~~.jp/users/view/page:2

——————————————————————————————————————–

しかし、絞込み条件を、Viewから得て$hogeに設定している場合は、問題が出てきます。

こんなふうに、条件をビューから得ると、2ページ目は絞込みがされないで、全件表示されます。prevも、nextも同じ症状となります。

$hoge = $this->data['search'];

何故かというと、ページャの【1 | 2 | 3】や【prev】、【next】は、単なるリンク(a href)でしかないからです。おそらくビューでは、$this->data[‘search’];をするために、form->createして、inputでコントローラに持ってきてますよね。そんで、送信とかボタン押すでしょ。

ページャで自動的に作られる【1 | 2 | 3】や【prev】、【next】は、単なるリンクなので、これをクリックしても、コントローラーでは、$this->dataは空です。(が~ん)

リンクにこんな感じで、’users/view/’. $condition 引数を設定しようとしても、ページャが自動的にリンク作るので、そんなことは、出来ません。(が~ん、が~ん)。
——————————————————————————————————————–
多分、ページャは、絞込み条件で与えられた件数を検索し、limitで割って計算して、page:2とかでその部分を持ってきているだけです。

|------------------------|------------------------|------------------------|
|         1ページ目      |       2ページ目        |       3ページ目        |
|------------------------|------------------------|------------------------|

ですので、ページングするたびに、同じ絞込み条件を与えないと、見た目、変なページングになってしまします。
——————————————————————————————————————–
解決策は、条件をどこに保存しておくか?です。
◆解決案1: データベースに保存しておく。

でも、複数の人が同時にブラウザ操作してたら・・・、工夫が必要ですよね。

◆解決案2: セッションに保存しておく。

これが、一番、現実的な解決方法だと思われます。

下記の2つをうまく組み合わせて、絞込み条件を保存し、ページングするたびに読み出せば、うまくいくはずです。

//セッションデータを読み出す。
if ($this->Session->check('pagecond')) {
    $this->data = $this->Session->read('pagecond');
}
//セッションデータを書き出す。
$this->Session->write('pagecond', $this->data);

以上です。

コメントを残す

役立つ
面白い

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください