CakePHPで初歩的なあたりでハマっています

Validateがうまくいかない
単純なミスだとは思うのですがうまくいきません
cakephpのバージョンは1.2
PHPのバージョンは5.25です

コントローラーのクラス名
UsersController
コントローラーのファイル名
users_controller.php

コントローラー内
class UsersController extends AppController{
  function regist(){

    $data = array('email'=> $this->params['form']['email'],
           'password' => $this->params['form']['password']);

    debug($data) //その1

    if(!$this->User->validates($data)){
      $this->flash("入力NG","/users/");
      return;
    }

    $this->User->save($data,false);
    $this->flash("入力OK","/users/");
    return;

  }
}

モデルのクラス名
User
モデルのファイル名
user.php

モデル内
class User extends AppModel{
  function beforeValidate() {
    debug($this->data); //その2
  }

  var $validate = array(
    'email' => VALID_NOT_EMPTY
  );
}

emailが未入力でも入力OKとなってしまいます。
出力その1では配列に値が入っていましたが、その2では「Array()」と出るだけでした。saveはうまくいきます。

回答の条件
  • 1人5回まで
  • 登録:2008/09/14 16:47:08
  • 終了:2008/09/15 15:04:57

ベストアンサー

id:heilig_zwei No.1

heilig_zwei回答回数119ベストアンサー獲得回数132008/09/14 20:57:46

ポイント100pt

どちらかというとオブジェクト指向言語の基礎の話になりますが、

model側に引数を指定する必要があります。

function beforeValidate($results) {

debug($results); //その2

return $results;

}

でどうすか?

めんどいのでデバッグはしてません。

id:ticaramoci

上記のコードをそのまま記述すると入力値が出力されました。

デバッグ方法が間違ってたということですね

ただ問題はvalidateの処理が行われないことの方で

emailが未入力でも「入力OK」となってしまいます

2008/09/14 22:38:27
  • id:zero-uhura
    ふと、配列のフォーマットが違うような気がした(保存できてるけど、、、)。

        $data = array();
        $data['User'] = array('email'=> $this->params['form']['email'],
               'password' => $this->params['form']['password']);



        $data = array('email'=> $this->params['form']['email'],
               'password' => $this->params['form']['password']);
  • id:ticaramoci
    ticaramoci 2008/09/14 18:25:43
    コメント欄にてありがとうございます。
    上記のように書き換えてみましたが結果は同じで
    出力その2も「Array()」のままでした
  • id:heilig_zwei
    zero-uhura様のおっしゃる通り、
    validateに入るパラメータは次のような形じゃないとだめです。

    Array (
    [User] => Array (
    [email] => hogehoge@hoge.com
    [username] => hoge
    )
    )

    Viewが無いのでなんともいえませんが、
    もし、Formヘルパーを使っているのであれば
    $this->paramsではなくて$this->data['User']['email']ですよ。

  • id:ticaramoci
    ticaramoci 2008/09/15 00:20:04
    zero-uhuraさんが書いたとおり書き換えたり
    Array (
    [User] => Array (
    [email] => hogehoge@hoge.com
    [username] => hoge
    )
    )
    という風にも書いてみましたがダメでした。
    Formヘルパーなどは使ってません。
  • id:ticaramoci
    ticaramoci 2008/09/15 00:34:44
    Array
    (
      [User] => Array
        (
          [email] =>
          [password] => aaaaa
        )

    )

    デバッグの出力はこんな感じです
    viewがないからダメなんでしょうか‥。
  • id:heilig_zwei
    一つずつ詰めていきましょう。まず、

    $data = array(
     ’User’ => array(
      'email'=> ’hoge@hoge.com',
      'password' => ’hogehoge’
     )
    );

    (これがzero-uhuraさんの書いたのと
    同じ意味を持つということは分かりますよね?)

    として、validateが通るかどうか確認してみます。
    これで通らなければデータ構造は合っていて、
    validateの仕方に問題があるということになります。


    通っていれば、データ構造が間違っているということです。
    次に、

    print($this->params['form']['email']);

    として、出力結果を見ます。
    フォームから入力したEmailが表示されなければ、ここがバグ箇所です。


    Viewを見せていただければ一発で分かるのですが。

  • id:ticaramoci
    ticaramoci 2008/09/15 01:51:41
    ビューはこんな感じです。

    <form action="regist" method="POST">
    <table>
      <tr>
        <td><label for="UserEmail1">メールアドレス</label></td>
        <td><input name="email" value="" type="text" id="UserEmail" /></td>
      </tr><tr>
        <td><label for="UserPassword">パスワード</label></td>
        <td><input name="password" value="" type="text" id="UserPassword" /></td>
      </tr>
    </table>
      <input type="submit" value="登録" name="submit"/>
    </form>


    あと
    print($this->params['form']['email']);
    をためしましたが入力値は表示されました。
  • id:heilig_zwei
    どうも1.2のバリはおかしいところがあるみたいですね。

    http://qtown.jugem.jp/?eid=47&target=comment
    http://tech.li-pton.com/php/validation_trap.html

    これでダメならちょっと分かりません。
    今手元に開発環境が無いので。ごめんなさい。
  • id:ticaramoci
    ticaramoci 2008/09/15 04:16:44
    できました!
    if(!$this->User->validates($data)){



    if($this->User->create($data) && !$this->User->validates()){

    何故かこう書き換えるとできました。
    ですが、まだよくわかってないので明日いろいろ調べてみます。

    解説も含めてもうしばらく回答を募集したいと思います。
    ありがとうございました。
  • id:ticaramoci
    ticaramoci 2008/09/15 15:04:18
    こういうことらしいです
    http://tech.li-pton.com/php/validation_trap.html
    聞かなかったらずっとわからなかったと思います
    むずかしいなあ。。
    ありがとうございました

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません