<?php
namespace App\Controller;
use App\Entity\CaseStudies;
use App\Entity\Menu;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class MenuDefaultController extends AbstractController
{
public function __construct(protected EntityManagerInterface $em) {}
public function fetchMenu(Request $request, $identifier, $currentUrl, $renderUL = true)
{
$locale = $request->getLocale();
$study = null;
$menu = $this->em->getRepository(Menu::class)->findOneBy(['identifier' => $identifier]);
if (null === $menu) {
return new Response('');
// throw $this->createNotFoundException('The menu \'' . $indentifier . '\' does not exist');
}
$structure = $this->getMenuStructure($locale, $menu);
if ($identifier === 'Top') {
$studies = $this->em->getRepository(CaseStudies::class)->findBy(
['deleted' => false, 'active' => true, 'featuredInMenu' => true],
['sortOrder' => 'ASC'],
1, 0
);
if ($studies) {
$study = $studies[0];
}
}
return $this->render('@theme/common/menu.html.twig', [
'menu_id' => $menu->getId(),
'menu' => $structure,
'currentUrl' => $currentUrl,
'study' => $study,
]);
}
public function hasMenuChildren($menuData, $id)
{
return array_filter($menuData, fn ($var) => $var['menu_parent_id'] == $id);
}
private function getMenuStructure($locale, $menu)
{
$menuData = $menu->getMenuItems();
$items = [];
foreach ($menuData as $menuItem) {
$page = $menuItem->getPageId();
if (null != $page) {
$navTitle = $page->getNavTitle();
$slug = $page->getSlug();
$image = $page->getFullImage3Path();
$excerpt = null;
// $excerpt = $page->getExcerpt();
} else {
$navTitle = $menuItem->getNameOverride();
$slug = $menuItem->getUrlOverride();
$image = null;
$excerpt = null;
}
// no navtitle override for translations
if ('en' == $locale && '' != $menuItem->getNameOverride()) {
$navTitle = $menuItem->getNameOverride();
}
$items[] = [
'menu_item_id' => $menuItem->getMenuItemId(),
'navtitle' => $navTitle,
'slug' => $this->fixSlug($slug),
'image' => $image,
'excerpt' => $excerpt,
'isdynamic' => $menuItem->getIsdynamic(),
'url_override' => $menuItem->getUrlOverride() ? $this->fixSlug($menuItem->getUrlOverride()) : null,
'dynamicentity' => $menuItem->getDynamicentity(),
'new_window' => $menuItem->getNewwindow(),
'menu_parent_id' => $menuItem->getMenuParentId(),
];
}
foreach ($items as $key => $item) {
if (!$item['isdynamic']) {
continue;
}
$items[$key]['dynamic_items'] = $this->getDynamicItems($item);
}
$menu = $this->hasMenuChildren($items, 0);
foreach ($menu as $key => $item) {
$menu[$key]['children'] = $this->hasMenuChildren($items, $item['menu_item_id']);
foreach ($menu[$key]['children'] as $key2 => $item2) {
$menu[$key]['children'][$key2]['children'] = $this->hasMenuChildren($items, $item2['menu_item_id']);
foreach ($menu[$key]['children'][$key2]['children'] as $key3 => $item3) {
$menu[$key]['children'][$key2]['children'][$key3]['children'] = $this->hasMenuChildren($items, $item3['menu_item_id']);
}
}
}
return $menu;
}
private function getDynamicItems($item)
{
$dynamicItems = [];
$bundleEntity = str_replace('App:', '\\App\\Entity\\', (string) $item['dynamicentity']);
// dd($bundleEntity);
$findBy = ['active' => 1, 'deleted' => 0];
if ($bundleEntity === '\App\Entity\Sector' || $bundleEntity === '\App\Entity\Service') {
$findBy['parent'] = null;
}
$dyn_manu_items = $this->em->getRepository($bundleEntity)->findBy($findBy);
$possibleTitles = ['getTitle', 'getName', 'getHeadline', 'getHeading', 'getMetaTitle'];
foreach ($dyn_manu_items as $dyn_manu_item) {
$dyn_title = '';
// check to ensure that the get<Whatever> fucntion exists on the entity
foreach ($possibleTitles as $title) {
if (method_exists($dyn_manu_item, $title)) {
$dyn_title = call_user_func([$dyn_manu_item, $title]);
break;
}
}
$url = $item['url_override'].'/'.$dyn_manu_item->getSlug();
$children = [];
// if (method_exists($dyn_manu_item, 'getActiveChildren')) {
// foreach (call_user_func([$dyn_manu_item, 'getActiveChildren']) as $child) {
// $childUrl = $item['url_override'].'/'.$child->getSlug();
// $children[] = [
// 'navtitle' => $child->getTitle(),
// 'slug' => $childUrl,
// ];
// }
// }
$dynamicItems[] = [
'navtitle' => $dyn_title,
'slug' => $url,
'children' => $children,
];
}
return $dynamicItems;
}
private function fixSlug($slug)
{
// some slugs will be prefixed with '/' while other may not (i.e db or custom) - so add them if they need them
if (str_starts_with((string) $slug, 'http')) {
return $slug;
}
if (str_starts_with((string) $slug, '/')) {
$slug = ltrim((string) $slug, '/');
}
$slug = ltrim((string) $slug, '/');
return '/'.$slug;
}
}