在TypoScript菜单上撕掉我的头发。我需要以下行为:
“特殊”菜单项的列表pageIDs保持不变{$ SPECIAL}
呈现HMENU,显示站点根目录的导航。如果pageID是“特殊”,那么它将获得一个特殊的div换行,并且其子页面的列表嵌套在div换行中。如果该项不是“特殊”,则它不会获得特殊换行,也不会显示子页面。所有“特殊”项目都显示在页面列表的顶部。
我尝试了几种方法:
方法1. 一个接一个地渲染两个HMENU。第一个菜单仅显示{$ SPECIAL},第二个菜单显示siteroot,不包括{$ SPECIAL}项目。
问题:如果我使用special.directory来显示{$ SPECIAL},则不会呈现父页面。如果我使用special.list,则不会呈现子页面。哎呀!
方法2. 渲染一大块自定义菜单TS,使用if条件检查页面是否为{$ SPECIAL}
问题:我可以在{$ SPECIAL}项目上显示特殊包装,但我无法确定如何呈现特定于每个项目的子页面列表。< / p>
到目前为止,方法2的代码是:
MAIN_NAV.20 = HMENU
MAIN_NAV.20 {
special = directory
special.value = {$SITE_ROOT}
excludeUidList = {$RESTRICTED_ROOT}, {$HOME_SHORTCUT}
1 = TMENU
1{
NO{
# suppress standard menu output
doNotShowLink = 1
# build each menu item conditionally
stdWrap2.cObject = COA
stdWrap2.cObject{
#Standard
10 = TEXT
10{
# not in list of special pages?
if.value = {$NAV_CONTAINERS}
if.isInList.field = uid
if.negate = 1
field = nav_title//title
typolink.parameter.field = uid
wrap = <ul><li>|</li></ul>
}
#Special
20 = TEXT
20.wrap = <div class="SPECIAL"><ul><li><span>|</span>
20 {
if.value.field = uid
if.equals = {$SPECIAL}
field = nav_title//title
}
30 = TEXT
30.wrap = |</li></ul></div>
30 {
if.value.field = uid
if.equals = {$SPECIAL}
}
}
}
}
}
我无法硬编码(例如“特殊项目1作为文本元素,然后特殊项目1儿童作为菜单,然后特殊项目1作为文本元素,然后特殊项目2儿童......”)因为{理论上,$ SPECIAL}可以成为任意数量的页面。
任何人都可以提供任何建议来协助采用其中一种方法吗?
答案 0 :(得分:1)
我认为用户Ila是对的,如果你使用special = list,你应该能够通过添加TMEN来添加多个级别(子页面)。
另一方面,我有一个类似的菜单,我想分享。它包含两种特殊渲染情况 - 一种使用override.if
,另一种使用CASE
。
temp.mainnav = HMENU
temp.mainnav {
wrap = <nav>|</nav>
entryLevel = 0
1 = TMENU
1 {
noBlur = 1
expAll = 1
wrap = <ul>|</ul>
NO {
wrapItemAndSub=<li class="p{page:uid}">|</li>
wrapItemAndSub.insertData = 1
}
}
2 = TMENU
2 {
noBlur = 1
expAll = 1
NO {
wrapItemAndSub=<li>|</li>
// http://labor.99grad.de/2013/07/10/typo3-hmenu-einen-menupunkt-anders-darstellen/
doNotLinkIt.override = 1
doNotLinkIt.override.if {
value = {$pidsDoNotLinkInMenu}
isInList.field = uid
}
stdWrap.wrap.override = <p class="unlinkedMenuItem">|</p>
stdWrap.wrap.override.if {
value = {$pidsDoNotLinkInMenu}
isInList.field = uid
}
}
}
3 = TMENU
3 {
noBlur = 1
expAll = 1
wrap = <ul class="level3">|</ul>
NO.wrapItemAndSub.cObject = CASE
NO.wrapItemAndSub.cObject {
//http://stackoverflow.com/questions/18899573/how-to-apply-a-different-wrap-in-a-tmenu-for-certain-items-only/18910302?noredirect=1#18910302
key.field = uid
// normal item
default = TEXT
default.value = <li class="level3">|</li>
// special item
{$somePid} = TEXT
{$somePid}.value = <li class="level3 foo">|</li>
{$somePid}.append < temp.sometemp
// some other special item
{$someOtherpid} = TEXT
{$someOtherpid}.value = <li class="level3 bar">|</li>
{$someOtherpid}.append < temp.someothertemp
}
}
}
我认为这两种方法都可以用来实现你的目标。