<?php/** * Menu Provider * * @author Vincent van Waasbergen <v.vanwaasbergen@visualmedia.nl> */namespace VisualMedia\LisaBundle\Service;use Symfony\Component\Cache\Adapter\AdapterInterface;use VisualMedia\LisaBundle\Component\Interfaces\ManagerInterface;use VisualMedia\LisaBundle\Component\Interfaces\MenuInterface;use VisualMedia\LisaBundle\Component\Interfaces\MenuItemInterface;use VisualMedia\LisaBundle\Component\Interfaces\ServiceInterface;use VisualMedia\LisaBundle\Helper\EntityHelper;use VisualMedia\LisaBundle\Component\Menu;use VisualMedia\LisaBundle\Menu\EmptyMenu;use VisualMedia\LisaBundle\Menu\MenuItem\EmptyMenuItem;/** * Menu Provider * * Services that provides access to all available Menu's. */class MenuProvider implements ServiceInterface{ public const CACHE_KEY = 'menus'; public const SERVICE_ID = 'visualmedia.lisa.menu_provider'; /** * Factory Provider * @var FactoryProvider */ protected $factoryProvider; /** * Menus * @var array */ protected $menus = array(); /** * Managers * @var array */ protected $managers = array(); /** * Is Loaded * @var bool */ protected $loaded = false; /** * Constructor * * @param FactoryProvider $factoryProvider */ public function __construct(FactoryProvider $factoryProvider) { $this->factoryProvider = $factoryProvider; } /** * {@inheritdoc} */ public static function getServiceId(): string { return self::SERVICE_ID; } /** * Set Menus * * @param array $menus * * @return void */ public function setMenus(array $menus): void { $this->menus = $menus; } /** * Set Menu * * @param string $key * @param MenuInterface $menu * * @return void */ public function setMenu($key, MenuInterface $menu): void { $this->menus[$key] = $menu; } /** * Menu Exists * * @param string $key * * @return bool */ public function exists(string $key): bool { return array_key_exists($key, $this->menus); } /** * Get Menu * * @param string $key * * @return MenuInterface */ public function getMenu($key): MenuInterface { // Attempt creation of Lisa menu from injected managers. if (!$this->loaded && $key !== EmptyMenu::class) { $this->loadFromManagers(); } // Return an empty menu when nothing found. if (!$this->exists($key)) { return new Menu(null, null, null); } // Initialize found menu, if this wasn't done before. $menu = $this->menus[$key]; $menu = $menu->isInitialized() ? $menu : $menu->initialize(); return $menu; } /** * New Menu * * @return MenuInterface */ public function newMenu(): MenuInterface { $menu = clone($this->getMenu(EmptyMenu::class)); $menu->setInitialized(false); return $menu; } /** * New Menu Item * * @return MenuItemInterface */ public function newMenuItem(): MenuItemInterface { return new EmptyMenuItem(); } /** * Load From Managers * * @return void */ public function loadFromManagers(): void { foreach ($this->managers as $class=>$manager) { $result = $manager->getMenuIndex(); foreach ($result as $menu) { $newMenu = $this->newMenu(); foreach ($menu->getMenuItems() as $menuItem) { if ($menuItem->getPublished() !== true) { continue; } $key = EntityHelper::entityToKey($menuItem); $newMenuItem = $this->newMenuItem(); $newMenuItem->setKey($key); $newMenuItem->setTitle($menuItem->getTitle()); $newMenuItem->setPath($newMenuItem::PATH_HASH); $newMenuItem->setPathTarget($menuItem->getTargetBlank() ? '_blank' : null); if (null !== $parent = $menuItem->getParent()) { if (!$parent->getPublished()) { continue; } $newMenuItem->setParent(EntityHelper::entityToKey($parent)); } if (null !== $factory = $this->factoryProvider->getFactory($menuItem->getFactory())) { $factory->build($newMenuItem, $menuItem); } $newMenu->setItem($key, $newMenuItem); } $this->menus[$menu->getReference()] = $newMenu; } } $this->loaded = true; } /** * Set Manager * * @param string $key * @param ManagerInterface $menu * * @return void */ public function setManager($key, ManagerInterface $menu): void { $this->managers[$key] = $menu; } /** * Methode to get the first menu that is active * * @return Menu menu */ public function getActiveMenu(): ?Menu { foreach ($this->menus as $menu) { if (!$menu->isInitialized()) { $menu->initialize(); } if ($menu->getActive()) { return $menu; break; } } return null; }}