Symfony 2: автоматически сгенерированные навигационные меню - PullRequest
1 голос
/ 16 февраля 2012

Кто-нибудь знает хороший принцип или, может быть, пакет для работы с навигационными меню в symfony2?

Я пробовал комплект Knp, но это всего лишь сеттеры и геттеры. Несмотря на функциональность, при которой контроллеры будут соответствовать моему главному меню, действия будут соответствовать подменю, а дополнительные параметры могут быть сопоставлены с подменю.

Я подумал, что мог бы подать заявление, что каждая запись в моем главном меню будет относиться к XController.php, а каждая запись в подменю под ним будет относиться к xAction в том же контроллере. Knp довольно гибок, но (насколько я понимаю) не поддерживает такое отображение.

Основная запись навигации должна быть активной, когда мы находимся в соответствующем контроллере, независимо от действия или каких-либо других параметров. И вот проблема. В конфигурации Symfony у вас есть _controller: ABBundle:NameController:nameAction, извлекая имя контроллера и действия, из которого довольно тяжело, и не очень хорошая идея для запуска при каждой загрузке страницы. Если я сопоставлю всю строку _controller, то мои пункты главного меню не будут активными независимо от действия ..

Также я думал, что эта схема может генерировать даже панировочные сухари, первая ссылка будет копией активной ссылки из главной навигации, вторая может быть активным входом в меню суб-навигации, а остальные могут быть установлены через контроллер по логике.

Есть идеи?

1 Ответ

4 голосов
/ 13 июня 2012

Я так и сделал.Я зарегистрировал 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 и генерирую пункты меню, записанные в БД.

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 sub и т. Д.) Является очень редким случаем в приложении реального мира (по моему мнению) и не очень пригодно для использования (хотя вам придется кодировать в основном «исключения», которые контроллер не должен использовать)включите, и т. д.).

Наличие меню БД - решение для меня.Очень гибкий, пользователи могут редактировать его с хорошим интерфейсом и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...