From 58606ec9beeae9abfcb23352f7cd5bb69b3ecfa8 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Tue, 29 Oct 2024 11:57:32 +0700 Subject: [PATCH] Penambahan Menu Service Provider --- app/Providers/MenuServiceProvider.php | 72 +++++++++ bootstrap/providers.php | 1 + resources/views/layouts/sidebar.blade.php | 189 +++++++++++----------- 3 files changed, 163 insertions(+), 99 deletions(-) create mode 100644 app/Providers/MenuServiceProvider.php diff --git a/app/Providers/MenuServiceProvider.php b/app/Providers/MenuServiceProvider.php new file mode 100644 index 0000000..7da4991 --- /dev/null +++ b/app/Providers/MenuServiceProvider.php @@ -0,0 +1,72 @@ +loadMenus(); + $this->shareMenusWithViews(); + } + + protected function loadMenus() + { + $modulesPath = base_path('Modules'); + $moduleDirs = File::directories($modulesPath); + + foreach ($moduleDirs as $moduleDir) { + $moduleJsonPath = $moduleDir . '/module.json'; + if (File::exists($moduleJsonPath)) { + $moduleConfig = json_decode(File::get($moduleJsonPath), true); + if (isset($moduleConfig['menu'])) { + $this->mergeMenus($moduleConfig['menu']); + } + } + } + } + + protected function mergeMenus(array $menu) + { + foreach ($menu as $key => $items) { + if (!isset($this->menus[$key])) { + $this->menus[$key] = []; + } + + foreach ($items as $newItem) { + $existingItemKey = $this->findExistingMenuItem($this->menus[$key], $newItem); + + if ($existingItemKey !== null) { + // Merge submenus if the item already exists + $this->menus[$key][$existingItemKey]['sub'] = array_merge( + $this->menus[$key][$existingItemKey]['sub'] ?? [], + $newItem['sub'] ?? [] + ); + } else { + // Add new item if it doesn't exist + $this->menus[$key][] = $newItem; + } + } + } + } + + protected function findExistingMenuItem(array $menuItems, array $newItem) + { + foreach ($menuItems as $index => $item) { + if ($item['title'] === $newItem['title'] || $item['path'] === $newItem['path']) { + return $index; + } + } + return null; + } + + protected function shareMenusWithViews() + { + view()->share('menus', $this->menus); + } + } diff --git a/bootstrap/providers.php b/bootstrap/providers.php index 38b258d..bb366f8 100644 --- a/bootstrap/providers.php +++ b/bootstrap/providers.php @@ -2,4 +2,5 @@ return [ App\Providers\AppServiceProvider::class, + App\Providers\MenuServiceProvider::class, ]; diff --git a/resources/views/layouts/sidebar.blade.php b/resources/views/layouts/sidebar.blade.php index 07aa424..be656f5 100644 --- a/resources/views/layouts/sidebar.blade.php +++ b/resources/views/layouts/sidebar.blade.php @@ -5,12 +5,12 @@ @php @@ -43,100 +43,91 @@ $headingMain = 0; $headingMaster = 0; @endphp - @foreach($module as $row => $key) - @if($key) - @if(file_exists(dirname(__FILE__, 4) . '/Modules/'.$row.'/module.json')) - @php - $module = json_decode(file_get_contents(dirname(__FILE__, 4) . '/Modules/'.$row.'/module.json')); - $menus = $module->menu; - @endphp - @foreach($menus as $key => $value) - @foreach($value as $menu) - @if($key=='main') - @if($headingMain == 0) - - @php $headingMain = 1; @endphp - @endif - @elseif($key=='master') - @if($headingMaster == 0) - - @php $headingMaster = 1; @endphp - @endif - @elseif($key=='system') - @if($headingSystem == 0) - - @php $headingSystem = 1; @endphp - @endif - @endif - @if(auth()->user()->hasRole($menu->roles)) - @if(isset($menu->sub)) -