2012-02-16 18 views
1

誰かがsymfony2のナビゲーションメニューを扱う良い原則やバンドルを知っていますか?symfony 2:自動生成されたナビゲーションメニュー

私はKnpバンドルを試しましたが、セッターとゲッターだけです。コントローラが私のメインメニューと一致する機能のうち、アクションはサブメニューと一致し、追加のパラメータはサブサブメニューにマッピングすることができます。

メインメニューの各エントリはXController.phpに関連し、サブメニューの各エントリは同じコントローラ内のxActionに関連すると私は考えました。 Knpは非常に柔軟ですが、(わかっている限り)このようなマッピングはサポートされていません。

アクションまたは他のパラメータに関係なく、関連するコントローラにいるときは、メインナビゲーションエントリがアクティブである必要があります。そしてここに問題があります。 symfonyの設定には_controller: ABBundle:NameController:nameActionがあります。コントローラーとアクション名はかなり重いので、すべてのページの読み込み時に実行するのは良い考えではありません。私が_controller文字列全体と一致すると、私のメインメニューのエントリは、アクションの独立したアクティブではありません..

また、私はパンくずリストがこのスキーマによって生成されると思った、最初のリンクは、第2のものはサブナビゲーションメニューのアクティブな入力であり、残りのものはロジックに従ってコントローラを介して設定することができる。

アイデア?

+0

あなたの主な質問で本当に助けになることはできませんが、すべての設定が終了してかなり効率的なPHPコードになってしまいます。キャッシュされているファイルをチェックして結果を確認します。だから、ほとんどのものが重すぎることを心配しないでください。 – Cerad

+0

はい、私は移動するために私自身のサービスを書くことに決めました。私はキャッシュを使用すると、実際にはスピードアップします:) –

+0

そのコードを見ることは可能ですか?私は、現在のルートパラメータに応じて生成されたメニューを解決するために、同じ問題にヒットしました。 – nysander

答えて

4

このようにしました。 KnpMenuをサービスとして登録し、そのクラスにentityManagerを渡しました。手にEMで

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 } 

私は、エンティティ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; 
} 

マッピングコントローラは(私による)現実世界のアプリでは非常にまれなケースであり、非常に使用できなくなります(あなたは主に「例外」をコーディングする必要があります考えどのコントローラーが含まれていないかなど)。

私はDBメニューを用意しています。 非常に柔軟性があり、ユーザーは素敵なインターフェイスなどで編集できます。

+0

子要素があるときはどうですか? – Bogdan