45

如何自定义 KNPMenuBundle?

我不知道如何使用 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'}) }}
4

5 回答 5

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>
于 2012-06-27T16:17:33.483 回答
6

我花了一段时间才弄清楚这一点。

在定义名为“safe_label”的菜单项时,您可以应用一个参数。通过将此设置为 true,它会在导航栏中而不是 html 中输出图像。

    $image = "<img src='/path/to/image' />";
    $menu->addChild( $image , 
      array(
        'route' => 'url_route_name',
        'extras' => array(
          'safe_label' => true
        )
      )
    );

希望有帮助

于 2012-12-23T01:54:39.047 回答
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 %}


于 2014-02-19T17:19:01.380 回答
2

要简单地添加类和其他 HTML 属性(例如,将菜单与 Twitter Bootstrap 集成并添加其类和 ID),您可以使用为此类定制提供的方法。

以下是一些有用的资源:

KnpMenuBundles 提供了一些文档化的方法,如 setAttributes、selLinkAttirbute 或 setLabelAttribute(以及其他方法),这些方法对于自定义菜单呈现很有用。

于 2015-02-18T17:50:28.840 回答
1

为什么不定义<li>or<span>元素的属性并在 css 中添加图像?

于 2012-06-27T14:21:34.237 回答