5

如果我使用 YII 上传文件并且另一条规则失败,则用户必须再次选择文件。避免这种情况的最简单方法是什么?

例如,我有一个规则,标题最多不能超过 20 个字符。用户输入 21 个字母。他选择要上传的文件。当用户返回该页面时,该文件不再存在,他必须再次选择它,并再次有效地上传。这非常令人沮丧,尤其是现在用户需要上传多达十个文件时。

我知道 Drupal 就是这样工作的。如果您上传和其他规则失败,当您返回表单时,文件将显示为屏幕截图。如何在 YII 上获得相同的功能?

更新 如果我可以通过此扩展程序满足该要求并且不需要用户按下开始上传,我将免费回家

4

3 回答 3

1

xupload 包装的原始插件,您可以使用一个额外的回调选项:.done().

在 xupload wiki 中,访问这些附加选项的方式如下:

<?php
    $this->widget('xupload.XUpload', array(
        // ... other attributes
        'options' => array(
            //This is the submit callback that will gather
            //the additional data corresponding to the current file
            'submit' => "js:function (e, data) {
                var inputs = data.context.find(':input');
                data.formData = inputs.serializeArray();
                return true;
            }"
        ),
    ));
?>

资源

您可能只需将提交部分更改为done,然后将上传文件的 URL/路径保存到临时隐藏字段,然后将验证移动到该隐藏字段,因此用户不必重新上传文件再次。

我从这个插件移到了coco 上传器,因为它更容易实现。

于 2013-04-26T10:20:19.540 回答
1

您可以启用客户端验证AJAX 验证。因此,您的常规属性将在发送表单和上传文件之前进行验证。

于 2013-04-26T11:13:39.837 回答
1

你可以用会话来做到这一点。

在您的控制器中

    // Here I have taken Users as model. you should replace it as your need.       

    $model=new Users;
    if(isset($_POST['Users']))
    {
        $model->attributes=$_POST['Users'];

        //save file in session if User has actually selected a file and there weren't any errors.
        if(isset($_FILES['Users']) && $_FILES['Users']['error']['image'] == 0){
            Yii::app()->session['image'] = $_FILES['Users'];
        }
        if(isset(Yii::app()->session['image']) && !empty(Yii::app()->session['image'])){
            $model->image = Yii::app()->session['image'];
            $model->image = CUploadedFile::getInstance($model,'image');
        }
        if($model->save())
        {   
            if(!empty($model->image)){
                $model->image->saveAs(Yii::app()->basePath.'/images/'.time()."_".$model->image->name);
                unset(Yii::app()->session['image']);
                //File has successfully been uploaded.
            }               
            // redirect to other page.
        }
    }
    else{
        // remember to unset the session variable if it's a get request.
        unset(Yii::app()->session['image']);
    }

在你的视图文件中

//Your form fields

//This is to show user that he has already selected a file. You could do it in more     sofisticated way.
if(isset(Yii::app()->session['image']) && !empty(Yii::app()->session['image'])) {
    echo "<label>".Yii::app()->session['image']['name']['image']."</label><br>";
}
//File uplaod field.

//More form Fields.

希望有帮助。

于 2013-04-26T13:08:17.683 回答