Имеется возможность прикреплять файлы к посту. Прикрепление осуществляется с помощью виджета
https://github.com/kartik-v/yii2-widget-fileinput
Если выделить на компьютере несколько файлов и перетащить их в поле загрузки, то всё работает хорошо. Если же перетаскивать файлы по одному, то почему-то загружается только последний файл, остальные просто теряются. Почему так происходит и как исправить?
Сам порядок действий такой: заполняю нужные поля, перетаскиваю файлы, нажимаю кнопку save. (Сами файлы не нажимаю загрузить).
Порядок такой, т.к. не хочу чтобы файлы загружались без созданного поста.
Код в контроллере:
public function actionCreate()
{
$model = new Article(); //Создаю модель поста
$upload = new UploadForm(); // Создаю модель загрузки файлов
if (Yii::$app->request->isPost) {
$model->load(Yii::$app->request->post()); //Загружаю данные в модель
if($model->save()){
$upload->files = UploadedFile::getInstances($upload, 'files'); // Если модель сохранена, то загружаю файлы
$upload->UploadOperation($model->id); //Сохраняю файлы, а так же для каждого файла создаю запись в таблицу
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('create', compact('model','categories','upload'));
}
Модель загрузки файлов:
public $files;
public function rules()
{
return [
[['files'], 'file', 'maxSize'=>8*1024*1024,'maxFiles' => 10],
];
}
public function UploadOperation($article_id){
$user_id= Yii::$app->user->id;
foreach ($this->files as $file) {
$filename = $this->generateFilename($file); //Генерирую имя файла
$file->saveAs($this->getFolder() . $filename); //Сохраняю файл
$operation= new Uploads(); //Создаю запись в таблице бд
$operation->user_id=$user_id; //Кто загрузил файл
$operation->article_id=$article_id; //К какому посту относится
$operation->file=$filename; //Путь к файлу
if($operation->validate()){
$operation->save(false); //Сохраняю запись
}
else{
unlink($this->getFolder().$filename); //Удаляю файл
throw new ForbiddenHttpException('Wrong Upload');
}
}
}
}
Сам view:
<?php $form = ActiveForm::begin(
['options'=>['enctype'=>'multipart/form-data']]
); ?>
<?= $form->field($model, 'content')->textarea(['rows' => 6]) ?> // Содержимое поста
<?= $form->field($upload, 'files[]')->widget(FileInput::className(), [
'language' => 'ru',
'options' => ['multiple' => true],
'pluginOptions' => ['uploadUrl' => Url::to(['Тут просто заглушка, т.к. файлы грузятся после создания поста'])]
]); ?>
<div class="form-group">
<?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?> //Кнопка для создания поста
</div>
<?php ActiveForm::end(); ?>