Создание панировочных сухарей в 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 %}
Почему он не принимает переменную "элемент"?
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.
Начиная с версии 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 %}
Начиная с 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
.