Browse Source

优化表单对json( -> )类型字段支持

jqh 4 years ago
parent
commit
803f7dc9c2

+ 26 - 9
src/Form/Field.php

@@ -391,17 +391,24 @@ class Field implements Renderable
      */
     protected function formatFieldData($data)
     {
-        if (is_array($this->column)) {
+        $column = $this->normalizeColumn();
+
+        if (is_array($column)) {
             $value = [];
 
-            foreach ($this->column as $key => $column) {
+            foreach ($column as $key => $column) {
                 $value[$key] = Arr::get($data, $column);
             }
 
             return $value;
         }
 
-        return Arr::get($data, $this->column, $this->value);
+        return Arr::get($data, $column, $this->value);
+    }
+
+    protected function normalizeColumn()
+    {
+        return str_replace('->', '.', $this->column);
     }
 
     /**
@@ -955,7 +962,7 @@ class Field implements Renderable
      */
     public function setElementClass($class)
     {
-        $this->elementClass = array_merge($this->elementClass, (array) $class);
+        $this->elementClass = array_merge($this->elementClass, (array) $this->normalizeElementClass($class));
 
         return $this;
     }
@@ -968,16 +975,26 @@ class Field implements Renderable
     public function getElementClass()
     {
         if (! $this->elementClass) {
-            $name = $this->getElementName();
-
-            $this->elementClass = array_map(function ($v) {
-                return static::FIELD_CLASS_PREFIX.$v;
-            }, (array) str_replace(['[', ']'], '_', $name));
+            $this->elementClass = $this->normalizeElementClass((array) $this->getElementName());
         }
 
         return $this->elementClass;
     }
 
+    /**
+     * @param string|array $class
+     *
+     * @return array|string
+     */
+    public function normalizeElementClass($class)
+    {
+        if (is_array($class)) {
+            return array_map([$this, 'normalizeElementClass'], $class);
+        }
+
+        return static::FIELD_CLASS_PREFIX.str_replace(['[', ']', '->', '.'], '_', $class);
+    }
+
     /**
      * Get element class string.
      *

+ 1 - 1
src/Form/Field/File.php

@@ -142,7 +142,7 @@ class File extends Field implements UploadFieldInterface
 
     protected function formatFieldData($data)
     {
-        return Helper::array(Arr::get($data, $this->column));
+        return Helper::array(Arr::get($data, $this->normalizeColumn()));
     }
 
     /**

+ 1 - 1
src/Form/Field/KeyValue.php

@@ -22,7 +22,7 @@ class KeyValue extends Field
     {
         $this->data = $data;
 
-        return Helper::array(Arr::get($data, $this->column, $this->value));
+        return Helper::array(Arr::get($data, $this->normalizeColumn(), $this->value));
     }
 
     /**

+ 1 - 1
src/Form/Field/ListField.php

@@ -65,7 +65,7 @@ class ListField extends Field
     {
         $this->data = $data;
 
-        return Helper::array(Arr::get($data, $this->column, $this->value));
+        return Helper::array(Arr::get($data, $this->normalizeColumn(), $this->value));
     }
 
     /**

+ 1 - 1
src/Form/Field/MultipleSelect.php

@@ -9,7 +9,7 @@ class MultipleSelect extends Select
 {
     protected function formatFieldData($data)
     {
-        return Helper::array(Arr::get($data, $this->column));
+        return Helper::array(Arr::get($data, $this->normalizeColumn()));
     }
 
     protected function prepareInputValue($value)

+ 4 - 5
src/Form/Field/Select.php

@@ -101,11 +101,10 @@ class Select extends Field
     {
         if (Str::contains($field, '.')) {
             $field = $this->formatName($field);
-            $class = static::FIELD_CLASS_PREFIX.str_replace(['[', ']'], '_', $field);
-        } else {
-            $class = static::FIELD_CLASS_PREFIX.$field;
         }
 
+        $class = $this->normalizeElementClass($field);
+
         $sourceUrl = admin_url($sourceUrl);
 
         $script = <<<JS
@@ -149,10 +148,10 @@ JS;
     {
         $fieldsStr = implode('^', array_map(function ($field) {
             if (Str::contains($field, '.')) {
-                return static::FIELD_CLASS_PREFIX.str_replace('.', '_', $field).'_';
+                return $this->normalizeElementClass($field).'_';
             }
 
-            return static::FIELD_CLASS_PREFIX.$field;
+            return $this->normalizeElementClass($field);
         }, (array) $fields));
         $urlsStr = implode('^', array_map(function ($url) {
             return admin_url($url);

+ 1 - 1
src/Form/Field/Tags.php

@@ -44,7 +44,7 @@ class Tags extends Field
      */
     protected function formatFieldData($data)
     {
-        $value = Arr::get($data, $this->column);
+        $value = Arr::get($data, $this->normalizeColumn());
 
         if (is_array($value) && $this->keyAsValue) {
             $value = array_column($value, $this->visibleColumn, $this->key);

+ 1 - 3
src/Form/Field/Tree.php

@@ -234,9 +234,7 @@ class Tree extends Field
 
     protected function formatFieldData($data)
     {
-        $value = Arr::get($data, $this->column);
-
-        return Helper::array($value, true);
+        return Helper::array(Arr::get($data, $this->normalizeColumn()));
     }
 
     /**

+ 2 - 2
src/Form/NestedForm.php

@@ -412,12 +412,12 @@ class NestedForm
             foreach ($column as $k => $name) {
                 $errorKey[$k] = sprintf('%s.%s.%s', $this->relationName, $key, $name);
                 $elementName[$k] = sprintf('%s[%s][%s]', $this->relationName, $key, $name);
-                $elementClass[$k] = [$this->relationName, Field::FIELD_CLASS_PREFIX.$name];
+                $elementClass[$k] = [$this->relationName, $name];
             }
         } else {
             $errorKey = sprintf('%s.%s.%s', $this->relationName, $key, $column);
             $elementName = sprintf('%s[%s][%s]', $this->relationName, $key, $column);
-            $elementClass = [$this->relationName, Field::FIELD_CLASS_PREFIX.$column];
+            $elementClass = [$this->relationName, $column];
         }
 
         return $field->setErrorKey($errorKey)