KnpMenuBundle - 如何为菜单的每个元素设置一个图标类?

kla*_*ius 5 php symfony knpmenu knpmenubundle

我希望我的视图代码看起来像这样:

<li>
    <a href="path/to/action">
            <i class="icon-class"></i>
            <span class="title">Title</span>
    </a>
</li>
Run Code Online (Sandbox Code Playgroud)

我通过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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我用以下代码覆盖了视图(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 %}
Run Code Online (Sandbox Code Playgroud)

如何<i>在Builder类中的方法adminMenu()中将图标类名的值传递给元素?最简单的方法是什么?

Fed*_*kun 8

您可以添加所需的任何属性

$menu->addChild('Dashboard', array(
    'route' => 'admin_dashboard',
))->setAttribute('icon', 'icon-class');
Run Code Online (Sandbox Code Playgroud)

然后

{{ item.attribute('icon') }}
Run Code Online (Sandbox Code Playgroud)


Jon*_*nny 6

我建议使用extras代替attributes, 因为attributes用于渲染li元素的属性。

$menu->addChild('Dashboard', array(
    'uri' => '#',
))->setAttribute('icon', 'icon-class');
Run Code Online (Sandbox Code Playgroud)

和

{{ item.attribute('icon') }}
Run Code Online (Sandbox Code Playgroud)

可能会呈现为:

<li icon="icon-class"><a href="#"><i class="fa fa-icon-class" aria-hidden="true"></i> Dashboard</a></li>
Run Code Online (Sandbox Code Playgroud)

然而:

$menu->addChild('Dashboard', array(
    'uri' => '#',
))->setExtra('icon', 'icon-class');
Run Code Online (Sandbox Code Playgroud)

和

{{ item.extra('icon') }}
Run Code Online (Sandbox Code Playgroud)

可能会被渲染为:

<li><a href="#"><i class="fa fa-icon-class" aria-hidden="true"></i> Dashboard</a></li>
Run Code Online (Sandbox Code Playgroud)

另请参阅此答案:https ://stackoverflow.com/a/19095287/2106834 。