人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: umakoya
●カテゴリ:インターネット ウェブ制作
✍キーワード:ADD blog CakePHP dB view
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● heilig_zwei
●20ポイント

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

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

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

◎質問者からの返答

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

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


2 ● tdoi
●50ポイント ベストアンサー

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