浏览代码

widget form支持tab和rows布局 #273

jqh 4 年之前
父节点
当前提交
eec82feb1a
共有 8 个文件被更改,包括 182 次插入113 次删除
  1. 27 4
      resources/views/widgets/form.blade.php
  2. 2 65
      src/Form.php
  3. 1 34
      src/Form/Builder.php
  4. 38 0
      src/Form/Concerns/HasRows.php
  5. 43 0
      src/Form/Concerns/HasTabs.php
  6. 5 4
      src/Form/Row.php
  7. 39 4
      src/Form/Tab.php
  8. 27 2
      src/Widgets/Form.php

+ 27 - 4
resources/views/widgets/form.blade.php

@@ -1,10 +1,33 @@
 {!! $start !!}
-    <div class="box-body fields-group">
+    <div class="box-body fields-group p-0">
+        @if(! $tabObj->isEmpty())
+            @include('admin::form.tab', compact('tabObj'))
 
-        @foreach($fields as $field)
-            {!! $field->render() !!}
-        @endforeach
+            @foreach($fields as $field)
+                @if($field instanceof \Dcat\Admin\Form\Field\Hidden)
+                    {!! $field->render() !!}
+                @endif
+            @endforeach
+        @else
+            @if($rows)
+                <div class="ml-2 mb-2">
+                    <input type="hidden" name="_token" value="{{ csrf_token() }}">
+                    @foreach($rows as $row)
+                        {!! $row->render() !!}
+                    @endforeach
 
+                    @foreach($fields as $field)
+                        @if($field instanceof \Dcat\Admin\Form\Field\Hidden)
+                            {!! $field->render() !!}
+                        @endif
+                    @endforeach
+                </div>
+            @else
+                @foreach($fields as $field)
+                    {!! $field->render() !!}
+                @endforeach
+            @endif
+        @endif
     </div>
 
     @if ($method != 'GET')

+ 2 - 65
src/Form.php

@@ -11,8 +11,6 @@ use Dcat\Admin\Form\Concerns;
 use Dcat\Admin\Form\Condition;
 use Dcat\Admin\Form\Field;
 use Dcat\Admin\Form\NestedForm;
-use Dcat\Admin\Form\Row;
-use Dcat\Admin\Form\Tab;
 use Dcat\Admin\Traits\HasBuilderEvents;
 use Dcat\Admin\Traits\HasFormResponse;
 use Dcat\Admin\Widgets\DialogForm;
@@ -92,6 +90,8 @@ class Form implements Renderable
         Concerns\HasFiles,
         Concerns\HasSteps,
         Concerns\HandleCascadeFields,
+        Concerns\HasRows,
+        Concerns\HasTabs,
         Macroable {
             __call as macroCall;
         }
@@ -240,18 +240,6 @@ class Form implements Renderable
      */
     protected $ignored = [];
 
-    /**
-     * @var Form\Tab
-     */
-    protected $tab = null;
-
-    /**
-     * Field rows in form.
-     *
-     * @var Row[]
-     */
-    protected $rows = [];
-
     /**
      * @var bool
      */
@@ -495,35 +483,6 @@ class Form implements Renderable
         return $fieldset;
     }
 
