ソースを参照

表单options方法支持传入匿名函数

jqh 6 年 前
コミット
7522a15b3c

+ 9 - 3
src/Controllers/MenuController.php

@@ -122,18 +122,24 @@ class MenuController extends Controller
 
         $form->display('id', 'ID');
 
-        $form->select('parent_id', trans('admin.parent_id'))->options($menuModel::selectOptions());
+        $form->select('parent_id', trans('admin.parent_id'))->options(function () use ($menuModel) {
+            return $menuModel::selectOptions();
+        });
         $form->text('title', trans('admin.title'))->required();
         $form->icon('icon', trans('admin.icon'))->default('fa-bars')->help($this->iconHelp());
         $form->text('uri', trans('admin.uri'));
         $form->multipleSelect('roles', trans('admin.roles'))
-            ->options($roleModel::all()->pluck('name', 'id'))
+            ->options(function () use ($roleModel) {
+                return $roleModel::all()->pluck('name', 'id');
+            })
             ->customFormat(function ($v) {
                 return array_column($v, 'id');
             });
         if ($menuModel::withPermission()) {
             $form->tree('permissions', trans('admin.permission'))
-                ->nodes((new $permissionModel)->allNodes())
+                ->nodes(function () use ($permissionModel) {
+                    return (new $permissionModel)->allNodes();
+                })
                 ->customFormat(function ($v) {
                     if (!$v) {
                         return [];

+ 4 - 2
src/Controllers/PermissionController.php

@@ -126,7 +126,8 @@ class PermissionController extends Controller
 
         $tree->tools(function (Tree\Tools $tools) {
             $label = trans('admin.table');
-            $tools->add("<a class='btn btn-sm btn-default' href='?_layout=1'><i class=' ti-layout-grid3-alt'></i>&nbsp $label</a>");
+            $url = url(request()->getPathInfo()).'?_layout=1';
+            $tools->add("<a class='btn btn-sm btn-default' href='{$url}'>$label</a>");
         });
 
         $tree->branch(function ($branch) {
@@ -224,7 +225,8 @@ class PermissionController extends Controller
             });
 
             $label = trans('admin.default');
-            $tools->append("<a class='btn btn-sm btn-default' href='?'><i class='fa fa-align-right'></i>&nbsp $label</a>");
+            $url = url(request()->getPathInfo());
+            $tools->append("<a class='btn btn-sm btn-default' href='{$url}'>$label</a>");
         });
 
         $grid->filter(function (Grid\Filter $filter) {

+ 6 - 3
src/Controllers/RoleController.php

@@ -171,10 +171,13 @@ class RoleController extends Controller
         });
         $form->text('name', trans('admin.name'))->required();
 
-        $permissionModel = config('admin.database.permissions_model');
-        $permissionModel = new $permissionModel;
         $form->tree('permissions')
-            ->nodes($permissionModel->allNodes())
+            ->nodes(function () {
+                $permissionModel = config('admin.database.permissions_model');
+                $permissionModel = new $permissionModel;
+
+                return $permissionModel->allNodes();
+            })
             ->customFormat(function ($v) {
                 if (!$v) return [];
 

+ 5 - 2
src/Controllers/UserController.php

@@ -223,7 +223,6 @@ class UserController extends Controller
      */
     public function form($id = null)
     {
-        $roleModel = config('admin.database.roles_model');
         $userTable = config('admin.database.users_table');
 
         $connection = config('admin.database.connection');
@@ -248,7 +247,11 @@ class UserController extends Controller
         $form->ignore(['password_confirmation']);
 
         $form->multipleSelect('roles', trans('admin.roles'))
-            ->options($roleModel::all()->pluck('name', 'id'))
+            ->options(function () {
+                $roleModel = config('admin.database.roles_model');
+
+                return $roleModel::all()->pluck('name', 'id');
+            })
             ->customFormat(function ($v) {
                 return array_column($v, 'id');
             });

+ 8 - 11
src/Form/Field/Checkbox.php

@@ -2,6 +2,7 @@
 
 namespace Dcat\Admin\Form\Field;
 
+use Dcat\Admin\Support\Helper;
 use Illuminate\Contracts\Support\Arrayable;
 
 class Checkbox extends MultipleSelect
@@ -25,23 +26,19 @@ class Checkbox extends MultipleSelect
     /**
      * Set options.
      *
-     * @param array|callable|string $options
+     * @param array|\Closure|string $options
      *
      * @return $this|mixed
      */
     public function options($options = [])
     {
-        if (is_callable($options)) {
+        if ($options instanceof \Closure) {
             $this->options = $options;
 
             return $this;
         }
 
-        if ($options instanceof Arrayable) {
-            $options = $options->toArray();
-        }
-
-        $this->options = (array) $options;
+        $this->options = Helper::array($options);
 
         return $this;
     }
@@ -119,10 +116,10 @@ class Checkbox extends MultipleSelect
      */
     public function render()
     {
-        if (is_callable($this->options)) {
-            $this->options = $this->options->bindTo($this->getFormModel());
-
-            $this->options(call_user_func($this->options, $this->value, $this));
+        if ($this->options instanceof \Closure) {
+            $this->options(
+                $this->options->call($this->getFormModel(), $this->value, $this)
+            );
         }
 
         $this->addVariables([

+ 8 - 11
src/Form/Field/Radio.php

@@ -3,6 +3,7 @@
 namespace Dcat\Admin\Form\Field;
 
 use Dcat\Admin\Form\Field;
+use Dcat\Admin\Support\Helper;
 use Illuminate\Contracts\Support\Arrayable;
 
 class Radio extends Field
@@ -14,23 +15,19 @@ class Radio extends Field
     /**
      * Set options.
      *
-     * @param array|callable|string $options
+     * @param array|\Closure|string $options
      *
      * @return $this
      */
     public function options($options = [])
     {
-        if (is_callable($options)) {
+        if ($options instanceof \Closure) {
             $this->options = $options;
 
             return $this;
         }
 
-        if ($options instanceof Arrayable) {
-            $options = $options->toArray();
-        }
-
-        $this->options = (array) $options;
+        $this->options = Helper::array($options);
 
         return $this;
     }
@@ -89,10 +86,10 @@ class Radio extends Field
      */
     public function render()
     {
-        if (is_callable($this->options)) {
-            $this->options = $this->options->bindTo($this->getFormModel());
-
-            $this->options(call_user_func($this->options, $this->value, $this));
+        if ($this->options instanceof \Closure) {
+            $this->options(
+                $this->options->call($this->getFormModel(), $this->value, $this)
+            );
         }
 
         $this->addVariables([

+ 9 - 10
src/Form/Field/Select.php

@@ -4,6 +4,7 @@ namespace Dcat\Admin\Form\Field;
 
 use Dcat\Admin\Admin;
 use Dcat\Admin\Form\Field;
+use Dcat\Admin\Support\Helper;
 use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Support\Arr;
@@ -24,12 +25,18 @@ class Select extends Field
     /**
      * Set options.
      *
-     * @param array|callable|string $options
+     * @param array|\Closure|string $options
      *
      * @return $this|mixed
      */
     public function options($options = [])
     {
+        if ($options instanceof \Closure) {
+            $this->options = $options;
+
+            return $this;
+        }
+
         // remote options
         if (is_string($options)) {
             // reload selected
@@ -40,15 +47,7 @@ class Select extends Field
             return $this->loadRemoteOptions(...func_get_args());
         }
 
-        if ($options instanceof Arrayable) {
-            $options = $options->toArray();
-        }
-
-        if (is_callable($options)) {
-            $this->options = $options;
-        } else {
-            $this->options = (array) $options;
-        }
+        $this->options = Helper::array($options);
 
         return $this;
     }

+ 3 - 4
src/Form/Field/SelectResource.php

@@ -71,14 +71,13 @@ class SelectResource extends Field
 
     protected function formatOptions()
     {
-        $opts = $this->options;
-        if (is_callable($opts)) {
+        if ($this->options instanceof \Closure) {
             $value = Helper::array(old($this->column, $this->value));
 
-            $opts = call_user_func($opts, $value);
+            $this->options = $this->options->call($this->getFormModel(), $value, $this);
         }
 
-        $this->options = Helper::array($opts);
+        $this->options = Helper::array($this->options);
 
     }
 

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

@@ -73,12 +73,18 @@ class Tags extends Field
     /**
      * Set the field options.
      *
-     * @param array|Collection|Arrayable $options
+     * @param array|Collection|Arrayable|\Closure $options
      *
      * @return $this|Field
      */
     public function options($options = [])
     {
+        if ($this->options instanceof \Closure) {
+            $this->options = $options;
+
+            return $this;
+        }
+
         if (!$this->keyAsValue) {
             return parent::options($options);
         }
@@ -151,6 +157,12 @@ class Tags extends Field
      */
     public function render()
     {
+        if ($this->options instanceof \Closure) {
+            $this->options(
+                $this->options->call($this->getFormModel(), $this->value, $this)
+            );
+        }
+
         $this->script = "$(\"{$this->getElementClassSelector()}\").select2({
             tags: true,
             tokenSeparators: [',']

+ 5 - 2
src/Form/Field/Tree.php

@@ -61,7 +61,7 @@ class Tree extends Field
     protected $filterParents = true;
 
     /**
-     * @param array $data exp:
+     * @param array|Arrayable|\Closure $data exp:
      *     {
      *          "id": "1",
      *          "parent": "#",
@@ -69,7 +69,6 @@ class Tree extends Field
      *          // "state": {"selected": true}
      *     }
      *
-     * @param array $data
      * @return $this
      */
     public function nodes($data)
@@ -115,6 +114,10 @@ class Tree extends Field
 
         $this->value = &$value;
 
+        if ($this->nodes instanceof \Closure) {
+            $this->nodes = $this->nodes->call($this->getFormModel(), $this->value, $this);
+        }
+
         if (!$this->nodes) return;
 
         $idColumn     = $this->columnNames['id'];