显示当前页面的子页面,但如果当前页面没有子页面,则显示父页面的子页面
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>
}
}
}
但是:当当前页面没有子页面时,应该显示父页面的子页面。
示例:
- 我在第
home
页:菜单应显示指向第 foo
和 bar
页的链接。
- 我在
foo
:应该显示 foobar
和 foobaz
。
- 我在
foobar
:这里还应显示 foobar
和 foobaz
而不是空菜单。
Typo3 版本是 7.6。
这是个好问题。目前我只看到使用 entryLevel 的 stdWrap-properties 的解决方案。因此,您可以创建 entryLevel.stdWrap.cObject = CONTENT
,然后在 pidInRootline = current(默认?)页面上执行 select 查询。在 CONTENT 的 renderObj
中,您只需 return entryLevel 以防找到子页面,如果没有,则为下一个最高级别的 entryLevel。
这样应该可以,但希望大家有更好的解决办法
我可以解决。如果当前页面有子页面,我必须将 HMENU
的 entryLevel
设置为 -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
# ...
}
}
这样你就不需要理会为什么你当前页面的菜单是空的,事实就足够了。不过,在包装方面可能会有点繁琐……
我有一个这样的页面树:
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>
}
}
}
但是:当当前页面没有子页面时,应该显示父页面的子页面。
示例:
- 我在第
home
页:菜单应显示指向第foo
和bar
页的链接。 - 我在
foo
:应该显示foobar
和foobaz
。 - 我在
foobar
:这里还应显示foobar
和foobaz
而不是空菜单。
Typo3 版本是 7.6。
这是个好问题。目前我只看到使用 entryLevel 的 stdWrap-properties 的解决方案。因此,您可以创建 entryLevel.stdWrap.cObject = CONTENT
,然后在 pidInRootline = current(默认?)页面上执行 select 查询。在 CONTENT 的 renderObj
中,您只需 return entryLevel 以防找到子页面,如果没有,则为下一个最高级别的 entryLevel。
这样应该可以,但希望大家有更好的解决办法
我可以解决。如果当前页面有子页面,我必须将 HMENU
的 entryLevel
设置为 -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
# ...
}
}
这样你就不需要理会为什么你当前页面的菜单是空的,事实就足够了。不过,在包装方面可能会有点繁琐……