Typo3 v9.5LTS частичный не рендеринг

Пытаясь понять, как правильно делать шаблоны в typo3, я перешел с typo3 6.2 на typo3 v9.5, и все новое. Мне удалось использовать DCE, создать макет серверной части, и теперь я пытаюсь создать повторяющийся элемент для использования, например, на нескольких страницах с разными шаблонами.

Сравнивая новую установку typo3 с основным шаблоном, предоставленным с typo3, я вижу, что они используют файл внутри:

ext / your_template / Resources / Private / Partials / Page / Structure / Footercontent

Затем в шаблоне они отображают html-файл, который загружает элементы из домашнего шаблона (я думаю).

Здесь вы можете увидеть рендер

Моя проблема возникает, когда я пытаюсь воспроизвести это на моей собственной странице. На моей странице он не отображается, даже базовая структура html.

FooterContent.html внутри , как я показываю на этом рисунке, и вызова рендеринга в моем основном шаблоне как на этом рисунке

Home.html (шаблон)

  <f:section name="Footer">

      <f:render partial="Structure/FooterContent" arguments="{_all}" />

  </f:section>

FooterContent.html

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<section class="section footer-section footer-section-content">
  <div class="beez_footer">
    <div class="beez_footer_top beez_section">
      <div class="beez_ft_left">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '5'}" />
      </div>
      <div class="beez_ft_right">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '6'}" />
      </div>
    </div>
    <div class="beez_footer_middle beez_section">
      <div class="beez_ft_left">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '7'}" />
      </div>
      <div class="beez_ft_middle">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '8'}" />
      </div>
      <div class="beez_ft_right">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '9'}" />
      </div>
    </div>
    <div class="beez_footer_bottom beez_section">
      <div class="beez_ft_left">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '10'}" />
      </div>
      <div class="beez_ft_right">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: 11}" />
      </div>
    </div>
  </div>
</section>
</html>

setup.typoscript в (ext / your_template / Configuration / Typoscript /):

######################
#### DEPENDENCIES ####
######################
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:fluid_styled_content/Configuration/TypoScript/setup.typoscript">


################
#### HELPER ####
################
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:nubis_theme/Configuration/TypoScript/Helper/DynamicContent.typoscript">


##############
#### PAGE ####
##############
page = PAGE
page {
    typeNum = 0
    shortcutIcon = EXT:nubis_theme/Resources/Public/Icons/favicon.ico

    10 = FLUIDTEMPLATE
    10 {
        # Template names will be generated automaticly by converting the applied
        # backend_layout, there is no explicit mapping nessesary anymore.
        #
        # BackendLayout Key
        # subnavigation_right_2_columns -> SubnavigationRight2Columns.html
        #
        # Backend Record
        # uid: 1 -> 1.html
        #
        # Database Entry
        # value: -1 -> None.html
        # value: pagets__subnavigation_right_2_columns -> SubnavigationRight2Columns.html
        templateName = TEXT
        templateName {
            cObject = TEXT
            cObject {
                data = pagelayout
                required = 1
                case = uppercamelcase
                split {
                    token = pagets__
                    cObjNum = 1
                    1.current = 1
                }
            }
            ifEmpty = Default
        }
        templateRootPaths {
            0 = EXT:nubis_theme/Resources/Private/Templates/Page/
            1 = {$page.fluidtemplate.templateRootPath}
        }
        partialRootPaths {
            0 = EXT:nubis_theme/Resources/Private/Partials/Page/
            1 = {$page.fluidtemplate.partialRootPath}
        }
        layoutRootPaths {
            0 = EXT:nubis_theme/Resources/Private/Layouts/Page/
            1 = {$page.fluidtemplate.layoutRootPath}
        }
        dataProcessing {
            10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
            10 {
                references.fieldName = media
            }
            20 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
            20 {
                levels = 2
                includeSpacer = 1
                as = mainnavigation
            }
        }
    }

    meta {
        viewport = {$page.meta.viewport}
        robots = {$page.meta.robots}
        apple-mobile-web-app-capable = {$page.meta.apple-mobile-web-app-capable}
        description = {$page.meta.description}
        description {
            override.field = description
        }
        author = {$page.meta.author}
        author {
            override.field = author
        }
        keywords = {$page.meta.keywords}
        keywords {
            override.field = keywords
        }
        X-UA-Compatible = {$page.meta.compatible}
        X-UA-Compatible {
            attribute = http-equiv
        }

        # OpenGraph Tags
        og:title {
            attribute = property
            field = title
        }
        og:site_name {
            attribute = property
            data = TSFE:tmpl|setup|sitetitle
        }
        og:description = {$page.meta.description}
        og:description {
            attribute = property
            field = description
        }
        og:image {
            attribute = property
            stdWrap.cObject = FILES
            stdWrap.cObject {
                references {
                    data = levelfield:-1, media, slide
                }
                maxItems = 1
                renderObj = COA
                renderObj {
                    10 = IMG_RESOURCE
                    10 {
                        file {
                            import.data = file:current:uid
                            treatIdAsReference = 1
                            width = 1280c
                            height = 720c
                        }
                        stdWrap {
                            typolink {
                                parameter.data = TSFE:lastImgResourceInfo|3
                                returnLast = url
                                forceAbsoluteUrl = 1
                            }
                        }
                    }
                }
            }
        }
    }

    includeCSSLibs {

    }

    includeCSS {
        nubis_theme_layout = EXT:nubis_theme/Resources/Public/Css/layout.min.css
    }

    includeJSLibs {

    }

    includeJS {

    }

    includeJSFooterlibs {

    }

    includeJSFooter {
        nubis_theme_scripts = EXT:nubis_theme/Resources/Public/JavaScript/Dist/scripts.js
    }
}


