lib/composer/LisaBundle/src/VisualMedia/LisaBundle/Service/MenuProvider.php line 131

Open in your IDE?
  1. <?php
  2. /**
  3.  * Menu Provider
  4.  *
  5.  * @author Vincent van Waasbergen <v.vanwaasbergen@visualmedia.nl>
  6.  */
  7. namespace VisualMedia\LisaBundle\Service;
  8. use Symfony\Component\Cache\Adapter\AdapterInterface;
  9. use VisualMedia\LisaBundle\Component\Interfaces\ManagerInterface;
  10. use VisualMedia\LisaBundle\Component\Interfaces\MenuInterface;
  11. use VisualMedia\LisaBundle\Component\Interfaces\MenuItemInterface;
  12. use VisualMedia\LisaBundle\Component\Interfaces\ServiceInterface;
  13. use VisualMedia\LisaBundle\Helper\EntityHelper;
  14. use VisualMedia\LisaBundle\Component\Menu;
  15. use VisualMedia\LisaBundle\Menu\EmptyMenu;
  16. use VisualMedia\LisaBundle\Menu\MenuItem\EmptyMenuItem;
  17. /**
  18.  * Menu Provider
  19.  *
  20.  * Services that provides access to all available Menu's.
  21.  */
  22. class MenuProvider implements ServiceInterface
  23. {
  24.     public const CACHE_KEY 'menus';
  25.     public const SERVICE_ID 'visualmedia.lisa.menu_provider';
  26.     /**
  27.      * Factory Provider
  28.      * @var FactoryProvider
  29.      */
  30.     protected $factoryProvider;
  31.     /**
  32.      * Menus
  33.      * @var array
  34.      */
  35.     protected $menus = array();
  36.     /**
  37.      * Managers
  38.      * @var array
  39.      */
  40.     protected $managers = array();
  41.     /**
  42.      * Is Loaded
  43.      * @var bool
  44.      */
  45.     protected $loaded false;
  46.     /**
  47.      * Constructor
  48.      *
  49.      * @param FactoryProvider $factoryProvider
  50.      */
  51.     public function __construct(FactoryProvider $factoryProvider)
  52.     {
  53.         $this->factoryProvider $factoryProvider;
  54.     }
  55.     /**
  56.      * {@inheritdoc}
  57.      */
  58.     public static function getServiceId(): string
  59.     {
  60.         return self::SERVICE_ID;
  61.     }
  62.     /**
  63.      * Set Menus
  64.      *
  65.      * @param array $menus
  66.      *
  67.      * @return void
  68.      */
  69.     public function setMenus(array $menus): void
  70.     {
  71.         $this->menus $menus;
  72.     }
  73.     /**
  74.      * Set Menu
  75.      *
  76.      * @param string $key
  77.      * @param MenuInterface $menu
  78.      *
  79.      * @return void
  80.      */
  81.     public function setMenu($keyMenuInterface $menu): void
  82.     {
  83.         $this->menus[$key] = $menu;
  84.     }
  85.     /**
  86.      * Menu Exists
  87.      *
  88.      * @param string $key
  89.      *
  90.      * @return bool
  91.      */
  92.     public function exists(string $key): bool
  93.     {
  94.         return array_key_exists($key$this->menus);
  95.     }
  96.     /**
  97.      * Get Menu
  98.      *
  99.      * @param string $key
  100.      *
  101.      * @return MenuInterface
  102.      */
  103.     public function getMenu($key): MenuInterface
  104.     {
  105.         // Attempt creation of Lisa menu from injected managers.
  106.         if (!$this->loaded && $key !== EmptyMenu::class) {
  107.             $this->loadFromManagers();
  108.         }
  109.         // Return an empty menu when nothing found.
  110.         if (!$this->exists($key)) {
  111.             return new Menu(nullnullnull);
  112.         }
  113.         // Initialize found menu, if this wasn't done before.
  114.         $menu $this->menus[$key];
  115.         $menu $menu->isInitialized() ? $menu $menu->initialize();
  116.         return $menu;
  117.     }
  118.     /**
  119.      * New Menu
  120.      *
  121.      * @return MenuInterface
  122.      */
  123.     public function newMenu(): MenuInterface
  124.     {
  125.         $menu = clone($this->getMenu(EmptyMenu::class));
  126.         $menu->setInitialized(false);
  127.         return $menu;
  128.     }
  129.     /**
  130.      * New Menu Item
  131.      *
  132.      * @return MenuItemInterface
  133.      */
  134.     public function newMenuItem(): MenuItemInterface
  135.     {
  136.         return new EmptyMenuItem();
  137.     }
  138.     /**
  139.      * Load From Managers
  140.      *
  141.      * @return void
  142.      */
  143.     public function loadFromManagers(): void
  144.     {
  145.         foreach ($this->managers as $class=>$manager) {
  146.             $result $manager->getMenuIndex();
  147.             foreach ($result as $menu) {
  148.                 $newMenu $this->newMenu();
  149.                 foreach ($menu->getMenuItems() as $menuItem) {
  150.                     if ($menuItem->getPublished() !== true) {
  151.                         continue;
  152.                     }
  153.                     $key EntityHelper::entityToKey($menuItem);
  154.                     $newMenuItem $this->newMenuItem();
  155.                     $newMenuItem->setKey($key);
  156.                     $newMenuItem->setTitle($menuItem->getTitle());
  157.                     $newMenuItem->setPath($newMenuItem::PATH_HASH);
  158.                     $newMenuItem->setPathTarget($menuItem->getTargetBlank() ? '_blank' null);
  159.                     if (null !== $parent $menuItem->getParent()) {
  160.                         if (!$parent->getPublished()) {
  161.                             continue;
  162.                         }
  163.                         $newMenuItem->setParent(EntityHelper::entityToKey($parent));
  164.                     }
  165.                     if (null !== $factory $this->factoryProvider->getFactory($menuItem->getFactory())) {
  166.                         $factory->build($newMenuItem$menuItem);
  167.                     }
  168.                     $newMenu->setItem($key$newMenuItem);
  169.                 }
  170.                 $this->menus[$menu->getReference()] = $newMenu;
  171.             }
  172.         }
  173.         $this->loaded true;
  174.     }
  175.     /**
  176.      * Set Manager
  177.      *
  178.      * @param string $key
  179.      * @param ManagerInterface $menu
  180.      *
  181.      * @return void
  182.      */
  183.     public function setManager($keyManagerInterface $menu): void
  184.     {
  185.         $this->managers[$key] = $menu;
  186.     }
  187.     /**
  188.      * Methode to get the first menu that is active
  189.      *
  190.      * @return Menu menu
  191.      */
  192.     public function getActiveMenu(): ?Menu
  193.     {
  194.         foreach ($this->menus as $menu) {
  195.             if (!$menu->isInitialized()) {
  196.                 $menu->initialize();
  197.             }
  198.             if ($menu->getActive()) {
  199.                 return $menu;
  200.                 break;
  201.             }
  202.         }
  203.         return null;
  204.     }
  205. }