KnpMenuBundle — как я могу установить класс значков для каждого элемента меню?

Я хочу чтобы мой вид кода выглядел так:

<li>
<a href="path/to/action">
<i class="icon-class"></i>
<span class="title">Title</span>
</a>
</li>

Я создаю элементы меню с помощью Menu Builder:

class Builder extends ContainerAware
{
public function adminMenu(FactoryInterface $factory, array $options)
{
$menu = $factory->createItem('root');

$menu->addChild('Dashboard', array(
'route' => 'admin_dashboard',
));

return $menu;
}
}

Я переписал представление с помощью следующего кода (knp_menu.html.twig):

{% block linkElement %}
{% import _self as knp_menu %}
<a href="{{ item.uri }}"{{ knp_menu.attributes(item.linkAttributes) }}>
<i class="icon-class"></i>
<span class="title">{{ block('label') }}</span>
</a>
{% endblock %}

Как я могу передать значение имени класса значка <i> элемент в методе adminMenu (), в классе Builder? Какой самый простой способ сделать это?

5

Решение

Вы можете добавить любой атрибут, который вы хотите с

$menu->addChild('Dashboard', array(
'route' => 'admin_dashboard',
))->setAttribute('icon', 'icon-class');

затем

{{ item.attribute('icon') }}
8

Другие решения

Я бы предложил использовать extras вместо attributes, так как attributes используется для визуализации li атрибуты элемента.

$menu->addChild('Dashboard', array(
'uri' => '#',
))->setAttribute('icon', 'icon-class');

а также

{{ item.attribute('icon') }}

вероятно будет отображаться как:

<li icon="icon-class"><a href="#"><i class="fa fa-icon-class" aria-hidden="true"></i> Dashboard</a></li>

В то время как:

$menu->addChild('Dashboard', array(
'uri' => '#',
))->setExtra('icon', 'icon-class');

а также

{{ item.extra('icon') }}

Вероятно, будет просто отображено как:

<li><a href="#"><i class="fa fa-icon-class" aria-hidden="true"></i> Dashboard</a></li>

Также посмотрите этот ответ: https://stackoverflow.com/a/19095287/2106834.

3

Просто:

$menu->addChild('Home', ['route' => 'home_page'])
->setAttribute('icon', 'fa fa-home');
0
По вопросам рекламы [email protected]