Создание панировочных сухарей в symfony 2.1 с помощью пакета knpmenu


Каков наилучший способ создания панировочных сухарей с помощью пакета knpmenu в symfony 2.1.x? Помимо использования пакетов 3-й партии.

ОБНОВЛЕНИЕ:

Привет, Путешественник, извините за поздний ответ. Теперь я следую вашему примеру и в какой-то момент застрял. Здесь приведенный ниже код создает исключение, которое

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

Почему он не принимает переменную "элемент"?

Author: Mister Been, 2012-11-13

3 answers

Класс Knp\Menu\MenuItem имеет метод getBreadcrumbsArray(). Он должен возвращать массив элементов в текущем активном следе меню. Если вы используете более раннюю версию KnpMenu (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();

Я думаю, что в конечном итоге я бы сделал создать расширение ветки, которое регистрирует глобальный breadcrumbs, и поместил туда метод getCurrentMenuItem(). Таким образом, вы можете иметь переменную breadcrumb во всех своих шаблонах без необходимости вручную отображать ее в каждом контроллере.

Источник: https://github.com/KnpLabs/KnpMenu/blob/master/src/Knp/Menu/MenuItem.php#L544.

 3
Author: theunraveler, 2012-11-13 14:27:32

Начиная с версии 2.0, getBreadcrumbsArray был перенесен в Knp\Menu\Util\MenuManipulator.

Возможная тренировка для это решение заключается в создании расширения ветки:

<?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 %}
 10
Author: b.b3rn4rd, 2015-03-04 10:15:06

Начиная с 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 теперь вы можете сделайте:

<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
Author: fsevestre, 2016-09-27 13:06:30