z-song / laravel-admin

Build a full-featured administrative interface in ten minutes
https://laravel-admin.org
MIT License
11.13k stars 2.81k forks source link

hasMany 多图上传 删除失败 临时解决办法 #5702

Open devzzk opened 1 year ago

devzzk commented 1 year ago

Description:

$form->hasMany('images', 'images', function (\Encore\Admin\Form\NestedForm $form) {
    $form->multipleImage('images_path', 'images')->removable();
});

多图上传 删除失败 临时解决方案:

Steps To Reproduce:

namespace App\Admin\Extensions\Form\Field;

use Encore\Admin\Form;

class MultipleImage extends \Encore\Admin\Form\Field\MultipleImage
{

    /**
     * Set default options form image field.
     *
     * @return void
     */
    protected function setupDefaultOptions()
    {
        $defaults = [
            'overwriteInitial'     => false,
            'initialPreviewAsData' => true,
            'msgPlaceholder'       => trans('admin.choose_file'),
            'browseLabel'          => trans('admin.browse'),
            'cancelLabel'          => trans('admin.cancel'),
            'showRemove'           => false,
            'showUpload'           => false,
            'showCancel'           => false,
            'dropZoneEnabled'      => false,
            'deleteExtraData'      => [
                $this->formatName($this->column) => static::FILE_DELETE_FLAG,
                static::FILE_DELETE_FLAG         => '',
                '_token'                         => csrf_token(),
                '_method'                        => 'PUT',
                '_uu_key'                         => $this->getErrorKey(), //  重点是这个 key, 可以在http 请求时带上
                                                         // $this->getErrorKey() => images.{id}.images_path
            ],
        ];

        if ($this->form instanceof Form) {
            $defaults['deleteUrl'] = $this->form->resource().'/'.$this->form->model()->getKey();
        }

        $defaults = array_merge($defaults, ['fileActionSettings' => $this->fileActionSettings]);

        $this->options($defaults);
    }
}

bootstrap.php

\Encore\Admin\Form::forget(['multipleImage']);
\Encore\Admin\Form::extend('multipleImage', App\Admin\Extensions\Form\Field\MultipleImage::class);

Controller.php

$form->saved(function (Form $form) {
    if (request()->wantsJson() && request()->has(Field::FILE_DELETE_FLAG)) {
        $key = $form->input(\Encore\Admin\Form\Field::FILE_DELETE_FLAG);  // 获取需要删除的键值
        $id = explode('.', $form->input('uu_key'))[1];    // 获取需要删除的数据的id 
        $image = Model::find($id);
        $images = $image->images_path;
        unset($images[$key]);
        $image->images_path = $images;
        $image->save();
        return resonse();
    }
});
devzzk commented 1 year ago

希望有所帮助