首页 > 解决方案 > Voyager Page Blocks 无法删除图像

问题描述

向我的页面添加了标准图像行块。添加了一些图片。并且不能删除最后一张图片。第一次 - 删除图标没有监听器,当点击图标时 - 没有发生任何事情。复制到我的项目的块编辑视图 \resources\views\vendor\voyager\page-blocks\edit-add.blade.php 从 \vendor\tcg\voyager\resources\views\bread\edit-add.blade 复制的侦听器。 php - 删除工作的地方

            $('.form-group').on('click', '.remove-multi-image', deleteHandler('img', true));
            $('.form-group').on('click', '.remove-single-image', deleteHandler('img', false));
            $('.form-group').on('click', '.remove-multi-file', deleteHandler('a', true));
            $('.form-group').on('click', '.remove-single-file', deleteHandler('a', false));

        $('#confirm_delete').on('click', function(){
            $.post('{{ route('voyager.'.$dataType->slug.'.media.remove') }}', params, function (response) {
                if ( response
                    && response.data
                    && response.data.status
                    && response.data.status == 200 ) {

                    toastr.success(response.data.message);
                    $file.parent().fadeOut(300, function() { $(this).remove(); })
                } else {
                    toastr.error("Error removing file.");
                }
            });

            $('#confirm_delete_modal').modal('hide');
        });

修复了小问题。但请求删除图像返回 400 - {"data":{"status":400,"message":"Field does not exist"}}

我认为这是因为页面块在一个 DB 列“数据”中包含所有字段 在此处输入图像描述

在此处输入图像描述

您对如何解决此问题有任何想法吗?

编辑 - 答案

<?php

namespace App\Http\Controllers;

use TCG\Voyager\Http\Controllers\VoyagerBaseController;
use Illuminate\Http\Request;
use TCG\Voyager\Facades\Voyager;
use Exception;

class VoyagerRewriten extends VoyagerBaseController
{
    //***************************************
    //
    //  Delete uploaded file
    //
    //****************************************

    public function remove_media(Request $request)
    {


        try {

            // GET THE SLUG, ex. 'posts', 'pages', etc.
            $slug = $request->get('slug');

            // GET file name
            $filename = $request->get('filename');

            // GET record id
            $id = $request->get('id');

            // GET field name
            $field = $request->get('field');

            // GET multi value
            $multi = $request->get('multi');

            $dataType = Voyager::model('DataType')->where('slug', '=', $slug)->first();

            // Load model and find record
            $model = app($dataType->model_name);
            $block = $model::find([$id])->first();

            // 
            // Check if field exists

            if ( $slug == 'page-blocks' ) {
                $data = $block->data;

                if (!isset($data->{$field})) {
                    throw new Exception(__('voyager::generic.field_does_not_exist'), 400);
                }

                    
                // Check permission
                // $this->authorize('edit', $data);

                if ($multi) {
                    // Check if valid json
                    if (is_null(@json_decode($data->{$field}))) {
                        throw new Exception(__('voyager::json.invalid'), 500);
                    }

                    // Decode field value
                    $fieldData = @json_decode($data->{$field}, true);
                    $key = null;

                    // Check if we're dealing with a nested array for the case of multiple files
                    if (is_array($fieldData[0])) {
                        foreach ($fieldData as $index=>$file) {
                            // file type has a different structure than images
                            if (!empty($file['original_name'])) {
                                if ($file['original_name'] == $filename) {
                                    $key = $index;
                                    break;
                                }
                            } else {
                                $file = array_flip($file);
                                if (array_key_exists($filename, $file)) {
                                    $key = $index;
                                    break;
                                }
                            }
                        }
                    } else {
                        $key = array_search($filename, $fieldData);
                    }

                    // Check if file was found in array
                    if (is_null($key) || $key === false) {
                        throw new Exception(__('voyager::media.file_does_not_exist'), 400);
                    }

                    $fileToRemove = $fieldData[$key]['download_link'] ?? $fieldData[$key];

                    // Remove file from array
                    unset($fieldData[$key]);

                    // Generate json and update field
                    $data->{$field} = empty($fieldData) ? null : json_encode(array_values($fieldData));
                    $block->data = $data;
                    $this->deleteFileIfExists($fileToRemove);
                } else {
                    if ($filename == $data->{$field}) {
                        $fileToRemove = $data->{$field};

                        $data->{$field} = null;
                        $block->data = $data;
                    } else {
                        throw new Exception(__('voyager::media.file_does_not_exist'), 400);
                    }
                }

                // Remove file from filesystem
                $this->deleteFileIfExists($fileToRemove);

                
            } else {
                // Check if field exists
                if (!isset($block->{$field})) {
                    throw new Exception(__('voyager::generic.field_does_not_exist'), 400);
                }

                // Check permission
                $this->authorize('edit', $block);

                if (@json_decode($multi)) {
                    // Check if valid json
                    if (is_null(@json_decode($block->{$field}))) {
                        throw new Exception(__('voyager::json.invalid'), 500);
                    }

                    // Decode field value
                    $fieldData = @json_decode($block->{$field}, true);
                    $key = null;

                    // Check if we're dealing with a nested array for the case of multiple files
                    if (is_array($fieldData[0])) {
                        foreach ($fieldData as $index=>$file) {
                            // file type has a different structure than images
                            if (!empty($file['original_name'])) {
                                if ($file['original_name'] == $filename) {
                                    $key = $index;
                                    break;
                                }
                            } else {
                                $file = array_flip($file);
                                if (array_key_exists($filename, $file)) {
                                    $key = $index;
                                    break;
                                }
                            }
                        }
                    } else {
                        $key = array_search($filename, $fieldData);
                    }

                    // Check if file was found in array
                    if (is_null($key) || $key === false) {
                        throw new Exception(__('voyager::media.file_does_not_exist'), 400);
                    }

                    $fileToRemove = $fieldData[$key]['download_link'] ?? $fieldData[$key];

                    // Remove file from array
                    unset($fieldData[$key]);

                    // Generate json and update field
                    $block->{$field} = empty($fieldData) ? null : json_encode(array_values($fieldData));
                } else {
                    if ($filename == $block->{$field}) {
                        $fileToRemove = $block->{$field};

                        $block->{$field} = null;
                    } else {
                        throw new Exception(__('voyager::media.file_does_not_exist'), 400);
                    }
                }

                $row = $dataType->rows->where('field', $field)->first();

                // Remove file from filesystem
                if (in_array($row->type, ['image', 'multiple_images'])) {
                    $this->deleteBreadImages($block, $field, $fileToRemove);
                } else {
                    $this->deleteFileIfExists($fileToRemove);
                }
            }

                $block->save();

                return response()->json([
                    'data' => [
                        'status'  => 200,
                        'message' => __('voyager::media.file_removed'),
                    ],
                ]);

        } catch (Exception $e) {
            $code = 500;
            $message = __('voyager::generic.internal_error');

            if ($e->getCode()) {
                $code = $e->getCode();
            }

            if ($e->getMessage()) {
                $message = $e->getMessage();
            }

            return response()->json([
                'data' => [
                    'status'  => $code,
                    'message' => $message,
                ],
            ], $code);
        }
    }
}

enter code here

等待您的评论)

标签: phplaravelvoyager

解决方案


推荐阅读