Трудность понимания нескольких загрузок в 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/*']) ?>