Почему не загружаются подстраницы?

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

мой второй вопрос (1-й: какая версия TYPO3?): почему вы делаете это так сложно? вместо registers вы используете только один раз, в select вы можете использовать маркеры, как показано в руководство по эксплуатации

Bernd Wilke πφ 31.10.2018 14:39

@Bernd: На самом деле решение lib.dynamicContent упрощает отображение столбцов, поскольку вам больше не нужно заботиться о каждом столбце вручную. См. Новый официальный Учебник по пакету сайта (или мой ответ).

sebkln 01.11.2018 12:37
0
2
76
2

Ответы 2

Решил это, используя это в DynamicContent.typoscript

lib {
content {

    get < styles.content.get

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

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

Это более подходящее решение традиционный, но уже не динамическое. Как я теперь вижу, вы используете свойство slide: вы тоже пробовали это с lib.dynamicContent? Как вы это использовали? Пожалуйста, измените эту информацию в своем вопросе. Также см. Мой ответ.

sebkln 01.11.2018 12:32

Рендеринг контента в TYPO3

Так или иначе, вам придется сопоставить столбец backend с 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. Я предполагаю, что вы уже прочитали это руководство, поскольку ваша версия lib.dynamicContent идентична.

Расширенная версия также может быть найдена в расширение bootstrap_package, который также является частью официального пакета TYPO3 Introduction Package. Я не буду здесь объяснять все его варианты.

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

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

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

Затем в шаблоне Fluid вы воспользуетесь помощником просмотра Fluid f:cObject. Эта программа просмотра обеспечивает подключение к 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.

Другие вопросы по теме