【问题标题】:Yii2 Ajax Validation not validating one field uniqueYii2 Ajax验证不验证一个唯一的字段
【发布时间】:2017-05-29 17:51:10
【问题描述】:

我在今天发现的 yii2 ajax 验证中发现了非常奇怪的行为。

基本上,我试图对表单的 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 请求,我可以在开发工具中看到 json 响应,但它根本不显示。但是,当您将 $user-&gt;setScenario('update'); 移到 if 条件之外时,只有在 if(Yii::$app-&gt;request-&gt;isAjax) 上方时它才能正常工作。我不明白这个,我错过了什么吗?为什么在 ajax 请求改变行为时使用 setScenario?

【问题讨论】:

  • 我也有同样的问题
  • 我刚刚更改了表单 ID,它对我有用

标签: php ajax validation yii yii2


【解决方案1】:

您正在覆盖 Yii 模型中的场景()函数,因此不验证任何属性。

检查:https://github.com/yiisoft/yii2/blob/master/framework/base/Model.php#L184

你应该做的是:

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

【讨论】:

  • 感谢您的回答,但这不是问题,我不希望用户名仅在 1 个场景中唯一。正如我所说,当我把 $user->setScenario('update');在 if 语句中检查它是否是 ajax 请求,它会中断并且不会在前端显示错误。当我把它放在 if 检查之上时,它工作得很好,并显示错误。在这两种情况下 $user->setScenario('update');被执行,但是当它在 if 语句中时,它会带来这个问题。
猜你喜欢
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 2019-03-24
  • 2015-12-07
  • 2011-08-07
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多