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

Show subpages of current page, but subpages of parent page, if the current page has no subpages

我有一个这样的页面树:

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>
        }
    }
}

但是:当当前页面没有子页面时,应该显示父页面的子页面。

示例:

Typo3 版本是 7.6。

这是个好问题。目前我只看到使用 entryLevel 的 stdWrap-properties 的解决方案。因此,您可以创建 entryLevel.stdWrap.cObject = CONTENT,然后在 pidInRootline = current(默认?)页面上执行 select 查询。在 CONTENT 的 renderObj 中,您只需 return entryLevel 以防找到子页面,如果没有,则为下一个最高级别的 entryLevel。

这样应该可以,但希望大家有更好的解决办法

我可以解决。如果当前页面有子页面,我必须将 HMENUentryLevel 设置为 -1-1 表示:从当前页面的子页面开始。如果页面没有子页面,则 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
        }
    }
}

为了完整起见,我想提一下,有时考虑此类问题是一种选择"from front end"。

例如如果子页面设置了 hide in menu 或其他包含或排除菜单页面的条件,除非您在 entrylevel.override 中复制它,否则您将得到一个空菜单。这可以通过使用类似

的东西来避免
lib.subMenu = HMENU
lib.subMenu {
    entrylevel = -1
    1 = TMENU
    # ...
    ifEmpty.cObject = HMENU
    ifEmpty.cObject {
        entrylevel = -2
        1 = TMENU
        # ...
    }
}

这样你就不需要理会为什么你当前页面的菜单是空的,事实就足够了。不过,在包装方面可能会有点繁琐……