CakePHP1.2のバリデーションエラーメッセージについて


一般的な方法として、モデルに項目名とルール、メッセージ内容などを定義して
<?php echo $form->error('User.email');?>
このようにビューに記述することでエラーを表示できると思うのですが、

$this->validate()を行ったコントローラに対応するビューではなく
redirectした別のビューにエラーメッセージを表示させたいのですが。

たとえば、$this->validate()のあとにコントローラ内でメッセージ内容を取得することは可能でしょうか

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

ベストアンサー

id:t_shiono No.1

回答回数256ベストアンサー獲得回数22

ポイント150pt

お言葉に甘えて、回答に書かせて頂きます。

フォーム入力のバリデーションの対応は、

1.バリデーションの失敗時にrender(入力フォーム)としてエラー表示する

2.Model::validationErrorsをセッションなどに退避した上でredirectする

でよいのかと思います。

問題がなければ、1の方がよいと思います。

id:dedara

CakePHP以外の開発だとセッション退避⇒redirectという方法が多かったので

感覚的にそういう方法を取ろうとしてたというのもあります

でもやはり1の方がスマートな感じですね。ありがとうございました

2008/10/22 16:57:24
  • id:t_shiono
    redirectしてしまうと、Modelはリセットされてしまうので、内部のvalidationErrorsは初期化されてしまいます。
    どうしてもやりたいのであれば、セッションにでも格納しておいて、再設定してあげればできるとは思います。

    ただ、redirectが必要な理由が分からないので、これ以上なんともいえません。
    ひょっとすると、redirectしなければ行けない構造の方が問題があったりするような気もしています。

    参考なれば。
  • id:dedara
    セッションに格納にしたいと考え
    「$this->validate()のあとにコントローラ内でメッセージ内容を取得することは可能でしょうか」
    と書きました。

    モデルで設定したバリデーションチェックでNGだった該当項目と該当エラーメッセージをコントローラで取得できればセッションに格納できると思ったので。

    画面遷移の流れは
    入力画面から「登録」ボタンでsubmit()。
    ⇒次の確認画面のコントローラでバリデーションチェック。
    ⇒チェックがすべてOKだったら確認画面にrender();
    ⇒ひとつでもNGがあれば入力画面までredirectさせてそこでエラー表示。再入力を求める

    ということを考えています。
  • id:t_shiono
    以下、仮定ですが、


    1./xxxxs/add
    XxxxsControllerのaddアクションを実行
    xxxxs/add.ctpを元にViewが表示

    <ユーザが入力し、Submitボタンを押す = /xxxxs/confirmにデータをPOST>

    2./xxxxs/confirm
    XxxxsControllerのconfirmアクションを実行
    アクション中でバリデーションを実行
    OKであれば、render()
    => /xxxxx/check.ctpを元にViewが表示し、確認させる
    NGであれば、render('add');
    => /xxxxx/add.ctpを元にViewが表示し、再入力を促す

    ではいけないのでしょうか?

    どうしても、redirectしたいのであれば、ModelのvalidationErrorsをセッションにでも退避させておけば、処理は可能だとは思います。

    $this->Session->write('errors', $this->Xxxx->validationErrors);

    としておいて、

    if ($this->Session->check('errors')) {
    $this->Xxxx->validationErrors = $this->Session->read('errors');
    }

    として復帰させる感じです。

    手元に動作環境が今ないので、細かい間違いなんかあったらすいません。
  • id:dedara
    render('add')で解決できそうです。ありがとうございました。
    (※ 一度試していたのですが、他の理由でうまくいかなかった経緯があり、redirect()しないとダメなのかなぁと思い込んでました…)
    それから $this->Xxxx->validationErrors このような書き方も知らなかったので、質問して良かったと思います。

    あと、イルカを付けたいので何か(ダミーの?)回答を入れてもらえませんか。

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

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

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

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