/Menu/AdmingeneratorMenuBuilder.php

https://bitbucket.org/ajalovec/admingeneratorgeneratorbundle · PHP · 130 lines · 90 code · 25 blank · 15 comment · 5 complexity · 697780155fa8b6d4053b001f104f544b MD5 · raw file

  1. <?php
  2. namespace Admingenerator\GeneratorBundle\Menu;
  3. use Symfony\Component\DependencyInjection\ContainerAware;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Routing\Router;
  6. use Knp\Menu\FactoryInterface;
  7. use Knp\Menu\ItemInterface;
  8. class AdmingeneratorMenuBuilder extends ContainerAware
  9. {
  10. protected $factory;
  11. /* used to store existing divider names */
  12. protected $dividers;
  13. /**
  14. * @param \Knp\Menu\FactoryInterface $factory
  15. */
  16. public function __construct(FactoryInterface $factory)
  17. {
  18. $this->factory = $factory;
  19. $this->dividers = array();
  20. }
  21. /**
  22. * @param Request $request
  23. * @param Router $router
  24. */
  25. public function createAdminMenu(Request $request)
  26. {
  27. $menu = $this->factory->createItem('root');
  28. $menu->setChildrenAttributes(array('id' => 'main_navigation', 'class' => 'nav'));
  29. return $menu;
  30. }
  31. /**
  32. * Example dashboard menu
  33. *
  34. * @param Request $request
  35. * @param Router $router
  36. */
  37. public function createDashboardMenu(Request $request)
  38. {
  39. $menu = $this->factory->createItem('root');
  40. $menu->setChildrenAttributes(array('id' => 'dashboard_sidebar', 'class' => 'nav nav-list'));
  41. $menu->setExtra('request_uri', $this->container->get('request')->getRequestUri());
  42. $menu->setExtra('translation_domain', 'Admingenerator');
  43. $this->addNavHeader($menu, 'Overview');
  44. $this->addNavLinkRoute($menu, 'Dashboard', 'AdmingeneratorDashboard_welcome')->setExtra('icon', 'icon-home');
  45. $this->addNavHeader($menu, 'Features');
  46. $this->addNavLinkRoute($menu, 'Commands', 'AdmingeneratorDashboard_documentation', array('document' => 'commands'))->setExtra('icon', 'icon-bullhorn');
  47. $this->addNavLinkRoute($menu, 'Filters', 'AdmingeneratorDashboard_documentation', array('document' => 'filters'))->setExtra('icon', 'icon-filter');
  48. $this->addNavLinkRoute($menu, 'Routing', 'AdmingeneratorDashboard_documentation', array('document' => 'routing'))->setExtra('icon', 'icon-globe');
  49. $this->addNavLinkRoute($menu, 'Forms', 'AdmingeneratorDashboard_documentation', array('document' => 'forms'))->setExtra('icon', 'icon-list');
  50. $this->addNavLinkRoute($menu, 'Templates', 'AdmingeneratorDashboard_documentation', array('document' => 'templates'))->setExtra('icon', 'icon-th-large');
  51. $this->addNavLinkRoute($menu, 'Model manager', 'AdmingeneratorDashboard_documentation', array('document' => 'orm'))->setExtra('icon', 'icon-random');
  52. return $menu;
  53. }
  54. protected function addNavHeader(ItemInterface $menu, $label)
  55. {
  56. $item = $menu->addChild($label);
  57. $item->setAttribute('class', 'nav-header');
  58. $item->setExtra('translation_domain', $menu->getExtra('translation_domain'));
  59. $menu->setExtra('request_uri', $menu->getExtra('request_uri'));
  60. return $item;
  61. }
  62. protected function addNavLinkURI(ItemInterface $menu, $label, $uri)
  63. {
  64. $item = $menu->addChild($label, array('uri' => $uri));
  65. $item->setExtra('translation_domain', $menu->getExtra('translation_domain'));
  66. $menu->setExtra('request_uri', $menu->getExtra('request_uri'));
  67. if ($item->getUri() == $menu->getExtra('request_uri')) {
  68. $item->setAttribute('class', 'active');
  69. }
  70. return $item;
  71. }
  72. protected function addNavLinkRoute(ItemInterface $menu, $label, $route, $routeParameters = array())
  73. {
  74. $item = $menu->addChild($label, array('route' => $route, 'routeParameters' => $routeParameters));
  75. $item->setExtra('translation_domain', $menu->getExtra('translation_domain'));
  76. $menu->setExtra('request_uri', $menu->getExtra('request_uri'));
  77. if ($item->getUri() == $menu->getExtra('request_uri')) {
  78. $item->setAttribute('class', 'active');
  79. }
  80. return $item;
  81. }
  82. protected function addDropdownMenu(ItemInterface $menu, $label, $caret = true)
  83. {
  84. $item = $this->addNavLinkURI($menu, $label, '#');
  85. $item->setLinkAttributes(array('class' => 'dropdown-toggle', 'data-toggle' => 'dropdown'));
  86. $item->setChildrenAttributes(array('class' => 'dropdown-menu'));
  87. $item->setAttributes(array('class' => 'dropdown'));
  88. $item->setExtra('translation_domain', $menu->getExtra('translation_domain'));
  89. $item->setExtra('caret', $caret);
  90. $menu->setExtra('request_uri', $menu->getExtra('request_uri'));
  91. return $item;
  92. }
  93. protected function addDivider(ItemInterface $menu)
  94. {
  95. // generate unique divider name
  96. do {
  97. $name = 'divider'.mt_rand();
  98. } while (in_array($name, $this->dividers));
  99. $this->dividers[] = $name;
  100. $item = $menu->addChild($name, array());
  101. $item->setLabel('');
  102. $item->setAttribute('class', 'divider');
  103. return $item;
  104. }
  105. }