5

YII を使用してファイルをアップロードし、別のルールが失敗した場合、ユーザーはファイルを再度選択する必要があります。これを回避する最も簡単な方法は何ですか?

たとえば、タイトルは最大 20 文字にするというルールがあります。ユーザーは 21 文字で入力します。アップロードするファイルを選択します。ユーザーがページに戻ったとき、ファイルはもうそこにないので、もう一度選択して、効果的にもう一度アップロードする必要があります。これは、ユーザーが最大 10 個のファイルをアップロードする必要がある場合は特に、非常にイライラします。

Drupal がこのように機能することは知っています。アップロードして他のルールが失敗した場合、フォームに戻ったときにファイルがスクリーンショットとして表示されます。YII で同じ機能を得るにはどうすればよいですか?

更新この拡張機能 でその要件をカバーでき、ユーザーがアップロードの開始を押す必要がなければ、私は家から解放されます

4

3 に答える 3

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 に答える
1

クライアント側の検証AJAX 検証を有効にすることができます。したがって、フォームが送信されてファイルがアップロードされる前に、通常の属性が検証されます。

于 2013-04-26T11:13:39.837 に答える
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 に答える