2017-01-14 5 views
1

私はyii2 ajaxのバリデーションを発見しました。Yii2 Ajaxの検証では、1つのフィールドが一意でないことを確認していません。

基本的に私は入力が一意であり、そのテーブルのそのフィールドのどこにも見つからないことを確認するために、フォームの1フィールドでajax検証を実行しようとしていました。

あなたは私に言わせれば、次のコードは正常に動作するはずです:

コントローラーで
public function scenarios(){ 
    return ['update' => ['username']]; 
} 
public function rules(){ 
    return [['username'], 'unique']; 
} 

public function actionUpdate(){ 
    $user = User::findmodel.. bla bla 
    some more bla bla.. 

    if(Yii::$app->request->isAjax){ 

     $user->setScenario('update'); 

     $user_post_ajax = Yii::$app->request->post('User'); 
     $user->username = $user_post_ajax['username']; 
     Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
     return ActiveForm::validate($user); 
    } 

    some more bla bla bla.. 
} 

ビューで:

<?php $form = ActiveForm::begin(); ?> 

    <?= $form->field($user, 'username', ['enableAjaxValidation' => true])->textInput() ?> 
    <?= Html::submitButton('Save', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
    <?php ActiveForm::end(); ?> 

これをモデルに

すべきだが、それはそうでない場合は、検証エラーを表示しません。この場合は'Username is already taken'のように、有効でも無効でも表示されません。それはajaxリクエストを実行し、私はdevのツールでjsonの応答を見ることができますが、まったく表示されません。しかし、$user->setScenario('update');をif条件の外に移動させると、if(Yii::$app->request->isAjax)よりも上にあると、完全に正常に動作します。私はこれを理解していない、何かが不足している?なぜajaxリクエストが動作を変更するときにsetScenarioを使用するのですか?

+0

私は少し同じ問題 –

+0

を持っている私は、フォームのIDを変更して、それはあなたの答え私 –

答えて

0

Yiiモデルからscenarios()関数をオーバーライドしているため、すべての属性が検証されていません。

チェック:https://github.com/yiisoft/yii2/blob/master/framework/base/Model.php#L184あなたは何をすべき

、次のとおりです。

public function rules(){ 
    return [['username'], 'unique', 'on'=>['update']]; 
} 
+0

のthnxのための作業だが、それはあります問題ではない、私は1つのシナリオでのみユニークなユーザーネームが欲しい。私は$ user-> setScenario( 'update')を置くと問題が起きると言いました。 if文の中でajax要求であるかどうかをチェックして破棄し、フロントエンドにエラーを表示しません。私はチェックの上に置くとき、それはうまく動作し、エラーを表示します。どちらの場合も$ user-> setScenario( 'update');が実行されますが、if文の内部にある場合は、その問題が発生します。 –

関連する問題