2011-04-17 75 views
28

以下简单的代码:添加活动类与SF2链接和小枝

<li><a href="{{ path('_list') }}">List</a></li> 

有一个简单的方法来添加一个class="active"如果当前页面的_list路由匹配?

使用的Symfony2的最新PR-释放和小树枝作为模板引擎

回答

77

嫩枝允许条件语句和Request对象在整个应用程序可用。如果你是其中的模板,得到的路线要使用:

app.request.attributes.get('_route') 

如果您正在使用的渲染功能,您要使用:

app.request.attributes.get('_internal') 

有了这一点,你应该能够使用方法:

class="{% if app.request.attributes.get('_route') == '_list' %}active{% endif %}" 

或更短:

class="{{ app.request.get('_route') == '_list' ? 'active' }}" 
+0

是的,我在源代码中几分钟前发现了'_route'参数,但是我将它作为变量传递给模板,因为我不知道我可以直接从树枝访问请求变量。多数民众赞成真棒,谢谢! – choise 2011-04-18 14:32:38

+5

可能会更近一些,但app.request.get('_ route')也适用。 – 2012-01-30 21:36:37

+11

较短的版本:class =“{{app.request.attributes.get('_ route')=='_list'?'active'}}” – Jekis 2014-01-03 07:45:54

1

SF2.2

{{ dump(app.request.server.get('PATH_INFO')) }} 
1

Symfony2.3,在嫩枝,试试这个让URI:

{{ dump(app.request.server.get("REQUEST_URI")) }} 
18

有时你不想做一个路线的精确匹配。对于这些情况,您可以使用枝条的“开始”条件逻辑。

举个例子,假设你正在使用书籍。您有以下路线:书籍,book_show,book_new,book_edit。您希望为任何这些情况突出显示导航项目Book。这段代码可以实现这一点。

<a class="{% if app.request.attributes.get('_route') starts with 'book' %}active{% endif %}">Books</a> 
<a class="{% if app.request.attributes.get('_route') starts with 'author' %}active{% endif %}">Authors</a> 

本例将至少Symfony的2.3.x版本

+1

优秀的片段!它为我工作。 – MikeGA 2014-01-19 06:01:30

+0

完美的解决方案。谢谢! – BlueMan 2016-03-13 18:38:19

0

这是我要做的事(使用Symfony的2.6)

<li {% if app.request.get('_route') == '_homepage' %} class="active" {% endif %}><a href="{{ path('_homepage') }}">Student</a></li> 

​​是路由的名称在你的包的routing.yml并且路线看起来像这样

_homepage: 
    path: /
    defaults: { _controller: CoreBundle:Default:index } 
8

使用三元运算符:

{% set route = app.request.attributes.get('_route') %} 
    <ul class="nav navbar-nav"> 
     <li {{ route == 'profile_index' ? 'class="active"' }}><a href="{{ path('profile_index') }}"><i class="icon-profile position-left"></i> My Profile</a></li> 
     <li {{ route == 'influencers_index' ? 'class="active"'}}><a href="{{ path('influencers_index') }}"><i class="icon-crown position-left"></i> Influencers</a></li> 
     <li {{ route == 'task_manager_index' ? 'class="active"'}}><a href="{{ path('task_manager_index') }}"><i class="icon-alarm-check position-left"></i> Task Manager</a></li> 
    </ul> 
11

最短版本:

{% set route = app.request.get('_route') %} 

<li class="{{ route starts with 'post' ? 'open' }}"></li> 
<li class="{{ route starts with 'category' ? 'open' }}"></li> 

有时有用:

{% set route = app.request.get('_route') %} 

<li class="{{ 'post' in route ? 'open' }}"></li> 
<li class="{{ 'category' in route ? 'open' }}"></li> 
+0

非常优雅。谢谢你。 – ACJ 2017-12-15 17:31:40

-2

=“CLASS_NAME {%如果循环。索引0 == 0%} {CLASSNAME ENDIF%%}”

+2

虽然这段代码片段是受欢迎的,并且可能会提供一些帮助,但如果它包含* how *和* why *的解释](// meta.stackexchange.com/q/114762)问题。请记住,你正在为将来的读者回答这个问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。 – 2017-03-03 13:13:47

0

这是用symfony 3.4做过,但可能类似的东西可以用SF2完成。

的src \的appbundle \嫩枝\ AppExtension.php

<?php 

namespace AppBundle\Twig; 

use Symfony\Component\HttpFoundation\RequestStack; 

class AppExtension extends \Twig_Extension 
{ 
    private $requestStack; 

    public function __construct(RequestStack $requestStack) 
    { 
     $this->requestStack = $requestStack; 
    } 

    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('activeMenu', [$this, 'activeMenu']) 
     ]; 
    } 

    /** 
    * Pass route names. If one of route names matches current route, this function returns 
    * 'active' 
    * @param array $routesToCheck 
    * @return string 
    */ 
    public function activeMenu(array $routesToCheck) 
    { 
     $currentRoute = $this->requestStack->getCurrentRequest()->get('_route'); 

     foreach ($routesToCheck as $routeToCheck) { 
      if ($routeToCheck == $currentRoute) { 
       return 'active'; 
      } 
     } 

     return ''; 
    } 
} 

添加这services.yml

services: 
    #... some other services 
    AppBundle\Twig\AppExtension: 
     arguments: ["@request_stack"] 

用法:

<ul class="nav navbar-nav"> 
    <li class="{{ activeMenu(['form', 'edit_form']) }}"><a href="{{ path('form') }}">Form</a></li> 
    <li class="{{ activeMenu(['list']) }}"><a href="{{ path('list') }}">List</a></li> 
</ul>