如何自定义KNPMenuBundle?
我无法弄清楚如何使用KnpMenuBundle添加图像或span标记。
我只是想要这个:
<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 根据您的需要修改模板。例如,如果您决定每次使用$menu->addChild('Your Title');
时添加范围标记,只需在<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'}) }}
答案 0 :(得分:16)
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>
答案 1 :(得分:6)
我花了一段时间搞清楚这一点。
在定义名为“safe_label”的菜单项时,可以应用一个参数。通过将其设置为true,它会在导航栏中输出图像而不是html。
$image = "<img src='/path/to/image' />";
$menu->addChild( $image ,
array(
'route' => 'url_route_name',
'extras' => array(
'safe_label' => true
)
)
);
希望有所帮助
答案 2 :(得分:3)
您需要先从父模板导入宏,然后才能使用它们。
{% 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 %}
答案 3 :(得分:2)
要简单地添加类和其他HTML属性(例如,将menù与Twitter Bootstrap addind集成其类和ID),您可以使用为这种自定义提供的方法。
以下是一些有用的资源:
KnpMenuBundles提供了一些文档化的方法,如setAttributes,selLinkAttirbute或setLabelAttribute(以及其他方法),这些方法对自定义menù渲染非常有用。
答案 4 :(得分:1)
为什么不定义<li>
或<span>
元素的属性并在css中添加图片?