Как отобразить подменю в symfony-cmf

Я отчаянно пытаюсь сделать подменю в symfony-cmf.

пример

Состав:

page1
  ├─p1-subpage1
  ├─p1-subpage2
  └─p1-subpage3
page2
  ├─p2-subpage1
  └─p2-subpage2

Всякий раз, когда текущая страница находится где-то в пределах page1 иерархия должна использовать p1-subpage* сделать меню, когда я в пределах page2 иерархия должна использовать p2-subpage* сделать меню. Технически это означает, что он должен установить текущий элемент на родительский уровень 1-го уровня (если он еще не на нем) и визуализировать один уровень узлов (например, knp_menu_render('main', { depth: 1 })).

Проблема может быть разделена на две части:

  1. Рендеринг (под) меню из данного узла
  2. Извлечение текущего узла

Мысли и Испытания

  • TWIG: Было предложено поддерживать рендеринг подменю как функциональность самого KnpMenu, но это не было сделано. В качестве обходного пути кто-то в проблеме предоставил расширение ветки. Однако это расширение основано на getCurrentItemМетод, который былудален с помощью KNP-Menu 2.0. Хотя cmf в настоящее время использует v1.1 из knp-menubundle, это скоро изменится
  • TWIG: CnertaBreadcrumbBundle вернул бы эту функциональность, но также зависит от KNP-Menu 2.0.
  • TWIG: Используяхак, похожий на предложенный здесь. Он проверяет текущий URI, подсчитывает количество слешей и решает, основываясь на том, что использовать. Это может сработать. Проблема здесь: у меня нетcmfMainContent переменная определена, и я не могу найти ничего подобного в моем{{ dump() }}(нет ничего, кроме меню).
  • RouteVoter: У самого cmf есть несколько MenuVoters, которые хорошо документируют,что они из себя представляют, но не знают, как их использовать. Я не думаю, что есть какой-либо способ получить доступ к этой функциональности с помощью ветки, и при этом я не знаю, как перехватить построение меню.

Спасибо за любую помощь.

3 ответа

Вчера я создал пакет для своего собственного, похожего на случай использования.

Однако, поскольку все мои страницы используют один и тот же маршрут, вам, возможно, придется немного его адаптировать.

Я все еще думаю, что вы можете найти вдохновение, особенно для второй части вашей проблемы.

Моя связка: https://github.com/burki94/RecursiveMenuBundle/blob/master/README.md

AbstractRecursiveBuilder: https://github.com/burki94/RecursiveMenuBundle/blob/master/Menu/AbstractRecursiveBuilder.php:

Посмотрите здесь пример использования избирателей, чтобы принять решение о том, что выделить: https://github.com/dbu/conference-tutorial-1.0/pull/20

Помимо этого, мы добиваемся значительного прогресса в версии нашего MenuBundle, совместимой с KnpMenu 2.x, но это может произойти до января, пока мы не выпустим стабильную версию (но мы могли бы сделать ее раньше.. мы увидим): https://github.com/symfony-cmf/MenuBundle/pull/214

Это не совсем решение, потому что оно не соответствует моим требованиям совместимости с KnpMenu 2.*. Но это устаревшее решение легко:

     {% set currentItem = knp_menu_get('main').currentItem %}
     {% if currentItem is not null %}
            {% if currentItem.getLevel() == 1 %}
                  {% set main = currentItem %}
            {% else %}
                  {% set main = currentItem.getParent() %}
            {% endif %}
            {{ knp_menu_render(main, { 'template': 'ComBundle:Default:left_menu.html.twig', 'currentClass': 'uk-active' }) }}
     {% endif %}
Другие вопросы по тегам