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