code simple suivant:
<li><a href="{{ path('_list') }}">List</a></li>
existe-t-il un moyen simple d'ajouter un class="active"
si la page actuelle correspond à _list
route?
en utilisant la dernière version PR de symfony2 et twig comme moteur de modèle
Twig permet les conditions et l'objet Request est disponible dans toute l'application. Si vous incluez le modèle, pour obtenir l'itinéraire que vous souhaitez utiliser:
app.request.attributes.get('_route')
Si vous utilisez la fonction de rendu, vous souhaitez utiliser:
app.request.attributes.get('_internal')
Avec cela, vous devriez pouvoir utiliser:
class="{% if app.request.attributes.get('_route') == '_list' %}active{% endif %}"
ou plus court:
class="{{ app.request.get('_route') == '_list' ? 'active' }}"
Parfois, vous ne voulez pas faire correspondre exactement un itinéraire. Pour ces cas, vous pouvez utiliser la logique conditionnelle "commence par" de twig.
Par exemple, supposons que vous travaillez avec des livres. Vous disposez des itinéraires suivants: book, book_show, book_new, book_edit. Vous souhaitez que l'élément de navigation Livre soit mis en surbrillance pour l'un 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
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>
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>
Cela se 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 '';
}
}
Ajoutez ceci à services.yml
services:
#... some other services
AppBundle\Twig\AppExtension:
arguments: ["@request_stack"]
Usage:
<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>
j'ai trouvé un très bon bundle qui gère tous ces trucs automatiquement:
Symfony2.3, dans Twig, essayez ceci pour obtenir uri:
{{ dump(app.request.server.get("REQUEST_URI")) }}
SF2.2
{{ dump(app.request.server.get('PATH_INFO')) }}