【问题标题】:Yii2 AJAX model validation ActiveFormYii2 AJAX 模型验证 ActiveForm
【发布时间】:2018-02-02 23:22:53
【问题描述】:

当我们为 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 文件输入。

【问题讨论】:

标签: validation model yii2 active-form


【解决方案1】:

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

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

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

活跃于:

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

validationUrl -> 在控制器中操作的 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]) ?>

【讨论】:

  • 这是完全错误的,您不能也不应该使用ajaxValidation 进行文件上传,请参阅here
  • 是的,您是正确的,但是您链接我的解决方案并未明确解决。当有人对整个表单使用 AJAX 时,可能会发现文件输入有问题,他们建议使用小部件(客户端验证),因为 Yii2 会自动执行此操作,所以在基本情况下不需要。请再次阅读我的帖子,因为我没有对文件使用 ajaxValidation,因为它写在“唯一字段”上方。
  • 是的,我同意你应该使用像\kartik\FileInput 这样的小部件在运行时上传,但是 OP 已经添加了注释,指出他没有使用除ActiveForm 提供的标准文件输入以外的任何小部件,发表评论的原因是为了不让你投反对票。只需在帖子顶部提及,一切都很好。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多