Yii2 AJAX 文件输入验证

Yii2 AJAX validation with file input

我使用 ActiveForm 创建了一个表单,其中包含一个多文件输入。我在提交时启用了 AJAX 验证,但是当我 select "n" 项目并单击提交按钮时,yii 在后台发送数据但是文件验证器 return 下一条错误消息:"Please upload a files"。好的,我明白为什么要这样做,但我不知道如果我想检查最大文件数量和大小并且至少需要一个文件并且我也想使用 ajax 验证,那么最佳做法是什么。如果我不使用 ajax 验证并将 skipOnEmpty 从 false 更改为 true,这也许是最佳实践...?

示例(不是真正的完整代码):

型号:

class Document extends Model {
    public $name;
    public $files;

    public function rules()
    {
        return [
            ['name', 'required'],
            ['files', 'file',
                'maxSize'     => 1024 * 1024,
                'maxFiles'    => 5,
                'skipOnEmpty' => false
            ]
        ];
    }

    public function create() { // other code }
}

控制器:

class DocumentController extends Model
{
    public function create()
    {
        $model = new Document();

        $model->load(Yii::$app->request->post());
        $model->files = UploadedFile::getInstances($model, 'files');

        if (Yii::$app->request->isAjax) {
            Yii::$app->response->format = Response::FORMAT_JSON;

            return ActiveForm::validate($model);
        }

        if ($model->validate() && $model->create()) {
           // other code...
        }
    }
}

谢谢大家!

这是已知问题:https://github.com/yiisoft/yii2/issues/6873

您可以制作在客户端验证上传的小部件,如果一切正常,将文件发送到服务器,在那里将使用您的模型再次验证它们,如果出现问题,return 错误。

小部件示例 https://github.com/2amigos/yii2-file-upload-widget

//型号

public function rules()
{
    return [

        [['identity_copy','home_copy', 'certificate_copy'], 'file', 
            'skipOnEmpty' => false,'on' => 'imageFalse',
            'extensions' => 'jpg, png, gif',
            'wrongExtension' => '{attribute} ควรเป็น {extensions} เท่านั้น.',
            'maxSize' => 512000,
        ],
        [['identity_copy','home_copy', 'certificate_copy'], 'file', 
            'skipOnEmpty' => TRUE,'on' => 'imageTrue',
            'extensions' => 'jpg, png, gif',
        ],
    ];
}

//控制器

public 函数 actionCreate() {

    $model = new StdRecord();

    $model->scenario = 'imageFalse';

   if ($model->load(Yii::$app->request->post())) {

        $model->scenario = 'imageTrue';


        $model->save();
        Yii::$app->session->setFlash('success', 'บันทึกข้อมูลเรียบร้อย');
        return $this->redirect(['view', 'id' => $model->std_id]);
    } else {
        if(Yii::$app->request->isAjax){
           return $this->renderAjax('create', [
               'model' => $model,
        ]);  
        } else {
            return $this->render('create', [
              'model' => $model,
        ]);  
        }
    }
}

#controller ajax 验证与预期相同

if ($model->load(Yii::$app->request->post())) {
    if (Yii::$app->request->isAjax) {
        Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }
}

#fileRequired 场景的模型验证

['filePath', 'required', 'on' => ['fileRequired']],

$tempScenario = $documentModel->scenario;

$documentModel->scenario = 'fileRequired';

echo $form->field($documentModel, "filePath", [
    'enableClientValidation' => true,
    'enableAjaxValidation' => false,
])->fileInput();
$documentModel->scenario = $tempScenario;

A enableAjaxValidation remove for ajax validation enableClientValidation 用于客户端验证,非常适合文件验证