首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用knpmenu包在symfony 2.1中创建面包屑

使用knpmenu包在symfony 2.1中创建面包屑
EN

Stack Overflow用户
提问于 2012-11-13 10:47:42
回答 3查看 7.4K关注 0票数 4

使用symfony 2.1.x中的knpmenu包创建面包屑的最佳方法是什么?除了使用第三党捆绑.

更新:

你好,theunraveler,很抱歉迟了回答。现在我一直在学习你的榜样,我被困在了一个时刻。在这里,下面的代码抛出一个异常,即

代码语言:javascript
复制
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 %}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-13 12:29:18

Knp\Menu\MenuItem类有一个getBreadcrumbsArray()方法。它应该返回当前活动菜单跟踪中的项数组。如果您使用的是较早版本的KnpMenu (我认为是<= 1.1.2 ),则返回的数组将以label => uri的形式出现。否则,它将是一个数组,每个项都有键labeluriitem

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

代码语言:javascript
复制
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()

代码语言:javascript
复制
$this->getCurrentMenuItem($your_menu)->getBreadcrumbsArray();

我想我最终要做的是注册一个创建一个Twig扩展全局breadcrumbs,并将getCurrentMenuItem()方法放在那里。这样,您就可以在所有模板中使用breadcrumb变量,而不必在每个控制器中手动呈现它。

资料来源:https://github.com/KnpLabs/KnpMenu/blob/master/src/Knp/Menu/MenuItem.php#L544.

票数 3
EN

Stack Overflow用户

发布于 2015-03-04 10:15:06

自版本2.0以来,getBreadcrumbsArray已被移动到Knp\Menu\Util\MenuManipulator

解决方案的可能解决方案是创建一个小枝扩展:

代码语言:javascript
复制
<?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';
    }

}

登记树枝分机:

代码语言:javascript
复制
kimwild_common.menu_manipulator_extension:
    class: Kimwild\CommonBundle\Twig\MenuManipulatorExtension
    public: false
    tags:
        - { name: twig.extension }

在breadcrumb.html.twig中:

代码语言:javascript
复制
{% block root %}
    {%- for  link in menu_manipulator(item) %}
    /* whatever you want to do ... */
    {%- endfor %}
{% endblock %}
票数 10
EN

Stack Overflow用户

发布于 2015-10-29 20:21:59

自从KnpMenu 2.1之后,就有了一个新的小枝函数:knp_menu_get_breadcrumbs_array

你可以看看我的要点:https://gist.github.com/fsevestre/b378606c4fd23814278a

我添加了一个新的小枝函数knp_menu_get_current_item,它检索当前菜单项并与knp_menu_get_breadcrumbs_array函数很好地工作。

--

编辑:

使用KnpMenu 2.2,您现在可以:

代码语言:javascript
复制
<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>

https://github.com/KnpLabs/KnpMenu/blob/master/doc/02-Twig-Integration.markdown#functions

knp_menu_get_current_item('main') Twig函数将检索main菜单的当前菜单项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13359366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档