From 5a15ed44c8250090ec6ef9e2c4088cc5bf7fd16f Mon Sep 17 00:00:00 2001 From: Vincent Vanwaelscappel Date: Wed, 18 May 2022 15:24:41 +0200 Subject: [PATCH] wait #5284 @2 --- .../Controllers/CubistFilesorURLUpload.php | 30 +++ src/app/Magic/Fields/FilesOrURL.php | 27 +++ .../Magic/Models/CubistMagicAbstractModel.php | 36 ++++ .../views/fields/filesorurl.blade.php | 193 ++++++++++++++++++ .../cubist/backpack/filesorurlupload.php | 8 + 5 files changed, 294 insertions(+) create mode 100644 src/app/Http/Controllers/CubistFilesorURLUpload.php create mode 100644 src/resources/views/fields/filesorurl.blade.php create mode 100644 src/routes/cubist/backpack/filesorurlupload.php diff --git a/src/app/Http/Controllers/CubistFilesorURLUpload.php b/src/app/Http/Controllers/CubistFilesorURLUpload.php new file mode 100644 index 0000000..ee83a52 --- /dev/null +++ b/src/app/Http/Controllers/CubistFilesorURLUpload.php @@ -0,0 +1,30 @@ +get('entity'); + $id = request()->get('entry_id'); + $attribute = request()->get('attribute'); + /** @var CubistMagicAbstractModel $instance */ + $instance = $className::find($id); + + foreach (request()->allFiles() as $files) { + if (!is_array($files)) { + $files = [$files]; + } + foreach ($files as $file) { + /** @var $file UploadedFile */ + $res[] = $instance->uploadFreeFile($file, $attribute); + } + } + return response()->json($res); + } +} diff --git a/src/app/Magic/Fields/FilesOrURL.php b/src/app/Magic/Fields/FilesOrURL.php index b5dacf3..1899d82 100644 --- a/src/app/Magic/Fields/FilesOrURL.php +++ b/src/app/Magic/Fields/FilesOrURL.php @@ -2,7 +2,34 @@ namespace Cubist\Backpack\Magic\Fields; +use Cubist\Backpack\CubistBackpackServiceProvider; + class FilesOrURL extends Field { + protected $_adminType = 'filesorurl'; + protected $_viewNamespace = CubistBackpackServiceProvider::NAMESPACE . '::fields'; + protected $_destination = ''; + + public function getDefaultAttributes() + { + return array_merge(parent::getDefaultAttributes(), ['destination' => $this->_destination]); + } + + protected function _postSetAttributes() + { + parent::_postSetAttributes(); + $accept = $this->getAttribute('accept', null); + if ($accept !== null) { + $this->setAttribute('accept', $this->_normalizeAccept($accept)); + } + } + protected function _normalizeAccept($accept) + { + if (is_array($accept)) { + $accept = implode(', ', $accept); + } + $accept = str_replace('*.', '.', $accept); + return $accept; + } } diff --git a/src/app/Magic/Models/CubistMagicAbstractModel.php b/src/app/Magic/Models/CubistMagicAbstractModel.php index f6adeda..be2b1be 100644 --- a/src/app/Magic/Models/CubistMagicAbstractModel.php +++ b/src/app/Magic/Models/CubistMagicAbstractModel.php @@ -8,6 +8,7 @@ use Backpack\CRUD\app\Http\Controllers\Operations\CloneOperation; use Cubist\Backpack\Magic\Fields\Composed; use Cubist\Backpack\Magic\Fields\Datetime; use Cubist\Backpack\Magic\Fields\Files; +use Cubist\Backpack\Magic\Fields\FilesOrURL; use Cubist\Backpack\Magic\Operations\CreateOperation; use Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation; use Cubist\Backpack\Magic\Operations\UpdateOperation; @@ -29,6 +30,7 @@ use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Http\UploadedFile; use Illuminate\Support\Arr; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Cache; @@ -1174,6 +1176,40 @@ class CubistMagicAbstractModel extends Model implements HasMedia return $saved; } + /** + * @param $uploadedFile UploadedFile + * @param $attribute string + * @return string + * @throws \Exception + */ + public function uploadFreeFile($uploadedFile, $attribute) + { + $field = $this->getField($attribute); + if (!$field instanceof FilesOrURL) { + throw new \Exception('Field must be FilesOrURL'); + } + $baseDirectory = $this->_getFreeFileBaseDirectory(); + if (null === $baseDirectory) { + throw new \Exception('Base directory must be set'); + } + $dir = \Cubist\Util\Files\Files::mkdir($baseDirectory . '/' . $field->getAttribute('destination', '')); + $name = $uploadedFile->getClientOriginalName(); + $e = explode('.', $name); + $ext = array_pop($e); + $name = implode('.', $e); + $name = Str::slug($name) . '.' . $ext; + $uploadedFile->move($dir, $name); + return $name; + } + + /** + * @return string + */ + protected function _getFreeFileBaseDirectory() + { + return null; + } + public function saveWithoutFlushingCache($options = []) { $this->_flushCacheOnSave = false; diff --git a/src/resources/views/fields/filesorurl.blade.php b/src/resources/views/fields/filesorurl.blade.php new file mode 100644 index 0000000..692cfbc --- /dev/null +++ b/src/resources/views/fields/filesorurl.blade.php @@ -0,0 +1,193 @@ +@php + $field['wrapper'] = $field['wrapper'] ?? $field['wrapperAttributes'] ?? []; + $field['wrapper']['data-init-function'] = $field['wrapper']['data-init-function'] ?? 'bpFieldInitUploadElement'; + $field['wrapper']['data-field-name'] = $field['wrapper']['data-field-name'] ?? $field['name']; + + $form_id='filesorurl_'.uniqid(); +@endphp + + +@include('crud::fields.inc.wrapper_start') + +@include('crud::fields.inc.translatable_icon') + +@push('before_scripts') +
+ + + +
+@endpush + +{{-- Show the file picker on CREATE form. --}} +
+ + 'form-control freefile-text-input']) + > + +
+ +{{-- HINT --}} +@if (isset($field['hint'])) +

{!! $field['hint'] !!}

+@endif +@include('crud::fields.inc.wrapper_end') + + +{{-- ########################################## --}} +{{-- Extra CSS and JS for this particular field --}} +{{-- If a field type is shown multiple times on a form, the CSS and JS will only be loaded once --}} +@if ($crud->fieldTypeNotLoaded($field)) + @php + $crud->markFieldTypeAsLoaded($field); + @endphp + + @push('crud_fields_styles') + + @endpush + + @push('crud_fields_scripts') + + @endpush +@endif diff --git a/src/routes/cubist/backpack/filesorurlupload.php b/src/routes/cubist/backpack/filesorurlupload.php new file mode 100644 index 0000000..93663e3 --- /dev/null +++ b/src/routes/cubist/backpack/filesorurlupload.php @@ -0,0 +1,8 @@ + config('backpack.base.route_prefix', 'admin'), + 'middleware' => ['web', config('backpack.base.middleware_key', 'admin')], +], function () { // custom admin routes + Route::post('filesorurlupload', '\Cubist\Backpack\Http\Controllers\CubistFilesorURLUpload@upload'); +}); -- 2.39.5