2 votes

Comparaison de la route avec la demande actuelle dans Symfony

Pour la navigation de mon site, j'aimerais indiquer la page en cours. Si chaque page de la navigation a sa propre route, y a-t-il un moyen de voir si la demande actuelle correspond à la route ? Quelque chose comme :

$request->getRoute() == '@my_route'

Ou, plus généralement, existe-t-il un moyen idiomatique de définir la page active lors de la création de la navigation du site dans Symfony ?

5voto

NiKo Points 5023

Ou, plus généralement, existe-t-il un moyen idiomatique de définir la page active lors de la création de la navigation du site dans Symfony ?

N'utilisez pas sfContext::getInstance(), les noms de route ou les uris internes pour cela. Il y a plusieurs façons de mettre en évidence le menu de navigation avec Symfony, personnellement j'aime bien mettre un attribut de requête (par exemple dans un contrôleur), comme ceci :

<?php
// ...
  public function executeFoo(sfWebRequest $request)
  {
    $request->setAttribute('section', 'blah');
  }

Puis dans votre modèle :

<ul>
  <li class="<?php echo 'blah' === $sf_request->getAttribute('section') ? 'active' : '' ?>">
    <a href="<php echo url_for('@my_route') ?>">Blah</a>
  </li>
</ul>

Vous pouvez même ajouter le section de vos routes dans le routing.yml fichier :

my_route:
  url: /foo
  param: { module: foo, action: bar, section: blah }

Ensuite, dans votre modèle, si vous le faites, veillez à vérifier qu'il s'agit d'un paramètre de requête plutôt que d'un attribut :

<ul>
  <li class="<?php echo 'blah' === $sf_request->getParameter('section') ? 'active' : '' ?>">
    <a href="<php echo url_for('@my_route') ?>">Blah</a>
  </li>
</ul>

Simple et efficace, non ? Mais si vous avez besoin d'une navigation plus complexe (notamment des menus imbriqués), vous devriez penser à utiliser des plugins plus complets ou des CMS basés sur Symfony comme Sympal, Diem ou ApostropheCMS.

1voto

Tom Points 10295

Vous pouvez essayer de travailler avec les éléments suivants :

In template:
$route = $sf_context->getInstance()->getRouting()->getCurrentRouteName();

In action:
$route = sfContext::getInstance()->getRouting()->getCurrentRouteName();

Ce qu'il renvoie est le nom de la route tel que vous l'avez défini dans le routage. Ainsi, par exemple, si vous avez une règle de routage appelée "@search_results", la méthode ci-dessus renverra "search_results".

Il existe peut-être une meilleure méthode, mais je l'utilise également pour définir la page active actuelle dans mes mises en page... en ajoutant une classe "selected" à un élément de navigation si le nom de la route actuelle correspond à "xxx".

0voto

Maerlyn Points 18190

J'ai créé une aide, je l'ai ajoutée au fichier standard_helpers et je crée des liens de navigation en l'utilisant au lieu de link_to :

function thu_menu($name, $uri, $options = array())
{
  return link_to_unless(strpos(sfContext::getInstance()->getRouting()->getCurrentInternalUri(true), $uri) !== false, $name, $uri, $options);
}

Je n'aime pas sfContext::getInstance(), mais c'est le seul moyen que j'ai trouvé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X