【问题标题】:TYPO3: how to display content elements from different pagesTYPO3:如何显示来自不同页面的内容元素
【发布时间】:2020-10-22 09:58:28
【问题描述】:

希望有人知道我可以如何简化以下 TypoScript,以便我可以将模板常量中的页面 ID 列表传递给模板脚本。比如说,我定义了一个 TEASER_IDS = 6,7,9,12,4,TypeScript 遍历该列表并将其用于 select.pidInList 一个又一个,而不必在 TypoScript 中手动创建一个 CONTENT 对象每个 ID。

lib.teaser = COA
lib.teaser {  
  10 = CONTENT
  10 {
    stdWrap.wrap = <div class="part">|</div>
    table = tt_content
    select.orderBy = sorting
    select.pidInList = 6
    select.where = colPos=1
    select.languageField = sys_language_uid
  }
  20 = CONTENT
  20 {
    stdWrap.wrap = <div class="part">|</div>
    table = tt_content
    select.orderBy = sorting
    select.pidInList = 7
    select.where = colPos=1
    select.languageField = sys_language_uid
  }
}

page.50.30 < lib.teaser

是TYPO3版本10.4.8

编辑:新版本,但我希望每个元素都被包装,所以结果是

//this is what it should look like
<div class="header">CONTENT ID 6 colPos 1</div>
<div class="text">CONTENT ID 6 colPos 2</div>
<div class="header">CONTENT ID 7 colPos 1</div>
<div class="text">CONTENT ID 7 colPos 2</div>
<div class="header">CONTENT ID 4 colPos 1</div>
<div class="text">CONTENT ID 4 colPos 2</div>

TypoScript 现在:

lib.teaser = COA
lib.teaser {  
  10 = CONTENT
  10 {
    stdWrap.wrap = <div class="header">|</div>
    table = tt_content
    select.orderBy = sorting
    select.pidInList = 6,7,4
    select.where = colPos=1
    select.languageField = sys_language_uid
  }
  20 = CONTENT
  20 {
    stdWrap.wrap = <div class="text">|</div>
    table = tt_content
    select.orderBy = sorting
    select.pidInList = 6,7,4
    select.where = colPos=2
    select.languageField = sys_language_uid
  }
}

page.50.30 < lib.teaser

代码给了我,这是有道理的,但我不知道如何更改代码,所以它给了我上面提到的新代码的首选输出

//this is not what i want
<div class="header">
CONTENT ID 6 colPos 1
CONTENT ID 7 colPos 1
CONTENT ID 4 colPos 1
</div>
<div class="text">
CONTENT ID 6 colPos 2
CONTENT ID 7 colPos 2
CONTENT ID 4 colPos 2
</div>

【问题讨论】:

  • 嗯,pidInList 正是这样做的:select.pidInList = 6,7
  • 哦,是的,谢谢。确实:) 但是,我想单独包装它。比如说,目前所有的内容元素都被包装在一起。我会用一些新的来更新上面的问题,因为需要来自多个 colPos 的内容元素
  • 不要使用两个 CONTENT 对象,因为它们都会遍历所有匹配的 CE。相反,如果 colPos 具有相应的值,请使用选项覆盖 wrap
  • 请问这是如何实现的?如何检查 colPos 是否具有特定值?我认为这远远超出了我的知识范围

标签: typo3 typoscript typo3-10.x


【解决方案1】:

不要使用两个 CONTENT 对象,因为它们都会遍历所有匹配的 CE。相反,如果 colPos 具有相应的值,请使用选项覆盖换行。

stdWrap {
  wrap = <div class="text">|</div>
  override = <div class="header">|</div>
  override.if {
    value.field = colPos
    equals = 1
  }
}

(https://docs.typo3.org/m/typo3/reference-typoscript/master/en-us/Functions/If.html#if)

【讨论】:

    【解决方案2】:

    如果您想在从不同列收集内容的页面上循环,您需要在打字稿中构建此结构。

    您现在已经注意到,您从所有页面获取第 1 列的所有内容,然后从第 2 列获取所有内容。

    如何在页面 ID 上构建循环?我们在打字稿中没有for 循环,因为它是一种配置语言而不是编程语言。

    这可能通过在 id 的逗号分隔列表上进行拆分来实现。

    lib.teaser = TEXT
    lib.teaser {
        # list of page ids:
        value = 6,7,9,12,4
        split.token = ,
    
        # only one kind of rendering (otherwise use optionsplit to define cases)
        cObjNum = 1
        # example: 1 = first, 4 = last, between: 2,3 alternating
        # cObjNum = 1 |*| 2 || 3 |*| 4
        # cases of rendering:
        1 = COA
        1 {
            10 = CONTENT
            10 {
                stdWrap.wrap = <div class="part">|</div>
                table = tt_content
                select.orderBy = sorting
                # use current value of split:
                select.pidInList.current = 1
                select.where = colPos=1
                select.languageField = sys_language_uid
            }
            20 = CONTENT
            20 {
                stdWrap.wrap = <div class="part">|</div>
                table = tt_content
                select.orderBy = sorting
                select.pidInList.current = 1
                select.where = colPos=1
                select.languageField = sys_language_uid
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多