Итак, возникла задача в 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 %}
{% 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
работает не только для массивов но и для строк! Этого уже достаточно считаю.
Успешных проектов!