добавить активный класс для связи с sf2 и веткой - PullRequest
32 голосов
/ 18 апреля 2011

следующий простой код:

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

Есть ли простой способ добавить class="active", если текущая страница соответствует маршруту _list?

с использованием новейшего PR-релиза symfony2 и twig в качестве движка шаблонов

Ответы [ 10 ]

89 голосов
/ 18 апреля 2011

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' }}"
20 голосов
/ 22 октября 2013

Иногда вы не хотите выполнять точное сопоставление маршрута. Для этих случаев вы можете использовать условную логику ветки «начинается с».

В качестве примера, давайте предположим, что вы работаете с книгами. У вас есть следующие маршруты: book, book_show, book_new, book_edit. Вы хотите, чтобы элемент навигации Книга был выделен для любого из этих случаев. Этот код сделает это.

<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

18 голосов
/ 14 января 2016

Кратчайшая версия:

{% 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>
8 голосов
/ 19 ноября 2015

С троичным оператором:

    {% 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>
3 голосов
/ 07 января 2018

Это делается с помощью symfony 3.4, но, вероятно, что-то подобное можно сделать и с 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 '';
    }
}

Добавить это в 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>
3 голосов
/ 20 апреля 2011

Я нашел очень хороший Пакет, который обрабатывает все это автоматически:

https://github.com/KnpLabs/KnpMenuBundle

1 голос
/ 16 сентября 2013

Symfony2.3, в Twig, попробуйте получить uri:

{{ dump(app.request.server.get("REQUEST_URI")) }}
1 голос
/ 03 мая 2013

SF2.2

{{ dump(app.request.server.get('PATH_INFO')) }}
0 голосов
/ 03 марта 2017

class = "class_name {% if loop.index0 == 0%} CLASSNAME {% endif%}" *

0 голосов
/ 08 июня 2015

Вот как я это делаю (используя 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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...