違うページに遷移するのではなく、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 件のコメント:
コメントを投稿