php - 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"}}
您对如何解决此问题有任何想法吗?
编辑 - 答案
<?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
等待您的评论)
解决方案
推荐阅读
- c# - SQL 连接未连接到索赔数据库
- hadoop - nifi ConvertRecord JSON to CSV 只获得一条记录?
- mysql - 将大型 MySQL 表拆分为多个文件?
- android - 访问存储库中的 appcontext 以获取共享首选项(架构)
- json - Newtonsoft 序列化隐藏的继承成员
- java - Javascript WebApp的Spring Security Oauth2身份验证
- python-3.x - Python Tkinter - for循环计数器增量按钮错误
- android - 当一张表有很多记录时,为什么我的 Sqlite 数据库变得非常慢?
- python - 用于解析文本、根据第一列中的值创建多个文件并根据匹配进行排序的 Python 脚本
- inheritance - 如何在 kotlin 中使用成员定义类可以在 java 派生类中访问