Cakephpの質問です。バリデーションをしてエラーがあったときに戻るページを任意のページにできるのでしょうか?

具体的には、/blog/viewのページ内に/comment/addへPostするフォームを下記のように作成しました。
$form->create("Comment", array("action" => "add", "type" => "post"))
(ブログ記事の下部にコメント欄があるイメージです)
値が正常ならcommentsコントローラのadd()で処理されDBに反映されましたが、エラー時には/comment/addに遷移してしまいました。
元の/blog/viewに戻したいのですが。方法はあるでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/11/20 17:58:55
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tdoi No.2

回答回数174ベストアンサー獲得回数75

ポイント50pt

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を見るというのもありかもしれません。

何かの参考になれば。

id:umakoya

教えて頂いた方法を参考に下記で目的が達成されました。

<?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が代わってしまうと一気にめんどうになるんですね。

2008/11/19 14:11:34

その他の回答1件)

id:heilig_zwei No.1

回答回数119ベストアンサー獲得回数13

ポイント20pt

ここに同様の質問があります。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1346&foru...

エラー処理に$this->dataを呼び出せばいいようです。

id:umakoya

これは同モデル内でのaddとeditの処理の違いなので違うようです。

私の場合は、/blog/viewのページにあるformからcommentにaddしているようなかたちです。

2008/11/15 21:53:34
id:tdoi No.2

回答回数174ベストアンサー獲得回数75ここでベストアンサー

ポイント50pt

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を見るというのもありかもしれません。

何かの参考になれば。

id:umakoya

教えて頂いた方法を参考に下記で目的が達成されました。

<?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が代わってしまうと一気にめんどうになるんですね。

2008/11/19 14:11:34
  • id:tdoi
    目的が達成できた用で何よりです。

    それが適切かどうかは判断できませんが、BlogコントローラのviewアクションでCommentを追加してしまうというのも手としてはあると思います。
    それであれば、懸念されているvalidationErrorsについては通常通りに処理できるかと思います。
  • id:umakoya
    たしかにviewアクションでCommentを更新するのが早いかもしれません。
    ただ個人的にモデルの更新はそのControllerに限定させたかったので。
    開発規模が大きくなればそんなことを言ってられないかも知れませんが。
  • id:tdoi
    いるかありがとうございます。
    お役に立てたようで、何よりです。

    「モデルの更新はそのControllerに限定させたかったの」というのはよく分かります。
    Blogコントローラのviewアクションで処理させるのがよいかどうかは、
    viewアクションで他に何をしているかや、Commentコントローラで何をさせるかなどによっても変わるかなと思っています。

    関連するモデルがあれば、どうしても1つのコントローラ内で複数のモデルを編集する必要はあるので、その辺りは適宜考えていくしかないかもしれないですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません