【问题标题】:Symfony2 Mark menu as active layout.html.twigSymfony2 将菜单标记为活动 layout.html.twig
【发布时间】:2014-02-24 13:00:05
【问题描述】:
我创建了一个有 4 个页面的小网站,意味着 4 个导航点。在 css 中总有一个导航点设置为活动的:
class="active"
所有这 4 个页面都继承了定义导航的 layout.html.twig 文件。
根据选择的导航点更改类(“活动”)类的最简单方法是什么?
提前感谢您的帮助!
【问题讨论】:
标签:
symfony
navigation
twig
【解决方案1】:
因为我没有那么多导航点,所以我用 twig 的 if 标记解决了这个问题。
<a href="{{ path('dbe_underConstruction') }}" title="Home"
{% if app.request.get('_route') == 'dbe_underConstruction' %} class="active"{% endif %}>Home </a>
这可能不是一个明确的解决方案,但效果很好:-)
【解决方案2】:
您可以使用KnpMenuBundle。例如src/Foo/BarBundle/Menu/MenuBuilder.php:
<?php
namespace Foo\BarBundle\Menu;
use Knp\Menu\FactoryInterface;
use Symfony\Component\HttpFoundation\Request;
class MenuBuilder
{
private $factory;
public function __construct(FactoryInterface $factory)
{
$this->factory = $factory;
}
public function createMyMenu(Request $request)
{
$menu = $this->factory->createItem('root');
$menu->setChildrenAttributes(array('class' => 'my-menu'));
// Always visible
$menu->addChild('Home', array('route' => 'foo_bar_homepage'));
// According to the current route
switch($request->get('_route')) {
case 'item_list':
$menu->addChild('Items')
->setCurrent(true);
break;
case 'item_show':
$menu->addChild('Items', array('route' => 'item_list'));
$menu->addChild('Show')
->setCurrent(true);
break;
// ...
}
}
active类会在调用setCurrent()方法时自动可用。
文档在here,你可以找到另一个教程here。
【解决方案3】:
您可以定义当前菜单项:
{% set current_menu = "home" %}
然后检查当前菜单项是什么:
<li class="nav-item{% if current_menu is same as("home") %} active{% endif %}">