Сравнение маршрута с текущим запросом в Symfony - PullRequest
2 голосов
/ 29 апреля 2010

Для навигации по моему сайту я бы хотел указать текущую страницу. Если каждая страница в навигации имеет свой собственный маршрут, есть ли способ узнать, соответствует ли текущий запрос маршруту? Что-то вроде:

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

Или, вообще, есть ли идиоматический способ настройки активной страницы при создании навигации по сайту в Symfony?

Ответы [ 3 ]

5 голосов
/ 02 мая 2010

Или, вообще, есть ли идиоматический способ настройки активной страницы при создании навигации по сайту в Symfony?

Не используйте для этого sfContext :: getInstance (), имена маршрутов или внутренние uris. Есть несколько способов добиться выделения меню навигации с помощью Symfony, лично мне нравится устанавливать атрибут запроса (например, в контроллере), например:

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

Тогда в вашем шаблоне:

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

Вы даже можете добавить параметр section из ваших маршрутов в файл routing.yml:

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

Тогда в вашем шаблоне, если вы это сделаете, будьте внимательны, чтобы проверить параметр запроса вместо атрибута:

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

Простой, но эффективный, верно? Но если вам нужны более сложные навигационные системы (особенно вложенные меню), вам следует подумать об использовании более полнофункциональных плагинов или CMS на основе Symfony, таких как Sympal, Diem или ApostropheCMS.

1 голос
/ 30 апреля 2010

Вы можете попробовать поработать со следующим:

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

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

То, что он возвращает, является именем маршрута, которое вы определили в маршрутизации. Так, например, если у вас есть правило маршрутизации с именем «@search_results», приведенный выше метод вернет «search_results».

Может быть, есть лучший способ, но я также использую это, чтобы установить текущую активную страницу в моих макетах ... путем добавления "выбранного" класса к элементу навигации, если текущее имя маршрута соответствует "xxx".

0 голосов
/ 30 апреля 2010

Я создал помощника, добавил его в standard_helpers и создаю навигационные ссылки, используя это вместо link_to:

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

Мне не нравится sfContext :: getInstance (), но это был единственный способ, который я нашел.

...