Menu.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. * Register menu.
  49. */
  50. public function register()
  51. {
  52. if (!admin_has_default_section(\AdminSection::LEFT_SIDEBAR_MENU)) {
  53. admin_inject_default_section(\AdminSection::LEFT_SIDEBAR_MENU, function () {
  54. $menuModel = config('admin.database.menu_model');
  55. return $this->build((new $menuModel())->allNodes());
  56. });
  57. }
  58. if (config('app.debug')) {
  59. // Register the menu of helpers.
  60. $this->add(static::$helperNodes, 20);
  61. }
  62. }
  63. /**
  64. * @param array $nodes
  65. * @param int $priority
  66. */
  67. public function add(array $nodes = [], int $priority = 10)
  68. {
  69. admin_inject_section(\AdminSection::LEFT_SIDEBAR_MENU_BOTTOM, function () use (&$nodes) {
  70. return $this->build($nodes);
  71. }, true, $priority);
  72. }
  73. /**
  74. * Build html.
  75. *
  76. * @param array $nodes
  77. *
  78. * @throws \Throwable
  79. *
  80. * @return string
  81. */
  82. public function build(array $nodes)
  83. {
  84. $html = '';
  85. foreach (Helper::buildNestedArray($nodes) as $item) {
  86. $html .= $this->renderMenu($item);
  87. }
  88. return $html;
  89. }
  90. /**
  91. * @param array $item
  92. *
  93. * @return array|string
  94. */
  95. protected function renderMenu(array $item)
  96. {
  97. return view('admin::partials.menu', ['item' => &$item])->render();
  98. }
  99. /**
  100. * @param array $item
  101. * @param null|string $path
  102. *
  103. * @return bool
  104. */
  105. public function isActive(array $item, ?string $path = null)
  106. {
  107. if (empty($path)) {
  108. $path = request()->path();
  109. }
  110. if (empty($item['children'])) {
  111. if (empty($item['uri'])) {
  112. return false;
  113. }
  114. return trim($this->getPath($item['uri']), '/') == $path;
  115. }
  116. foreach ($item['children'] as $v) {
  117. if ($path == trim($this->getPath($v['uri']), '/')) {
  118. return true;
  119. }
  120. if (!empty($v['children'])) {
  121. if (static::isActive($v, $path)) {
  122. return true;
  123. }
  124. }
  125. }
  126. return false;
  127. }
  128. /**
  129. * @param array $menuItem
  130. *
  131. * @return bool
  132. */
  133. public function show(array $menuItem)
  134. {
  135. $permissionIds = $menuItem['permission_id'] ?? null;
  136. $roles = array_column($menuItem['roles'] ?? [], 'slug');
  137. $permissions = array_column($menuItem['permissions'] ?? [], 'slug');
  138. if (!$permissionIds && !$roles && !$permissions) {
  139. return true;
  140. }
  141. $user = Admin::user();
  142. if ($user->visible($roles)) {
  143. return true;
  144. }
  145. foreach (array_merge(Helper::array($permissionIds), $permissions) as $permission) {
  146. if ($user->can($permission)) {
  147. return true;
  148. }
  149. }
  150. return false;
  151. }
  152. /**
  153. * @param $uri
  154. *
  155. * @return string
  156. */
  157. public function getPath($uri)
  158. {
  159. if (!$uri) {
  160. return $uri;
  161. }
  162. return url()->isValidUrl($uri) ? $uri : admin_base_path($uri);
  163. }
  164. /**
  165. * @param $uri
  166. *
  167. * @return string
  168. */
  169. public function getUrl($uri)
  170. {
  171. if (!$uri) {
  172. return $uri;
  173. }
  174. return admin_url($uri);
  175. }
  176. }