2014-06-29 14 views
6

i knpmenubundle für meine Website verwenden und hier ist mein Problem: ich eine Liste der Benutzer über diese Route aufgelistet haben:/admin/users und das Menü ist wie folgt aus:KnpMenuBundle und dynamische Routen Parameter

User (is opened) 
    list (is active) 
    add new 

in der Listenansicht die Position „Liste“ in dem Menü aktiv ist, wie ich in der neuen Ansicht hinzufügen mag, das Element ist aktiv im Menü „neue hinzufügen“ wie i

will

aber , wenn ich bearbeiten möchte ein Benutzer die allready vorhanden sind, kann ich nicht aktiv die Position „Nutzer“ verwalten, da te Route einen dynamischen Parameter haben hier

ist, wie meine Seite strukturiert ist:

in src/dn/AdminBundle /Resources/Config/routing.yml

# Users 
### List 
dnAdmin_usersList: 
    pattern: /users/{page} 
    defaults: { _controller: dnAdminBundle:User:list, page: 1 } 
    requirements: 
     page: \d* 

### Edit 
dnAdmin_userEdit: 
    pattern: /user/edit/{id} 
    defaults: { _controller: dnAdminBundle:User:edit} 
    requirements: 
     id: \d+ 

in app/ressources/view/Layout/html/Zweig

{{ render(controller("dnAdminBundle:Common:leftMenu")) }} 

in src/dn/AdminBundle/Controller/CommonController

public function leftMenuAction() 
{ 
    return $this->render('dnAdminBundle:Common:leftMenu.html.twig'); 
} 

in src/dn/AdminBundle/Ressourcen/Ansicht/Common/LeftMenu/html.twig

{{ knp_menu_render('leftMenu', {'template':'dnAdminBundle:Menu:knp_menu.html.twig', 'currentClass':'active', 'ancestorClass':'active'}) }} 

in src/dn/AdminBundle/Ressourcen/config/services.yml

services: 
    dn_admin.menu_builder: 
     class: dn\AdminBundle\Menu\MenuBuilder 
     arguments: ["@knp_menu.factory"] 

    dn_admin.menu.leftMenu: 
     class: Knp\Menu\MenuItem 
     factory_service: dn_admin.menu_builder 
     factory_method: createLeftMenu 
     arguments: ["@request"] 
     scope: request 
     tags: 
      - { name: knp_menu.menu, alias: leftMenu } 

in src/dn/AdminBundle/Menü/MenuBuilder.php Namensraum dn \ AdminBundle \ Menu;

Verwenden Sie Knp \ Menu \ FactoryInterface; Verwenden Sie Symfony \ Component \ HttpFoundation \ Request; Klasse MenuBuilder { private $ factory;

/** 
* @param FactoryInterface $factory 
*/ 
public function __construct(FactoryInterface $factory) 
{ 
    $this->factory = $factory; 
} 

public function createLeftMenu(Request $request) 
{ 
    // root 
    $menu = $this->factory->createItem('root'); 
    $menu->setChildrenAttributes(array('class' => 'sidebar-menu')); 

    // Users 
    $l = $menu->addChild('Users', array(
     'uri' => '#', 
    )); 
    $l->setAttribute('class', 'treeview'); 
    $l->setChildrenAttribute('class', 'treeview-menu'); 
    $l->addChild('Liste', array(
     'route' => 'dnAdmin_userList', 
    )); 
    $l->addChild('Edit', array(
     'route'   => 'dnAdmin_userEdit', 
     'routeParameters' => $request->get('id'), 
    )) 
    ->setDisplay(false); 
} 

aber $ request-> get ('id') leer Rückgabestring

Jeder Idee haben, wie ich die aktuellen Parameter in knpmenubundle bekommen kann?

Dank

Antwort

10

Wenn Ihr Menü Builder erweitert ContainerAware Sie in der Lage sein sollte, das Request-Objekt zuzugreifen.Beispiel:

class Builder extends ContainerAware { 
public function mainMenu(FactoryInterface $factory, array $options) {   

    $request = $this->container->get('request');   

    $menu = $factory->createItem('root'); 
    $parent = $menu->addChild('Users', array('route' => 'users')); 
    $parent->addChild('Edit', array('route' => 'user_edit', 'routeParameters' => array('id' => $request->get('id')))); 

    return $menu; 
} 

Ihre Benutzer Menüpunkt sollte die current_ancestor Klasse erhält

1

Wenn Ihre Menü-Builder-Klasse nicht ContainerAware verlängern (und als Dienst, gibt es keine Notwendigkeit dafür, dies zu tun) Sie passieren können in der @request_stack, oder typheinting Symfony\Component\HttpFoundation\RequestStack Service, und holen Sie die ID von dort:

$id - $this->requestStack->getCurrentRequest()->get('id'); 
// -or- 
$request = $this->requestStack->getCurrentRequest(); 
$id = $request->get('id'); 
Verwandte Themen