Browse Source

Admin::requiredAssets 支持传递动态参数

jqh 4 năm trước cách đây
mục cha
commit
3be3a97f9f
2 tập tin đã thay đổi với 80 bổ sung10 xóa
  1. 77 8
      src/Layout/Asset.php
  2. 3 2
      src/Traits/HasAssets.php

+ 77 - 8
src/Layout/Asset.php

@@ -4,6 +4,7 @@ namespace Dcat\Admin\Layout;
 
 use Dcat\Admin\Admin;
 use Dcat\Admin\Color;
+use function GuzzleHttp\Psr7\parse_query;
 use Illuminate\Support\Str;
 
 class Asset
@@ -75,7 +76,10 @@ class Asset
             'js' => '@admin/dcat/plugins/bootstrap-validator/validator.min.js',
         ],
         '@select2' => [
-            'js'  => '@admin/dcat/plugins/select/select2.full.min.js',
+            'js'  => [
+                '@admin/dcat/plugins/select/select2.full.min.js',
+                '@admin/dcat/plugins/select/i18n/{lang}.js',
+            ],
             'css' => '@admin/dcat/plugins/select/select2.min.css',
         ],
         '@bootstrap-datetimepicker' => [
@@ -314,7 +318,7 @@ class Asset
         }
 
         if ($value === null) {
-            return $this->alias[$name] ?? [];
+            return $this->getAlias($name);
         }
 
         if (mb_strpos($name, '@') !== 0) {
@@ -324,12 +328,79 @@ class Asset
         $this->alias[$name] = $value;
     }
 
+    /**
+     * 获取别名.
+     *
+     * @param string $name
+     * @param array $params
+     *
+     * @return array|string
+     */
+    public function getAlias($name, array $params = [])
+    {
+        if (mb_strpos($name, '@') !== 0) {
+            $name = '@'.$name;
+        }
+
+        [$name, $query] = $this->parseParams($name);
+
+        $params += $query;
+
+        $assets = $this->alias[$name] ?? [];
+
+        // 路径别名
+        if (is_string($assets)) {
+            return $assets;
+        }
+
+        $normalize = function ($files) use ($params) {
+            $files = (array) $files;
+            foreach ($files as $k => &$file) {
+                foreach ($params as $k => $v) {
+                    $file = str_replace("{{$k}}", $v, $file);
+                }
+            }
+
+            return array_filter($files, function ($file) {
+                return ! mb_strpos($file, '{');
+            });
+        };
+
+        return [
+            'js' => $normalize($assets['js'] ?? []) ?: null,
+            'css' => $normalize($assets['css'] ?? []) ?: null,
+        ];
+    }
+
+    /**
+     * 解析参数.
+     *
+     * @param string $name
+     *
+     * @return array
+     */
+    protected function parseParams($name)
+    {
+        $name = explode('?', $name);
+
+        if (empty($name[1])) {
+            return [$name[0], []];
+        }
+
+        parse_str($name[1], $params);
+
+        return [$name[0], $params];
+    }
+
     /**
      * 根据别名设置需要载入的js和css脚本.
      *
      * @param string|array $alias
+     * @param array $params
+     *
+     * @return void
      */
-    public function require($alias)
+    public function require($alias, array $params = [])
     {
         if (is_array($alias)) {
             foreach ($alias as $v) {
@@ -339,12 +410,10 @@ class Asset
             return;
         }
 
-        if (mb_strpos($alias, '@') !== 0) {
-            $alias = '@'.$alias;
-        }
+        $assets = $this->getAlias($alias, $params);
 
-        $this->js($this->alias[$alias]['js'] ?? null);
-        $this->css($this->alias[$alias]['css'] ?? null);
+        $this->js($assets['js']);
+        $this->css($assets['css']);
     }
 
     /**

+ 3 - 2
src/Traits/HasAssets.php

@@ -14,12 +14,13 @@ trait HasAssets
 
     /**
      * @param string|array $name
+     * @param array $params
      *
      * @return void
      */
-    public static function requireAssets($name)
+    public static function requireAssets($name, array $params = [])
     {
-        static::asset()->require($name);
+        static::asset()->require($name, $params);
     }
 
     /**