【问题标题】:Yii2 AJAX validation with file inputYii2 AJAX 验证与文件输入
【发布时间】:2017-01-03 02:13:41
【问题描述】:

我使用 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...
        }
    }
}

谢谢各位!

【问题讨论】:

  • 你为什么要Controller扩展Model
  • 这只是示例中的一个错误。
  • 这很令人困惑,你应该做出有效的例子,以便人们可以更好地帮助你:)
  • 你从来没有犯过错误吗?我认为你应该写一个有用的答案:)
  • 哈哈,如果可以的话,我会的.. :D

标签: php ajax validation upload yii2


【解决方案1】:

#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);
    }
}

#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 验证的 enableAjaxValidation 移除 enableClientValidation 用于客户端验证,非常适合文件验证

【讨论】:

    【解决方案2】:

    //模型

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

    //控制器

    公共函数 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,
            ]);  
            }
        }
    }
    

    【讨论】:

    • 您应该在您的代码周围添加一些 cmets,就像您提交答案时建议的那样。这样人们就可以更好地理解您的代码
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢链接,我制作了一个小部件,它也可以使用 JavaScript 验证文件输入并且运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多