Yii2 Ajax验证不验证一个唯一的字段

时间:2017-01-14 12:51:35

标签: php ajax validation yii yii2

我发现今天发现的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->setScenario('update');移到if条件之外时,仅在if(Yii::$app->request->isAjax)之上,那么它的效果非常好。我不明白这一点,我错过了什么?为什么在ajax请求改变行为时使用setScenario?

1 个答案:

答案 0 :(得分:0)

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

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

你应该做的是:

<Grid>
    <Grid.Background>
        <LinearGradientBrush>
            <GradientStop />
            <GradientStop />
        </LinearGradientBrush>
    </Grid.Background>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Grid.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard TargetProperty="Background.GradientStops[0].Color">
                        <ColorAnimation From="Red"
                                                            To="Green"
                                                            Duration="0:0:2"
                                                            AutoReverse="True"
                                                            RepeatBehavior="Forever" />
                    </Storyboard>
                </BeginStoryboard>
                <BeginStoryboard>
                    <Storyboard TargetProperty="Background.GradientStops[1].Offset">
                        <DoubleAnimation From="0"
                                                             To="1"
                                                             Duration="0:0:2"
                                                             AutoReverse="True"
                                                             RepeatBehavior="Forever"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Grid.Triggers>
    <TextBlock>Grid...</TextBlock>
</Grid>