ajouter la classe active pour faire le lien avec sf2 et twig

code simple suivant:

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

est-il un moyen simple d'ajouter un class="active" si la page courante correspond au _list route?

en utilisant le plus récent PR-Release de symfony2 et brindille comme moteur de modèle

31
demandé sur j0k 2011-04-18 01:19:35

10 réponses

Twig permet les conditionnels et l'objet Request est disponible dans toute l'application. Si vous êtes y compris le modèle, pour obtenir l'itinéraire que vous souhaitez utiliser:

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

Si vous utilisez la fonction rendu, vous souhaitez utiliser:

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

Avec ça, vous devriez être en mesure d'utiliser:

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

ou plus court:

class="{{ app.request.get('_route') == '_list' ? 'active' }}"
80
répondu Tau_Zero 2018-02-16 21:36:21

Parfois, vous ne voulez pas faire la correspondance exacte de l'itinéraire. Pour ces cas, vous pouvez utiliser la logique conditionnelle de la brindille" commence par".

par exemple, supposons que vous travaillez avec des livres. Vous avez les routes suivantes: book, book_show, book_new, book_edit. Vous voulez que le livre d'items de navigation soit surligné pour n'importe lequel de ces cas. Ce code accomplirait cela.

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

Cet exemple fonctionne avec au moins Symfony 2.3.x

18
répondu John Kramlich 2013-10-21 22:16:17

version la plus courte:

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

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

Parfois utile:

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

<li class="{{ 'post' in route ? 'open' }}"></li>
<li class="{{ 'category' in route ? 'open' }}"></li>
13
répondu Max Lipsky 2016-01-14 10:08:37

avec opérateur ternaire:

    {% 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>
8
répondu Yuriy Korman 2015-11-18 23:01:44

j'ai trouvé un très bon Bundle qui gère tout ça automatiquement:

https://github.com/KnpLabs/KnpMenuBundle

3
répondu choise 2013-10-08 17:54:39

SF2.2

{{ dump(app.request.server.get('PATH_INFO')) }}
1
répondu Karol Gontarski 2013-05-03 18:17:50

Symfony2.3, dans Twig, essayez ceci pour obtenir uri:

{{ dump(app.request.server.get("REQUEST_URI")) }}
1
répondu Degas 2013-09-16 06:12:12

C'est la façon dont je le fais (à l'aide de Symfony 2.6)

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

'_homepage' est le nom de la route dans routing.yml de votre bundle et la route ressemble à ceci

_homepage:
    path:     /
    defaults: { _controller: CoreBundle:Default:index }
0
répondu Baig 2015-06-08 11:22:12

C'est fait avec symfony 3.4, mais probablement quelque chose de similaire peut être fait avec SF2.

src\AppBundle\Twig\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 '';
    }
}

ajouter ceci aux services.yml

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

Utilisation:

<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>
0
répondu Darius.V 2018-01-07 11:31:04

class="class_name {% si la boucle.index0 = = 0 %}CLASSNAME{% endif%}"

-2
répondu Marcin Łęża 2017-03-03 12:47:57