Php 使用KNP菜单包在symfony 2.1中创建面包屑

Php 使用KNP菜单包在symfony 2.1中创建面包屑,php,symfony,navigation,breadcrumbs,knpmenubundle,Php,Symfony,Navigation,Breadcrumbs,Knpmenubundle,使用symfony 2.1.x中的KNP菜单包创建面包屑的最佳方法是什么?除了使用第三方捆绑包之外 更新: 嗨,解开者,很抱歉回答晚了。现在我一直在学习你的榜样,我有一刻被困住了。这里,下面的代码抛出一个异常 Missing argument 2 for Acme\DemoBundle\Menu\MenuBuilder::getBreadCrumbs() {% set item = knp_menu_get('main') %} {{ knp_menu_render(item) }}

使用symfony 2.1.x中的KNP菜单包创建面包屑的最佳方法是什么?除了使用第三方捆绑包之外

更新:

嗨,解开者,很抱歉回答晚了。现在我一直在学习你的榜样,我有一刻被困住了。这里,下面的代码抛出一个异常

Missing argument 2 for Acme\DemoBundle\Menu\MenuBuilder::getBreadCrumbs()    

{% set item = knp_menu_get('main') %}
{{ knp_menu_render(item) }}
{% block breadcrumbs %}
    {% set breadcrumbs = knp_menu_get('breadcrumbs', [], {'request':    app.request, 'menu': item }) %}
    {{ dump(breadcrumbs) }}
{% endblock %}

为什么它不接受“item”变量?

这个
Knp\Menu\MenuItem
类有一个
getBreadcrumbsArray()
方法。它应该返回当前活动菜单轨迹中的项目数组。如果您使用的是早期版本的
knp菜单
(uri),否则,它将是一个数组,每个项都有键
标签
uri
、和

要查找当前菜单项,您可能需要在控制器(或其他地方,如果对您的项目更有意义的话)中创建一个如下所示的方法:

public function getCurrentMenuItem($menu)
{
    foreach ($menu as $item) {
        if ($item->isCurrent()) {
            return $item;
        }

        if ($item->getChildren() && $current_child = $this->getCurrentMenuItem($item)) {
            return $current_child;
        }
    }

    return null;
}
从那里,您可以对返回的值调用
getBreadcrumbsArray()

$this->getCurrentMenuItem($your_menu)->getBreadcrumbsArray();
我想我最终要做的是注册一个
breadcrumbs
global,并将
getCurrentMenuItem()
方法放在其中。这样,您就可以在所有模板中使用
breadcrumb
变量,而不必在每个控制器中手动渲染它


来源:.

2.0版以来,
getBreadcrumbsArray
已移动到
Knp\Menu\Util\menumaniplator

可能的解决方案是创建一个细枝延伸:

<?php

namespace Kimwild\CommonBundle\Twig;
use Knp\Menu\Util\MenuManipulator;
use Knp\Menu\ItemInterface;

class MenuManipulatorExtension extends \Twig_Extension
{

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('menu_manipulator', array($this, 'menuManipulator')),
        );
    }

    public function menuManipulator(ItemInterface $item)
    {
        $manipulator = new MenuManipulator();
        return $manipulator->getBreadcrumbsArray($item);
    }


    public function getName()
    {
        return 'menu_manipulator';
    }

}
kimwild_common.menu_manipulator_extension:
    class: Kimwild\CommonBundle\Twig\MenuManipulatorExtension
    public: false
    tags:
        - { name: twig.extension }
在breadcrumb.html.twig中:

{% block root %}
    {%- for  link in menu_manipulator(item) %}
    /* whatever you want to do ... */
    {%- endfor %}
{% endblock %}

由于KNPENU
2.1
,有一个新的细枝函数:
KNPENU\u get\u breadcrumbs\u array

你可以看看我的要点:

我添加了一个新的细枝函数
knp\u menu\u get\u current\u item
,该函数检索当前菜单项,并与
knp\u menu\u get\u breadcrumbs\u array
函数配合使用

--

编辑:

使用KNPENU
2.2
,您现在可以执行以下操作:

<ol class="breadcrumb">
{% for breadcrumb_item in knp_menu_get_breadcrumbs_array(knp_menu_get_current_item('main')) %}
    {% if not loop.last %}
    <li><a href="{{ breadcrumb_item.uri }}">{{ breadcrumb_item.label }}</a></li>
    {% else %}
    <li class="active">{{ breadcrumb_item.label }}</li>
    {% endif %}
{% endfor %}
</ol>

{knp_菜单中的面包屑_项的百分比\u获取面包屑_数组(knp_菜单\u获取当前_项('main'))%}
{%if not loop.last%}
  • {%else%}
  • {{breadcrumb_item.label}
  • {%endif%} {%endfor%}


    knp\u菜单获取当前项('main')
    Twig函数将为
    main
    菜单检索当前菜单项。

    嗯,
    KnpMenuBundle
    是一个第三方包……同意,但我的意思是,在现有knpmenu包中已经有机会创建面包屑时,不要再添加任何包。您能提供一些使用此包的示例吗方法?因为问题在于确定呈现菜单的当前项。使用如何查找当前菜单项的示例更新了我的答案。GetBreadCrumbArray()不再可用。您知道该使用什么吗?@Netbulae,此方法已移动到
    Knp\Menu\Util\menumaniplator
    查看此答案:从2012年到现在(2015年),这实际上已成为如何以Symfony 2友好方式解决此问题的正确答案,不赞成以前接受的方法!