为什么子页面无法加载?

时间:2018-10-31 12:48:33

标签: mysql typo3 typoscript typo3-extensions

我正在学习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,则将加载站点,但是布局错误。你能解释一下为什么我会得到这个例外吗?

2 个答案:

答案 0 :(得分:2)

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帮助器。它是非常新的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部分始终包含数据属性的确切内容,而从不包含Array

答案 1 :(得分:0)

通过在DynamicContent.typoscript中使用它来解决

lib {
content {

    get < styles.content.get

    getLeft < .get
    getLeft {
        select.where = colPos=1
    }

    getRight < .get
    getRight {
        select.where = colPos=2
        slide = -1
    }
}
}