src/Controller/MenuDefaultController.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Menu;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. class MenuDefaultController extends AbstractController
  9. {
  10.     public function __construct(protected EntityManagerInterface $em)
  11.     {
  12.     }
  13.     public function fetchMenu(Request $request$identifier$currentUrl$renderUL true)
  14.     {
  15.         $locale $request->getLocale();
  16.         $menu $this->em->getRepository(Menu::class)->findOneBy(['identifier' => $identifier]);
  17.         if (null === $menu) {
  18.             return new Response('');
  19.             // throw $this->createNotFoundException('The menu \'' . $indentifier . '\' does not exist');
  20.         }
  21.         $menuStructure $this->getMenuStructure($locale$menu);
  22.         // dump($menuStructure);
  23.         return $this->render('@theme/common/menu.html.twig', [
  24.             'menu' => $menuStructure,
  25.             'currentUrl' => $currentUrl,
  26.         ]);
  27.     }
  28.     public function hasMenuChildren($menuData$id)
  29.     {
  30.         return array_filter($menuData, fn ($var) => $var['menu_parent_id'] == $id);
  31.     }
  32.     private function getMenuStructure($locale$menu)
  33.     {
  34.         $menuData $menu->getMenuItems();
  35.         $items = [];
  36.         foreach ($menuData as $menuItem) {
  37.             $page $menuItem->getPageId();
  38.             if (null != $page) {
  39.                 $navTitle $page->getNavTitle();
  40.                 $slug $page->getSlug();
  41.             } else {
  42.                 $navTitle $menuItem->getNameOverride();
  43.                 $slug $menuItem->getUrlOverride();
  44.             }
  45.             // no navtitle override for translations
  46.             if ('en' == $locale && '' != $menuItem->getNameOverride()) {
  47.                 $navTitle $menuItem->getNameOverride();
  48.             }
  49.             $items[] = [
  50.                 'menu_item_id' => $menuItem->getMenuItemId(),
  51.                 'navtitle' => $navTitle,
  52.                 'slug' => $this->fixSlug($slug),
  53.                 'isdynamic' => $menuItem->getIsdynamic(),
  54.                 'url_override' => $menuItem->getUrlOverride() ? $this->fixSlug($menuItem->getUrlOverride()) : null,
  55.                 'dynamicentity' => $menuItem->getDynamicentity(),
  56.                 'new_window' => $menuItem->getNewwindow(),
  57.                 'menu_parent_id' => $menuItem->getMenuParentId(),
  58.             ];
  59.         }
  60.         foreach ($items as $key => $item) {
  61.             if (!$item['isdynamic']) {
  62.                 continue;
  63.             }
  64.             $items[$key]['dynamic_items'] = $this->getDynamicItems($item);
  65.         }
  66.         $menu $this->hasMenuChildren($items0);
  67.         foreach ($menu as $key => $item) {
  68.             $menu[$key]['children'] = $this->hasMenuChildren($items$item['menu_item_id']);
  69.             foreach ($menu[$key]['children'] as $key2 => $item2) {
  70.                 $menu[$key]['children'][$key2]['children'] = $this->hasMenuChildren($items$item2['menu_item_id']);
  71.                 foreach ($menu[$key]['children'][$key2]['children'] as $key3 => $item3) {
  72.                     $menu[$key]['children'][$key2]['children'][$key3]['children'] = $this->hasMenuChildren($items$item3['menu_item_id']);
  73.                 }
  74.             }
  75.         }
  76.         return $menu;
  77.     }
  78.     private function getDynamicItems($item)
  79.     {
  80.         $dynamicItems = [];
  81.         $bundleEntity str_replace('/''\\', (string) $item['dynamicentity']);
  82.         $bundleEntity str_replace('App:''', (string) $item['dynamicentity']);
  83.         $bundleEntity 'App\\Entity\\'.$bundleEntity;
  84.         $dyn_manu_items $this->em->getRepository($bundleEntity)->findBy(['active' => 1'deleted' => 0]);
  85.         $possibleTitles = ['getTitle''getName''getHeadline''getHeading''getMetaTitle'];
  86.         foreach ($dyn_manu_items as $dyn_manu_item) {
  87.             $dyn_title '';
  88.             // check to ensure that the get<Whatever> fucntion exists on the entity
  89.             foreach ($possibleTitles as $title) {
  90.                 if (method_exists($dyn_manu_item$title)) {
  91.                     $dyn_title call_user_func([$dyn_manu_item$title]);
  92.                     break;
  93.                 }
  94.             }
  95.             $url $item['url_override'].'/'.$dyn_manu_item->getSlug();
  96.             $dynamicItems[] = [
  97.                 'navtitle' => $dyn_title,
  98.                 'slug' => $url,
  99.                 'icon' => $dyn_manu_item->getIcon() ?? null,
  100.             ];
  101.         }
  102.         return $dynamicItems;
  103.     }
  104.     private function fixSlug($slug)
  105.     {
  106.         // some slugs will be prefixed with '/' while other may not (i.e db or custom) - so add them if they need them
  107.         if (str_starts_with((string) $slug'http')) {
  108.             return $slug;
  109.         }
  110.         if (str_starts_with((string) $slug'/')) {
  111.             $slug ltrim((string) $slug'/');
  112.         }
  113.         $slug ltrim((string) $slug'/');
  114.         return '/'.$slug;
  115.     }
  116. }