<?php
/**
* Twig Menu Extension
*
* @author Bertin van den Ham <b.vandenham@visualmedia.nl>
*/
namespace VisualMedia\MenuBundle\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;
use VisualMedia\LisaBundle\Component\Interfaces\MenuInterface;
use VisualMedia\LisaBundle\Component\ManagerData;
use VisualMedia\LisaBundle\Service\MenuProvider;
use VisualMedia\MenuBundle\Entity\BaseMenuItem;
use VisualMedia\MenuBundle\Manager\BaseMenuManager;
use VisualMedia\MenuBundle\Service\MenuItemFactoryProvider;
/**
* Twig Menu Extension
*/
class TwigMenuExtension extends AbstractExtension
{
/**
* @var MenuProvider
*/
protected $menuProvider;
/**
* @var BaseMenuManager
*/
protected $menuManager;
/**
* @var MenuItemFactoryProvider
*/
protected $menuItemFactoryProvider;
/**
* @param MenuProvider $menuProvider
* @param BaseMenuManager $menuManager
* @param MenuItemFactoryProvider $menuItemFactoryProvider
*/
public function __construct(MenuProvider $menuProvider, BaseMenuManager $menuManager, MenuItemFactoryProvider $menuItemFactoryProvider)
{
$this->menuProvider = $menuProvider;
$this->menuManager = $menuManager;
$this->menuItemFactoryProvider = $menuItemFactoryProvider;
}
/**
* @return array
*/
public function getFunctions(): array
{
return array(
new TwigFunction('menu', array($this, 'menu')),
new TwigFunction('menu_item_link', array($this, 'menuItemLink')),
);
}
/**
* @param string $reference
* @return BaseMenu
*/
public function menu(string $reference): ?MenuInterface
{
if (!$this->menuProvider->exists($reference)) {
$this->menuManager->getOrCreateMenu($reference);
$this->menuProvider->loadFromManagers();
}
return $this->menuProvider->getMenu($reference);
}
/**
* @param BaseMenuItem $menuItem
* @return string|array
*/
public function menuItemLink(BaseMenuItem $menuItem)
{
if (null !== $factory = $this->menuItemFactoryProvider->getMenuItemFactory($menuItem->getFactory())) {
return $factory->buildLink($menuItem->getLink());
}
return null;
}
}