2012-02-08 3 views
2

のYiiカスタム検証ルール()自分のアプリケーションのためのユーザー登録は、以下の検証ルールを提出する前に呼び出され

public function rules() 
{ 
    return array(
     array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'), 
     array('club, email, firstName, lastName, level, password, telephone', 'length', 'max'=>45), 
     array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'on'=>'register'), 
     array('email', 'isUniqueEmailAddress'), 
    ); 
} 

正常に完了したが、第四最初の3つの検証ルール(カスタム検証方法)はしません。それはisUniqueEmailAddress '関数を呼び出して、以下を実行する必要があります。あなたが見ることができるように、私も単純に検証エラーが登録フォームに送り返されることを保証するためにすべてのロジックをコメントアウトしまし

/* 
* Returns true if there doesn't exist a user in the database with the submitted email 
*/ 
public function isUniqueEmailAddress($attribute, $params) 
{ 
    //if (User::model()->find('email=:email', array(':email'=>$this->email)) !== null) 
    //{ 
     $this->addError('email', 'Email account already exists'); 
    //} 
} 

、ありませんvalidation()でエラーが返されます。私はYii's Documentationを読んでフォーラムを精査しましたが、なぜ自分のカスタム検証方法が呼び出されていないのか理解できません。

+3

あなたは、モデル内のエラーをチェックするためには何を使用していますか? '$ model-> getErrors()'? モデルのシナリオは何ですか? カスタム 'beforeValidate()'メソッドがありますか?もしそうなら、あなたはそれに真実を戻していますか? 'CApplication :: end();'をその検証メソッドに入れて、実際に呼び出されているかどうか確認しましたか? – Ben

答えて

0

コードが正しく動作していない(正しいと思われる)理由がいくつか考えられましたが、この場合はUniqueバリデーターを使用できます。

array('email', 'unique')となります。

1

$ model-> save()を呼び出した後、コントローラーでフラッシュメッセージを設定しようとしたときにこの問題が発生しました。それは論理エラーを引き起こしたコードフォーマットの問題でした。これは、フォームの送信は、デバッグのために毎回失敗する原因となっているはずです理論的には

public function validateNumItems($attribute, $params) { 
    $this->addError($attribute, 'Validate Items Failed'); 
} 

はたとえば、モデルに私はこのようなものを持っていました。しかしそれは決してしなかった。

私のコントローラの更新アクションは、このように見えた:GIIによって作成された$モデル - >保存()テストの周り

public function actionUpdate($id) { 
    $model = $this->loadModel($id); 

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 

    if (isset($_POST['Collection'])) 
    { 
     $model->attributes = $_POST['Collection']; 
     if ($model->save()) 
     Yii::app()->user->setFlash('success', "Data saved!"); 
     $this->redirect(array('index')); 
    } 

    $this->render('update', array('model' => $model,)); 
    } 

不足しているブラケットを、私は新しい行を追加したときに論理エラーが発生しました。ブラケットを固定して固定します。このような

public function actionUpdate($id) { 
    $model = $this->loadModel($id); 

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 

    if (isset($_POST['Collection'])) { 
     $model->attributes = $_POST['Collection']; 
     if ($model->save()) { 
      Yii::app()->user->setFlash('success', "Data saved!"); 
      $this->redirect(array('index')); 
     } 
    } 

    $this->render('update', array('model' => $model,)); 
    } 
1
array('email', 'exist') 

public function rules() 
{ 
    return array(
     array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'), 
     array('club, email, firstName, lastName, level, password, telephone', 'length', 'max'=>45), 
     array('passwordConfirm', 'compare', 'compareAttribute'=>'password', 'on'=>'register'), 
     array('email', 'exist') 
    ); 
} 
0

はこれを試して、それがうまく働いている -

public function rules() 
    { 
     return array(
      array('email, firstName, lastName, password, passwordConfirm, telephone', 'required'), 
     array('email', 'email','message'=>"The email isn't correct"), 
      array('email', 'uniqueEmail'), 
     ); 
    } 

カスタム関数を、同じモデルに書き込む -

public function uniqueEmail($attribute, $params) 
    { 
     if($user = User::model()->exists('email=:email',array(':email'=>$this->email))) 
      $this->addError($attribute, 'Email already exists!'); 
    } 
関連する問題