| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- <?php
- namespace Dcat\Admin\Layout;
- use Dcat\Admin\Admin;
- use Dcat\Admin\Support\Helper;
- use Lang;
- class Menu
- {
- /**
- * @var array
- */
- protected static $helperNodes = [
- [
- 'id' => 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;
- }
- }
|