################
#### CONFIG ####
################
config {
    absRefPrefix = auto
    contentObjectExceptionHandler = 0
    no_cache = {$config.no_cache}
    uniqueLinkVars = 1
    pageTitleFirst = 1
    linkVars = L
    prefixLocalAnchors = {$config.prefixLocalAnchors}
    renderCharset = utf-8
    metaCharset = utf-8
    doctype = html5
    removeDefaultJS = {$config.removeDefaultJS}
    inlineStyle2TempFile = 1
    admPanel = {$config.admPanel}
    debug = 0
    cache_period = 86400
    sendCacheHeaders = {$config.sendCacheHeaders}
    intTarget =
    extTarget =
    disablePrefixComment = 1
    index_enable = 1
    index_externals = 1
    index_metatags = 1
    headerComment = {$config.headerComment}

    // Disable Image Upscaling
    noScaleUp = 1

    // Compression and Concatenation of CSS and JS Files
    compressJs = 0
    compressCss = 0
    concatenateJs = 0
    concatenateCss = 0
}

Затем внутри своего веб-сайта я получаю только контент, который я смог отобразить из шаблона. Другими словами, все, кроме частичного рендеринга. Я не видел никаких проблем, связанных с этим, и документация от typo3 не разъясняет этого. Должно быть, я чего-то упускаю, но не знаю что.

