jqh 5 年之前
父節點
當前提交
7670cfbe2c
共有 4 個文件被更改,包括 96 次插入23 次删除
  1. 1 1
      src/Form/Concerns/HasFieldValidator.php
  2. 4 3
      src/Form/Field.php
  3. 12 7
      src/Form/Field/Text.php
  4. 79 12
      src/Widgets/Form.php

+ 1 - 1
src/Form/Concerns/HasFieldValidator.php

@@ -133,7 +133,7 @@ trait HasFieldValidator
             return $rules;
         }
 
-        if (!$id = $this->form->getKey()) {
+        if (method_exists($this->form, 'getKey') || ! $id = $this->form->getKey()) {
             return $rules;
         }
 

+ 4 - 3
src/Form/Field.php

@@ -4,6 +4,7 @@ namespace Dcat\Admin\Form;
 
 use Dcat\Admin\Admin;
 use Dcat\Admin\Form;
+use Dcat\Admin\Widgets\Form as WidgetForm;
 use Dcat\Admin\Form\Concerns;
 use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Contracts\Support\Renderable;
@@ -136,7 +137,7 @@ class Field implements Renderable
     /**
      * Parent form.
      *
-     * @var Form
+     * @var Form|WidgetForm
      */
     protected $form = null;
 
@@ -404,11 +405,11 @@ class Field implements Renderable
     }
 
     /**
-     * @param Form $form
+     * @param Form|WidgetForm $form
      *
      * @return $this
      */
-    public function setForm(Form $form = null)
+    public function setForm($form = null)
     {
         $this->form = $form;
 

+ 12 - 7
src/Form/Field/Text.php

@@ -50,23 +50,28 @@ class Text extends Field
      *
      * @see http://1000hz.github.io/bootstrap-validator/
      *
-     * @param string $field
+     * @param string|Field $field
      * @param string $error
      * @return $this
      */
-    public function confirm(string $field, ?string $error = null, ?string $fieldSelector = null)
+    public function confirm($field, ?string $error = null, ?string $fieldSelector = null)
     {
-        if (! $fieldSelector && $this->form) {
-            $column = $this->form->field($field);
+        $field = $field instanceof Field ? $field : $this->form->field($field);
+        $name  = $field->column();
 
-            $column->rules('confirmed');
+        if (! $fieldSelector && $this->form) {
+            $fieldSelector = '#'.$field->getElementId();
+        }
 
-            $fieldSelector = '#'.$column->getElementId();
+        if ($name.'_confirmation' === $this->column) {
+            $field->rules('confirmed');
+        } else {
+            $this->rules('nullable|same:'.$name);
         }
 
         $attributes = [
             'data-match'       => $fieldSelector,
-            'data-match-error' => str_replace(':attribute', $field, $error ?: trans('admin.validation.match'))
+            'data-match-error' => str_replace(':attribute', $name, $error ?: trans('admin.validation.match'))
         ];
 
         return $this->attribute($attributes);

+ 79 - 12
src/Widgets/Form.php

@@ -5,10 +5,13 @@ namespace Dcat\Admin\Widgets;
 use Closure;
 use Dcat\Admin\Admin;
 use Dcat\Admin\Form\Field;
+use Dcat\Admin\Support\Helper;
 use Dcat\Admin\Traits\HasHtmlAttributes;
+use Dcat\EasyExcel\Support\Traits\Macroable;
 use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Contracts\Support\Renderable;
 use Illuminate\Support\Arr;
+use Illuminate\Support\Fluent;
 use Illuminate\Support\Str;
 
 /**
@@ -71,7 +74,9 @@ use Illuminate\Support\Str;
  */
 class Form implements Renderable
 {
-    use HasHtmlAttributes;
+    use HasHtmlAttributes, Macroable {
+        __call as macroCall;
+    }
 
     /**
      * @var Field[]
@@ -84,9 +89,14 @@ class Form implements Renderable
     protected $useAjaxSubmit = true;
 
     /**
-     * @var array
+     * @var Fluent
      */
-    protected $data = [];
+    protected $data;
+
+    /**
+     * @var mixed
+     */
+    protected $primaryKey;
 
     /**
      * Available buttons.
@@ -117,16 +127,12 @@ class Form implements Renderable
      * Form constructor.
      *
      * @param array $data
+     * @param mixed $key
      */
-    public function __construct($data = [])
+    public function __construct($data = [], $key = null)
     {
-        if ($data instanceof Arrayable) {
-            $data = $data->toArray();
-        }
-
-        if (!empty($data)) {
-            $this->data = $data;
-        }
+        $this->data($data);
+        $this->key($key);
 
         $this->initFormAttributes();
     }
@@ -177,6 +183,46 @@ class Form implements Renderable
         return $this->setHtmlAttribute('method', strtoupper($method));
     }
 
+    /**
+     * Set primary key.
+     *
+     * @param mixed $value
+     * @return $this
+     */
+    public function key($value)
+    {
+        $this->primaryKey = $value;
+
+        return $this;
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getKey()
+    {
+        return $this->primaryKey;
+    }
+
+    /**
+     * @param $data
+     * @return $this
+     */
+    public function data($data)
+    {
+        $this->data = new Fluent(Helper::array($data));
+
+        return $this;
+    }
+
+    /**
+     * @return Fluent
+     */
+    public function model()
+    {
+        return $this->data;
+    }
+
     /**
      * Add a fieldset to form.
      *
@@ -198,6 +244,22 @@ class Form implements Renderable
         return $fieldset;
     }
 
+    /**
+     * Get specify field.
+     *
+     * @param string $name
+     * @return Field|null
+     */
+    public function field($name)
+    {
+        foreach ($this->fields as $field) {
+            if ($field->column() === $name) {
+                return $field;
+            }
+        }
+    }
+
+
     /**
      * Disable Pjax.
      *
@@ -298,6 +360,7 @@ class Form implements Renderable
     {
         array_push($this->fields, $field);
 
+        $field->setForm($this);
         $field->setWidth($this->width['field'], $this->width['label']);
 
         $field::collectAssets();
@@ -313,7 +376,7 @@ class Form implements Renderable
     protected function getVariables()
     {
         foreach ($this->fields as $field) {
-            $field->fill($this->data);
+            $field->fill($this->data->toArray());
         }
 
         return [
@@ -378,6 +441,10 @@ class Form implements Renderable
 
             return $element;
         }
+
+        if (static::hasMacro($method)) {
+            return $this->macroCall($method, $arguments);
+        }
     }
 
     /**