/** * Обновление книги. * * @param string $id * * @return mixed * @throws \Exception * @throws \yii\base\Exception * @throws \yii\web\NotFoundHttpException */ public function actionUpdate($id) { $model = $this->findModel($id); $oldImagePath = $model->preview; if ($model->load(Yii::$app->request->post()) && $model->save()) { if (null !== ($image = UploadedFile::getInstance($model, 'preview'))) { $model->preview = $image; if (!$model->validate(['preview'])) { Yii::$app->getSession()->setFlash('error', Html::errorSummary($model, ['header' => 'Пожалуйста, исправьте следующие ошибки:', 'encode' => false])); // возвращаем путь к изображению, если валидация провалилась $model->preview = $oldImagePath; $model->update(false, ['preview']); return $this->render('update', ['model' => $model]); } // удаляем предыдущее изображение $oldImageFile = Yii::$app->params['booksUploadsDir'] . $oldImagePath; if (is_file($oldImageFile)) { unlink($oldImageFile); } // работаем с новым загруженным изображением $uploadsDir = realpath(Yii::$app->params['booksUploadsDir']); $uploadsTmpDir = realpath(Yii::$app->params['frontendUploadsTmpDir']); // сохраняем изображение во временную директорию $tmpFilename = $uploadsTmpDir . DIRECTORY_SEPARATOR . 'book_preview_' . uniqid() . '.' . $image->getExtension(); if (false === $image->saveAs($tmpFilename)) { throw new Exception('Невозможно сохранить загруженное изображение для превью книги в файл: ' . $tmpFilename); } else { // создаем вложенные директории $path = Util::createNestedFolders($uploadsDir, $model->id); $filename = $path . DIRECTORY_SEPARATOR . dechex($model->id) . '.' . $image->getExtension(); $previewFilename = $path . DIRECTORY_SEPARATOR . dechex($model->id) . '_thumb.' . $image->getExtension(); $imagine = Image::getImagine(); /** @var $i \Imagine\Gd\Image */ $i = $imagine->open($tmpFilename); // если размеры изображения превышают лимиты, оно ресайзится if ($i->getSize()->getWidth() > Yii::$app->params['maxImageWidth'] || $i->getSize()->getHeight() > Yii::$app->params['maxImageHeight']) { $i->thumbnail(new Box(Yii::$app->params['maxImageWidth'], Yii::$app->params['maxImageHeight']), ImageInterface::THUMBNAIL_INSET)->save($filename, ['quality' => 100]); } else { $i->save($filename); } // создаем превьюшку из исходника $i = $imagine->open($tmpFilename); if ($i->getSize()->getWidth() > Yii::$app->params['thumbnailDefaultWidth'] || $i->getSize()->getHeight() > Yii::$app->params['thumbnailDefaultHeight']) { $i->thumbnail(new Box(Yii::$app->params['thumbnailDefaultWidth'], Yii::$app->params['thumbnailDefaultHeight']), ImageInterface::THUMBNAIL_INSET)->save($previewFilename, ['quality' => 100]); } // удаляем временный файл unlink($tmpFilename); $filename = str_replace('\\', '/', $filename); $filename = preg_replace('=^(.*?)(/uploads/books/.*)$=iu', '\\2', $filename); $model->preview = $filename; } } else { $model->preview = $oldImagePath; } $model->update(false, ['preview']); Yii::$app->getSession()->setFlash('success', 'Данные книги «' . $model->name . '» успешно обновлены.'); if (null === ($referer = Yii::$app->request->post('referer'))) { return $this->redirect(['index', 'id' => $model->id]); } else { return $this->redirect($referer); } } else { return $this->render('update', ['model' => $model]); } }