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>
- 避免 typoscript 对象的双重呈现、双重 DB 请求等
- 避免在标签属性中使用标签语法,这在未来的 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 中进行测试和使用
我正在使用 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>
- 避免 typoscript 对象的双重呈现、双重 DB 请求等
- 避免在标签属性中使用标签语法,这在未来的 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 中进行测试和使用