yii2 kartik fileinput просмотр нескольких загруженных файлов - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь использовать kartik fileinput для загрузки нескольких файлов в моей форме.

Я использую свою таблицу Attachment, чтобы сохранить в БД имя файла и другие поля, и я сохраняю файлы в моей файловой системе. Я обычно связываю Attachment с Registry таблицей через RegistryAttachment таблицу.

Я успешно сохраняю несколько файлов, но когда я загружаю файлы с указанием c Registry, я хочу видеть их как при первой загрузке.

I Я пытаюсь это с помощью следующего кода:

Действие контроллера

public function actionLoadMultiple($registryId = NULL){

    $model = new Attachment();

    if(!$registryId){
        $model->files = [];
        $registryId = 6;//For example
        $registry = \app\models\Registry::findOne($registryId);
        $registryAttachments = $registry->attachments;//Find all Attachment record for registryId
        foreach($registryAttachments as $attachment){
            $model->files[$attachment->original_filename] = $attachment->filePath();
        }
    }

    if (Yii::$app->request->isPost) {
        //Loading the files in the model.
        //After I load them, I save them using the model function uploadMultiple
        $model->files = UploadedFile::getInstances($model, 'files');
        $loadedFiles = $model->uploadMultiple();
        if ($loadedFiles) {
            // file is uploaded successfully
            foreach($loadedFiles as $originalFileName=>$fileName){
                $attachment = new Attachment();
                $attachment->section = $model->section?: 'oth';
                $attachment->description = $model->description ?: 'Other';
                $attachment->filename = $fileName;
                $attachment->original_filename =$originalFileName;
                if(!$attachment->save()){
                    $attachment->removeFile();
                    return ['error'=>\Yii::t('app','Error saving attachments to db. Please contact an administrator')];
                }
            }
            return $this->redirect(['index']);
        }
    }

    return $this->render('load_multiple',['model'=>$model]);
}

Функция модели

public function uploadMultiple(){
    $files = $this->files;
    $section = $this->section ?: '';
    if(!$files){
        return false;
    }

    $fileNameList = [];
    $path = Utility::getAttachmentsBasePath();
    $count = 1;
    foreach ($files as $file) {
        if (!$section) {
            $section = 'oth';
        }

        $filename = \app\models\Attachment::generateFilename($file->name);

        //I set the path to the right folder
        $completePath = $path . '/' . $section . '/' . $filename;
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            $completePath = str_replace('/', '\\', ($completePath));
        }

        if (!$file->saveAs($completePath)) {
            Yii::error("Error loading file - error code {$file->error}", "upload");
            return ['error' => \Yii::t('app', 'Error saving files. Please contact an administrator')];
        }

        if (isset($fileNameList[$file->name])) {
            $fileNameList[$file->name . '_' . $count] = $filename ;
            $count++;
        } else {
            $fileNameList[$file->name] = $filename;
        }
    }
    return $fileNameList;
}

Просмотр load-multiple

<?php

  use yii\widgets\ActiveForm;
  use kartik\file\FileInput;
  use yii\helpers\Html;


   $this->title = Yii::t('app', 'Create Multiple Attachment');
   $initialPreviewAttachmentFile = [];
   $fileInputShowRemove = true;


   if($model->files){
    foreach($model->files as $key=>$file){
     $basePath = Yii::$app->params['attachmentsBasePath'].'/reg';
     $type = \app\models\Attachment::fileInputTypeForUploaded($key);
     $initialPreviewAttachmentFile[] = $file;
     $initialPreviewAttachmentCaption[] = ['caption'=>$key,'type'=>$type,];
   }
  }


  $form = ActiveForm::begin(['enableAjaxValidation' => true,]);




  echo $form->field($model, 'files[]')->widget(FileInput::class, 
    [
        'name' => 'files[]',
        'options' => ['multiple' => true],
        'pluginOptions' => [
     //                'minFileCount' => 1,
            'maxFileCount' => 10,
            'maxFileSize' => Yii::$app->params["attachmentsMaxSize"],
            'initialPreview' => $initialPreviewAttachmentFile ,
            'initialPreviewAsData' => (!empty($initialPreviewAttachmentFile)),
            'initialPreviewConfig' => $initialPreviewAttachmentCaption,
            'fileActionSettings' => [
                'showDownload' => false,
                'showRemove' => true,
            ],
        ],
    ]);
 ?>
<div class="form-group">
<?=
    Html::submitButton(Yii::t('app', 'Save'), [
        'class' => 'btn btn-success save-attachment',
    ])
?>

Если выбранный Registry прикрепил 3 файла, результат будет следующим:

Trial of multiple file preview.

В этом параметре у меня возникают следующие проблемы:

  1. Я хочу видеть содержимое каждого файла, но оно не работает.
  2. Когда я загружаю новый файл, виджет удаляет уже загруженные файлы.
  3. Кнопка удаления одного файла не работает
...