2014-06-29 11 views
6

io uso knpmenubundle per il mio sito e qui è il mio problema: Ho un elenco di utente elencato da questo percorso:/admin/utenti e il menu è in questo modo:KnpMenuBundle e dinamica del percorso parametro

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

nella vista elenco, la voce "lista" nel menu è attivo come voglio nella nuova visione aggiungere la voce "aggiungere nuove" nel menu è attivo come voglio

ma , quando voglio modificare un utente che esiste giá, non in grado di gestire per attivare la voce "utenti" perché te percorso ha un parametro dinamico

Ecco come il mio sito è strutturato:

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/ramoscello

{{ 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/Resources/view/comune/LeftMenu/html.twig

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

in src/dn/AdminBundle/Resources/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/Menu/MenuBuilder.php spazio dei nomi dn \ AdminBundle \ Menu;

Utilizzare Knp \ Menu \ FactoryInterface; usa Symfony \ Component \ HttpFoundation \ Request; classe 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); 
} 

ma $ request-> get ('id') ritorno stringa vuota

Qualcuno ha idea su come posso ottenere il parametro corrente in knpmenubundle?

Grazie

risposta

10

Se il menu builder estende ContainerAware si dovrebbe essere in grado di accedere all'oggetto richiesta.Esempio:

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; 
} 

gli Utenti voce di menu dovrebbe ottenere la classe current_ancestor

1

Se la classe menu builder non si estende ContainerAware (e, come servizio, non c'è alcun bisogno di farlo) è possibile passare nel @request_stack, o il servizio typehinting Symfony\Component\HttpFoundation\RequestStack, a prendere l'id da lì:

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