2

エクストラネットの各バンドルは、独立したアプリケーションです。私のメニューにはすべてのアプリがリストされており、実際のルートプレフィックスに応じて現在のアプリをマークするのが好きです.

最初に base.html.twig の twig コード:

{{ knp_menu_render('AppBundle:Builder:mainMenu', { 'currentClass': 'active'}) }}

ビルダー関数:

public function mainMenu(FactoryInterface $factory, array $options){
  $main = $factory->createItem('root');

  foreach($this->getExtranetBundles() as $bundle){
    $main->addChild($bundle->getAcronym(), array('route' => $bundle->getRoute()));
  }

  // Current Element
  $matcher = new Matcher();
  $matcher->addVoter(new BundleVoter($this->getCurrentBundle()));
  $renderer = new ListRenderer($matcher);
  $renderer->render($main);

  return $main;
}

私の BundleVoter クラスは正しく動作し、現在のメニューが見つかった場合は true を返します。しかし、HTML では、現在の要素に「アクティブな」クラスが含まれることはありません。

KnpMenuBundle をもう少し読み、Knp\Menu\Matcher クラスにデバッグ コードを追加しました。

public function addVoter(VoterInterface $voter)
{
    echo "add voter: " . get_class($voter);
    $this->voters[] = $voter;
}

そして、この出力を得ました:

add voter: AppBundle\Menu\BundleVoter
add voter: Knp\Menu\Matcher\Voter\RouteVoter

神秘的な RouteVoter はどこから来たのですか? 現在の要素の BundleVoter 選択を上書きしますか? どうすれば非アクティブ化/上書きできますか?

4

1 に答える 1