Browse Source

增加工具表单默认文件上传/删除接口

jqh 4 years ago
parent
commit
dbc376a192

+ 2 - 0
src/Admin.php

@@ -249,6 +249,8 @@ class Admin
                 /* @var \Illuminate\Routing\Router $router */
                 $router->post('action', 'HandleActionController@handle')->name('action');
                 $router->post('form', 'HandleFormController@handle')->name('form');
+                $router->post('form/upload', 'HandleFormController@uploadFile')->name('form.upload');
+                $router->post('form/destroy-file', 'HandleFormController@destroyFile')->name('form.destroy-file');
                 $router->post('value', 'ValueController@handle')->name('value');
                 $router->get('render', 'RenderableController@handle')->name('render');
                 $router->post('tinymce/upload', 'TinymceController@upload')->name('tinymce.upload');

+ 32 - 8
src/Controllers/HandleFormController.php

@@ -2,18 +2,16 @@
 
 namespace Dcat\Admin\Controllers;
 
+use Dcat\Admin\Form\Field\File;
+use Dcat\Admin\Traits\HasUploadedFile;
 use Dcat\Admin\Widgets\Form;
 use Exception;
 use Illuminate\Http\Request;
-use Symfony\Component\HttpFoundation\Response;
 
 class HandleFormController
 {
-    /**
-     * @param Request $request
-     *
-     * @return Response
-     */
+    use HasUploadedFile;
+
     public function handle(Request $request)
     {
         $form = $this->resolveForm($request);
@@ -31,6 +29,28 @@ class HandleFormController
         return $form->handle($input) ?: $form->success();
     }
 
+    public function uploadFile(Request $request)
+    {
+        $form = $this->resolveForm($request);
+
+        /* @var $field File */
+        $field = $form->field($this->uploader()->upload_column);
+
+        return $field->upload($this->file());
+    }
+
+    public function destroyFile(Request $request)
+    {
+        $form = $this->resolveForm($request);
+
+        /* @var $field File */
+        $field = $form->field($request->_column);
+
+        $field->deleteFile($request->key);
+
+        return $this->responseDeleted();
+    }
+
     /**
      * @param Request $request
      *
@@ -40,11 +60,11 @@ class HandleFormController
      */
     protected function resolveForm(Request $request)
     {
-        if (! $request->has('_form_')) {
+        if (! $request->has(Form::REQUEST_NAME)) {
             throw new Exception('Invalid form request.');
         }
 
-        $formClass = $request->get('_form_');
+        $formClass = $request->get(Form::REQUEST_NAME);
 
         if (! class_exists($formClass)) {
             throw new Exception("Form [{$formClass}] does not exist.");
@@ -57,6 +77,10 @@ class HandleFormController
             throw new Exception("Form method {$formClass}::handle() does not exist.");
         }
 
+        if (method_exists($form, 'form')) {
+            $form->form();
+        }
+
         return $form;
     }
 }

+ 12 - 0
src/Form/Field/WebUploader.php

@@ -139,6 +139,18 @@ trait WebUploader
         return $this;
     }
 
+    /**
+     * @param array $data
+     *
+     * @return $this
+     */
+    public function withFormData(array $data)
+    {
+        $this->options['formData'] = array_merge($this->options['formData'], $data);
+
+        return $this;
+    }
+
     /**
      * Set default options form file field.
      *

+ 2 - 0
src/Layout/Content.php

@@ -159,6 +159,8 @@ class Content implements Renderable
      * @param bool $value
      *
      * @return $this
+     *
+     * @deprecated
      */
     public function perfectScrollbar(bool $value = true)
     {

+ 12 - 2
src/Widgets/Form.php

@@ -83,6 +83,8 @@ class Form implements Renderable
             __call as macroCall;
         }
 
+    const REQUEST_NAME = '_form_';
+
     /**
      * @var string
      */
@@ -456,6 +458,14 @@ class Form implements Renderable
         $field->setForm($this);
         $field->width($this->width['field'], $this->width['label']);
 
+        if ($field instanceof Field\File) {
+            $formData = [static::REQUEST_NAME => get_called_class()];
+
+            $field->url(route(admin_api_route('form.upload')));
+            $field->deleteUrl(route(admin_api_route('form.destroy-file'), $formData));
+            $field->withFormData($formData);
+        }
+
         $field::collectAssets();
 
         return $this;
@@ -632,7 +642,7 @@ JS
      */
     public function sanitize(array $input)
     {
-        Arr::forget($input, ['_form_', '_token', '_current_']);
+        Arr::forget($input, [static::REQUEST_NAME, '_token', '_current_']);
 
         return $input;
     }
@@ -657,7 +667,7 @@ JS
         if (method_exists($this, 'handle')) {
             $this->method('POST');
             $this->action(route(admin_api_route('form')));
-            $this->hidden('_form_')->default(get_called_class());
+            $this->hidden(static::REQUEST_NAME)->default(get_called_class());
             $this->hidden('_current_')->default($this->getCurrentUrl());
         }
     }