2

私はYii 2フォームで作業しています。クライアント側の検証が失敗したときにモデルを再初期化したいとします。以下のような一定のルールを持つ例:Yii 2でクライアント側の検証が失敗した場合にモデルを再初期化する方法は?

public function rules() 
{ 
    return [ 
     [['username'], 'required', 'message' => 'You must enter your username'], 
     ['username','email'], 
     [['password'], 'required', 'message' => 'You must enter your password'],   
    ]; 
} 

検証は、私はすべてのフィールドが空になりたい失敗した場合(例えば、ユーザーが無効な電子メールアドレスを入力したとき)。どうやってやるの?

答えて

2

私はあなたがモデルをロードする標準のYii 2の方法を使用すると仮定します。

$model = new SomeModel(); 
if ($model->load(\Yii::$app->request->post()) && $model->save()) { 
    // ... 
} 
return $this->render('view', ['model' => $model]); 

セットフィールドをnullに検証が失敗したとき。すべての検証メッセージが失われるため、新しいインスタンスを作成する必要はありません(これは簡単です)。

$model = new SomeModel(); 
if ($model->load(\Yii::$app->request->post())) { 
    if ($model->save()) { 
     // .... 
    } else { 
     $model->username = null; 
     $model->password = null; 
    } 
} 
return $this->render('view', ['model' => $model]); 

UPDATE:クライアント側の検証のためには、このビューにコードを追加JS:

$("#form-ID").on("afterValidateAttribute", function (event, attribute, messages) { 
    if (event.result === false) { 
     attribute.value = ""; 
    } 
}); 

適切なフォーム要素JS識別子と#form-IDを交換します。

+0

はい私は既にそれが好きですが、これは投稿後ですので、ページがリフレッシュされないような方法があれば質問しています。 – praba

+0

私の回答が更新されました。 – Bizley

+0

私はafterValidateAttributeの代わりにafterValidateを使用しています。これはうまく動作しています。私には別の考えがあります –

関連する問題