2012-02-16 38 views
1

任何人都知道一個好的原則,或者可能是一個處理symfony2中導航菜單的包?Symfony 2:自動生成的導航菜單

我試過了Knp包,但它只是setter和getters。雖然控制器的功能與我的主菜單相匹配,但操作將與子菜單相匹配,並且附加參數可以映射到子子菜單。

我以爲我可以讓我的應用程序,我的主菜單中的每個條目將涉及到XController.php和它下面的子菜單中的每個條目將涉及在同一控制器中的xAction。 Knp非常靈活,但是(據我所知)不支持這種映射。

無論操作還是其他參數,當我們在相關控制器中時,主導航條目都應該處於活動狀態。這是問題。在symfony的配置中,您有_controller: ABBundle:NameController:nameAction,提取控制器和操作名稱非常重要,並且不是每個頁面加載都運行的好主意。如果我匹配整個_controller字符串,那麼我的主菜單條目將不會被激活而不依賴於該動作。

另外我還以爲即使麪包屑可以通過這種模式生成,第一個鏈接將是活動鏈接的副本主導航,第二個可以是子導航菜單的主動輸入,其餘可以通過控制器根據邏輯設置。

任何想法?

+0

不能真正幫助你解決主要問題,但我會說所有配置的東西都會被編譯成相當有效的PHP代碼。檢查緩存下的文件以查看結果。所以不要擔心大多數東西太重。 – Cerad 2012-02-17 03:54:32

+0

是的,我決定去編寫我自己的導航服務。我認爲使用緩存將真的加快速度:) – 2012-02-17 17:37:45

+0

是否有可能看看該代碼?我剛剛遇到同樣的問題,以解決取決於當前路線參數生成的菜單。 – nysander 2012-05-12 19:19:56

回答

4

我這樣做了。 我已經將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; 
} 

映射控制器的菜單項(和子子子等)是(根據我)在現實世界中的應用非常罕見的情況下,也不會是非常有用的(認爲你將不得不代碼大多是「例外」哪個控制器不包括,等等)。

擁有數據庫菜單是我的解決方案。 非常靈活,用戶可以用漂亮的界面等進行編輯。

+0

當你有孩子的元素時呢? – Bogdan 2016-04-04 09:15:46