getAll(); //$menus = Menu::with('elements', 'elements.page', 'elements.category', 'elements.product', 'elements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product')->orderBy('order_by')->get(); $menus = Menu::with('allElements', 'allElements.page', 'allElements.gjspage', 'allElements.category', 'allElements.product', 'allElements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product')->orderBy('order_by')->get(); foreach ($menus as $menu) { foreach ($menu->allElements as $element) { $depth = $this->getElementDepth($element); $element['depth'] = $depth; } } return response()->json([ 'menus' => $menus ]); } return response()->json([ 'message' => 'Menu module not enabled.' ], 400); } private function getElementDepth($element, $depth = 0) { if ($element->parent_id != null) { $parent = MenuElement::find($element->parent_id); if ($parent) { $depth = $this->getElementDepth($parent, ++$depth); } } return $depth; } public function allPages(Request $request) { if (isModuleActive('PageBuilder')) { $all_pages = []; $menuService = new MenuService(new MenuRepository); $pages = $menuService->getPages(); $native_pages = $pages->toArray(); for ($i = 0; $i < count($native_pages); $i++) { $native_pages[$i]['_type'] = 'native'; } $all_pages = array_merge($all_pages, $native_pages); if (isModuleActive('PageBuilderPlus')) { $gjspages = \Modules\PageBuilderPlus\Entities\GJSPage::orderBy('title')->get()->toArray(); for ($i = 0; $i < count($gjspages); $i++) { $gjspages[$i]['_type'] = 'gjs'; } $all_pages = array_merge($all_pages, $gjspages); } return response()->json([ 'pages' => $all_pages ]); } return response()->json([ 'message' => 'PageBuilder module not enabled.' ], 400); } public function allCategories(Request $request) { if (isModuleActive('Product')) { $repository = new CategoryRepository(new Category); $categories = $repository->getAll(); return response()->json([ 'categories' => $categories ]); } return response()->json([ 'message' => 'Product module not enabled.' ], 400); } public function allProducts(Request $request) { if (isModuleActive('Product')) { $repository = new ProductRepository(); $products = $repository->getProduct()->get(); return response()->json([ 'products' => $products ]); } return response()->json([ 'message' => 'Product module not enabled.' ], 400); } public function allRoles(Request $request) { if (isModuleActive('RolePermission')) { //$repository = new RoleRepository(); //$roles = $repository->all(); $roles = Role::where('type', '!=','superadmin')->get(); return response()->json([ 'roles' => $roles ]); } return response()->json([ 'message' => 'RolePermission module not enabled.' ], 400); } public function storeMenu(Request $request) { if (isModuleActive('Menu')) { $data = $request->except('_token'); if (isset($data['name']) && $data['name'] != null) { $data['slug'] = $this->productSlug($data['name']); $menu = new Menu(); $menu->fill($data)->save(); if (isset($data['items'])) { $menu_elements = []; $menu_element = null; $items = $data['items']; foreach ($items as $key => $item) { $item['menu_id'] = $menu->id; $item['title'] = $item['label']; $item['position'] = 100000 + $key; if ($item['type'] == 'column') { $item['column'] = $item['label']; $cmenu = new MenuColumn(); $cmenu->fill($item); $cmenu->save(); $citems = $item['items']; foreach ($citems as $key => $citem) { $citem['menu_id'] = $menu->id; $citem['column_id'] = $cmenu->id; $citem['title'] = $citem['label']; $citem['position'] = 100000 + $key; if (in_array($citem['type'], ['page', 'category', 'product'])) { $citem['link'] = null; $citem['element_id'] = [$citem['elementId']]; } $this->addElement($citem); } } else { $item['column_id'] = null; if (in_array($item['type'], ['page', 'gjspage', 'category', 'product'])) { $item['link'] = null; $item['element_id'] = [$item['elementId']]; } $menu_element = $this->addElement($item); $menu_element['depth'] = $item['depth']; $menu_elements[] = $menu_element; } } for ($i = 0; $i < count($menu_elements); $i++) { $menu_element = $menu_elements[$i]; if ($menu_element['depth'] > 0) { $parent_depth = $menu_element['depth'] - 1; for ($j = $i; $j >= 0; $j--) { if ($menu_elements[$j]['depth'] == $parent_depth) { $element = MenuElement::find($menu_element->id); if ($element) { $element->parent_id = $menu_elements[$j]->id; $element->update(); break; } } } } } } //$menu->load(['elements', 'elements.page', 'elements.category', 'elements.product', 'elements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']); $menu->load(['allElements', 'allElements.page', 'allElements.category', 'allElements.product', 'allElements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']); foreach ($menu->allElements as $element) { $depth = $this->getElementDepth($element); $element['depth'] = $depth; } return response()->json([ 'menu' => $menu, 'message' => 'New menu has been successfully created.' ]); } else { return response()->json([ 'message' => 'Please enter the menu name.' ], 400); } } return response()->json([ 'message' => 'Menu module not enabled.' ], 400); } public function updateMenu(Request $request) { if (isModuleActive('Menu')) { $data = $request->except('_token'); $data['slug'] = $this->productSlug($data['name']); $menu = Menu::find($data['id']); $menu->fill($data)->update(); if (isset($data['items'])) { $menu_elements = []; $menu_element = null; $items = $data['items']; if ($menu->menu_type == 'mega_menu') { $elements = $menu->columns; } else { $elements = $menu->elements; } foreach ($elements as $element) { $discard = true; foreach ($items as $item) { if (isset($item['id'])) { if ($item['id'] == $element->id) { $discard = false; break; } } } if ($discard) { if ($menu->menu_type == 'mega_menu') { $celements = $element->elements; foreach ($celements as $celement) { $metas = $celement->metas->pluck('id'); Meta::destroy($metas); } MenuElement::where('column_id', $element->id)->delete(); } else { $metas = $element->metas->pluck('id'); Meta::destroy($metas); } $element->delete(); } } foreach ($items as $key => $item) { if ($item['type'] == 'column') { $item['column'] = $item['label']; if (isset($item['id'])) { $cmenu = MenuColumn::find($item['id']); if ($cmenu) { $cmenu->fill($item); $cmenu->update(); $elements = $cmenu->elements; } } else { $item['menu_id'] = $menu->id; $item['position'] = 100000 + $key; $cmenu = new MenuColumn(); $cmenu->fill($item); $cmenu->save(); } if ($cmenu) { $citems = $item['items']; if ($elements) { foreach ($elements as $element) { $discard = true; foreach ($citems as $citem) { if (isset($citem['id'])) { if ($citem['id'] == $element->id) { $discard = false; break; } } } if ($discard) { $metas = $element->metas->pluck('id'); Meta::destroy($metas); $element->delete(); } } } foreach ($citems as $key => $citem) { $citem['menu_id'] = $menu->id; $citem['column_id'] = $cmenu->id; $citem['title'] = $citem['label']; $citem['position'] = 100000 + $key; if (in_array($citem['type'], ['page', 'category', 'product'])) { $citem['link'] = null; $citem['element_id'] = [$citem['elementId']]; } if (isset($citem['id'])) { $this->editElement($citem); } else { $this->addElement($citem); } } } } else { $item['menu_id'] = $menu->id; $item['title'] = $item['label']; $item['position'] = 100000 + $key; if (in_array($item['type'], ['page', 'gjspage', 'category', 'product'])) { $item['link'] = null; $item['element_id'] = [$item['elementId']]; } if (isset($item['id'])) { $menu_element = $this->editElement($item); $menu_element['depth'] = $item['depth']; $menu_elements[] = $menu_element; } else { $menu_element = $this->addElement($item); $menu_element['depth'] = $item['depth']; $menu_elements[] = $menu_element; } } } for ($i = 0; $i < count($menu_elements); $i++) { $menu_element = $menu_elements[$i]; if ($menu_element['depth'] > 0) { $parent_depth = $menu_element['depth'] - 1; for ($j = $i; $j >= 0; $j--) { if ($menu_elements[$j]['depth'] == $parent_depth) { $element = MenuElement::find($menu_element->id); if ($element) { $element->parent_id = $menu_elements[$j]->id; $element->update(); break; } } } } else { $element = MenuElement::find($menu_element->id); if ($element) { $element->parent_id = null; $element->update(); } } } } //$menu->load(['elements', 'elements.page', 'elements.category', 'elements.product', 'elements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']); $menu->load(['allElements', 'allElements.page', 'allElements.category', 'allElements.product', 'allElements.metas', 'columns', 'columns.elements', 'columns.elements.page', 'columns.elements.category', 'columns.elements.product']); foreach ($menu->allElements as $element) { $depth = $this->getElementDepth($element); $element['depth'] = $depth; } return response()->json([ 'menu' => $menu, 'message' => 'Menu has been successfully updated.' ]); } return response()->json([ 'message' => 'Menu module not enabled.' ], 400); } public function destroyMenu(Request $request) { if (isModuleActive('Menu')) { $menu = Menu::where('id', $request->id)->first(); if(count($menu->allElements) > 0){ $elements = $menu->allElements; foreach ($elements as $element) { $metas = $element->metas->pluck('id'); Meta::destroy($metas); } } $repository = new MenuRepository(); $result = $repository->deleteById($request->id); if ($result == 'not_possible') { return response()->json([ 'message' => 'Unable to delete menu.' ], 400); } return response()->json([ 'message' => 'Menu has been successfully deleted.' ]); } return response()->json([ 'message' => 'Menu module not enabled.' ], 400); } public function setActiveMenu(Request $request) { if (isModuleActive('Menu')) { Menu::where('menu_position', $request->menu_position)->update(['status' => 0]); $menu = Menu::find($request->id); if ($menu) { $menu->status = 1; $menu->update(); } return response()->json([ 'message' => 'Menu has been successfully set active.' ]); } return response()->json([ 'message' => 'Menu module not enabled.' ]); } public function addElement($item) { if ($item['type'] != 'link' && $item['type'] != 'function') { foreach($item['element_id'] as $element_id){ $icon = isset($item['icon']) ? $item['icon']['tags'][0] : null; $requestData = [ 'menu_id' => $item['menu_id'], 'column_id' => isset($item['column_id']) ? $item['column_id'] : null, 'type' => $item['type'], 'element_id' => $element_id, 'title' => $item['title'], 'position' => $item['position'], 'hash' => isset($item['hash']) ? $item['hash'] : null, 'class' => isset($item['class']) ? $item['class'] : null, 'audience' => isset($item['audience']) ? $item['audience'] : null, 'roles' => isset($item['roles']) && count($item['roles']) > 0 ? implode(',', $item['roles']) : null, 'icon' => $icon, 'normal_text_color' => isset($item['normalTextColor']) ? $item['normalTextColor'] : null, 'hover_text_color' => isset($item['hoverTextColor']) ? $item['hoverTextColor'] : null ]; return $this->saveElement($requestData); } } elseif ($item['type'] == 'function') { $requestData = [ 'menu_id' => $item['menu_id'], 'type' => $item['type'], 'element_id' => $item['element_id'], 'title' => $item['title'], 'position' => $item['position'] ]; return $this->saveElement($requestData); } else { if (isset($item['roles']) && count($item['roles']) > 0 ) { $item['roles'] = implode(',', $item['roles']); } if (isset($item['icon'])) { $item['icon'] = $item['icon']['tags'][0]; } if (isset($item['normalTextColor'])) { $item['normal_text_color'] = $item['normalTextColor']; } if (isset($item['hoverTextColor'])) { $item['hover_text_color'] = $item['hoverTextColor']; } return $this->saveElement($item); } } public function editElement($item) { if ($item['type'] != 'link' && $item['type'] != 'function') { foreach($item['element_id'] as $element_id){ $icon = isset($item['icon']) ? $item['icon']['tags'][0] : null; $requestData = [ 'id' => $item['id'], 'menu_id' => $item['menu_id'], 'column_id' => isset($item['column_id']) ? $item['column_id'] : null, 'type' => $item['type'], 'element_id' => $element_id, 'title' => $item['title'], 'position' => $item['position'], 'hash' => isset($item['hash']) ? $item['hash'] : null, 'class' => isset($item['class']) ? $item['class'] : null, 'audience' => isset($item['audience']) ? $item['audience'] : null, 'roles' => isset($item['roles']) && count($item['roles']) > 0 ? implode(',', $item['roles']) : null, 'icon' => $icon, 'normal_text_color' => isset($item['normalTextColor']) ? $item['normalTextColor'] : null, 'hover_text_color' => isset($item['hoverTextColor']) ? $item['hoverTextColor'] : null ]; return $this->updateElement($requestData); } } elseif ($item['type'] == 'function') { $requestData = [ 'id' => $item['id'], 'menu_id' => $item['menu_id'], 'type' => $item['type'], 'element_id' => $item['element_id'], 'title' => $item['title'], 'position' => $item['position'] ]; return $this->updateElement($requestData); } else { if (isset($item['roles']) && count($item['roles']) > 0 ) { $item['roles'] = implode(',', $item['roles']); } if (isset($item['icon'])) { $item['icon'] = $item['icon']['tags'][0]; } if (isset($item['normalTextColor'])) { $item['normal_text_color'] = $item['normalTextColor']; } if (isset($item['hoverTextColor'])) { $item['hover_text_color'] = $item['hoverTextColor']; } return $this->updateElement($item); } } public function saveElement($data) { $element = new MenuElement(); $element->fill($data); $element->save(); $repository = new MetaRepository(); if (isset($data['hash'])) { $repository->update($element->id, 'hash', $data['hash']); } if (isset($data['class'])) { $repository->update($element->id, 'class', $data['class']); } if (isset($data['audience'])) { $repository->update($element->id, 'audience', $data['audience']); } if (isset($data['roles'])) { $repository->update($element->id, 'roles', $data['roles']); } if (isset($data['icon'])) { $repository->update($element->id, 'icon', $data['icon']); } if (isset($data['normal_text_color'])) { $repository->update($element->id, 'normal_text_color', $data['normal_text_color']); } if (isset($data['hover_text_color'])) { $repository->update($element->id, 'hover_text_color', $data['hover_text_color']); } return $element; } public function updateElement($data) { $element = MenuElement::find($data['id']); $element->fill($data); $element->update(); $repository = new MetaRepository(); if (isset($data['hash'])) { $repository->update($element->id, 'hash', $data['hash']); } if (isset($data['class'])) { $repository->update($element->id, 'class', $data['class']); } if (isset($data['audience'])) { $repository->update($element->id, 'audience', $data['audience']); } if (isset($data['roles'])) { $repository->update($element->id, 'roles', $data['roles']); } if (isset($data['icon'])) { $repository->update($element->id, 'icon', $data['icon']); } if (isset($data['normal_text_color'])) { $repository->update($element->id, 'normal_text_color', $data['normal_text_color']); } if (isset($data['hover_text_color'])) { $repository->update($element->id, 'hover_text_color', $data['hover_text_color']); } return $element; } }