-    /**
-     * Use tab to split form.
-     *
-     * @param string  $title
-     * @param Closure $content
-     *
-     * @return $this
-     */
-    public function tab($title, Closure $content, $active = false)
-    {
-        $this->getTab()->append($title, $content, $active);
-
-        return $this;
-    }
-
-    /**
-     * Get Tab instance.
-     *
-     * @return Tab
-     */
-    public function getTab()
-    {
-        if (is_null($this->tab)) {
-            $this->tab = new Tab($this);
-        }
-
-        return $this->tab;
-    }
-
     /**
      * Destroy data entity and remove files.
      *
@@ -1371,28 +1330,6 @@ class Form implements Renderable
         return $this;
     }
 
-    /**
-     * Add a row in form.
-     *
-     * @param Closure $callback
-     *
-     * @return $this
-     */
-    public function row(Closure $callback)
-    {
-        $this->rows[] = new Row($callback, $this);
-
-        return $this;
-    }
-
-    /**
-     * @return Row[]
-     */
-    public function rows()
-    {
-        return $this->rows;
-    }
-
     /**
      * Tools setting for form.
      *

+ 1 - 34
src/Form/Builder.php

@@ -819,7 +819,7 @@ class Builder
         $tabObj = $this->form->getTab();
 
         if (! $tabObj->isEmpty()) {
-            $this->addTabScript();
+            $tabObj->addScript();
         }
 
         if ($this->form->allowAjaxSubmit() && empty($this->stepBuilder)) {
@@ -874,37 +874,4 @@ $('#{$this->getElementId()}').form({
 JS
         );
     }
-
-    /**
-     * @return void
-     */
-    protected function addTabScript()
-    {
-        $elementId = $this->getElementId();
-
-        $script = <<<JS
-(function () {
-    var hash = document.location.hash;
-    if (hash) {
-        $('#$elementId .nav-tabs a[href="' + hash + '"]').tab('show');
-    }
-    
-    // Change hash for page-reload
-    $('#$elementId .nav-tabs a').on('shown.bs.tab', function (e) {
-        history.pushState(null,null, e.target.hash);
-    });
-    
-    if ($('#$elementId .has-error').length) {
-        $('#$elementId .has-error').each(function () {
-            var tabId = '#'+$(this).closest('.tab-pane').attr('id');
-            $('li a[href="'+tabId+'"] i').removeClass('hide');
-        });
-    
-        var first = $('#$elementId .has-error:first').closest('.tab-pane').attr('id');
-        $('li a[href="#'+first+'"]').tab('show');
-    }
-})();
-JS;
-        Admin::script($script);
-    }
 }

+ 38 - 0
src/Form/Concerns/HasRows.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace Dcat\Admin\Form\Concerns;
+
+use Closure;
+use Dcat\Admin\Form\Row;
+
+trait HasRows
+{
+    /**
+     * Field rows in form.
+     *
+     * @var Row[]
+     */
+    protected $rows = [];
+
+    /**
+     * Add a row in form.
+     *
+     * @param Closure $callback
+     *
+     * @return $this
+     */
+    public function row(Closure $callback)
+    {
+        $this->rows[] = new Row($callback, $this);
+
+        return $this;
+    }
+
+    /**
+     * @return Row[]
+     */
+    public function rows()
+    {
+        return $this->rows;
+    }
+}

+ 43 - 0
src/Form/Concerns/HasTabs.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace Dcat\Admin\Form\Concerns;
+
+use Closure;
+use Dcat\Admin\Form\Tab;
+
+trait HasTabs
+{
+    /**
+     * @var Tab
+     */
+    protected $tab = null;
+
+    /**
+     * Use tab to split form.
+     *
+     * @param string  $title
+     * @param Closure $content
+     *
+     * @return $this
+     */
+    public function tab($title, Closure $content, $active = false)
+    {
+        $this->getTab()->append($title, $content, $active);
+
+        return $this;
+    }
+
+    /**
+     * Get Tab instance.
+     *
+     * @return Tab
+     */
+    public function getTab()
+    {
+        if (is_null($this->tab)) {
+            $this->tab = new Tab($this);
+        }
+
+        return $this->tab;
+    }
+}

+ 5 - 4
src/Form/Row.php

@@ -2,6 +2,7 @@
 
 namespace Dcat\Admin\Form;
 
+use Dcat\Admin\Widgets\Form as WidgetForm;
 use Dcat\Admin\Form;
 use Illuminate\Contracts\Support\Renderable;
 
@@ -72,7 +73,7 @@ class Row implements Renderable
     /**
      * Parent form.
      *
-     * @var Form
+     * @var Form|WidgetForm
      */
     protected $form;
 
@@ -93,10 +94,10 @@ class Row implements Renderable
     /**
      * Row constructor.
      *
-     * @param \Closure $callback
-     * @param Form     $form
+     * @param \Closure        $callback
+     * @param Form|WidgetForm $form
      */
