Ответ 1
CSS работает для этого случая, но иногда вам может потребоваться добавить или изменить разметку более существенно. Для этого вы можете использовать собственный визуализатор, как определено здесь: https://github.com/KnpLabs/KnpMenuBundle/blob/master/Resources/doc/custom_renderer.md
Пример пакета, который делает это MopaBoostrapBundle Я выделил важные части здесь.
Объявление службы, в которое добавлен тег knp_menu.renderer
:
services:
mopa_bootstrap.navbar_renderer:
class: Mopa\Bundle\BootstrapBundle\Navbar\Renderer\NavbarRenderer
arguments: [ @service_container, [] ]
tags:
# The alias is what is used to retrieve the menu
- { name: knp_menu.renderer, alias: navbar }
и шаблон ветки может быть написан, например, так.
<div class="navbar {{ (navbar.hasOption('fixedTop') and navbar.getOption('fixedTop')) ? 'navbar-fixed-top' : '' }}">
<div class="navbar-inner">
<div class="container{{ (navbar.hasOption('isFluid') and navbar.getOption('isFluid')) ? '-fluid' : '' }}">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
{% if navbar.hasOption('title') %}<a class="brand" href="{{ path(navbar.getOption('titleRoute')) }}">{{ navbar.getOption('title') }}</a>{% endif %}
<div class="nav-collapse">
{{ navbar.hasMenu('leftmenu') ? knp_menu_render(navbar.getMenu('leftmenu'), {'currentClass': 'active', 'ancestorClass': 'active', 'allow_safe_labels': 'true'}) : '' }}
{% if navbar.hasFormView('searchform') %}
{%- set form_view = navbar.getFormView('searchform') -%}
{%- set form_type = navbar.getFormType('searchform') -%}
{%- set form_attrs = form_view.vars.attr -%}
{% form_theme form_view _self %}
<form class="navbar-search pull-{{ form_attrs.pull|default('left') }}" method="{{ form_attrs.method|default('post') }}" action="{{ path(navbar.getFormRoute('searchform')) }}">
{{ form_widget(form_view) }}
</form>
{% endif %}
{{ navbar.hasMenu('rightmenu') ? knp_menu_render(navbar.getMenu('rightmenu'), {'currentClass': 'active', 'ancestorClass': 'active', 'allow_safe_labels': 'true'}) : '' }}
</div>
</div>
</div>
</div>