Трудность понимания нескольких загрузок в Yii2

У меня есть 2 таблицы: ЗАЯВЛЕНИЕ и ФАЙЛЫ

ЗАЯВЛЕНИЕ: идентификатор, имя, описание, создано

ФАЙЛЫ: идентификатор, идентификатор запроса, вложение,

При создании нового запроса мне нужно загрузить несколько вложений одновременно, я хотел бы знать, как будет выглядеть код в ACTION SolicitationController, чтобы файлы отправлялись в папку UPLOAD, а имена сохранялись в таблице FILES:

public function actionCreate()
{
    $model = new Solicitation();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        Yii::$app->session->setFlash('protocolo-success', 'Solicitation Saved!');
        return $this->redirect(['index']);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

Обновить

Модель запроса:

<?php

namespace app\modules\solicitation\models;
use app\models\User;
use Yii;

class Registros extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'mod_solicitation_records';
    }

    public $files;

    public function rules()
    {
        return [
            [['id','name','location_id','user_id'], 'required'],
            [['description'], 'safe'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'Nº Protocolo',
            'name' => 'Nome',
            'description' => 'Descrição',
        ];
    }

    public function getUser()
    {
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }      

    public function getLocation()
    {
        return $this->hasOne(Location::className(), ['id' => 'location_id']);
    }

}

2 ответа

Создайте модель UploadForm, используя следующую ссылку

Не забудьте изменить пространство имен "приложение" в модели, а также добавить следующую строку в контроллер.

use app\models\UploadForm;
use yii\web\UploadedFile;

Теперь измените действие контроллера следующим образом:

public function actionCreate(){
$model = new Solicitation();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
   $upload = new UploadForm();
   $upload->imageFiles = UploadedFile::getInstances($model, 'imageFiles');
        if ($model->upload()) {
            \Yii::$app->session->setFlash('protocolo-success', 'Solicitation Saved!');
    return $this->redirect(['index']);
        }

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

Попробуйте это с вашим действием создания контроллера "SOLICITATION"

public function actionCreate() {

    $model = new Registros();
    if ($model->load(Yii::$app->request->post() && $model->save(false))) {
        // SOLICITATION ID 
        $solicitation_id = $model->id;

        $flag = false;
        // GET INSTANCES OF FILE 
        $model->files = \yii\web\UploadedFile::getInstances($model, 'files');

        foreach ($model->files as $file) {
            $file_name = $file->baseName . '.' . $file->extension;
            $flag = $file->saveAs("UPLOAD_FOLDER_BASEPATH/" . $file_name);
            if ($flag) {
                $fileObj = new FILES_MODEL();
                $fileObj->solicitation_id = $solicitation_id;
                $fileObj->attachment = $file_name;
                $fileObj->created = time();
                $fileObj->save(false);
            } else {
                echo "FILE UPLOAD ERROR CODE  : " . $_FILES["file"]["error"];
                exit;
            }
        }
        Yii::$app->session->setFlash('protocolo-success', 'Solicitation Saved!');
        return $this->redirect(['index']);
    } else {
        return $this->render('create', [
                    'model' => $model,
        ]);
    }
}

и просмотр файла есть

<?= $form->field($model, 'files[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?>
Другие вопросы по тегам