Я пытаюсь использовать 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 файла, результат будет следующим:
.
В этом параметре у меня возникают следующие проблемы:
- Я хочу видеть содержимое каждого файла, но оно не работает.
- Когда я загружаю новый файл, виджет удаляет уже загруженные файлы.
- Кнопка удаления одного файла не работает