Controller:
public function actionAdd()
{
$model = new Info();
if ( $model->load(Yii::$app->request->post()) ) {
$model->img_preview = UploadedFile::getInstance($model, 'img_preview');
$model->img_full = UploadedFile::getInstance($model, 'img_full');
if ( $model->upload() && $model->save(false)) {
Yii::$app->session->setFlash('message', 'Данные сохранены!');
return $this->refresh();
}
Yii::$app->session->setFlash('message', 'Не правильные данные!');
}
return $this->render('add', compact('model'));
}
Model info:
class Info extends ActiveRecord
{
public static function tableName()
{
return '{{info}}';
}
public function rules() {
return [
[['title', 'preview', 'description_seo'], 'string', 'length' => [0, 255]],
[['title', 'preview', 'description_seo'], 'filter', 'filter' => 'strip_tags'],
[['title', 'preview', 'description_seo'], 'trim'],
[['title', 'preview', 'description_seo'], 'required'],
[['img_preview', 'img_full'], 'safe'],
['description', 'safe'],
];
}
public function upload() {
if ($this->validate()) {
$model = new InfoUpload($this);
$model->upload();
return true;
}
return false;
}
}
Model InfoUpload:
class InfoUpload extends Model
{
public $modelInfo;
public $img_preview;
public $img_full;
public function __construct(&$model)
{
$this->modelInfo = $model;
$this->img_preview = $model->img_preview;
$this->img_full = $model->img_full;
}
public function upload() {
// Создание директории
$folderName = $this->generateUniqFileName("web/info");
FileHelper::createDirectory( Yii::getAlias("@frontend/web/img/info/$folderName") );
// Создание файла
$imgPreviewName = $folderName . '/' . $this->generateUniqFileName("web/info/$folderName") . '.' . $this->img_preview->extension;
$this->img_preview->saveAs( Yii::getAlias("@frontend/web/img/info/$imgPreviewName") );
// Создание Файла
$imgFullName = $folderName . '/' . $this->generateUniqFileName("web/info/$folderName") . '.' . $this->img_full->extension;
$this->img_full->saveAs( Yii::getAlias("@frontend/web/img/info/$imgFullName") );
// Заполнение главной модели
$this->fillingInfo(['img_preview' => $imgPreviewName, 'img_full' => $imgFullName,]);
}
public function fillingInfo($paths) {
$this->modelInfo->img_preview = $paths['img_preview'];
$this->modelInfo->img_full = $paths['img_full'];
}
public function generateUniqFileName($path) {
$name = bin2hex(random_bytes(8));
if ( file_exists( Yii::getAlias("@frontend/$path/$name") ) ) return $this->generateUniqFileName($path);
else return $name;
}
}
Я создал две модели( Спасибо за это
Дмитрий ):
1) Модель Info - Отвечает за валидацию данных и запись их в базу данных
2) Модель InfoUpload - Отвечает за сохранение файлов и перезаписи значений в главной модели Info.
В InfoUpload передается вся модель Info по ссылке, и при записи файлов модель с данными Info обновляется, и вместо файлов там путь к ним.