浏览代码

工具表单增加格式化表单提交数据功能

jqh 4 年之前
父节点
当前提交
7a2b96758c
共有 3 个文件被更改,包括 67 次插入5 次删除
  1. 2 0
      src/Controllers/HandleFormController.php
  2. 37 0
      src/Support/Helper.php
  3. 28 5
      src/Widgets/Form.php

+ 2 - 0
src/Controllers/HandleFormController.php

@@ -20,6 +20,8 @@ class HandleFormController
             return $form->failedAuthorization();
             return $form->failedAuthorization();
         }
         }
 
 
+        $form->form();
+
         if ($errors = $form->validate($request)) {
         if ($errors = $form->validate($request)) {
             return $form->validationErrorsResponse($errors);
             return $form->validationErrorsResponse($errors);
         }
         }

+ 37 - 0
src/Support/Helper.php

@@ -9,6 +9,7 @@ use Illuminate\Contracts\Support\Jsonable;
 use Illuminate\Contracts\Support\Renderable;
 use Illuminate\Contracts\Support\Renderable;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Arr;
+use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Artisan;
 use Illuminate\Support\Facades\Artisan;
 use Illuminate\Support\Facades\File;
 use Illuminate\Support\Facades\File;
 use Illuminate\Support\Str;
 use Illuminate\Support\Str;
@@ -710,4 +711,40 @@ class Helper
 
 
         return base_path(str_replace([$namespace, '\\'], [$path, '/'], $class)).'.php';
         return base_path(str_replace([$namespace, '\\'], [$path, '/'], $class)).'.php';
     }
     }
+
+    /**
+     * Is input data is has-one relation.
+     *
+     * @param Collection $fields
+     * @param array      $input
+     */
+    public static function prepareHasOneRelation(Collection $fields, array &$input)
+    {
+        $relations = [];
+        $fields->each(function ($field) use (&$relations) {
+            $column = $field->column();
+
+            if (is_array($column)) {
+                foreach ($column as $v) {
+                    if (Str::contains($v, '.')) {
+                        $first = explode('.', $v)[0];
+                        $relations[$first] = null;
+                    }
+                }
+
+                return;
+            }
+
+            if (Str::contains($column, '.')) {
+                $first = explode('.', $column)[0];
+                $relations[$first] = null;
+            }
+        });
+
+        foreach ($relations as $first => $v) {
+            if (isset($input[$first])) {
+                $input = array_merge($input, Arr::dot([$first => $input[$first]]));
+            }
+        }
+    }
 }
 }

+ 28 - 5
src/Widgets/Form.php

@@ -330,6 +330,10 @@ class Form implements Renderable
     public function field($name)
     public function field($name)
     {
     {
         foreach ($this->fields as $field) {
         foreach ($this->fields as $field) {
+            if (is_array($field->column())) {
+                return in_array($name, $field->column(), true);
+            }
+
             if ($field === $name || $field->column() === $name) {
             if ($field === $name || $field->column() === $name) {
                 return $field;
                 return $field;
             }
             }
@@ -376,10 +380,6 @@ class Form implements Renderable
      */
      */
     public function validate(Request $request)
     public function validate(Request $request)
     {
     {
-        if (method_exists($this, 'form')) {
-            $this->form();
-        }
-
         $failedValidators = [];
         $failedValidators = [];
 
 
         /** @var \Dcat\Admin\Form\Field $field */
         /** @var \Dcat\Admin\Form\Field $field */
@@ -745,7 +745,30 @@ JS
     {
     {
         Arr::forget($input, [static::REQUEST_NAME, '_token', '_current_']);
         Arr::forget($input, [static::REQUEST_NAME, '_token', '_current_']);
 
 
-        return $input;
+        return $this->prepareInput($input);
+    }
+
+    public function prepareInput(array $input)
+    {
+        Helper::prepareHasOneRelation($this->fields, $input);
+
+        foreach ($input as $column => $value) {
+            if (is_null($field = $this->field($column))) {
+                unset($input[$column]);
+
+                continue;
+            }
+
+            $input[$column] = $field->prepare($value);
+        }
+
+        $prepared = [];
+
+        foreach ($input as $key => $value) {
+            Arr::set($prepared, $key, $value);
+        }
+
+        return $prepared;
     }
     }
 
 
     protected function prepareForm()
     protected function prepareForm()