Кто-нибудь знает хороший принцип или, может быть, пакет для работы с навигационными меню в symfony2?
Я пробовал комплект Knp, но это просто сеттеры и геттеры. Я имею в виду функциональность, в которой контроллеры будут соответствовать моему главному меню, действия будут соответствовать подменю, а дополнительные параметры могут быть отображены в под-подменю.
Я думал, что могу сделать свое приложение тем, что каждая запись в моем главном меню будет относиться к XController.php
и каждая запись в подменю под ним будет относиться к xAction
в том же контроллере. Knp довольно гибкий, но (насколько я понимаю) не поддерживает такое отображение.
Основная запись навигации должна быть активной, когда мы находимся в соответствующем контроллере независимо от действия или любых других параметров. И вот проблема. В конфиге symfony у вас есть _controller: ABBundle:NameController:nameAction
, извлечение контроллера и название действия, из которого довольно тяжело, и не очень хорошая идея запускать каждую загрузку каждой страницы. Если я сопоставляю всю строку _controller, то мои записи в главном меню не будут активны независимо от действия.
Кроме того, я думал, что с помощью этой схемы могут быть созданы даже панировочные сухари, первая ссылка будет копией активной ссылки из основной навигации, вторая может быть активной входом в навигационное меню, а остальные могут быть установлены через контроллер согласно к логике.
Есть идеи?
Я сделал это так. Я зарегистрировал KnpMenu как службу и передал entityManager классу.
stex_site_main.menu_builder: class: Stex\SiteBundle\Menu\MenuBuilder arguments: ["@knp_menu.factory", "@doctrine.orm.entity_manager"] stex_site_main.menu.main: class: Knp\Menu\MenuItem factory_service: stex_site_main.menu_builder factory_method: createMainMenu arguments: ["@request"] scope: request tags: - { name: knp_menu.menu, alias: main }
С EM в руке я открываю Entity MyMenu и создаю записи меню, записанные в db.
private $factory; private $em; public function __construct(FactoryInterface $factory, \Doctrine\ORM\EntityManager $em) { $this->factory = $factory; $this->em = $em; } public function createMainMenu(\Symfony\Component\HttpFoundation\Request $request) { $menu = $this->factory->createItem('root'); $menu->setChildrenAttribute('class', 'menu'); $menu->addChild(' ', array('route' => 'stex_site_home_home', 'attributes' => array('class' => 'home'))); $menu->setCurrentUri($request->getRequestUri()); $em = $this->em; $q = $em->createQuery(' SELECT m FROM StexAdminBundle:MyMenu m WHERE m.status=1 ORDER BY menu.position'); $r = $q->getResult(); foreach($r as $menu) { $menu->addChild($menu->getName(), array('route' => $menu->getRoute(), 'routeParameters' => array(json_decode($menu->getParams()))); } return $menu; }
Сопоставление контроллеров с записями меню (и суб-sub и т. Д.) – очень редкий случай в приложении реального мира (по моему мнению) и не будет очень удобным (подумайте, что вам придется кодировать в основном «исключения», которые контроллер не должен включать и т. Д. .).
Наличие меню БД – это решение для меня. Очень гибкий, пользователи могут редактировать его с помощью приятного интерфейса и т. Д.