Menu.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?php
  2. namespace Dcat\Admin\Layout;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Support\Helper;
  5. class Menu
  6. {
  7. /**
  8. * @var array
  9. */
  10. protected static $helperNodes = [
  11. [
  12. 'id' => 1,
  13. 'title' => 'Helpers',
  14. 'icon' => 'fa-gears',
  15. 'uri' => '',
  16. 'parent_id' => 0,
  17. ],
  18. [
  19. 'id' => 2,
  20. 'title' => 'Extensions',
  21. 'icon' => 'fa-plug',
  22. 'uri' => 'helpers/extensions',
  23. 'parent_id' => 1,
  24. ],
  25. [
  26. 'id' => 3,
  27. 'title' => 'Scaffold',
  28. 'icon' => 'fa-keyboard-o',
  29. 'uri' => 'helpers/scaffold',
  30. 'parent_id' => 1,
  31. ],
  32. [
  33. 'id' => 4,
  34. 'title' => 'Routes',
  35. 'icon' => 'fa-internet-explorer',
  36. 'uri' => 'helpers/routes',
  37. 'parent_id' => 1,
  38. ],
  39. [
  40. 'id' => 5,
  41. 'title' => 'Icons',
  42. 'icon' => 'fa-fonticons',
  43. 'uri' => 'helpers/icons',
  44. 'parent_id' => 1,
  45. ],
  46. ];
  47. /**
  48. * @var \Illuminate\Contracts\Routing\UrlGenerator
  49. */
  50. protected $url;
  51. public function __construct()
  52. {
  53. $this->url = url();
  54. }
  55. /**
  56. * Register menu,.
  57. */
  58. public function register()
  59. {
  60. if (!admin_has_default_section(\AdminSection::LEFT_SIDEBAR_MENU)) {
  61. admin_inject_default_section(\AdminSection::LEFT_SIDEBAR_MENU, function () {
  62. $menuModel = config('admin.database.menu_model');
  63. return $this->build((new $menuModel())->allNodes());
  64. });
  65. }
  66. if (config('app.debug')) {
  67. // Register the menu of helpers.
  68. $this->add(static::$helperNodes, 20);
  69. }
  70. }
  71. /**
  72. * @param array $nodes
  73. * @param int $priority
  74. */
  75. public function add(array $nodes = [], int $priority = 10)
  76. {
  77. admin_inject_section(\AdminSection::LEFT_SIDEBAR_MENU_BOTTOM, function () use (&$nodes) {
  78. return $this->build($nodes);
  79. }, true, $priority);
  80. }
  81. /**
  82. * Build html.
  83. *
  84. * @param array $nodes
  85. * @return string
  86. * @throws \Throwable
  87. */
  88. public function build(array $nodes)
  89. {
  90. $html = '';
  91. foreach (Helper::buildNestedArray($nodes) as $item) {
  92. $html .= $this->renderMenu($item);
  93. }
  94. return $html;
  95. }
  96. /**
  97. * @param array $item
  98. * @return array|string
  99. */
  100. protected function renderMenu(array $item)
  101. {
  102. return view('admin::partials.menu', ['item' => &$item])->render();
  103. }
  104. /**
  105. * @param array $item
  106. * @param null|string $path
  107. * @return bool
  108. */
  109. public function isActive(array $item, ?string $path = null)
  110. {
  111. if (empty($path)) {
  112. $path = request()->path();
  113. }
  114. if (empty($item['children'])) {
  115. if (empty($item['uri'])) {
  116. return false;
  117. }
  118. return trim($this->getAdminPath($item['uri']), '/') == $path;
  119. }
  120. foreach($item['children'] as $v) {
  121. if ($path == trim($this->getAdminPath($v['uri']), '/')) {
  122. return true;
  123. }
  124. if (!empty($v['children'])) {
  125. if (static::isActive($v, $path)) {
  126. return true;
  127. }
  128. }
  129. }
  130. return false;
  131. }
  132. /**
  133. * @param array $menuItem
  134. * @return bool
  135. */
  136. public function show(array $menuItem)
  137. {
  138. $permissionIds = $menuItem['permission_id'] ?? null;
  139. $roles = array_column($menuItem['roles'] ?? [], 'slug');
  140. $permissions = array_column($menuItem['permissions'] ?? [], 'slug');
  141. if (!$permissionIds && !$roles && !$permissions) {
  142. return true;
  143. }
  144. $user = Admin::user();
  145. if ($user->visible($roles)) {
  146. return true;
  147. }
  148. foreach (array_merge(Helper::array($permissionIds), $permissions) as $permission) {
  149. if ($user->can($permission)) {
  150. return true;
  151. }
  152. }
  153. return false;
  154. }
  155. /**
  156. * @param $uri
  157. * @return string
  158. */
  159. public function getAdminPath($uri)
  160. {
  161. if (!$uri) return $uri;
  162. return $this->url->isValidUrl($uri) ? $uri : admin_base_path($uri);
  163. }
  164. }