4

symfony 2.1.x で knpmenu バンドルを使用してブレッドクラムを作成する最良の方法は何ですか? サードパーティのバンドルを使用する以外に。

アップデート:

こんにちは、theunraveler さん、返信が遅くなってすみません。今、私はあなたの例に従ってきましたが、ある瞬間に立ち往生しています。ここで、以下のコードは例外をスローします。

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 %}

「アイテム」変数を受け入れないのはなぜですか?

4

3 に答える 3

10

バージョン以降2.0getBreadcrumbsArrayに移動されましたKnp\Menu\Util\MenuManipulator

このソリューションの可能なワークアウトは、twig 拡張機能を作成することです。

<?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 %}
于 2015-03-04T10:15:06.253 に答える
3

Knp\Menu\MenuItemクラスにはgetBreadcrumbsArray()メソッドがあります。現在アクティブなメニュー トレイル内の項目の配列を返す必要があります。以前のバージョンKnpMenu(<= 1.1.2 だと思います) を使用している場合、返される配列はlabel => uri. labelそれ以外の場合は、各項目が、uri、および のキーを持つ配列になりitemます。

現在のメニュー項目を見つけるには、次のようなメソッドをコントローラー (または、プロジェクトにとってより意味がある場合は別の場所) に作成することをお勧めします。

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 拡張機能を作成し、そこにメソッドを配置することだと思います。そうすれば、各コントローラーで手動でレンダリングする必要なく、すべてのテンプレートに変数を含めることができます。breadcrumbsgetCurrentMenuItem()breadcrumb

ソース: https://github.com/KnpLabs/KnpMenu/blob/master/src/Knp/Menu/MenuItem.php#L544 .

于 2012-11-13T12:29:18.050 に答える