浏览代码

增加 Form::json 字段

jqh 4 年之前
父节点
当前提交
0f10beb97a
共有 5 个文件被更改,包括 100 次插入92 次删除
  1. 2 1
      src/Form.php
  2. 1 0
      src/Form/EmbeddedForm.php
  3. 95 0
      src/Form/Field/Json.php
  4. 1 91
      src/Form/Field/Table.php
  5. 1 0
      src/Widgets/Form.php

+ 2 - 1
src/Form.php

@@ -23,7 +23,6 @@ use Illuminate\Support\Arr;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Fluent;
 use Illuminate\Support\MessageBag;
-use Illuminate\Support\Str;
 use Illuminate\Support\Traits\Macroable;
 use Illuminate\Validation\Validator;
 use Symfony\Component\HttpFoundation\Response;
@@ -83,6 +82,7 @@ use Symfony\Component\HttpFoundation\Response;
  * @method Field\Markdown               markdown($column, $label = '')
  * @method Field\Range                  range($start, $end, $label = '')
  * @method Field\Color                  color($column, $label = '')
+ * @method Field\Json                   json($column, $labelOrCallback, $callback = null)
  */
 class Form implements Renderable
 {
@@ -162,6 +162,7 @@ class Form implements Renderable
         'markdown'       => Field\Markdown::class,
         'range'          => Field\Range::class,
         'color'          => Field\Color::class,
+        'json'           => Field\Json::class,
     ];
 
     /**

+ 1 - 0
src/Form/EmbeddedForm.php

@@ -60,6 +60,7 @@ use Illuminate\Support\Collection;
  * @method Field\Markdown               markdown($column, $label = '')
  * @method Field\Range                  range($start, $end, $label = '')
  * @method Field\Color                  color($column, $label = '')
+ * @method Field\Json                   json($column, $labelOrCallback, $callback = null)
  */
 class EmbeddedForm
 {

+ 95 - 0
src/Form/Field/Json.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace Dcat\Admin\Form\Field;
+
+use Dcat\Admin\Form\NestedForm;
+use Dcat\Admin\Support\Helper;
+
+class Json extends HasMany
+{
+    public function __construct($column, $arguments = [])
+    {
+        $this->column = $column;
+
+        if (count($arguments) == 1) {
+            $this->label = $this->formatLabel();
+            $this->builder = $arguments[0];
+        } elseif (count($arguments) == 2) {
+            [$this->label, $this->builder] = $arguments;
+        }
+    }
+
+    protected function buildRelatedForms()
+    {
+        if (is_null($this->form)) {
+            return [];
+        }
+
+        $forms = [];
+
+        if ($values = old($this->column)) {
+            foreach ($values as $key => $data) {
+                if ($data[NestedForm::REMOVE_FLAG_NAME] == 1) {
+                    continue;
+                }
+
+                $forms[$key] = $this->buildNestedForm($key)->fill($data);
+            }
+        } else {
+            foreach ($this->value() as $key => $data) {
+                if (isset($data['pivot'])) {
+                    $data = array_merge($data, $data['pivot']);
+                }
+
+                $forms[$key] = $this->buildNestedForm($key)->fill($data);
+            }
+        }
+
+        return $forms;
+    }
+
+    protected function prepareInputValue($input)
+    {
+        return collect($this->buildNestedForm()->prepare($input))
+            ->filter(function ($item) {
+                return empty($item[NestedForm::REMOVE_FLAG_NAME]);
+            })
+            ->transform(function ($item) {
+                unset($item[NestedForm::REMOVE_FLAG_NAME]);
+
+                return $item;
+            })
+            ->values()
+            ->toArray();
+    }
+
+    public function value($value = null)
+    {
+        if ($value === null) {
+            return Helper::array(parent::value($value));
+        }
+
+        return parent::value($value);
+    }
+
+    public function buildNestedForm($key = null)
+    {
+        $form = new NestedForm($this->column);
+
+        $form->setForm($this->form)
+            ->setKey($key);
+
+        call_user_func($this->builder, $form);
+
+        $form->hidden(NestedForm::REMOVE_FLAG_NAME)->default(0)->addElementClass(NestedForm::REMOVE_FLAG_CLASS);
+
+        return $form;
+    }
+
+    public function saveAsJson()
+    {
+        return $this->saving(function ($v) {
+            return json_encode($v);
+        });
+    }
+}

+ 1 - 91
src/Form/Field/Table.php

@@ -3,104 +3,14 @@
 namespace Dcat\Admin\Form\Field;
 
 use Dcat\Admin\Admin;
-use Dcat\Admin\Form\NestedForm;
-use Dcat\Admin\Support\Helper;
 
-class Table extends HasMany
+class Table extends Json
 {
     /**
      * @var string
      */
     protected $viewMode = 'table';
 
-    /**
-     * Table constructor.
-     *
-     * @param string $column
-     * @param array  $arguments
-     */
-    public function __construct($column, $arguments = [])
-    {
-        $this->column = $column;
-
-        if (count($arguments) == 1) {
-            $this->label = $this->formatLabel();
-            $this->builder = $arguments[0];
-        } elseif (count($arguments) == 2) {
-            [$this->label, $this->builder] = $arguments;
-        }
-    }
-
-    /**
-     * @return array
-     */
-    protected function buildRelatedForms()
-    {
-        if (is_null($this->form)) {
-            return [];
-        }
-
-        $forms = [];
-
-        if ($values = old($this->column)) {
-            foreach ($values as $key => $data) {
-                if ($data[NestedForm::REMOVE_FLAG_NAME] == 1) {
-                    continue;
-                }
-
-                $forms[$key] = $this->buildNestedForm($key)->fill($data);
-            }
-        } else {
-            foreach ($this->value() as $key => $data) {
-                if (isset($data['pivot'])) {
-                    $data = array_merge($data, $data['pivot']);
-                }
-
-                $forms[$key] = $this->buildNestedForm($key)->fill($data);
-            }
-        }
-
-        return $forms;
-    }
-
-    protected function prepareInputValue($input)
-    {
-        return collect($this->buildNestedForm()->prepare($input))
-            ->filter(function ($item) {
-                return empty($item[NestedForm::REMOVE_FLAG_NAME]);
-            })
-            ->transform(function ($item) {
-                unset($item[NestedForm::REMOVE_FLAG_NAME]);
-
-                return $item;
-            })
-            ->values()
-            ->toArray();
-    }
-
-    public function value($value = null)
-    {
-        if ($value === null) {
-            return Helper::array(parent::value($value));
-        }
-
-        return parent::value($value);
-    }
-
-    public function buildNestedForm($key = null)
-    {
-        $form = new NestedForm($this->column);
-
-        $form->setForm($this->form)
-            ->setKey($key);
-
-        call_user_func($this->builder, $form);
-
-        $form->hidden(NestedForm::REMOVE_FLAG_NAME)->default(0)->addElementClass(NestedForm::REMOVE_FLAG_CLASS);
-
-        return $form;
-    }
-
     public function render()
     {
         if (! $this->shouldRender()) {

+ 1 - 0
src/Widgets/Form.php

@@ -79,6 +79,7 @@ use Illuminate\Validation\Validator;
  * @method Field\Markdown       markdown($column, $label = '')
  * @method Field\Range          range($start, $end, $label = '')
  * @method Field\Color          color($column, $label = '')
+ * @method Field\Json           json($column, $labelOrCallback, $callback = null)
  */
 class Form implements Renderable
 {