@MarkLb

Как организовать обновление записи с виджетом FileInput от картик в Yii2?

Здравствуйте, использую виджет FileInput для загрузки миниатюр к записи. Создание/редактирование/etc записи сделано при помощи CRUD.

Дело в том, что когда происходит подгрузка формы обновления записи - не подгружается название изображения в БД, в отличии от других полей.

oH1J5.jpg

Допустим, изображение и все другие поля заполнены и мы решили отредактировать поле blocks.

1. Заходим в редактирование записи.
2. Заменяем содержимое поле blocks.
3. Сохраняем.

оскольку, поле миниатюры пустое -- сохранится null заместо текущего содержимого.

Собственно, хочу решить данную проблему. Пока из вариантов сделать отдельную функцию для обновления/добавления/удаления миниатюры, но это уже крайний вариант. Думаю, кто либо-встречался с данной проблемой и надеюсь, что сможет мне помочь.

Вот часть кода, которая отвечает за вывод формы загрузки изображения:

<?= $form->field($model, 'miniature')->widget(FileInput::classname(), [
    'options' => ['accept' => 'image/*'],
]); ?>


Функция сохранения изображения в модели:

public function beforeSave($insert)
{
    if ($file =  UploadedFile::getInstance($this, 'miniature') ){

        $dir = Yii::getAlias('@frontend').'/web/upload/';
        $this->miniature = time().'.'.$file->extension;
        $file->saveAs($dir.$this->miniature);

    }

    return parent::beforeSave($insert); 
}
  • Вопрос задан
  • 354 просмотра
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Думаю, что в beforeSave() плохая идея сохранения картинки.
Лучше сделайте проверку, пустое значение miniature или нет. Если не пустое, то заполнить новые данные старым значением. Конечно же при условии, что нового значения Вы не передали.
Что-то подобное должно быть
public function beforeSave($insert)
{
   if(!$this->isNewRecord && self::getOldAttribute('miniature') != ''){
        $this->miniature = self::getOldAttribute('miniature');
   }
    return parent::beforeSave($insert); 
}

Это первое, что пришло в голову. А так, надо разбираться с документацией виджета, возможно там это предусмотрено.
Возможно получится что-то подобное, но не уверен
<?= $form->field($model, 'miniature')->widget(FileInput::classname(), [
    'options' => ['accept' => 'image/*'],
    'model' => !Yii::$app->isNewRecord ? $model->miniature : null
]); ?>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы