【问题标题】:Test in typoscript TMENU在打字稿 TMENU 中测试
【发布时间】:2018-06-04 09:47:31
【问题描述】:

我需要根据 tt_content 中是否存在内容来更改菜单的外观。为此,我这样做了,但它不起作用,我在测试中有错误:

      1 = TMENU
  1 {
    expAll = 1
    doNotLinkIt = 1                 

    IFSUB = 1
    IFSUB {
       doNotLinkIt = 1

    typeOfMenu = 0 
    #typeOfMenu.override = 1

    # pane content  
    contenu.cObject = COA
    contenu.cObject {                                                                       
          10 = CONTENT
          10 {
            table = tt_content
            select {
              orderBy = sorting
              pidInList.field = uid
              where = {#colPos}=99  and deleted = 0 and hidden = 0
            }
            if.isTrue.data {
                typeOfMenu = 1

            }
           # 20 = TEXT
           # 20 {
           #     field = bodytext
           #     typeOfMenu.value.override.if {
           #         isTrue.data = 20.field
           #     }
           # }
        }
    }
    [globalVar = LIT:1 = typeOfMenu]     
    #[globalVar = LIT:1 = {$typeOfMenu}]
        stdWrap {              
            typolink.parameter.field =  uid
            typolink.ATagParams = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
            typolink.ATagParams.insertData = 1
        }

    [else]
        stdWrap {              
            typolink.parameter.field =  uid
            typolink.ATagParams = class="vertical menu -- {register:typeOfMenu.value} --"
            typolink.ATagParams.insertData = 1
        }
    [end]            
        ...
  • 错误:第 2244 行:对象名称字符串,“[globalVar”包含无效字符“[”。必须是字母数字或以下之一:“_:-.”

有人有想法吗? 最好的问候!


差不多是这样,但它不起作用(Bernd Wilke 解决方案......)。我不太了解sql查询。并且有一个偏移量,它是第一个 typeOfMenu 是为第二个写的。事实上,我想要这样:

<div class="top-bar-left">
           <ul class="dropdown vertical menu medium-horizontal" data-responsive-menu="accordion medium-dropdown">
              <li>
                 <a href="/testtypo3-9.2.0/htdocs/index.php?id=25">!</a>
                 <ul class="vertical menu">
                    <li>
                       <a href="/testtypo3-9.2.0/htdocs/index.php?id=29">YogaTissimo.fr</a>
                       <ul class="vertical menu">
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=31">Qui sommes nous ?</a></li>
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=30">Faq</a></li>
                       </ul>
                    </li>
                    <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=28">Vous nous dites ?</a></li>
                    <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=27">Contacts</a></li>
                    <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=26">Â propos</a></li>
                 </ul>
              </li>
              <li>
                 <a href="/testtypo3-9.2.0/htdocs/index.php?id=15">Philosophie</a>
                 <ul class="vertical menu">
                    <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=24">Un art de vivre</a></li>
                    <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=23">Conscience et action</a></li>
                    <li>
                       <a href="/testtypo3-9.2.0/htdocs/index.php?id=17">Journal d'une sadhana [TTC]</a>
                       <ul class="vertical menu">
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=22">Jour 1</a></li>
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=21">Jour 2</a></li>
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=20">Jour 3</a></li>
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=19">Jour 4</a></li>
                          <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=18">Jour 5</a></li>
                       </ul>
                    </li>
                    <li><a href="/testtypo3-9.2.0/htdocs/index.php?id=16">Vedanta</a></li>
                 </ul>
              </li> .....

而且,当 colPos=99 中有东西时,我想拥有:

     <div class="top-bar-left">
        <ul class="dropdown vertical menu medium-horizontal" data-responsive-menu="accordion medium-dropdown">
           <li class="sanskrit-1">
              <a href="/testtypo3-9.2.0/htdocs/index.php?id=25" class="dropdown shrink" data-toggle="sous-menu1">!</a>
              <div class="dropdown-pane" id="sous-menu1" data-dropdown data-options="closeOnClick:true; hover: true; hoverPane: true">
                 <div class="grid-x grid-padding-x">
                    <div class="large-12">PaneC'est-UN_PANE ! </div>
                 </div>
                 <div class="grid-x grid-padding-x">
                    <div class="large-3 medium-4 cell">
                       <p>
                          <a href="/testtypo3-9.2.0/htdocs/index.php?id=29">YogaTissimo.fr</a></br><b>Sur ce site</b>
                          <i>

                       </i></p>
                       <ul class="ssmenu">
                          <li class="first"><a href="/testtypo3-9.2.0/htdocs/index.php?id=31">Qui sommes nous ?</a></li>
                          <li class="last"><a href="/testtypo3-9.2.0/htdocs/index.php?id=30">Faq</a></li>
                       </ul>
                    </div>
                    <div class="large-3 medium-4 cell">
                       <p><a href="/testtypo3-9.2.0/htdocs/index.php?id=28">Vous nous dites ?</a></br></p>
                    </div>
                    <div class="large-3 medium-4 cell">
                       <p><a href="/testtypo3-9.2.0/htdocs/index.php?id=27">Contacts</a></br></p>
                    </div>
                    <div class="large-3 medium-4 cell">
                       <p><a href="/testtypo3-9.2.0/htdocs/index.php?id=26">Â propos</a></br><b></b><i></i>
                       <div class="img-wrap"><img src="/testtypo3-9.2.0/htdocs/fileadmin/user_upload/bg.jpeg" width="225" height="225"   alt="" ></div>
                       </p>
                    </div>
                 </div>
              </div>
           </li>

这里的打字稿部分我很难编码并且有效,没有考虑 colPos = 99:

    # menu
20 = HMENU
20 {
    wrap = <ul class="dropdown vertical menu medium-horizontal" data-responsive-menu="accordion medium-dropdown">|</ul>

  # Premier niveau
  1 = TMENU
  1 {
    expAll = 1
    doNotLinkIt = 1                 

    IFSUB = 1
    IFSUB {
       doNotLinkIt = 1

       stdWrap {              
           typolink.parameter.field =  uid
           typolink.ATagParams = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
           typolink.ATagParams.insertData = 1
        }
        wrapItemAndSub = <li class="sanskrit-1">|</div></div></li> |*| <li>|</div></div></li> |*| <li class="last">|</div></div></li>
        after {
          stdWrap.insertData = 1
          stdWrap.wrap = <div class="dropdown-pane" id="sous-menu{register:count_MENUOBJ}" data-dropdown data-options="closeOnClick:true; hover: true; hoverPane: true"><div class="grid-x grid-padding-x">|

          # pane content  
          stdWrap.cObject = COA
          stdWrap.cObject {                                                                       
          10 = CONTENT
          10 {
            table = tt_content
            select {
              orderBy = sorting
              pidInList.field = uid
              where = {#colPos}=99  and deleted = 0 and hidden = 0
            }

            renderObj = COA
            renderObj {
              10 = TEXT
              10.stdWrap.field = bodytext
              10.stdWrap.wrap = <div class="large-12">|

              20 = FILES
              20 {
                references {
                  table = tt_content
                  uid.data = field:uid
                  fieldName = image
                }
                begin = 0
                maxItems = 1

                renderObj = IMAGE
                renderObj {
                  file {
                    import.data = file:current:originalUid // file:current:uid
                    #width = 232c
                    #height = 145c
                  }
                  required = 1
                  #wrap = <div class="img-wrap">|</div>
                  wrap = |
                }
              }
              30 = TEXT
              30.value = </div></div><div class="grid-x grid-padding-x">
            } //COA
          } //CONTENT
        } //COA
      } //after
    } //IFSUB
  } //1

最好的问候

现在如果我这样做:

# menu
20 = HMENU
20 {
    wrap = <ul class="dropdown vertical menu medium-horizontal" data-responsive-menu="accordion medium-dropdown">|</ul>

  # Premier niveau
  1 = TMENU
  1 {
    expAll = 1
    doNotLinkIt = 1                 

    IFSUB = 1
    IFSUB {
       doNotLinkIt = 1

        stdWrap.cObject = COA 
        stdWrap.cObject {
            # let's define registers
            1 = LOAD_REGISTER
            # define register 'typeOfMenu'
            1.typeOfMenu.cObject = TEXT
            1.typeOfMenu.cObject {
                # set value 1
                value = 1
                # override with 0
                override = 0
                # override only if this CONTENT is empty
                override.ifEmpty.cObject = CONTENT
                override.ifEmpty.cObject {
                    # select all CEs, from this page in column 99
                    table = tt_content
                    select {
                        pidInList.field = uid
                        where = {#colPos}=99 and deleted=0 and hidden=0
                    }
                    # render only the uid, so even an empty CE will trigger  
                    renderObj = TEXT
                    renderObj.field = uid
                } 
            }
            #99 = RESTORE_REGISTER 
        }                    

        stdWrap.typolink {              
            parameter.field =  uid
            ATagParams = class="vertical menu -- {register:typeOfMenu} --"
            ATagParams.insertData = 1

            ATagParams {
                insertData = 1
                # override the std value: 
                override = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
                override {
                    insertData = 1
                    # override only if register typeOfMenu is 1
                    stdWrap.if.equals = 1
                    stdWrap.if.data = register:typeOfMenu
                }
            }

        } 




       #stdWrap {              
       #    typolink.parameter.field =  uid
       #    typolink.ATagParams = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
       #    typolink.ATagParams.insertData = 1
       # }

        wrapItemAndSub = <li class="sanskrit-1">|</div></div></li> |*| <li>|</div></div></li> |*| <li class="last">|</div></div></li>
        after {
          stdWrap.insertData = 1
          stdWrap.wrap = <div class="dropdown-pane" id="sous-menu{register:count_MENUOBJ}" data-dropdown data-options="closeOnClick:true; hover: true; hoverPane: true"><div class="grid-x grid-padding-x">|

          # pane content  
          stdWrap.cObject = COA
          stdWrap.cObject {                                                                       
          10 = CONTENT
          10 {
            table = tt_content
            select {
              orderBy = sorting
              pidInList.field = uid
              where = {#colPos}=99  and deleted = 0 and hidden = 0
            }

            renderObj = COA
            renderObj {
              10 = TEXT
              10.stdWrap.field = bodytext
              10.stdWrap.wrap = <div class="large-12">|

              20 = FILES
              20 {
                references {
                  table = tt_content
                  uid.data = field:uid
                  fieldName = image
                }
                begin = 0
                maxItems = 1

                renderObj = IMAGE
                renderObj {
                  file {
                    import.data = file:current:originalUid // file:current:uid
                    #width = 232c
                    #height = 145c
                  }
                  required = 1
                  #wrap = <div class="img-wrap">|</div>
                  wrap = |
                }
              }
              30 = TEXT
              30.value = </div></div><div class="grid-x grid-padding-x">
            } //COA
          } //CONTENT
        } //COA
      } //after
    } //IFSUB
  } //1

我得到了一些与 colPos = 99 对应的 'typeOfMenu' 的值(颠倒过来,还不是那样),这几乎是好的,但脚本中较低的值没有考虑在内。

如果我这样做:

# let's define registers
        stdWrap.innerWrap.cObject = LOAD_REGISTER
        stdWrap.innerWrap.cObject {
            # define register 'typeOfMenu'
            typeOfMenu.cObject = TEXT
            typeOfMenu.cObject {
                # set value 1
                value = 1
                # override with 0
                override = 0
                # override only if this CONTENT is empty
                override.ifEmpty.cObject = CONTENT
                override.ifEmpty.cObject {
                    # select all CEs, from this page in column 99
                    table = tt_content
                    select {
                        pidInList.field = uid
                        where = colPos=99  and deleted=0 and hidden=0
                    }
                    # render only the uid, so even an empty CE will trigger  
                    renderObj = TEXT
                    renderObj.field = uid
                } 
            }
        }

        stdWrap.typolink{              
            parameter.field =  uid
            ATagParams = class="vertical menu -- {register:typeOfMenu} --"
            ATagParams {
                insertData = 1
                # override the std value: 
                override = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
                override {
                    insertData = 1
                    # override only if register typeOfMenu is 1
                    stdWrap.if.equals = 1
                    stdWrap.if.data = register:typeOfMenu
                }
            }
        }

我明白了:

<li class="sanskrit-1"><a href="/testtypo3-9.2.0/htdocs/index.php?id=25" class="vertical menu -- 46 --">!</a><div class="dropdown-pane" ... # DROP PANE YES
<li><a href="/testtypo3-9.2.0/htdocs/index.php?id=15" class="vertical menu -- 47 --"> ...</a> ... # DROP PANE YES
<li><a href="/testtypo3-9.2.0/htdocs/index.php?id=15" class="vertical menu -- 1 --"> ...</a> ... # NO DROP PANE
<li><a href="/testtypo3-9.2.0/htdocs/index.php?id=15" class="vertical menu -- 1 --"> ...</a> ... # NO DROP PANE
<li><a href="/testtypo3-9.2.0/htdocs/index.php?id=15" class="vertical menu -- 1 --"> ...</a> ... # NO DROP PANE

...

当它是 'typeOfMenu' = 1 时,我没有 droppane 但没有变化: override = class="dropdown shrink" data-toggle="sous-

【问题讨论】:

  • 你用的是什么版本的TYPO3?
  • typo3-9.2.0,我正在寻找你的脚本的一部分,我可以通过邮件将我所有的菜单邮寄给你吗?

标签: typo3 typoscript typo3-9.x


【解决方案1】:

您不能在 { } 的块中使用这些 TypoScript 条件。

例如这是不允许的:

lib.test {
    foo = bar

    [globalVar = TSFE:id = 10]
        foo = spam
    [global]
}

改为这样:

lib.test {
    foo = bar
}

[globalVar = TSFE:id = 10]
    lib.test.foo = spam
[global]

【讨论】:

  • 这是“typeOfMenu”变量,分配给 SQL 查询返回的值。这不是“id”……我什么都不懂,我是初学者。
  • 没关系。这只是一个例子。关键是你把那些[global...] 条件放在哪里。您不能将它们放在带有花括号的块内。你必须把它们完全放在外面。
【解决方案2】:

Typoscript 不是可以为变量赋值的编程语言。
所以你对不存在的属性的使用(你定义了倍数!)typeOfMenu 被完全忽略了。

您需要了解什么是排版:
这是一个配置标记。
您所做的只是填充一个复杂的 PHP 数组,该数组配置页面/或部分页面的呈现。

为了简化起见,您可以选择将值存储在寄存器中,以便在以后的渲染过程中使用。所以你可以避免多次计算一个值。但是您不能更改命名寄存器。

此外,您不能在打字稿条件中使用寄存器,因为在评估任何打字稿之前会评估条件 - 并且可以设置寄存器。

您可以做的是在.stdWrap.if 条件中使用寄存器值。

另一方面,您可以定义一个寄存器并根据stdWrap.if 条件决定值。

如果您使用流畅的模板而不是打字错误来构建菜单,则可以在 PHP 中使用 viewhelpers,这可能对您来说更熟悉。


编辑:

所以让我们尝试构建一个示例:

#start with pages that have subpages:
IFSUB = 1
IFSUB {
    // as we need to to the linking later no default linking:
    doNotLinkIt = 1
    # let's define registers
    stdWrap.innerWrap.cObject = LOAD_REGISTER
    stdWrap.innerWrap.cObject {
        # define register 'typeOfMenu'
        typeOfMenu.cObject = TEXT
        typeOfMenu.cObject {
            # set value 1
            value = 1
            # override with 0
            override = 0
            # override only if this CONTENT is empty
            override.ifEmpty.cObject = CONTENT
            override.ifEmpty.cObject {
                # select all CEs, from this page in column 99
                table = tt_content
                select {
                    pidInList.field = uid
                    where = colPos=99  and deleted=0 and hidden=0
                }
                # render only the uid, so even an empty CE will trigger  
                renderObj = TEXT
                renderObj.field = uid
            } 
        }
    }
    # now we link
    stdWrap.typolink{              
        parameter.field =  uid
        ATagParams = class="vertical menu -- {register:typeOfMenu} --"
        ATagParams {
            insertData = 1
            # override the std value: 
            override = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
            override {
                insertData = 1
                # override only if register typeOfMenu is 1
                stdWrap.if.equals = 1
                stdWrap.if.data = register:typeOfMenu
            }
        }
    }
}

(从内存构建,无需测试。我希望它有效)

【讨论】:

  • 很好,我理解,但这会很困难,而且我不会在不使用打字稿的情况下重做所有菜单,因为尽管(我的部分误解)我设法操作我的菜单。你有一段使用“注册”的代码让我选择合适的 .stdWrap.if 吗?
  • 我附加了一个例子。
  • 我把细节放在下面的帖子里。
  • 因为这不是您的问题/问题的答案,您应该将其添加到原始问题中。我将编辑您的问题,然后建议您删除答案(或者您可以自己删除)
  • 如果typeOfMenu 的值按1 计算,则评估顺序不正确。所以.before 的输出出现在菜单项之前,似乎是在菜单项之后计算的。由于LOAD_REGISTER 没有给出任何输出,我们可以用另一个包装来做。也许.innerWrap 而不是.before
【解决方案3】:

解决办法是:

        IFSUB = 1
    IFSUB {
        // as we need to to the linking later no default linking:
        doNotLinkIt = 1

        # let's define registers
        stdWrap.innerWrap.cObject = LOAD_REGISTER
        stdWrap.innerWrap.cObject {
            # define register 'typeOfMenu'
            typeOfMenu.cObject = TEXT
            typeOfMenu.cObject {
                # set value 1
                value = 1
                # override with 0
                override = 0
                # override only if this CONTENT is empty
                override.ifEmpty.cObject = CONTENT
                override.ifEmpty.cObject {
                    # select all CEs, from this page in column 99
                    table = tt_content
                    select {
                        pidInList.field = uid
                        where = colPos=99  and deleted=0 and hidden=0
                    }
                    # render only the uid, so even an empty CE will trigger  
                    renderObj = TEXT
                    renderObj.field = uid
                }
            }
        }
        # now we link
        stdWrap.typolink {              
            parameter.field =  uid
            ATagParams = class="dropdown shrink" data-toggle="sous-menu{register:count_MENUOBJ}"
            ATagParams {
                insertData = 1
                # override the std value: 
                #override = class="vertical menu -- {register:typeOfMenu} --"
                override = class="vertical menu"
                override {
                    #insertData = 1
                    # override only if register typeOfMenu is 1
                    if.value = 1
                    if.equals.dataWrap = {register:typeOfMenu}
                }
            }
        } ...

感谢 Bernd Wilke πφ! 最好的问候

【讨论】:

  • 因为这是一个中间结果,我已经将它附加到原始问题中
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 2019-07-29
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2020-07-10
相关资源
最近更新 更多