首页 文章

如果当前页面没有子页面,则显示当前页面的子页面,但显示父页面的子页面

提问于
浏览
1

我有这样的pagetree:

home
  foo
    foobar
    foobaz
  bar
    barbar
contact

我想显示一个导航菜单,其中包含当前页面的所有子页面 . 我用 TypoScript 实现了这个目标:

subNav = HMENU
subNav {
    entryLevel = -1

    1 = TMENU
    1 {
        wrap = <ul id="submenu">|</ul>
        NO = 1
        NO {
            wrapItemAndSub = <li>|</li>
        }
        ACT = 1
        ACT {
            wrapItemAndSub = <li id="active">|</li>
        }
    }
}

But: 当前页面没有子页面时,应显示父页面的子页面 .

例子:

  • 我在页面 home :菜单应显示指向页面 foobar 的链接 .

  • 我在 foofoobarfoobaz 应该显示 .

  • 我在 foobarHere also foobar and foobaz should be shown instead of an empty menu.

Typo3版本是7.6 .

3 回答

  • 1

    我可以解决它 . 如果当前页面有子页面,我必须将 HMENUentryLevel 设置为 -1 . -1 表示:从当前页面的che子页面开始 . 如果页面没有子页面,则必须将 entryLevel 设置为 -2 . 这意味着:从父页面的子节点开始 .

    entryLevel 有一个 override 属性:

    lib.subMenu = HMENU
    lib.subMenu {
    
        1 = TMENU
        1 {
            wrap = <ul id="submenu">|</ul>
            NO = 1
            NO {
                wrapItemAndSub = <li>|</li>
            }
            ACT = 1
            ACT {
                wrapItemAndSub = <li class="active">|</li>
            }
        }
    
        // -1 = current page
        entryLevel = -1
    
        // Set entry level to -2 (this is the parent page), if the current page has
        // no subpages.
        entryLevel.override = -2
        entryLevel.override.if {
            negate = 1
            isTrue.numRows {
                table = pages
                where = pid=this
            }
        }
    }
    
  • 1

    这是一个很好的问题 . 目前我只看到使用entryLevel的stdWrap属性的解决方案 . 所以你可以创建一个 entryLevel.stdWrap.cObject = CONTENT ,然后在pidInRootline = current(默认?)页面上执行选择查询 . 在CONTENT的 renderObj 中,您只需返回entryLevel以防子页面被找到,如果没有,则返回下一个最高级别的entryLevel .

    像这样它应该是可能的,但我希望任何人都有更好的解决方案 .

  • 2

    为了完整起见,我想提一下,有时可以选择“从前端”来思考这些问题 .

    例如 . 如果在菜单集中有隐藏的子页面或包含或排除菜单中的页面的其他条件,除非在 entrylevel.override 中重现,否则您将获得一个空菜单 . 这可以通过使用类似的东西来避免

    lib.subMenu = HMENU
    lib.subMenu {
        entrylevel = -1
        1 = TMENU
        # ...
        ifEmpty.cObject = HMENU
        ifEmpty.cObject {
            entrylevel = -2
            1 = TMENU
            # ...
        }
    }
    

    这样你就不必费心为什么当前页面的菜单是空的,这就足够了 . 尽管如此......在包装方面可能会有点繁琐

相关问题