1, 'title' => 'Helpers', 'icon' => 'fa fa-keyboard-o', 'uri' => '', 'parent_id' => 0, ], [ 'id' => 2, 'title' => 'Extensions', 'icon' => '', 'uri' => 'helpers/extensions', 'parent_id' => 1, ], [ 'id' => 3, 'title' => 'Scaffold', 'icon' => '', 'uri' => 'helpers/scaffold', 'parent_id' => 1, ], [ 'id' => 4, 'title' => 'Icons', 'icon' => '', 'uri' => 'helpers/icons', 'parent_id' => 1, ], ]; /** * @var string */ protected $view = 'admin::partials.menu'; /** * Register menu. */ public function register() { if (! admin_has_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'])) { admin_inject_default_section(Admin::SECTION['LEFT_SIDEBAR_MENU'], function () { $menuModel = config('admin.database.menu_model'); return $this->toHtml((new $menuModel())->allNodes()->toArray()); }); } if (config('app.debug') && config('admin.helpers.enable', true)) { $this->add(static::$helperNodes, 20); } } /** * @param array $nodes * @param int $priority * * @return void */ public function add(array $nodes = [], int $priority = 10) { admin_inject_section(Admin::SECTION['LEFT_SIDEBAR_MENU_BOTTOM'], function () use (&$nodes) { return $this->toHtml($nodes); }, true, $priority); } /** * Build html. * * @param array $nodes * * @throws \Throwable * * @return string */ public function toHtml($nodes) { $html = ''; foreach (Helper::buildNestedArray($nodes) as $item) { $html .= $this->render($item); } return $html; } /** * @param string $view * * @return $this */ public function view(string $view) { $this->view = $view; return $this; } /** * @param array $item * * @return string */ public function render($item) { return view($this->view, ['item' => &$item, 'builder' => $this])->render(); } /** * @param array $item * @param null|string $path * * @return bool */ public function isActive($item, ?string $path = null) { if (empty($path)) { $path = request()->path(); } if (empty($item['children'])) { if (empty($item['uri'])) { return false; } return trim($this->getPath($item['uri']), '/') == $path; } foreach ($item['children'] as $v) { if ($path == trim($this->getPath($v['uri']), '/')) { return true; } if (! empty($v['children'])) { if ($this->isActive($v, $path)) { return true; } } } return false; } /** * @param array $item * * @return bool */ public function visible($item) { if ( ! $this->checkPermission($item) || ! $this->checkExtension($item) || ! $this->userCanSeeMenu($item) ) { return false; } $show = $item['show'] ?? null; if ($show !== null && ! $show) { return false; } return true; } /** * 判断扩展是否启用. * * @param $item * * @return bool */ protected function checkExtension($item) { $extension = $item['extension'] ?? null; if (! $extension) { return true; } if (! $extension = Admin::extension($extension)) { return false; } return $extension->enabled(); } /** * 判断用户 * * @param array|\Dcat\Admin\Models\Menu $item * * @return bool */ protected function userCanSeeMenu($item) { $user = Admin::user(); if (! $user || ! method_exists($user, 'canSeeMenu')) { return true; } return $user->canSeeMenu($item); } /** * 判断权限. * * @param $item * * @return bool */ protected function checkPermission($item) { $permissionIds = $item['permission_id'] ?? null; $roles = array_column(Helper::array($item['roles'] ?? []), 'slug'); $permissions = array_column(Helper::array($item['permissions'] ?? []), 'slug'); if (! $permissionIds && ! $roles && ! $permissions) { return true; } $user = Admin::user(); if (! $user || $user->visible($roles)) { return true; } foreach (array_merge(Helper::array($permissionIds), $permissions) as $permission) { if ($user->can($permission)) { return true; } } return false; } /** * @param string $text * * @return string */ public function translate($text) { $titleTranslation = 'menu.titles.'.trim(str_replace(' ', '_', strtolower($text))); if (Lang::has($titleTranslation)) { return __($titleTranslation); } return $text; } /** * @param string $uri * * @return string */ public function getPath($uri) { return $uri ? (url()->isValidUrl($uri) ? $uri : admin_base_path($uri)) : $uri; } /** * @param string $uri * * @return string */ public function getUrl($uri) { return $uri ? admin_url($uri) : $uri; } }