我正在学习TYPO3,并创建了一个包含多个子页面的网站,但是
每次单击子页面时,都会出现此错误。
An exception occurred while executing 'SELECT * FROM `tt_content` WHERE
(`tt_content`.`pid` IN (19)) AND (`colPos`=Array) AND
(`tt_content`.`sys_language_uid` = 0) AND ((`tt_content`.`deleted` = 0) AND
(`tt_content`.`t3ver_state` <= 0) AND (`tt_content`.`pid` <> -1) AND
(`tt_content`.`hidden` = 0) AND (`tt_content`.`starttime` <= 1540989540) AND
((`tt_content`.`endtime` = 0) OR (`tt_content`.`endtime` > 1540989540)) AND
(((`tt_content`.`fe_group` = '') OR (`tt_content`.`fe_group` IS NULL) OR
(`tt_content`.`fe_group` = '0') OR (FIND_IN_SET('0',
`tt_content`.`fe_group`)) OR (FIND_IN_SET('-1', `tt_content`.`fe_group`)))))
ORDER BY `sorting` ASC': Unknown column 'Array' in 'where clause'
为什么说colPos = Array?
它不应该是数字而不是数组吗?
这是在我的DynamicContent.typoscript文件中。
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
}
wrap.cObject = TEXT
wrap.cObject {
field = wrap
}
}
20 = CONTENT
20 {
table = tt_content
select {
includeRecordsWithoutDefaultTranslation = 1
orderBy = sorting
where = {#colPos}={register:colPos}
where.insertData = 1
pidInList.data = register:pageUid
pidInList.override.data = register:contentFromPid
}
stdWrap {
dataWrap = {register:wrap}
required = 1
}
}
90 = RESTORE_REGISTER
}
例如,如果我将{register:colPos}更改为0,则将加载站点,但是布局错误。你能解释一下为什么我会得到这个例外吗?
最佳答案
TYPO3中的渲染内容
您必须以一种或另一种方式将后端列映射到Fluid(变量或viewhelper)。为此,需要TypoScript。
以前,您必须在TypoScript中编写类似以下内容(请注意注释):
page = PAGE
page {
10 = FLUIDTEMPLATE
10 {
// [...]
variables {
// Add new variable of type CONTENT.
// 'colPos=0' selects all content in backend column with number '0':
leftColumn = CONTENT
leftColumn {
table = tt_content
select {
orderBy = sorting
where = colPos=0
where.insertData = 1
}
}
// Copy configuration of the first variable,
// but change the column number to '1':
rightColumn < .leftColumn
rightColumn.select.where = colPos=1
}
}
}
然后在Fluid模板中,使用此变量将内容呈现在需要的地方(简化):
<div class="row">
<div class="col-sm-6">{leftColumn}</div>
<div class="col-sm-6">{rightColumn}</div>
</div>
对于您需要的每个新列,在TypoScript中都有一个新变量要添加。想象一下总共有15列的页面布局:将所有这些都映射到Fluid会很麻烦。
新方法:
lib.dynamicContent
为了防止这种情况,发明了TypoScript Helper。它是相当新的TYPO3 Site Package Tutorial的一部分。我想您已经阅读了本教程,因为您的
lib.dynamicContent
版本是相同的。扩展版本也可以在bootstrap_package extension中找到,它也是TYPO3官方引入包的一部分。我不会在这里解释其所有选项。
因此,我将此解决方案视为TYPO3中呈现列的当前状态。
它有什么作用?
简而言之,它基本上会将内容映射到您的Fluid模板,就像上面显示的
leftColumn = CONTENT
部分一样。但这将节省您通过使用某些TypoScript函数手动映射所有列的工作。
然后,在Fluid模板中,您将使用Fluid viewhelper
f:cObject
。该viewhelper提供了与TypoScript的连接。使用data
属性,可以将值传递给此TypoScript。对于lib.dynamicContent
的基本版本,您可以传递所需的colPos编号。 (可选)您可以分配与当前页面ID不同的页面ID。然后,此TypoScript将使用它来动态构建select语句:<div class="row">
<div class="col-sm-6">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}"/>
</div>
<div class="col-sm-6">
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '1'}"/>
</div>
</div>
您的具体情况
要回答您的第一个问题,我们需要更多信息:
您使用哪个TYPO3版本?
您如何尝试渲染Fluid模板中的内容?您只在数据属性中传递了
colPos
数字吗?我试图用不同的键入错误在TYPO3 v8和v9中重现您的错误消息,但没有成功。在出现异常的所有情况下,
colPos
部分始终包含data属性的确切内容,而不是Array
。关于mysql - 为什么子页面无法加载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53083722/