На главную
  Назад в „Symfony2“  

Итак, возникла задача в twig шаблоне найти подстроку, всё оказалось просто..

Суть возникшей задачки в том, что есть основное меню, при нажатии на каждый из элементов которого он становится подсвеченным. Проще всего это сделать следующим образом: получить при генерации меню текущий route и в цикле вывода всех элементов проверять текущий route и текущий выводимый элемент на равенство. Если они равны, то добавляем класс menu-item-higlighted, или как там он у Вас может называться.

В виде кода это может выглядеть примерно следующим образом:
          {%
            set header_menus = [
            { 'href':'MainBundle_TopMenuElement_Home','text':'common.menu.home.text'},
            { 'href':'MainBundle_TopMenuElement_About','text':'common.menu.about.text'},
            { 'href':'MainBundle_TopMenuElement_Contacts','text':'common.menu.contacts.text'},
            ]
          %}

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

          {% for menu_item in header_menus %}
              <div class="header-menu-item
                    {% if route == menu_item.href %}
                        menu-item-higlighted
                    {% endif %}
                   "

                   >
                  <a href="{{ path( menu_item.href ) }}" >
                    {{ menu_item.text|trans }}
                  </a>
              </div>

        {% endfor %}
   

Кстати, такая удобная возможность получения текущего route (
{% set route = app.request.get('_route') %}) появилась совсем недавно, в Symfony 2.0.* ещё не было, а в 2.1.* уже появилась. Хорошо, а то была проблема, городить всего приходилось, чтобы эту функциональность получить. Вот, тут всё хорошо разжёвано, сравните как было и как стало.

Всё становится немного сложнее, если у каждого меню, есть подменю, с другими rout`ами. Тогда соответственно подсвечиваться будет только один элемент, у которого route совпадёт с текущим. Естественно возникает мысль, задать всем элементам подменю routes продолжающие route основного элемента, прим.:

для основного MainBundle_TopMenuElement_Home подменю могут быть MainBundle_TopMenuElement_Home_Benefits, MainBundle_TopMenuElement_Home_Cooperation и т.д.

И тогда в проверке соответствия нужно сравнивать не всю строку, а только начало, или другую общую уникальную часть. Но для этого надо использовать аналоги РНР`шных функций strpos или substr, а таких фильтров в Twig пока нет (в стандартной поставке).

Решение нашлось простое, in работает не только для массивов но и для строк! Этого уже достаточно считаю.



Успешных проектов!

Павел Осипов
2012.10.11



  Наверх