| Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/ |
| Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/FrontendMenuController.php |
<?php
namespace App\Http\Controllers\Backend;
use App\Http\Controllers\Controller;
use App\Models\Backend\menu\frontend\Menu;
use App\Models\Backend\menu\frontend\MenuCategory;
use App\Models\Backend\menu\frontend\RoleMapping;
use App\Services\MenuFilterService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
class FrontendMenuController extends Controller
{
public function __construct(
protected MenuFilterService $menuFilter
) {}
public function index(Request $request)
{
$search = $request->get('search');
$menus = Menu::query()
->when($search, fn ($query) => $query->where('menu_name', 'like', "%{$search}%")
->orWhere('menu_link', 'like', "%{$search}%"))
->orderBy('menu_parent_id')
->orderBy('menu_id')
->paginate(10)
->withQueryString();
$parentNames = Menu::pluck('menu_name', 'menu_id');
return view('backend.module.menu.frontend.index', [
'menus' => $menus,
'search' => $search,
'parentNames' => $parentNames,
]);
}
public function create()
{
$parentMenus = Menu::where('menu_status', true)
->where('menu_parent_id', 0)
->pluck('menu_name', 'menu_id');
return view('backend.module.menu.frontend.create', [
'parentMenus' => $parentMenus,
]);
}
public function store(Request $request)
{
Menu::create($this->validatedMenu($request));
Cache::forget('frontend_nav');
flash()->success('Frontend menu created successfully.');
return redirect()->route('frontend-menu.index');
}
public function edit($id)
{
$parentMenus = Menu::where('menu_status', true)
->where('menu_parent_id', 0)
->pluck('menu_name', 'menu_id');
return view('backend.module.menu.frontend.edit', [
'menu' => Menu::findOrFail($id),
'parentMenus' => $parentMenus,
]);
}
public function update(Request $request, $id)
{
$menu = Menu::findOrFail($id);
$menu->update($this->validatedMenu($request));
Cache::forget('frontend_nav');
flash()->success('Frontend menu updated successfully.');
return redirect()->route('frontend-menu.index');
}
public function destroy($id)
{
Menu::findOrFail($id)->delete();
Cache::forget('frontend_nav');
flash()->success('Frontend menu deleted successfully.');
return redirect()->route('frontend-menu.index');
}
public function delete(Request $request)
{
$this->destroy($request->integer('id'));
return response()->json(['success' => true]);
}
public function roledelete($id)
{
RoleMapping::findOrFail($id)->delete();
flash()->success('Role mapping deleted successfully.');
return redirect()->back()->withInput($this->menuFilter->getParam());
}
public function assignMenu(Request $request)
{
if ($request->isMethod('post')) {
$data = $request->validate([
'role_code' => ['required', 'string'],
'menu_group' => ['nullable', 'string'],
'menu_id' => ['required', 'integer', 'exists:frontend_menu,menu_id'],
'parent_id' => ['nullable', 'integer'],
'page_id' => ['nullable', 'integer'],
'site_id' => ['nullable', 'integer'],
'category_id' => ['nullable', 'integer', 'exists:frontend_menu_category,category_id'],
'status' => ['nullable', 'boolean'],
]);
$data['menu_group'] = $data['menu_group'] ?? '';
$sort = RoleMapping::where('role_code', $data['role_code'])
->where('category_id', $data['category_id'] ?? null)
->where('parent_id', $data['parent_id'] ?? 0)
->max('sort') + 1;
$data['parent_id'] = $data['parent_id'] ?? 0;
$data['sort'] = $sort;
$data['status'] = $request->boolean('status', true);
$data['created_by'] = (string) auth('admin')->id();
$data['updated_by'] = (string) auth('admin')->id();
RoleMapping::create($data);
flash()->success('Menu assigned successfully.');
unset($data['parent_id']);
return $this->menuFilter->redirectAfterSave($data);
}
$siteId = $request->integer('site_id', 0);
$pageId = $request->integer('page_id', 0);
$categoryId = $request->integer('category_id', 0);
$categories = MenuCategory::dropdown();
$groupedRoles = RoleMapping::select('role_code')
->distinct()
->when($siteId, fn($q) => $q->where('site_id', $siteId))
->when($pageId, fn($q) => $q->where('page_id', $pageId))
->when($categoryId, fn($q) => $q->where('category_id', $categoryId))
->pluck('role_code');
$assignedMenusByRole = [];
foreach ($groupedRoles as $roleCode) {
$rootMappings = RoleMapping::with(['menu', 'category'])
->where('role_code', $roleCode)
->where('parent_id', 0)
->when($categoryId, fn($q) => $q->where('category_id', $categoryId))
->when($siteId, fn($q) => $q->where('site_id', $siteId))
->when($pageId, fn($q) => $q->where('page_id', $pageId))
->orderBy('sort')
->get();
$tree = [];
foreach ($rootMappings as $mapping) {
if (!$mapping->menu || !$mapping->menu->menu_status) {
continue;
}
$children = RoleMapping::nestedmenu($mapping->menu_id, $roleCode, null, 1, [
'category_id' => $mapping->category_id ?: null,
'site_id' => $mapping->site_id ?: null,
'page_id' => $mapping->page_id ?: null,
]);
$tree[] = [
'mapping' => $mapping,
'level' => 0,
'children' => $children,
];
}
$assignedMenusByRole[$roleCode] = $tree;
}
return view('backend.module.menu.frontend.assign', [
'menus' => Menu::dropdown(),
'listofmenus' => Menu::listofmenu(),
'roles' => Menu::getRole(),
'categories' => $categories,
'params' => $this->menuFilter->getParam(),
'assignedMenusByRole' => $assignedMenusByRole,
'groupedRoles' => $groupedRoles,
'pages' => Menu::getPageList(),
'sites' => Menu::getSiteList(),
'siteId' => $siteId,
'pageId' => $pageId,
'categoryId' => $categoryId,
'pageTitle' => 'Assign Menu',
'parentid' => $request->integer('parent_id', 0),
'rolecode' => $request->input('role_code', ''),
]);
}
public function level($id, $role, $pos, $sort)
{
DB::transaction(function () use ($id, $role, $pos, $sort) {
$current = RoleMapping::findOrFail($id);
$targetSort = (int) $sort + ((string) $pos === 'up' ? -1 : 1);
$target = RoleMapping::where('role_code', $role)
->where('category_id', $current->category_id)
->where('parent_id', $current->parent_id)
->where('sort', $targetSort)
->first();
if ($target) {
$target->update(['sort' => $current->sort]);
$current->update(['sort' => $targetSort]);
}
});
return back();
}
public function disabled($id)
{
$menu = Menu::findOrFail($id);
$menu->update(['menu_status' => ! $menu->menu_status]);
Cache::forget('frontend_nav');
flash()->success('Frontend menu status updated successfully.');
return back();
}
public function toggleMapping($id)
{
$mapping = RoleMapping::findOrFail($id);
$mapping->update(['status' => ! $mapping->status]);
flash()->success('Mapping status updated successfully.');
return back();
}
public function articleItem()
{
return response()->json(Menu::getArticleList());
}
public function sliderItem()
{
return response()->json(Menu::getImageSliderList());
}
private function validatedMenu(Request $request): array
{
$data = $request->validate([
'menu_name' => ['required', 'string', 'max:255'],
'menu_status' => ['nullable', 'boolean'],
'menu_class' => ['nullable', 'string', 'max:50'],
'menu_link' => ['nullable', 'string', 'max:255'],
'menu_icon' => ['nullable', 'string', 'max:255'],
'menu_parent_id' => ['nullable', 'integer'],
]);
$data['menu_status'] = $request->has('menu_status') ? (bool) $request->input('menu_status') : false;
$data['menu_parent_id'] = $request->integer('menu_parent_id', 0);
return $data;
}
}