Мой вам совет. Создайте дополнительную модель для формы. В ней производите валидацию непосредственно данных введенных пользователем, в том числе и самого файла.
А после загрузки файла и валидации всей формы - создавайте объект вашей модели, записывайте туда имя файла и сохраняйте ее.
Это нормальная практика иметь одну модель для связи с базой, и другую для валидации формы.
В данном примере модель формы имеет метод SaveModel. Который сохраняет модельку сущности из базы. В моем случае не нужно редактировать файл изображения (Attachment), поэтому я просто создаю новый, а старый удаляю. Имхо не самый лучше код, но какой сумел быстро найти.
<?php
/**
* Created by PhpStorm.
* User: Jakeroid
* Date: 17-Jul-15
* Time: 13:28
*/
namespace app\modules\cp\models;
use app\models\Attachment;
use Yii;
use yii\base\Model;
use app\models\Team;
class TeamForm extends Model
{
public $name;
public $logo;
/**
* @var Team
*/
private $dbModel;
/**
* @return array the validation rules.
*/
public function rules()
{
return [
[['name'], 'required'],
[['name'], 'string', 'max' => 255],
[['logo'], 'file', 'extensions' => 'gif, jpg, jpeg, png', 'skipOnEmpty' => false],
];
}
/**
* @return array customized attribute labels
*/
public function attributeLabels()
{
return [
'name' => Yii::t('app', 'Team name'),
'logo' => Yii::t('app', 'Team logo (flag)'),
];
}
/**
* @param $is_update boolean
* @return boolean from save method of dbModel
*/
public function saveModel($is_update = false)
{
$attachment = new Attachment();
$attachment->type = 'team_logo';
$attachment->attachments_group_id = 0;
$attachment->saveWithFile($this->logo);
if ($is_update) {
$this->dbModel->logo->delete();
}
$this->dbModel->logo_id = $attachment->id;
$this->dbModel->name = $this->name;
return $this->dbModel->save();
}
public function loadModel($model)
{
$this->dbModel = $model;
$this->name = $model->name;
}
/**
* @return Team from current dbModel
*/
public function getModel()
{
return $this->dbModel;
}
}
Контроллер такой:
public function actionUpdate($id)
{
$model = new TeamForm();
$model->loadModel($this->findModel($id));
if ($model->load(Yii::$app->request->post())) {
$model->logo = UploadedFile::getInstance($model, 'logo');
if ($model->validate() && $model->logo) {
$model->saveModel(true);
return $this->redirect(['view', 'id' => $model->getModel()->id]);
}
}
return $this->render('update', [
'model' => $model,
]);
}