2012年9月12日水曜日

[CakePHP]validationエラーを入力元の画面に出す方法

例えば、TOPページにある検索ボックスの未入力エラーのメッセージなんかは、
違うページに遷移するのではなく、TOPページのその検索ボックスのすぐそばに
メッセージを出したい場合、以下のようにする。

//in the themes_controller.php
    public function search(){
        if(!empty($this->data)){
            $this->Theme->set($this->data);
            if($this->Theme->validates()){
                //入力エラーが無いときの処理
            }else{
                $this->loadModel('Tag');
                $this->Theme->unbindModel(array('belongsTo'=>array('User')),false);
                $themes = $this->paginate('Theme');
                $tags =   $this->paginate('Tag');
                $this->set('themes',$themes);
                $this->set('tags',$tags);
                $this->render('/main/index');
            }
        }
    }

ポイント
※コードの下から説明していくよ。

・14行目のrenderでトップページを指定するのがポイント。
 ここで、redirectを使用してはだめ。redirectではvalidationエラーの情報を遷移先に
 引き継いでくれないため、エラーメッセージが表示されない。

・そして、9~13行目でTOPページを表示していたコントローラの処理(main_controller.phpの
 indexアクション)をそのままコピペ。これがないと、トップページでDBアクセスして取得する
 情報などが表示できない。(エラーとなる。)
 main_controllerのそのアクションを呼び出せれば楽なんだけどなぁ。
 どうやらそういう時は、コンポーネントという仕組みで処理を共通化するのがよいみたい。
 今度試してみよう。

・8行目で不足しているmodelをloadする。mainコントローラでは$usesに'Tag'が入っていたが、
 themeコントローラには入っていないため、ここでloadする必要がある。
 くわしくは[CakePHP]modelを二つ以上使用する場合の注意点参照。


【2012/09/13追記】
このやり方のだめなところを発見した。
一度入力エラーなしで遷移に成功し、その検索結果の画面にも 検索ボックスがあるとする。
そうすると、その検索結果画面で未入力チェックにひっかかると、そのままの画面ではなく、
main/indexに遷移してしまう。
遷移元のURL$this->referer();で判断できるかと思ったが、これをやると
検索結果画面のペイジネイションが維持できなくなる。3ページ目でひっかかったのに、
なぜか1ページ目で表示されるなどする。
結局、難しいので、全てエラー画面に遷移させてしまうことにする。

※CakePHPのバージョンはcakephp-cakephp-1.3.15-9-gacd25c3.zip



0 件のコメント:

コメントを投稿