FLUID 中的条件以检查列是否有内容

Condition within FLUID to check if column has content

我正在使用 Ben Kott 为 Typo3 9.5 提供的网站包,并将内容包含到我的流体模板中,如下所示:

<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '1'}" />

我正在尝试将其包装成一种有液体的状态,例如

<f:if condition="<f:cObject typoscriptObjectPath='lib.dynamicContent' data='{colPos: \'1\'}'">     
    whatever  
</f:if>

虽然它不起作用。我不知道是否有语法错误或不可能。

{f:cObject(typoscriptObjectPath: 'lib.dynamicContent', data: {colPos: 1}) -> f:variable(name: 'content')}
<f:if condition="{content}">
   There is content. Here it is:
   {content -> f:format.raw()}
</f:if>
  1. 避免 typoscript 对象的双重呈现、双重 DB 请求等
  2. 避免在标签属性中使用标签语法,这在未来的 Fluid 版本中可能无法实现

为后代编辑:上面代码失败的确切原因似乎是语法错误:

<f:if condition="<f:cObject typoscriptObjectPath='lib.dynamicContent' data='{colPos: \'1\'}'"> 

应该是:

<f:if condition="<f:cObject typoscriptObjectPath='lib.dynamicContent' data='{colPos: \'1\'}' />">

因为内标签没有关闭。不过,您仍然应该避免使用它——改用内联语法。在我上面的代码中,您可以删除 -> f:variable() 部分,然后表达式可以用作标签属性值。

另一种解决方案是专用的 TypoScript 对象,您可以在 Fluid if conditions 中使用它

################################################
#### COUNT CONTENT LIB FOR USAGE IN FLUID ####
################################################
#
#  EXAMPLE: amount of content elements in colPos 1 of actual PID
#  ---------------
#  <f:cObject typoscriptObjectPath="lib.countContent" data="{colPos: 1}" />
#  {f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: 1}')}
#
#  EXAMPLE: amount of content elements in more than one colPos of actual PID
#  ---------------
#  <f:cObject typoscriptObjectPath="lib.countContent" data="{colPos: '1,2'}" />
#  {f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: \'1,2\'}')}
#
#
#
#
#  Usage examples:
#  --------------
#
#  <f:if condition="{f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: 1}')}">
#      <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{pageUid: '{data.uid}', colPos: '1', wrap: '<aside class=\"l-aside\">|</aside>'}" />
#  </f:if>
#
#
#  <f:if condition="{f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: 1}')}">
#      <aside class="l-aside">
#         <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '1'}" />
#      </aside>
#  </f:if>
#
#
###############
lib.countContent = COA
lib.countContent {
    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
        select {
            selectFields = count(uid) AS counter
            where = {#colPos} IN({register:colPos})
            where.insertData = 1
            pidInList.data = register:pageUid
            pidInList.override.data = register:contentFromPid
            andWhere = (deleted = 0 AND hidden = 0)
        }

        renderObj = COA
        renderObj {
            10 = TEXT
            10 {
                data = field:counter
            }
        }
    }
    90 = RESTORE_REGISTER
}

此代码段已在不带工作区的 TYPO3 8.7 LTS 中进行测试和使用