Почему не загружаются подстраницы? - PullRequest
0 голосов
/ 31 октября 2018

Я изучаю 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 голосов
/ 01 ноября 2018

Рендеринг контента в 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 , которое также является частью официального ознакомительного пакета TYPO3. Я не буду объяснять все варианты здесь.

Поэтому я рассматриваю это решение как текущее состояние визуализации столбцов в TYPO3.

Что это делает?

Короче говоря, он в основном сопоставляет контент с вашим шаблоном Fluid, как и часть leftColumn = CONTENT, показанная выше. Но это избавит вас от необходимости отображать все столбцы вручную, используя некоторые функции TypoScript.

В своем шаблоне Fluid вы затем будете использовать панель просмотра Fluid f:cObject. Этот viewhelper обеспечивает соединение с TypoScript. С атрибутом data вы можете передавать значения этому TypoScript. Для базовой версии lib.dynamicContent вы можете передать желаемый номер colPos. При желании вы можете назначить другой идентификатор страницы, чем текущий. Затем он будет использован этим 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.

0 голосов
/ 31 октября 2018

Решено с помощью этого в DynamicContent.typoscript

lib {
content {

    get < styles.content.get

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

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