自定义KnpMenuBundle

时间:2012-06-27 13:08:05

标签: symfony knpmenubundle

如何自定义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'}) }}

5 个答案:

答案 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中添加图片?