具体的には、/blog/viewのページ内に/comment/addへPostするフォームを下記のように作成しました。
$form->create("Comment", array("action" => "add", "type" => "post"))
(ブログ記事の下部にコメント欄があるイメージです)
値が正常ならcommentsコントローラのadd()で処理されDBに反映されましたが、エラー時には/comment/addに遷移してしまいました。
元の/blog/viewに戻したいのですが。方法はあるでしょうか?
comments_controllerのaddアクションが実行されるのは確実なので、明示的に別なページに遷移したければ、そのようにしなければなりません。
手っ取り早いのは、フォームでエラー時の戻りURLをつけとくことでしょうか?
こんな感じです。
view.ctp
.... <?php $form->create("Comment", array("action" => "add", "type" => "post")) $form->input('return_action', array('type' => 'hidden', 'value' => '/blog/view/' . $blog['Blog']['id'])); ?> ....
comments_controller.php
function add() { .... if (!$this->Comment->save($this->data)) { $this->redirect($this->data['return_action']); exit; } .... }
明示的にフォームで渡していますが、Refererを見るというのもありかもしれません。
何かの参考になれば。
ここに同様の質問があります。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1346&foru...
エラー処理に$this->dataを呼び出せばいいようです。
これは同モデル内でのaddとeditの処理の違いなので違うようです。
私の場合は、/blog/viewのページにあるformからcommentにaddしているようなかたちです。
comments_controllerのaddアクションが実行されるのは確実なので、明示的に別なページに遷移したければ、そのようにしなければなりません。
手っ取り早いのは、フォームでエラー時の戻りURLをつけとくことでしょうか?
こんな感じです。
view.ctp
.... <?php $form->create("Comment", array("action" => "add", "type" => "post")) $form->input('return_action', array('type' => 'hidden', 'value' => '/blog/view/' . $blog['Blog']['id'])); ?> ....
comments_controller.php
function add() { .... if (!$this->Comment->save($this->data)) { $this->redirect($this->data['return_action']); exit; } .... }
明示的にフォームで渡していますが、Refererを見るというのもありかもしれません。
何かの参考になれば。
教えて頂いた方法を参考に下記で目的が達成されました。
<?php if ($this->Comment->create($this->data) && $this->Comment->validates()) { $this->Comment->save($data); $this->flash("コメントを登録しました", $this->data['Comment']['return_action']); } else { $this->Session->setFlash(implode("<br>", $this->validateErrors($this->Comment))); $this->redirect($this->data['Comment']['return_action']); } ?>
validateErrorsでエラー文言をセッションに入れて持ち運んでるのが無理やりですが、redirectしたview側のエラー表示を出すのがうまくいかなかったので代替方法です。
modelが代わってしまうと一気にめんどうになるんですね。
教えて頂いた方法を参考に下記で目的が達成されました。
validateErrorsでエラー文言をセッションに入れて持ち運んでるのが無理やりですが、redirectしたview側のエラー表示を出すのがうまくいかなかったので代替方法です。
modelが代わってしまうと一気にめんどうになるんですね。