Как получить имя старой картинки в экшене?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Как получить имя старой картинки в экшене?

Сообщение alexa777 »

Привет. Что касается просто удаления картинки по кнопке я разобрался, там ее нахожу по id и удаляю
А тут задача немного другая, удалять картинку из папки и ее запись в базе, при загрузке новой картинке, вместо нее. Проще говоря, есть картинка профиля, когда загружаю новую чтобы старая удалялась
Вот экшен, нечего в голово не пришло как искать картинку по finde() но тогда он выдает не объект а массив на объект. В общем поджскажите как правильно, вычислять старую картинку и удалять ее, когда загружаешь новую.
Спасибо заранее

Код: Выделить всё

public function actionUpload(){
        
        $image = new Images();
        if(Yii::$app->request->isPost){
            $image->user_id = Yii::$app->user->id;
            $image->refer = 'profile';
            $image = Images::find()->andWhere(['refer' => 'profile'])->all();
            $name = $image->name;
            unlink(Yii::getAlias('@profile_img') . DIRECTORY_SEPARATOR .$name);
            $image->delete();
            $image->update();
            $image->image = UploadedFile::getInstance($image, 'image');  
          
            if ($image->image) {
                $name = 'profile_' . uniqid() . '.' . $image->image->extension;
                $image->image->saveAs('uploads/' . $name);
                $image->name = $name;
                
            }
            
                
            $image->save(false);   
            
                
            return $this->redirect(['index']);

       }else {
            return $this->redirect(['index']);
            
        }
 
}
lenbord
Сообщения: 49
Зарегистрирован: 2016.01.12, 10:48
Контактная информация:

Re: Как получить имя старой картинки в экшене?

Сообщение lenbord »

Код: Выделить всё

$image->delete();
$image->update();
вот тут не понятно что Вы делаете, зачем вызывать методы для пустого объекта?
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как получить имя старой картинки в экшене?

Сообщение alexa777 »

lenbord писал(а): 2018.03.06, 12:51

Код: Выделить всё

$image->delete();
$image->update();
вот тут не понятно что Вы делаете, зачем вызывать методы для пустого объекта?
Это я уже понял, что он пустой и появляется только после
$image->image = UploadedFile::getInstance($image, 'image');
Как найти старую картинку и удалить ее?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: Как получить имя старой картинки в экшене?

Сообщение BalykhinAS »

alexa777 писал(а): 2018.03.06, 12:47 Привет. Что касается просто удаления картинки по кнопке я разобрался, там ее нахожу по id и удаляю
А тут задача немного другая, удалять картинку из папки и ее запись в базе, при загрузке новой картинке, вместо нее. Проще говоря, есть картинка профиля, когда загружаю новую чтобы старая удалялась
Вот экшен, нечего в голово не пришло как искать картинку по finde() но тогда он выдает не объект а массив на объект. В общем поджскажите как правильно, вычислять старую картинку и удалять ее, когда загружаешь новую.
Спасибо заранее

Код: Выделить всё

public function actionUpload(){
        
        $image = new Images();
        if(Yii::$app->request->isPost){
            $image->user_id = Yii::$app->user->id;
            $image->refer = 'profile';
            $image = Images::find()->andWhere(['refer' => 'profile'])->all();
            $name = $image->name;
            unlink(Yii::getAlias('@profile_img') . DIRECTORY_SEPARATOR .$name);
            $image->delete();
            $image->update();
            $image->image = UploadedFile::getInstance($image, 'image');  
          
            if ($image->image) {
                $name = 'profile_' . uniqid() . '.' . $image->image->extension;
                $image->image->saveAs('uploads/' . $name);
                $image->name = $name;
                
            }
            
                
            $image->save(false);   
            
                
            return $this->redirect(['index']);

       }else {
            return $this->redirect(['index']);
            
        }
 
}
загрузите модели изображений и распечатайте - там есть новые и старые атрибуты
lenbord
Сообщения: 49
Зарегистрирован: 2016.01.12, 10:48
Контактная информация:

Re: Как получить имя старой картинки в экшене?

Сообщение lenbord »

так Вы сделайте вот так:

Код: Выделить всё

$uploadImage = UploadedFile::getInstance($image, 'image');

if ($uploadImage) {
$image->image // тут же старая картинка пока что хранится, вот сперва удалите ее, а потом туда новую запишите
}
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как получить имя старой картинки в экшене?

Сообщение alexa777 »

lenbord писал(а): 2018.03.06, 12:57 так Вы сделайте вот так:

Код: Выделить всё

$uploadImage = UploadedFile::getInstance($image, 'image');

if ($uploadImage) {
$image->image // тут же старая картинка пока что хранится, вот сперва удалите ее, а потом туда новую запишите
}
Сделал, там показывает NULL может это поможет, у меня для картинок отдельная модель и таблица

Код: Выделить всё

public function actionUpload(){
        
        $image = new Images();
        if(Yii::$app->request->isPost){
            $image->user_id = Yii::$app->user->id;
            $image->refer = 'profile';
            $image = UploadedFile::getInstance($image, 'image');

            if ($image) {
            $image->image;
            }
          return var_dump($image);
            if ($image->image) {
                $name = 'profile_' . uniqid() . '.' . $image->image->extension;
                $image->image->saveAs('uploads/' . $name);
                $image->name = $name;
                
            }
            
                
            $image->save(false);   
            
                
            return $this->redirect(['index']);

       }else {
            return $this->redirect(['index']);
            
        }
 
}
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как получить имя старой картинки в экшене?

Сообщение alexa777 »

вместо

Код: Выделить всё

if ($image) {
            $image->image;
            }
сделал

Код: Выделить всё

if ($image) {
            $image->name;
            }
Показывает новую картинку
object(yii\web\UploadedFile)#116 (5) { ["name"]=> string(9) "44353.jpg" ["tempName"]=> string(14) "/tmp/php3PwTmJ" ["type"]=> string(10) "image/jpeg" ["size"]=> int(100539) ["error"]=> int(0) }

Вот если что моя модель

Код: Выделить всё

<?php

namespace common\models;

use Yii;
use yii\web\UploadedFile;


/**
 * This is the model class for table "images".
 *
 * @property int $id
 * @property string $name
 * @property string $refer
 * @property int $user_id
 */
class Images extends \yii\db\ActiveRecord
{
    
    public $image;
     
    
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'images';
    }
    
     
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['name', 'refer', 'user_id'], 'required'],
            [['user_id'], 'integer'],
            [['name'], 'string', 'max' => 150],
            [['refer'], 'string', 'max' => 50],
            [['image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg, jpeg', 'maxFiles' => 4],
        ];
    }
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как получить имя старой картинки в экшене?

Сообщение alexa777 »

Неужели никто не знает как это сделать?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Как получить имя старой картинки в экшене?

Сообщение Nex-Otaku »

Заменить "all()" на "one()".

Код: Выделить всё

$image = Images::find()->andWhere(['refer' => 'profile'])->one();
Похоже, что рано вам заниматься фреймворком, вам бы основы PHP и MySQL изучить.
alexa777
Сообщения: 299
Зарегистрирован: 2016.03.01, 17:38

Re: Как получить имя старой картинки в экшене?

Сообщение alexa777 »

Nex-Otaku писал(а): 2018.03.06, 14:52 Заменить "all()" на "one()".

Код: Выделить всё

$image = Images::find()->andWhere(['refer' => 'profile'])->one();
Похоже, что рано вам заниматься фреймворком, вам бы основы PHP и MySQL изучить.
Спасибо за подсказку, помогло)))
Я все учу, для меня практика это лучшее учение
Ответить