MenuBuilder.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /*
  3. * This file is part of the Sonata Project package.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Sonata\AdminBundle\Menu;
  11. use Knp\Menu\FactoryInterface;
  12. use Knp\Menu\ItemInterface;
  13. use Knp\Menu\Provider\MenuProviderInterface;
  14. use Sonata\AdminBundle\Admin\Pool;
  15. use Sonata\AdminBundle\Event\ConfigureMenuEvent;
  16. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  17. /**
  18. * Sonata menu builder.
  19. *
  20. * @author Martin Hasoň <martin.hason@gmail.com>
  21. * @author Alexandru Furculita <alex@furculita.net>
  22. */
  23. class MenuBuilder
  24. {
  25. /**
  26. * @var Pool
  27. */
  28. private $pool;
  29. /**
  30. * @var FactoryInterface
  31. */
  32. private $factory;
  33. /**
  34. * @var MenuProviderInterface
  35. */
  36. private $provider;
  37. /**
  38. * @var EventDispatcherInterface
  39. */
  40. private $eventDispatcher;
  41. /**
  42. * @param Pool $pool
  43. * @param FactoryInterface $factory
  44. * @param MenuProviderInterface $provider
  45. * @param EventDispatcherInterface $eventDispatcher
  46. */
  47. public function __construct(Pool $pool, FactoryInterface $factory, MenuProviderInterface $provider, EventDispatcherInterface $eventDispatcher)
  48. {
  49. $this->pool = $pool;
  50. $this->factory = $factory;
  51. $this->provider = $provider;
  52. $this->eventDispatcher = $eventDispatcher;
  53. }
  54. /**
  55. * Builds sidebar menu.
  56. *
  57. * @return ItemInterface
  58. */
  59. public function createSidebarMenu()
  60. {
  61. $menu = $this->factory->createItem('root');
  62. foreach ($this->pool->getAdminGroups() as $name => $group) {
  63. $extras = array(
  64. 'icon' => $group['icon'],
  65. 'label_catalogue' => $group['label_catalogue'],
  66. 'roles' => $group['roles'],
  67. );
  68. $menuProvider = isset($group['provider']) ? $group['provider'] : 'sonata_group_menu';
  69. $subMenu = $this->provider->get(
  70. $menuProvider,
  71. array(
  72. 'name' => $name,
  73. 'group' => $group,
  74. )
  75. );
  76. $subMenu = $menu->addChild($subMenu);
  77. $subMenu->setExtras(array_merge($subMenu->getExtras(), $extras));
  78. }
  79. $event = new ConfigureMenuEvent($this->factory, $menu);
  80. $this->eventDispatcher->dispatch(ConfigureMenuEvent::SIDEBAR, $event);
  81. return $event->getMenu();
  82. }
  83. }