Browse Source

修复Form::keyValue字段无法清空所有数据,以及无法显示验证错误信息问题

jqh 5 năm trước cách đây
mục cha
commit
7f29df6cc0

+ 10 - 5
resources/views/form/keyvalue.blade.php

@@ -3,6 +3,9 @@
     <label class="{{$viewClass['label']}} control-label">{{$label}}</label>
 
     <div class="{{$viewClass['field']}}">
+        <span name="{{$name}}"></span>
+        <input name="{{ $name }}[{{ \Dcat\Admin\Form\Field\KeyValue::DEFAULT_FLAG_NAME }}]" type="hidden" />
+
         <table class="table table-hover">
             <thead>
             <tr>
@@ -22,25 +25,27 @@
                     <td>
                         <div class="form-group {{ $errors->has($keysErrorKey) ? 'has-error' : '' }}">
                             <div class="col-sm-12">
-                                <input name="{{ $column }}[keys][]" value="{{ old("{$column}.keys.{$k}", $k) }}" class="form-control" required/>
-
+                                <error></error>
                                 @if($errors->has($keysErrorKey))
                                     @foreach($errors->get($keysErrorKey) as $message)
                                         <label class="control-label" for="inputError"><i class="fa fa-times-circle-o"></i> {{$message}}</label><br/>
                                     @endforeach
                                 @endif
+                                <input name="{{ $column }}[keys][{{ (int) $k }}]" value="{{ old("{$column}.keys.{$k}", $k) }}" class="form-control" required/>
+
                             </div>
                         </div>
                     </td>
                     <td>
                         <div class="form-group {{ $errors->has($valsErrorKey) ? 'has-error' : '' }}">
                             <div class="col-sm-12">
-                                <input name="{{ $column }}[values][]" value="{{ old("{$column}.values.{$k}", $v) }}" class="form-control" />
+                                <error></error>
                                 @if($errors->has($valsErrorKey))
                                     @foreach($errors->get($valsErrorKey) as $message)
                                         <label class="control-label" for="inputError"><i class="fa fa-times-circle-o"></i> {{$message}}</label><br/>
                                     @endforeach
                                 @endif
+                                <input name="{{ $column }}[values][{{ (int) $k }}]" value="{{ old("{$column}.values.{$k}", $v) }}" class="form-control" />
                             </div>
                         </div>
                     </td>
@@ -75,14 +80,14 @@
         <td>
             <div class="form-group  ">
                 <div class="col-sm-12">
-                    <input name="{{ $column }}[keys][]" class="form-control" required/>
+                    <input name="{{ $column }}[keys][{key}]" class="form-control" required/>
                 </div>
             </div>
         </td>
         <td>
             <div class="form-group  ">
                 <div class="col-sm-12">
-                    <input name="{{ $column }}[values][]" class="form-control" />
+                    <input name="{{ $column }}[values][{key}]" class="form-control" />
                 </div>
             </div>
         </td>

+ 1 - 1
resources/views/form/listfield.blade.php

@@ -28,7 +28,7 @@
                     <td>
                         <div class="form-group {{ $errors->has($itemErrorKey) ? 'has-error' : '' }}">
                             <div class="col-sm-12">
-                                <input name="{{ $name }}[values][{{ $k }}]" value="{{ old("{$column}.values.{$k}", $v) }}" class="form-control" />
+                                <input name="{{ $name }}[values][{{ (int) $k }}]" value="{{ old("{$column}.values.{$k}", $v) }}" class="form-control" />
                                 <error></error>
                                 @if($errors->has($itemErrorKey))
                                     @foreach($errors->get($itemErrorKey) as $message)

+ 34 - 8
src/Form/Field/KeyValue.php

@@ -8,6 +8,8 @@ use Illuminate\Support\Arr;
 
 class KeyValue extends Field
 {
+    const DEFAULT_FLAG_NAME = '_def_';
+
     /**
      * @var array
      */
@@ -55,27 +57,51 @@ class KeyValue extends Field
         $attributes["{$this->column}.keys.*"] = __('Key');
         $attributes["{$this->column}.values.*"] = __('Value');
 
+        $input = $this->prepareValidatorInput($input);
+
         return validator($input, $rules, $this->getValidationMessages(), $attributes);
     }
 
+    protected function prepareValidatorInput(array $input)
+    {
+        Arr::forget($input, $this->column.'.'.static::DEFAULT_FLAG_NAME);
+
+        return $input;
+    }
+
     protected function setupScript()
     {
-        $this->script = <<<JS
+        $value = old($this->column, $this->value);
+
+        $number = $value ? count($value) : 0;
 
-$('.{$this->column}-add').on('click', function () {
-    var tpl = $('template.{$this->column}-tpl').html();
-    $('tbody.kv-{$this->column}-table').append(tpl);
-});
+        $this->script = <<<JS
 
-$('tbody').on('click', '.{$this->column}-remove', function () {
-    $(this).closest('tr').remove();
-});
+(function () {
+    var index = {$number};
+    $('.{$this->column}-add').on('click', function () {
+        var tpl = $('template.{$this->column}-tpl').html().replace('{key}', index).replace('{key}', index);
+        $('tbody.kv-{$this->column}-table').append(tpl);
+        
+        index++;
+    });
+    
+    $('tbody').on('click', '.{$this->column}-remove', function () {
+        $(this).closest('tr').remove();
+    });
+})();
 
 JS;
     }
 
     public function prepare($value)
     {
+        unset($value[static::DEFAULT_FLAG_NAME]);
+
+        if (empty($value)) {
+            return [];
+        }
+
         return array_combine($value['keys'], $value['values']);
     }
 

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

@@ -122,7 +122,9 @@ class ListField extends Field
      */
     protected function setupScript()
     {
-        $number = $this->value ? count($this->value) : 0;
+        $value = old($this->column, $this->value);
+
+        $number = $value ? count($value) : 0;
 
         $this->script = <<<JS
 (function () {