Yii2 AJAX模型验证ActiveForm

时间:2018-02-02 14:45:14

标签: validation model yii2 active-form

当我们为ActiveForm配置Ajax验证时(对于整个表单),当我们的模型如下所示时,我们可以发现输入验证的难度:

[['file'],'file','skipOnEmpty'=>false,'extensions'=>['jpg', 'png', 'jpeg', 'pdf'],'checkExtensionByMimeType'=>false,'maxSize' => 1024 * 1024 * 2,'message'=>'Wrong format'],

当我们输入文件时,不建议对整个表单使用AJAX。

在这种特殊情况下,即使正确选择了我们的文件,AJAX也会在验证中返回错误。正确的方法我将在回答中进行描述。

注意:此解决方案不使用yii2-widget-fileinput等外部小部件作为例子,只是在ActiveForm中使用标准的Yii2文件输入。

1 个答案:

答案 0 :(得分:0)

我将尝试以非常基本的方式描述这个过程。

首先,我们需要确定我们要在客户端验证哪些字段(我们这里不需要ajax)和服务器端(ajax来这里)。

AJAX验证我们主要用于登录/电子邮件等独特字段。其他领域客户端验证就足够了。

Active From:

<?php
$form = ActiveForm::begin(
      [
        'id' => 'form-signup',
        'options' => ['encytype' => 'multipart/form-data'],
        'validateOnBlur' => false,
        'enableClientValidation' => true,
        'validationUrl' => Url::toRoute('customer/validation')
      ]
    );
?>

validationUrl - &gt; Url在控制器中操作,在我的例子中,这是CustomerController和actionValidation。

在控制器中:

    public function actionValidation() {
    $model = new Customer();

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = 'json';
        return ActiveForm::validate($model);
    }
}

我们确实需要使用AJAX验证的表单字段

<?= $form->field($model, 'email', ['enableAjaxValidation' => true])->textInput(['maxlength' => true]) ?>