Как отобразить подменю в 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 })
).
Проблема может быть разделена на две части:
- Рендеринг (под) меню из данного узла
- Извлечение текущего узла
Мысли и Испытания
- 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 %}