-    public function __construct(\Closure $callback, Form $form)
+    public function __construct(\Closure $callback, $form)
     {
         $this->callback = $callback;
 

+ 39 - 4
src/Form/Tab.php

@@ -2,13 +2,15 @@
 
 namespace Dcat\Admin\Form;
 
+use Dcat\Admin\Admin;
+use Dcat\Admin\Widgets\Form as WidgetForm;
 use Dcat\Admin\Form;
 use Illuminate\Support\Collection;
 
 class Tab
 {
     /**
-     * @var Form
+     * @var Form|WidgetForm
      */
     protected $form;
 
@@ -25,9 +27,9 @@ class Tab
     /**
      * Tab constructor.
      *
-     * @param Form $form
+     * @param Form|WidgetForm $form
      */
-    public function __construct(Form $form)
+    public function __construct($form)
     {
         $this->form = $form;
 
@@ -65,7 +67,7 @@ class Tab
     {
         call_user_func($content, $this->form);
 
-        $fields = clone $this->form->builder()->fields();
+        $fields = clone $this->form->fields();
 
         $all = $fields->toArray();
 
@@ -123,4 +125,37 @@ class Tab
     {
         return $this->tabs->isEmpty();
     }
+
+    /**
+     * @return void
+     */
+    public function addScript()
+    {
+        $elementId = $this->form->getElementId();
+
+        $script = <<<JS
+(function () {
+    var hash = document.location.hash;
+    if (hash) {
+        $('#$elementId .nav-tabs a[href="' + hash + '"]').tab('show');
+    }
+    
+    // Change hash for page-reload
+    $('#$elementId .nav-tabs a').on('shown.bs.tab', function (e) {
+        history.pushState(null,null, e.target.hash);
+    });
+    
+    if ($('#$elementId .has-error').length) {
+        $('#$elementId .has-error').each(function () {
+            var tabId = '#'+$(this).closest('.tab-pane').attr('id');
+            $('li a[href="'+tabId+'"] i').removeClass('hide');
+        });
+    
+        var first = $('#$elementId .has-error:first').closest('.tab-pane').attr('id');
+        $('li a[href="#'+first+'"]').tab('show');
+    }
+})();
+JS;
+        Admin::script($script);
+    }
 }

+ 27 - 2
src/Widgets/Form.php

@@ -5,6 +5,8 @@ namespace Dcat\Admin\Widgets;
 use Closure;
 use Dcat\Admin\Admin;
 use Dcat\Admin\Form\Concerns\HandleCascadeFields;
+use Dcat\Admin\Form\Concerns\HasRows;
+use Dcat\Admin\Form\Concerns\HasTabs;
 use Dcat\Admin\Form\Field;
 use Dcat\Admin\Support\Helper;
 use Dcat\Admin\Traits\HasAuthorization;
@@ -82,6 +84,8 @@ class Form implements Renderable
         HasFormResponse,
         HasAuthorization,
         HandleCascadeFields,
+        HasRows,
+        HasTabs,
         Macroable {
             __call as macroCall;
         }
@@ -98,6 +102,11 @@ class Form implements Renderable
      */
     protected $fields;
 
+    /**
+     * @var array
+     */
+    protected $variables = [];
+
     /**
      * @var bool
      */
@@ -485,13 +494,21 @@ class Form implements Renderable
 
         $this->fillFields($this->model()->toArray());
 
-        return [
+        return array_merge([
             'start'   => $this->open(),
             'end'     => $this->close(),
             'fields'  => $this->fields,
             'method'  => $this->getHtmlAttribute('method'),
             'buttons' => $this->buttons,
-        ];
+            'rows'    => $this->rows(),
+        ], $this->variables);
+    }
+
+    public function addVariables(array $variables)
+    {
+        $this->variables = array_merge($this->variables, $variables);
+
+        return $this;
     }
 
     public function fillFields(array $data)
@@ -690,6 +707,14 @@ JS
             $this->setupSubmitScript();
         }
 
+        $tabObj = $this->getTab();
+
+        if (! $tabObj->isEmpty()) {
+            $tabObj->addScript();
+        }
+
+        $this->addVariables(['tabObj' => $tabObj]);
+
         return view($this->view, $this->variables())->render();
     }