Настройте KnpMenuBundle
Как настроить KNPMenuBundle?
Я не могу понять, как добавить изображение или тег span, используя KnpMenuBundle.
Я просто хочу это:
<ul>
<li>
<img src="{{asset('bundles/mybundle/images/my_image.png')}} /">
<span>My Title</span>
</li>
</ul>
В MenuBuilder это будет начинаться с:
$menu->addChild('My Title');
Как я могу добавить изображение в <li>
заявление?
РЕДАКТИРОВАТЬ: ЛЕГКИЙ ПУТЬ
На самом деле это простой способ сделать это в комплекте:
1 Скопируйте шаблон vendor\KnpMenu\src\Knp\Menu\Resources\views\knp_menu.html.twig
в ваш Acme\AcmeBundle\Resources\views\Menu\knp_menu.html.twig
и расширить его следующим образом:
{% extends 'knp_menu.html.twig' %}
2 Измените шаблон в соответствии с вашими потребностями. Например, если вы решили добавить тег span каждый раз, когда вы используете $menu->addChild('Your Title');
просто добавьте тег span между <a></a>
:
{% block linkElement %}
<a href="{{ item.uri }}"{{ _self.attributes(item.linkAttributes) }}>
<span>{{ block('label') }}</span>
</a>
{% endblock %}
3 Теперь вы можете выбрать свой собственный макет при использовании меню:
{{ knp_menu_render('main', {'template': 'AcmeBundle:Menu:knp_menu.html.twig'}) }}
5 ответов
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>
Я провел некоторое время, выясняя это.
Существует параметр, который вы можете применить при определении пункта меню, который называется "safe_label". Если для этого параметра установлено значение true, оно выводит изображение в панель навигации вместо HTML.
$image = "<img src='/path/to/image' />";
$menu->addChild( $image ,
array(
'route' => 'url_route_name',
'extras' => array(
'safe_label' => true
)
)
);
надеюсь, это поможет
Вам нужно импортировать макросы из родительского шаблона, прежде чем вы сможете их использовать.
{% block linkElement %}
{% import 'knp_menu.html.twig' as knp_menu %}
<a href="{{ item.uri }}"{{ knp_menu.attributes(item.linkAttributes) }}>
<span>{{ block('label') }}</span>
</a>
{% endblock %}
Чтобы просто добавить классы и другие атрибуты HTML (например, чтобы интегрировать меню с Twitter Bootstrap, добавить его классы и идентификаторы), вы можете использовать методы, предусмотренные для такой настройки.
Вот несколько полезных ресурсов:
- Вот все подробности из документации KNP Menu Bundle: Создание меню: Основы - Атрибуты меню
- Вот несколько конкретных примеров: (На GitHub) Пакет меню KNP с Bootstrap 3 и Font Awesome 4
KnpMenuBundles предоставляет некоторые документированные методы, такие как setAttributes, selLinkAttirbute или setLabelAttribute (и другие методы тоже), которые полезны для настройки рендеринга меню.
Почему бы не определить атрибут <li>
или же <span>
элемент и добавить изображение в CSS?