Php 带文件输入的yii2ajax验证

Php 带文件输入的yii2ajax验证,php,ajax,validation,upload,yii2,Php,Ajax,Validation,Upload,Yii2,我用ActiveForm创建了一个表单,其中包含一个多文件输入。我在提交时启用了AJAX验证,但当我选择n个项目并单击提交按钮时,我会在后台发送数据,但文件验证程序返回下一个错误消息:请上载一个文件。好的,我明白为什么要这么做,但我不知道如果我想检查最大文件数和大小,并且至少需要一个文件,并且我也想使用ajax验证,那么最好的做法是什么。如果我不使用ajax验证并将skipOnEmpty从false更改为true,那么这也许是最好的做法 示例不是真正的完整代码: 型号: class Docume

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

这是已知的问题:

你们可以制作一个小部件,在客户端验证你们的上传,若一切正常的话,将文件发送到服务器,在那个里它们会被你们的模型再次验证,若出现错误,返回错误

小部件示例 这是已知的问题:

你们可以制作一个小部件,在客户端验证你们的上传,若一切正常的话,将文件发送到服务器,在那个里它们会被你们的模型再次验证,若出现错误,返回错误

小部件示例

//型号

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',
        ],
    ];
}
//控制器

公共功能创建{

    $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,
        ]);  
        }
    }
}
//模型

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',
        ],
    ];
}
//控制器

公共功能创建{

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

控制器ajax验证与expect相同

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;
一个用于ajax验证的ENABLEJAX验证移除
enableClientValidation用于客户端验证,它与expect一样,非常适合于文件验证

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;
一个用于ajax验证的ENABLEJAX验证移除
enableClientValidation用于客户端验证,它非常适合文件验证

Thx链接,我制作了一个小部件,它也可以用JavaScript验证文件输入,并且工作得非常好。Thx链接,我制作了一个小部件,它也可以用JavaScript验证文件输入,并且工作得非常好。您应该在代码周围添加一些注释就像你提交答案时建议的那样。这样人们可以对你的代码有更多的了解。你应该像提交答案时建议的那样在代码周围添加一些注释。这样人们可以对你的代码有更多的了解为什么你的控制器会扩展模型?这只是示例中的一个勘误表。令人困惑的是,你应该使用valid示例以便人们能更好地帮助你:你从来没有犯过错误吗?我想你应该写一个有用的答案:哈哈,如果我可以,我会的….:DWY你控制器扩展模型了吗?它只是示例中的一个勘误表。令人困惑的是,你应该做出有效的示例以便人们能更好地帮助你:你从来没有犯过错误吗?我想k你应该写一个有用的答案:哈哈,如果可以的话,我会