自定义KnpMenuBundle

Mic*_*ick 43 symfony knpmenubundle

如何自定义KNPMenuBundle?

我无法弄清楚如何使用KnpMenuBundle添加图像或span标记.

我只想要这个:

<ul>
    <li>
         <img src="{{asset('bundles/mybundle/images/my_image.png')}} /">
         <span>My Title</span>        
     </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

在MenuBuilder中,这将从以下开始:

$menu->addChild('My Title');
Run Code Online (Sandbox Code Playgroud)

我怎么能在<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' %}
Run Code Online (Sandbox Code Playgroud)


2 根据需要修改模板.例如,如果您决定每次使用 $menu->addChild('Your Title');时添加span标记,只需在以下各项之间添加span标记<a></a>:

{% block linkElement %}
    <a href="{{ item.uri }}"{{ _self.attributes(item.linkAttributes) }}>
        <span>{{ block('label') }}</span>
    </a>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)


3 您现在可以在使用菜单时选择自定义布局:

{{ knp_menu_render('main', {'template': 'AcmeBundle:Menu:knp_menu.html.twig'}) }}
Run Code Online (Sandbox Code Playgroud)

MDr*_*tte 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 }
Run Code Online (Sandbox Code Playgroud)

例如,枝条模板可以这样写.

<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>
Run Code Online (Sandbox Code Playgroud)


小智 6

我花了一段时间搞清楚这一点.

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

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

希望有所帮助

  • 正确,但你也应该在渲染包时使用原始格式,例如:{{knp_menu_render('main',{'template':'AcmeBundle:Menu:knp_menu.html.twig',{'allow_safe_labels':true})|生的 }} (2认同)