首页 > 解决方案 > TYPO3 - 更简单的方法,将 colPos 中的内容渲染到 Fluidtemplate 中?

问题描述

官方的 TYPO3 文档解释了如何创建(或复制)并使用 alib.dynamicContent将列渲染到 Fluidtemplate 中。我不明白这个例子中到底发生了什么。TypoScript 有:

lib.dynamicContent = COA
lib.dynamicContent {
   10 = LOAD_REGISTER
   10.colPos.cObject = TEXT
   10.colPos.cObject {
      field = colPos
      ifEmpty.cObject = TEXT
      ifEmpty.cObject {
         value.current = 1
         ifEmpty = 0
      }
   }
   20 = CONTENT
   20 {
      table = tt_content
      select {
         orderBy = sorting
         where = colPos={register:colPos}
         where.insertData = 1
      }
   }
   90 = RESTORE_REGISTER
}

我在大量的 TYPO3 项目中使用了这个片段,并且经常问自己那里发生了什么。

我通过试验改变了这一点,并以:

lib {
  dynamicContent = COA
  dynamicContent {
    10 = CONTENT
    10 {
      table = tt_content
      select {
        orderBy = sorting
        where {
          data = field:colPos
          wrap = colPos=|
        }
      }
    }
  }
}

这似乎在做“完全相同”的事情——它在通过 cObject ViewHelper 调用时输出我的内容。

有人可以解释这是否或为什么这是呈现内容的更糟糕的方式吗?

这是lib.dynamicContent-doc的链接:https ://docs.typo3.org/c/typo3/cms-fluid-styled-content/master/en-us/Installation/InsertingContentPageTemplate/Index.html#based-on-the-流体模板内容对象-cobj

标签: typo3typoscript

解决方案


您应该查看此代码段以及有关流体视图帮助<f:cObject>器的一些信息,可在此处找到:https ://docs.typo3.org/other/typo3/view-helper-reference/9.5/en-us/typo3/fluid /latest/CObject.html

正如你所看到的,有参数data,这将被交给,这就是为什么这个片段非常有意义。原因是,将不同的选项放入对象的子句中有点困难。因此它增加了可读性,并且可以轻松扩展这些寄存器。currentValueKeytabletyposcriptObjectPathwhereCONTENT

因此,此示例中的寄存器用于输入字段的值,或者如果该data字段为空colPos,它将current从t 产生异常。currentValueKey0

lib.dynamicContent = COA
lib.dynamicContent {
   10 = LOAD_REGISTER
   10.colPos.cObject = TEXT
   10.colPos.cObject {
      field = colPos
      ifEmpty.cObject = TEXT
      ifEmpty.cObject {
         value.current = 1
         ifEmpty = 0
      }
   }
   20 = CONTENT
   20 {
      table = tt_content
      select {
         orderBy = sorting
         where = colPos={register:colPos}
         where.insertData = 1
      }
   }
   90 = RESTORE_REGISTER
}

我们使用该片段的修改版本来潜入CONTENT对象的更多参数值。

所以我们可以交出一个数据字段pageUid,如果没有设置,我们将使用uid当前页面的。如果当前或目标页面被配置为显示来自另一个页面的内容,这将被覆盖,最后我们可以触发带有另一个数据字段的幻灯片。

lib.dynamicContent = COA
lib.dynamicContent {
    5 = LOAD_REGISTER
    5 {
        colPos.cObject = TEXT
        colPos.cObject {
            field = colPos
            ifEmpty.cObject = TEXT
            ifEmpty.cObject {
                value.current = 1
                ifEmpty = 0
            }
        }
        pageUid.cObject = TEXT
        pageUid.cObject {
            field = pageUid
            ifEmpty.data = TSFE:id
        }
        contentFromPid.cObject = TEXT
        contentFromPid.cObject {
            data = DB:pages:{register:pageUid}:content_from_pid
            data.insertData = 1
        }
    }
    20 = CONTENT
    20 {
        table = tt_content
        slide = -1
        slide.if.isTrue.field = slide
        select {
            includeRecordsWithoutDefaultTranslation = 1
            orderBy = sorting
            where = {#colPos}={register:colPos}
            where.insertData = 1
            pidInList.data = register:pageUid
            pidInList.override.data = register:contentFromPid
        }
    }
    90 = RESTORE_REGISTER
}

这使我们能够<f:cObject>在触发其他参数的同时使用视图助手,只需在数据数组中传递更多值即可。


推荐阅读