添加活动类以与sf2和twig链接

时间:2011-04-17 21:19:35

标签: php url symfony twig

遵循简单的代码:

<li><a href="{{ path('_list') }}">List</a></li>
如果当前页面与class="active"路由匹配,是否有一种简单的方法可以添加_list

使用symfony2和twig的最新PR-Release作为模板引擎

10 个答案:

答案 0 :(得分:89)

Twig允许条件,并且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' }}"

答案 1 :(得分:20)

有时您不希望对路线进行精确匹配。对于这些情况,您可以使用twigs的“starts with”条件逻辑。

举个例子,我们假设您正在使用书籍。您有以下路线:book,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

答案 2 :(得分:18)

最短版本:

{% 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>

答案 3 :(得分: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>

答案 4 :(得分:3)

我发现了一个非常好的Bundle,可以自动处理所有这些内容:

https://github.com/KnpLabs/KnpMenuBundle

答案 5 :(得分:3)

这是通过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>

答案 6 :(得分:1)

SF2.2

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

答案 7 :(得分:1)

Symfony2.3,在Twig中,尝试这个来获取uri:

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

答案 8 :(得分:-1)

我就是这样做的(使用Symfony 2.6)

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

'_homepage'是捆绑包中routing.yml的路线名称,路线如下所示

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

答案 9 :(得分:-3)

class =&#34; class_name {%if loop.index0 == 0%} CLASSNAME {%endif%}&#34;