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



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

更新:

嗨,解开者,抱歉回答晚了。现在我一直在效仿你的榜样,我一度陷入困境。在这里,下面的代码抛出了一个异常,即

Missing argument 2 for AcmeDemoBundleMenuMenuBuilder::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 %}

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

从版本 2.0 开始,getBreadcrumbsArray 已移至 KnpMenuUtilMenuManipulator

此解决方案的可能锻炼是创建一个树枝扩展:

<?php
namespace KimwildCommonBundleTwig;
use KnpMenuUtilMenuManipulator;
use KnpMenuItemInterface;
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: KimwildCommonBundleTwigMenuManipulatorExtension
    public: false
    tags:
        - { name: twig.extension }

在面包屑.html.twig中:

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

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

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

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();

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

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

由于 KnpMenu 2.1,有一个新的 twig 函数: knp_menu_get_breadcrumbs_array

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

我添加了一个新的 twig 函数knp_menu_get_current_item,它检索当前菜单项并与 knp_menu_get_breadcrumbs_array 函数配合使用。

--

编辑:

使用 KnpMenu 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>

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

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

相关内容

  • 没有找到相关文章

最新更新