Модель:
Код: Выделить всё
class Banners extends \yii\db\ActiveRecord {
public $group_id;
public $bannerImg;
public function rules() {
return [
[['bannerImg'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, gif'],
['name', 'trim'],
[['product_id', 'name', 'priority', 'bannerImg'], 'required'],
[['product_id', 'priority', 'disable'], 'integer'],
[['name'], 'string', 'max' => 200],
[['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Products::className(), 'targetAttribute' => ['product_id' => 'id']],
];
}
public function uploadBanner() {
if ($this->validate()) {
$fileName = str_replace('.', '', microtime(true));
$fullFileName = Yii::getAlias('@app')."/banners/{$fileName}.".$this->bannerImg->extension;
$this->bannerImg->saveAs($fullFileName);
$size_v = getimagesize($fullFileName);
if (empty($size_v[0]) || empty($size_v[1])) {
@unlink($fullFileName);
return FALSE;
}
$resultObj = new \stdClass();
$resultObj->filename = $fileName.'.'.$this->bannerImg->extension;
$resultObj->sizeX = $size_v[0];
$resultObj->sizeY = $size_v[1];
return $resultObj;
}
else {
Yii::$app->session->setFlash('error', 'Ошибка загрузки файла');
return FALSE;
}
}
........................................................
public function saveNewBanner($bannerInfo_v) {
$transaction = Yii::$app->db->beginTransaction();
// в таблице есть поля для имени и размеров
$this->file_name = $bannerInfo_v->filename;
$this->size_x = $bannerInfo_v->sizeX;
$this->size_x = $bannerInfo_v->sizeY;
if ($this->save()) {
$transaction->commit();
Yii::$app->session->setFlash('success', 'Баннер добавлен');
return TRUE;
}
}
else
$transaction->rollBack();
Yii::$app->session->setFlash('error', 'Ошибка при добавлении баннера');
return FALSE;
}
Код: Выделить всё
public function actionCreate() {
$model = new Banners();
if ($model->load(Yii::$app->request->post())) {
$model->bannerImg = \yii\web\UploadedFile::getInstance($model, 'bannerImg');
$bannerInfo_v = $model->uploadBanner();
if (!empty($bannerInfo_v)) {
$model->saveNewBanner($bannerInfo_v);
}
return $this->redirect(['view', 'id' => $model->id]);
} else {
........................................................
Насколько я понял из чтения гугла, ошибка возникает из за того, что сохранение файла через $this->bannerImg->saveAs($fullFileName) нужно делать ПОСЛЕ сохранения модели $this->save(). Но мне надо первым грузить файл, а потом уже сохранять данные в бд. Пробовал, так же по некоторым примерам после присвоения значений полям модели делать $this->bannerImg = NULL, но в этом случае не проходит валидация и мне выдаётся ошибка "Отсутствуют обязательные параметры: id". Какого-то внятного ответа, как поступать в таких случаях я не нашел. Подскажите, что делать и собственно почему так происходит? Я так понимаю это происходит из-за правила валидации 'file', но хотелось бы более полно понять процесс.PHP Warning – yii\base\ErrorException
finfo_file(Z:\OpenServer\userdata\temp\php3FF1.tmp): failed to open stream: No such file or directory