Задать вопрос

Как загрузить картинку в actionUpdate в yii2?

Здравствуйте, использую плагин kartik FileInput для загрузки изображений. Всё работает нормально.

Проблема в том, что когда я хочу обновить модель, то картинка не подгружается.

Смотреть картинку
b7425c705ade6fc9d94c29966b2b07ae.png
actionUpdate()

public function actionUpdate($id)
    {
        $object = Object::findOne($id);

        if ($object->load(Yii::$app->request->post()))
        {

            $directory = Yii::getAlias('@webroot') . '/uploads/Object/';
            $file = UploadedFile::getInstance($object, 'image');

            if ($file)
            {
                $object->image = strtotime('now') . '_' . Yii::$app->getSecurity()->generateRandomString(10) . '.' . $file->extension;

                if ($file->saveAs($directory . $object->image))
                {
                    $image = Yii::$app->image->load($directory . $object->image);
                    $image->resize(800, null, \Yii\image\drivers\Image::PRECISE)->save($directory . $object->image, 85);

                    $image = Yii::$app->image->load($directory . $object->image);
                    $image->resize('100', '100', Yii\image\drivers\Image::INVERSE);
                    $image->crop('100', '100');
                    $image->save($directory . 'thumb/' . $object->image, 90);
                }
            }

            if ($object->save() && $object->validate())
            {
                Yii::$app->session->setFlash('object-create-success');
            }
            else
            {
                Yii::$app->session->setFlash('object-action-error');
            }

            return $this->redirect(['/dispatcher/object']);
        }

        return $this->render('update', [
            'model' => $object,
        ]);
    }


Код самой формы

<?= $form->field($model, 'image')->widget(FileInput::className(), [
                        'name' => 'image',
                        'language' => 'ru',
                        'options' => [
                            'multiple' => false,
                        ],
                        'pluginOptions' => [
                            'uploadUrl' => Url::to(['/site/save-image']),
                            'theme' => "fa",
                            'maxFileCount' => 10,
                            'showCaption' => false,
                            'showRemove' => false,
                            'showUpload' => false,
                            'dropZoneEnabled' => false,
                            'browseClass' => 'dfx-btn dfx-btn-out upload-image',
                            'uploadClass' => 'dfx-btn dfx-btn-out upload-image',
                            'browseLabel' => 'Изменить изображение'
                        ]
                    ])->label('Изображение'); ?>


Как мне подгружать картинку уже созданной модели в этот плагин?
  • Вопрос задан
  • 620 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
slo_nik
@slo_nik Куратор тега Yii
Для того, чтобы были видны картинки при редактировании, Вам надо настроить несколько параметров виджета.
'pluginOptions' => [
       // остальные настройки
       'deleteUrl' => Url::to(['delete-img']), // укажите реальный путь к действию удаления изображений.
        'initialPreviewAsData' => true,
        'overwriteInitial'=>false,
        'initialPreview' => !$model->isNewRecord ? $model->imagesLinks : [],
        'initialPreviewConfig' => !$model->isNewRecord ? $model->imagesLinksData : [],
       // остальные настройки.
]

Методы imagesLinks и imagesLinksData могут выглядеть так
public function getImagesLinks()
    {
        $path = ArrayHelper::getColumn(UploadsFiles::find()->all(), 'pathImg');
        return $path;
    }

    public function getImagesLinksData()
    {
        $files = UploadsFiles::find()->all();
        return ArrayHelper::toArray($files,[
            UploadsFiles::class => [
                'caption' => 'file',
                'key' => 'id'
            ]
        ]);
    }
   // getPathImg() возвращает путь к изображению, используется в getImagesLinks()
    public function getPathImg()
    {
        return Url::home(true) . 'uploads/' . $this->file;
    }


p.s.
Для того,чтобы работал параметр "deleteUrl" нужно доработать код. Добавить js под формой
$this->registerJs('
  // #uploadsfiles-imagesfile - id Вашего FileInput
  $("#uploadsfiles-imagesfile").on("fileuploaded", function(event, data, previewId, index) {
  input.fileinput("destroy").fileinput({
    multiple: true,
    showUpload: false,
    showRemove: false,
    initialPreviewAsData: true,
    overwriteInitial: false,
    uploadUrl: "' . Url::to(['upload-img']) . '", // подставить реальный путь к действию
    deleteUrl: "' . Url::to(['delete-img']) . '", // подставить реальный путь к действию
    initialPreview: data.response.initialPreview,
    initialPreviewConfig: data.response.initialPreviewData,
  })
  input.closest("form").find("button").attr("disabled", false)
    console.log(data);
});
', View::POS_END);

И доработать действие actionUploadImg()
public function actionUploadImg()
    {
        $model = new UploadsFiles();

        if(Yii::$app->request->isAjax){
            $model->imagesFile = UploadedFile::getInstance($model, 'imagesFile');
            if($model->upload()){
                $model->load(Yii::$app->request->post());
                $model->saveImg();
                $answer['initialPreview'] = $model->getImagesLinks();
                $answer['initialPreviewData'] = $model->getImagesLinksData();
                return json_encode($answer);
            }
        }
        return false;
    }


Действие actionDeleteImg() может выглядеть так:
public function actionDeleteImg()
    {
        if(Yii::$app->request->isAjax){
            $model = UploadsFiles::find()->where('id=:id', [':id' => Yii::$app->request->post('key')])->one();
            FileHelper::unlink('uploads/' . $model->file);
            $model->delete();
            return Json::encode('Delete');
        }
        return false;
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы