src/Controller/MenuDefaultController.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\CaseStudies;
  4. use App\Entity\Menu;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. class MenuDefaultController extends AbstractController
  10. {
  11.     public function __construct(protected EntityManagerInterface $em) {}
  12.     public function fetchMenu(Request $request$identifier$currentUrl$renderUL true)
  13.     {
  14.         $locale $request->getLocale();
  15.         $study null;
  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.         $structure $this->getMenuStructure($locale$menu);
  22.         if ($identifier === 'Top') {
  23.             $studies $this->em->getRepository(CaseStudies::class)->findBy(
  24.                 ['deleted' => false'active' => true'featuredInMenu' => true],
  25.                 ['sortOrder' => 'ASC'],
  26.                 10
  27.             );
  28.             if ($studies) {
  29.                 $study $studies[0];
  30.             }
  31.         }
  32.         return $this->render('@theme/common/menu.html.twig', [
  33.             'menu_id' => $menu->getId(),
  34.             'menu' => $structure,
  35.             'currentUrl' => $currentUrl,
  36.             'study'  => $study,
  37.         ]);
  38.     }
  39.     public function hasMenuChildren($menuData$id)
  40.     {
  41.         return array_filter($menuData, fn ($var) => $var['menu_parent_id'] == $id);
  42.     }
  43.     private function getMenuStructure($locale$menu)
  44.     {
  45.         $menuData $menu->getMenuItems();
  46.         $items = [];
  47.         foreach ($menuData as $menuItem) {
  48.             $page $menuItem->getPageId();
  49.             if (null != $page) {
  50.                 $navTitle $page->getNavTitle();
  51.                 $slug $page->getSlug();
  52.                 $image $page->getFullImage3Path();
  53.                 $excerpt null;
  54.                 // $excerpt = $page->getExcerpt();
  55.             } else {
  56.                 $navTitle $menuItem->getNameOverride();
  57.                 $slug $menuItem->getUrlOverride();
  58.                 $image null;
  59.                 $excerpt null;
  60.             }
  61.             // no navtitle override for translations
  62.             if ('en' == $locale && '' != $menuItem->getNameOverride()) {
  63.                 $navTitle $menuItem->getNameOverride();
  64.             }
  65.             $items[] = [
  66.                 'menu_item_id' => $menuItem->getMenuItemId(),
  67.                 'navtitle' => $navTitle,
  68.                 'slug' => $this->fixSlug($slug),
  69.                 'image' => $image,
  70.                 'excerpt' => $excerpt,
  71.                 'isdynamic' => $menuItem->getIsdynamic(),
  72.                 'url_override' => $menuItem->getUrlOverride() ? $this->fixSlug($menuItem->getUrlOverride()) : null,
  73.                 'dynamicentity' => $menuItem->getDynamicentity(),
  74.                 'new_window' => $menuItem->getNewwindow(),
  75.                 'menu_parent_id' => $menuItem->getMenuParentId(),
  76.             ];
  77.         }
  78.         foreach ($items as $key => $item) {
  79.             if (!$item['isdynamic']) {
  80.                 continue;
  81.             }
  82.             $items[$key]['dynamic_items'] = $this->getDynamicItems($item);
  83.         }
  84.         $menu $this->hasMenuChildren($items0);
  85.         foreach ($menu as $key => $item) {
  86.             $menu[$key]['children'] = $this->hasMenuChildren($items$item['menu_item_id']);
  87.             foreach ($menu[$key]['children'] as $key2 => $item2) {
  88.                 $menu[$key]['children'][$key2]['children'] = $this->hasMenuChildren($items$item2['menu_item_id']);
  89.                 foreach ($menu[$key]['children'][$key2]['children'] as $key3 => $item3) {
  90.                     $menu[$key]['children'][$key2]['children'][$key3]['children'] = $this->hasMenuChildren($items$item3['menu_item_id']);
  91.                 }
  92.             }
  93.         }
  94.         return $menu;
  95.     }
  96.     private function getDynamicItems($item)
  97.     {
  98.         $dynamicItems = [];
  99.         $bundleEntity str_replace('App:''\\App\\Entity\\', (string) $item['dynamicentity']);
  100.         // dd($bundleEntity);
  101.         $findBy = ['active' => 1'deleted' => 0];
  102.         if ($bundleEntity === '\App\Entity\Sector' || $bundleEntity === '\App\Entity\Service') {
  103.           $findBy['parent'] = null;
  104.         }
  105.         $dyn_manu_items $this->em->getRepository($bundleEntity)->findBy($findBy);
  106.         $possibleTitles = ['getTitle''getName''getHeadline''getHeading''getMetaTitle'];
  107.         foreach ($dyn_manu_items as $dyn_manu_item) {
  108.             $dyn_title '';
  109.             // check to ensure that the get<Whatever> fucntion exists on the entity
  110.             foreach ($possibleTitles as $title) {
  111.                 if (method_exists($dyn_manu_item$title)) {
  112.                     $dyn_title call_user_func([$dyn_manu_item$title]);
  113.                     break;
  114.                 }
  115.             }
  116.             $url $item['url_override'].'/'.$dyn_manu_item->getSlug();
  117.             $children = [];
  118.             // if (method_exists($dyn_manu_item, 'getActiveChildren')) {
  119.             //     foreach (call_user_func([$dyn_manu_item, 'getActiveChildren']) as $child) {
  120.             //       $childUrl = $item['url_override'].'/'.$child->getSlug();
  121.             //       $children[] = [
  122.             //         'navtitle' => $child->getTitle(),
  123.             //         'slug' => $childUrl,
  124.             //       ];
  125.             //     }
  126.             // }
  127.             $dynamicItems[] = [
  128.                 'navtitle' => $dyn_title,
  129.                 'slug' => $url,
  130.                 'children' => $children,
  131.             ];
  132.         }
  133.         return $dynamicItems;
  134.     }
  135.     private function fixSlug($slug)
  136.     {
  137.         // some slugs will be prefixed with '/' while other may not (i.e db or custom) - so add them if they need them
  138.         if (str_starts_with((string) $slug'http')) {
  139.             return $slug;
  140.         }
  141.         if (str_starts_with((string) $slug'/')) {
  142.             $slug ltrim((string) $slug'/');
  143.         }
  144.         $slug ltrim((string) $slug'/');
  145.         return '/'.$slug;
  146.     }
  147. }