根据页面更改代码

时间:2012-07-12 11:31:28

标签: symfony twig

我有一个twig-template(带有twitter bootstrap),代码如下 - 它是一个导航栏:

<ul class="nav">
    <li class="active"><a href="#">Modul 1</a></li>
    <li><a href="#about">Modul 2</a></li>
    <li><a href="#contact">Modul 3</a></li>
</ul>

此代码位于我的global.html.twig中。所以我想根据打开的页面更改list元素中的class =“active”。

如果不在模板中添加太多逻辑,我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:3)

在没有太多开销的情况下实现这一目标的唯一方法是使用KnpLabs/KnpMenuBundle

在你的global.html.twig中:

<ul class="nav">
  {{ knp_menu_render('YourModule1Bundle:MenuBuilder:module1Menu', {'currentClass': 'active'}) }}
  {{ knp_menu_render('YourModule2Bundle:MenuBuilder:module2Menu', {'currentClass': 'active'}) }}
  {{ knp_menu_render('YourModule3Bundle:MenuBuilder:module3Menu', {'currentClass': 'active'}) }}
</ul>

在Module1包目录中:

  • 创建Menu文件夹
  • 按如下方式创建MenuBuilder.php

-

<?php
namespace YourMenu1Bundle\Menu;

use Knp\Menu\FactoryInterface;
use Symfony\Component\DependencyInjection\ContainerAware;

class MenuBuilder extends ContainerAware
{
  public function applicationMenu(FactoryInterface $factory, array $options)
  {
      $rootMenu = $factory->createItem('rootMenu');
      $rootMenu->setChildrenAttributes(array('class' => 'nav'));
      $rootMenu->setCurrentUri($this->container->get('request')->getRequestUri());
      $menu = $rootMenu->addChild('Module 1', array('route' => 'the_wanted_route'));
      return $rootMenu;
  }
}