TypoScript菜单,对列表中包含的特定pageID进行特殊处理

时间:2014-06-19 18:03:17

标签: typo3 typoscript

在TypoScript菜单上撕掉我的头发。我需要以下行为:

  1. “特殊”菜单项的列表pageIDs保持不变{$ SPECIAL}

  2. 呈现HMENU,显示站点根目录的导航。如果pageID是“特殊”,那么它将获得一个特殊的div换行,并且其子页面的列表嵌套在div换行中。如果该项不是“特殊”,则它不会获得特殊换行,也不会显示子页面。所有“特殊”项目都显示在页面列表的顶部。

  3. 我尝试了几种方法:

    方法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}可以成为任意数量的页面。

    任何人都可以提供任何建议来协助采用其中一种方法吗?

1 个答案:

答案 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

        }
    }

}

我认为这两种方法都可以用来实现你的目标。