LoginSignup
18
21

More than 5 years have passed since last update.

【CakePHP】Paginator × フィルター機能でのバグ解消奮闘記

Last updated at Posted at 2014-12-02

Paginator、めっちゃ便利なんですが、
他の機能と組み合わせようとしたとき、なんとも使い勝手が悪い。。

バージョンの違いなのかなんなのか、バグ解消にかなり奮闘したので記録しておきます。

【前提としてやりたいこと】
・ユーザのリストを表示して、かつページネーションしたい
・ユーザのグルーピング(今回はStudent,Teacher,Staff)でフィルターをかけたい(Postメソッド)

【今回のバグ】
・Paginate機能でページング(2ページ目以降に遷移)したのちにフィルターをかけると、
 ページ番号が維持されたままフィルターがかかってしまう
  → フィルター後に、そのページが存在しない場合エラーになる
・フィルター後にページングすると、フィルターが解除されてしまう

【バージョン】
cakephp 2.5.4

Paginatorの基本的な使い方なんかはこのあたりの記事が参考になります
初めての[CakePHP2.x]での開発、そして挫折するまで日記~その25 ページネーションを使ってみる

ページ番号が維持されてしまう

結論から言うと、ページ番号を1に戻したいタイミングにこれを追加する

UsersController.php
$this->request->params['named']['page'] = 1;

これだけなのに・・全然情報出てこなくて辛かったw

view側で$paginator->optionsを変えることでも設定できるらしいが、
おそらくPaginatorのヘルパーを使った動作のときのみで動くらしく、私のケースはダメだった。。
上でダメだった人は試してみてもいいかも
参考:検索結果をpaginateする方法

フィルター後にページングすると、フィルターが解除されてしまう

これは有名な落とし穴なようで、検索するとたくさん出てきました
主に対処方法は2種類で、

  • Sessionを使う方法
  • Getでデータを保持して持ち回る方法

があるようです。
私の場合はSessionを使う方法で解決しました!

参考元にお世話になった記事はこちら
検索結果をpaginateする方法

手順としては、
①保持したいデータをSessionに書き込む

$this->Session->write('filter', $filter);

②Post以外のときに、Sessionデータがあるか確認して、あれば読み込む

if($this->Session->check('filter')) {
    $sort = $this->Session->read('filter');
  ・・・

以上!
Viewファイルは特に触れることなくいけます

Get取得の方法でいく場合はこちらを参考にするといいかもです
CakePHPのページネーションでPostされたデータを持ち回る方法(Paginator helper)

コントローラー全体(今回使用しているindexメソッドのみ)はこんな感じ

UsersController.php
    public function index() {
        $this->Paginator->settings = $this->paginate;
        $this->User->recursive = 0;

        $this->set('total', $this->User->find('count', array(
                'conditions' => array('del_flg' => '0'))));

        if ($this->request->is('post')) {
            $filter = $this->request->data['Filter']['group_id'];
            $this->Session->write('filter', $filter);
            $this->set('filter', $filter);
            $this->request->params['named']['page'] = 1;

            if ($filter == '0') {
                $this->set('users', $this->Paginator->paginate('User', array('del_flg' => '0')));
            } else {
                $this->set('users', $this->Paginator->paginate('User', array('del_flg' => '0', 'group_id' => $filter)));
            }
        } else { //post処理以外(フィルターを使ったとき以外)
            if($this->Session->check('filter')) {
                $filter = $this->Session->read('filter');
                if ($filter == '0') {
                    $this->set('users', $this->Paginator->paginate('User', array('del_flg' => '0')));
                } else { 
                    $this->set('users', $this->Paginator->paginate('User', array('group_id' => $filter,'del_flg' => '0')));
                }
            } else {
                $this->set('users', $this->Paginator->paginate('User', array('del_flg' => '0')));
            }
        }
    }

あまりキレイではなく恐縮ですが・・
同じバグではまった方、参考にどぞー!

18
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
21