使用文件输入进行Yii2 AJAX验证

时间:2016-08-26 11:55:34

标签: php ajax validation upload yii2

我使用ActiveForm创建了一个包含一个多文件输入的表单。我在提交时启用了AJAX验证,但是当我选择“n”项并单击提交按钮时,yii在后台发送数据,但文件验证器返回下一条错误消息:“请上传文件”。好的我明白为什么这样做但我不知道如果我想检查最大文件数量和大小并且至少需要一个文件并且我也想使用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...
        }
    }
}

Thx伙计们!

3 个答案:

答案 0 :(得分:1)

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

您可以创建在客户端验证上传的小部件,如果可以的话,将文件发送到服务器,再次使用您的模型验证它们,如果出错则返回错误。

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

答案 1 :(得分:0)

#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场景进行#model验证

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

$tempScenario = $documentModel->scenario;

$documentModel->scenario = 'fileRequired';

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

一个enableAjaxValidation删除以进行Ajax验证 并且enableClientValidation用于客户端验证,非常适合文件验证

答案 2 :(得分:-1)

//模型

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 function 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,
        ]);  
        }
    }
}