Как осуществить одновременную загрузку документа и картинки?

Всем здравствуйте! Помогите пожалуйста разобраться. В общем задача такая - при формировании материала необходимо, чтобы можно было загрузить документ (doc или zip), а также загрузить картинку, за два этих параметра в форме отвечают две разные строки, для документа это docPath, для картинки gallery, бывает что надо загрузить только документ, а бывает что только картинку без документа. Функции указанные ниже рабочие, но я не знаю как их заставить работать вместе, проблема у меня в коде после проверки валидации.
public function actionCreate()
{
    $model = new Material([
      'dirName' => date('Y-m-d'),
    ]);

    if ($model->load(Yii::$app->request->post())){
        $model->alias = str2url($model->name); // алиас материала
        $model->docFile = UploadedFile::getInstance($model, 'docFile'); // Загрузка документа
        if ($model->validate()) {
            if ($model->save(false)) { // Загрузка картинки
                $model->gallery = UploadedFile::getInstances($model, 'gallery');
                $model->uploadGallery();                    
                Yii::$app->session->setFlash('success', "Материал {$model->name} добавлен");
                return $this->redirect(['view', 'id' => $model->id]);
            }
            if($model->path = $model->upload()) { // Загрузка документа
                if ($model->save(false)) {
                    Yii::$app->session->setFlash('success', "Документ {$model->name} добавлен");
                    return $this->redirect(['view', 'id' => $model->id]);
                }
            }
        }
    }
    return $this->render('create', [
        'model' => $model,
    ]);
}
  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ballly
@Ballly Автор вопроса
Файл _form.php
Загрузка картинки
<?= $form->field($model, 'gallery[]')->widget(FileInput::classname(), [
    'name' => 'attachment_49[]',
    'options'=>[
        'multiple'=>true
    ],
]);
?>

Загрузка документа
<?= $form->field($model, 'docFile')->widget(FileInput::classname(), [
    'name' => 'attachment_51',
    'pluginOptions' => [
        'showUpload' => false,
        'browseLabel' => '',
        'removeLabel' => '',
        'mainClass' => 'input-group-lg'
    ],
]) ?>


Модель
public $gallery;
public $docFile;
public $dirPath = 'upload/documents/';
public $dirName = '';

// Загрузка изображение
public function uploadGallery(){
    if($this->validate()){
        foreach ($this->gallery as $file){
            $path = 'upload/store/' . $file->baseName . '.' . $file->extension;
            $file->saveAs($path);
            $this->attachImage($path);
            @unlink($path);
        }
        return true;
    }else{
        return false;
    }
}

// Загрузка документа
public function upload()
{    
    if ($this->validate()) {
        $path = $this->processMkDir();
        $fileName = Inflector::slug(pathinfo($this->str2url($this->docFile->baseName), PATHINFO_FILENAME)) . '.' . $this->docFile->extension;
        $this->docFile->saveAs($path . $fileName);
        return $fileName;
    } else {
        return false;
    }
}

protected function processMkDir()
{
    $path = (!empty($this->dirName)) ? $this->dirPath.$this->dirName.'/' : $this->dirPath;
    if (!file_exists($path)) {
        mkdir($path, 0777, true);
    }
    return $path;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы