Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Menu; | |
use Knp\Menu\FactoryInterface; | |
use Knp\Menu\Loader\ArrayLoader; | |
use Knp\Menu\Matcher\MatcherInterface; | |
use Mautic\CoreBundle\CoreEvents; | |
use Mautic\CoreBundle\Event\MenuEvent; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
class MenuBuilder | |
{ | |
/** | |
* @var \Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher | |
*/ | |
private $dispatcher; | |
public function __construct( | |
private FactoryInterface $factory, | |
private MatcherInterface $matcher, | |
EventDispatcherInterface $dispatcher, | |
private MenuHelper $menuHelper | |
) { | |
$this->dispatcher = $dispatcher; | |
} | |
/** | |
* @return mixed | |
*/ | |
public function __call($name, $arguments) | |
{ | |
$name = str_replace('Menu', '', $name); | |
return $this->buildMenu($name); | |
} | |
/** | |
* Used by breadcrumbs to determine active link. | |
* | |
* @param \Knp\Menu\ItemInterface $menu | |
* @param string $forRouteUri | |
* @param string $forRouteName | |
* | |
* @return \Knp\Menu\ItemInterface|null | |
*/ | |
public function getCurrentMenuItem($menu, $forRouteUri, $forRouteName) | |
{ | |
try { | |
/** @var \Knp\Menu\ItemInterface $item */ | |
foreach ($menu as $item) { | |
if ('current' == $forRouteUri && $this->matcher->isCurrent($item)) { | |
// current match | |
return $item; | |
} elseif ('current' != $forRouteUri && $item->getUri() == $forRouteUri) { | |
// route uri match | |
return $item; | |
} elseif (!empty($forRouteName) && $forRouteName == $item->getExtra('routeName')) { | |
// route name match | |
return $item; | |
} | |
if ($item->getChildren() && $current_child = $this->getCurrentMenuItem($item, $forRouteUri, $forRouteName)) { | |
return $current_child; | |
} | |
} | |
} catch (\Exception) { | |
// do nothing | |
} | |
return null; | |
} | |
/** | |
* @return mixed | |
*/ | |
private function buildMenu($name) | |
{ | |
static $menus = []; | |
if (!isset($menus[$name])) { | |
$loader = new ArrayLoader($this->factory); | |
// dispatch the MENU_BUILD event to retrieve bundle menu items | |
$event = new MenuEvent($this->menuHelper, $name); | |
$this->dispatcher->dispatch($event, CoreEvents::BUILD_MENU); | |
$menuItems = $event->getMenuItems(); | |
// KNP Menu explicitly requires a menu name since v3 | |
if (empty($menuItems['name'])) { | |
$menuItems['name'] = $name; | |
} | |
$menus[$name] = $loader->load($menuItems); | |
} | |
return $menus[$name]; | |
} | |
} | |