Изменить: добавлен файл setup.typoscript (я использую настройку по умолчанию, предоставленную при установке пакета темы с: https://sitepackagebuilder.com)


person Luke Nubis    schedule 07.11.2018    source источник
comment
Можете ли вы добавить TypoScript, который вы используете для настройки шаблона (часть с FLUIDTEMPLATE)?   -  person Rudy Gnodde    schedule 07.11.2018
comment
Добавил настройку. Он должен быть по умолчанию.   -  person Luke Nubis    schedule 07.11.2018
comment
Как выглядит файл макета? Есть ли <f:render section="Footer" />   -  person René Pflamm    schedule 07.11.2018
comment
Не касался ни одного файла макета. Какая разница между макетом и партиалами?   -  person Luke Nubis    schedule 07.11.2018
comment
В файле макета указано, где отображаются ваши разделы в шаблоне.   -  person René Pflamm    schedule 07.11.2018
comment
В шаблоне по умолчанию typo3 я вижу эту часть здесь: <footer id="page-footer" class="bp-page-footer"> <f:render partial="DropIn/Structure/FooterBefore" arguments="{_all}" /> <f:render section="Footer" optional="true" /> <f:render partial="Structure/FooterMeta" arguments="{_all}" /> <f:render partial="DropIn/Structure/FooterAfter" arguments="{_all}" /> </footer> Где я определяю раздел нижнего колонтитула, чтобы все внутри него отображалось?   -  person Luke Nubis    schedule 07.11.2018


Ответы (3)


Из комментариев решение должно заключаться в том, чтобы добавить раздел в файл макета страницы по умолчанию.

По умолчанию (из sitepackagebuilder) используется файл макета, поэтому разделы, определенные в шаблоне, должны быть определены в файле макета .

В файле макета по умолчанию вы найдете только раздел "main", который отображается.

Чтобы добавить раздел Footer, поместите RenderViewHelper где-нибудь в макете:

<f:render section="Footer" />

Если вы хотите сделать это необязательным, вы можете добавить атрибут optional="true" в ViewHelper, чтобы вам не приходилось определять раздел нижнего колонтитула в каждом шаблоне, если он вам не нужен.

Структура FLUIDTEMPLATE выглядит так:

  • Templates может содержать Partials и может иметь Sections
  • Partials может содержать другие Partials
  • Layouts заключены в Templates могут отображать Sections, а также могут содержать Partials

Если вы хотите отобразить нижний колонтитул на своей глобальной странице, поместите нижний колонтитул Partial в свой Layout файл. Если вам нужен нижний колонтитул в зависимости от используемого шаблона, поместите нижний колонтитул в Section вашего шаблона и позвольте визуализировать Section в вашем Layout.

person René Pflamm    schedule 07.11.2018
comment
Это не могло быть лучше объяснено. Я понял это сам, когда вы писали этот ответ. В любом случае, вы объяснили это лучше, чем я. Большое тебе спасибо. - person Luke Nubis; 07.11.2018
comment
Я думаю, что формулировка в объяснении гибких шаблонов не так хороша («содержать» может вводить в заблуждение). Вместо того, чтобы редактировать его, я добавил еще одно более подробное объяснение в качестве ответа. - person Bernd Wilke πφ; 08.11.2018

просто для пояснения ответа Рене:

Гибкие шаблоны:

  • шаблоны - это вход в флюид. если вы вызываете жидкость, вы вызываете шаблон (<f:layout name="layoutname" />). Шаблон может определять макет; если это так, рендеринг начинается с макета

  • макеты - они призваны дать общую структуру. Это может быть достигнуто путем вставки различных разделов из определяющего шаблона и / или из партиалов.

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

разделы могут встречаться в шаблонах и частичных блоках как подблок.
Если вы вставляете такие разделы, как <f:render section="sectionname" />, этот раздел должен находиться в текущем файле - за исключением макетов, они ожидают свои разделы в шаблоне.
Если вы хотите вставить раздел из другого файла, вы можете вставить разделы только из частичного: <f:render section="sectionname" partial="partialname" />. Если вы опускаете имя раздела, вы вставляете часть целиком (<f:render partial="partialname" />)

Как правило, все вставки с f:render не передают данных (переменные жидкости), за исключением того, что макет получает все данные, известные определяющему шаблону, а раздел в шаблоне, который вставлен из макета, знает все данные исходного шаблона.
Для всех других вставок вам может потребоваться передать данные с параметром arguments f:render viewhelper:

<f:render section="sectionname" arguments="{ind1:'data1', ind2:'data2'}" />

Особый случай: вы можете передать все (известные локально) данные с помощью arguments="{_all}"

person Bernd Wilke πφ    schedule 08.11.2018
comment
спасибо за подробное объяснение, я хотел быть кратким;) - person René Pflamm; 08.11.2018

Спасибо René Pflamm и Bernd Wilke за их объяснения. Поскольку я пришел из tpyo3 v6.2, я использовал записи меток, чтобы повторить один и тот же элемент в нескольких шаблонах с помощью:

LOGO = RECORDS
LOGO.tables = tt_content
LOGO.source = 1

А затем в шаблоне

<div class="myClass">###LOGO###</div>

Это позволило мне получить некоторые элементы из папки внутри typo3, соответствующие их идентификаторам.

Я не знаю, можно ли это еще использовать, но я создал простую функцию

(находится в ext / your_theme / Configuration / Typoscript / Helper / DynamicContent.typoscript)

для использования в партиалах, где я вызываю typoscriptObjectPath="lib.dynamicContentFunction", и это позволяет мне вызывать через параметры данных идентификатор элемента, который я хотел бы отобразить. Вот пример и функция:

<f:cObject typoscriptObjectPath="lib.dynamicContentFunction" data="{Uid: '11'}" />

А ТАКЖЕ

lib.dynamicContentFunction = COA
lib.dynamicContentFunction {
    5 = LOAD_REGISTER
    5 {
        Uid.cObject = TEXT
        Uid.cObject {
            field = Uid
        }
    }
    20 = CONTENT
    20 {
        table = tt_content
        select {
            includeRecordsWithoutDefaultTranslation = 1
            orderBy = sorting
            where = {#uid}={register:Uid}
            where.insertData = 1
            pidInList = -1
            recursive = 99
        }
        stdWrap {
            dataWrap = {register:wrap}
            required = 1
        }
    }
    90 = RESTORE_REGISTER
}

Предупреждение. Если у вас много элементов, это может повлиять на скорость вашего сайта.

Кроме того, я хотел бы знать, что вы думаете, ребята. Есть лучший способ сделать это?

Цель: визуализировать определенный элемент содержимого, созданный в typo3 и доступный для редактирования оттуда, где я могу вызывать частичные элементы, выбирая их идентификатор. Функция должна искать, если возможно, на определенной странице / папке (id) с типом 3 и выбирать желаемый элемент содержимого с помощью параметров данных. Таким образом, я могу использовать редактируемый элемент нижнего колонтитула, который будет повторяться, например, на каждой странице.

person Luke Nubis    schedule 08.11.2018