Настройте KnpMenuBundle

40

Как настроить 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'}) }}
  • 3
    Почему бы не определить атрибут элемента <li> или <span> и добавить изображение в css?
  • 5
    «Легкий путь», перечисленный выше, потрясающий. Благодарю.
Показать ещё 4 комментария
Теги:
knpmenubundle

5 ответов

15
Лучший ответ

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>
  • 0
    Спасибо MDrolette, этот ответ мне очень помог! Ваше руководство было действительно полезным! Я сделал нечто очень похожее на то, что вы рекомендовали, за исключением того, что в этом случае я только расширил шаблон knp_menu.html.twig. Я отредактировал свой вопрос на случай, если вы заинтересованы. Опять офигенный ответ. Ура :-)
  • 0
    Есть ли полный пример того, как иметь работающий пользовательский рендер? symfony.com/doc/master/bundles/KnpMenuBundle/… Я следил за этим, но все равно не помог.
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
    Правильно, но вы также должны использовать необработанный формат при визуализации пакета, например: {{knp_menu_render ('main', {'template': 'AcmeBundle: Menu: knp_menu.html.twig', {'allow_safe_labels': true}) | raw}}
  • 0
    Небольшая поправка к предложению @repincln по спасению жизни: правильный синтаксис Symfony 2.8: {{ knp_menu_render('main', {'template': 'AcmeBundle:Menu:knp_menu.html.twig', 'allow_safe_labels': true})|raw }}
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 %}


2

Чтобы просто добавить классы и другие атрибуты HTML (например, чтобы интегрировать menù с Twitter Bootstrap, добавьте его классы и идентификаторы), вы можете использовать методы, предусмотренные для этой настройки. p >

Вот некоторые полезные ресурсы:

KnpMenuBundles предоставляет некоторые документальные методы, такие как setAttributes, selLinkAttirbute или setLabelAttribute (и другие методы), которые полезны для настройки рендеринга men.

  • 0
    битые ссылки, было бы неплохо еще посмотреть документы.
  • 1
    @ Навоз, я только что проверил их, и они работают! оо
1

Почему бы не определить атрибут элемента <li> или <span> и добавить изображение в css?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню