如何在symfony-cmf中渲染子菜单

时间:2014-11-05 12:45:25

标签: symfony symfony-cmf knpmenubundle knpmenu

我拼命想在symfony-cmf中渲染一个子菜单。

实施例

结构:

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

每当当前页面位于page1层次结构中的某个位置时,它应该使用p1-subpage*来呈现菜单,当我在page2层次结构中时,它应该使用p2-subpage*来渲染菜单。从技术上讲,这意味着它应该将当前项目设置为第一级别的父级(如果它尚未在其上)并渲染一级节点(例如knp_menu_render('main', { depth: 1 }))。

问题可以分为两部分:

  1. 从给定节点渲染(子)菜单
  2. 检索当前节点
  3. 思考和试炼

    • TWIG :支持渲染子菜单作为KnpMenu本身的功能已经suggested,但它还没有完成。由于此问题中有人提供了解决方法registering a twig extension。不过,此扩展程序基于{{>} getCurrentItem 方法has been removed with KNP-Menu 2.0。虽然cmf currently uses v1.1 of the knp-menubundle,但这是to change soon
    • TWIG The CnertaBreadcrumbBundle会恢复此功能,但依赖也适用于KNP-Menu 2.0。
    • TWIG Using a hack similar as suggested here。它检查当前URI,计算斜杠数并根据使用的内容确定。这可能会奏效。问题在于:我没有定义cmfMainContent变量,也无法在我的{{ dump() }}中找到任何类似的内容(也没有包含任何菜单)。
    • RouteVoter :cmf本身有一些MenuVoters,它们有很好的文档它们是什么,但不是如何来使用它们。我不认为有任何方法访问该功能 whithin twig ,我也不知道如何拦截菜单构建

    感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

在这里查看使用选民决定要突出显示内容的示例: https://github.com/dbu/conference-tutorial-1.0/pull/20

除此之外,我们在MenuBundle的KnpMenu 2.x兼容版本上取得了很好的进展,但它可能要到1月才能稳定发布(但我们可能会提前发布一个......我们会看到): https://github.com/symfony-cmf/MenuBundle/pull/214

答案 1 :(得分:1)

我昨天为自己的,类似的用例创建了一个包。

然而,由于我的所有页面共享相同的路径,您可能需要对其进行相当多的调整。

我仍然认为你可能会找到一些灵感,特别是对你问题的第二部分。

我的捆绑: https://github.com/burki94/RecursiveMenuBundle/blob/master/README.md

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

答案 2 :(得分:0)

这不是一个真正的解决方案,因为它没有遵循我与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 %}