简体   繁体   中英

Typo3 v9.5LTS partial not rendering

Trying to understand the right way to do templating in typo3, I came from typo3 6.2 to typo3 v9.5 and everything is new. I've achieved to use DCE, create a backend layout, and now I'm trying to create a repetitive element to use on multiple pages with different templates for instance.

Comparing with a fresh typo3 installation with the main template provided with typo3, I can see they use a file inside :

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

Then in the template, they render the html file that loads the elements from the home template (I guess).

Here you can see the render

My problem comes when I try to replicate this in my own page. It doesn't render in my page, not even the html base structure.

FooterContent.html inside as I show in this picture and the render call in my main template like in this picture

Home.html (Template)

  <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 in (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
}

Then, inside my website I get only the content I've been able to display from the template. In other words, everything except the render partial. I couldn't see any problem related to this and the documentation from typo3 doesn't clarify this. I must be missing something but I don't know what.

Edit: Added setup.typoscript (I'm using the default setup provided by when installing the theme package from: https://sitepackagebuilder.com )

From the comments the solution should be to add the section to the default page layout file.

By default (from sitepackagebuilder ) a layout file is used, so sections defined in a template must be defined in the layout file.

In the default layout file you find only a Section "main" which is rendered.

To add the Footer section, place a RenderViewHelper somewhere in your layout:

<f:render section="Footer" />

If you want to make it optional you can add the attribute optional="true" to the ViewHelper so you dont have to define the Footer Section in every Template if you dont need this.

The structure of a FLUIDTEMPLATE looks like this:

  • Templates can contain Partials and can have Sections
  • Partials can contain other Partials
  • Layouts are enclose the Templates can render Sections and can also contain Partials

If you want to render a footer to your global page, place the footer Partial in your Layout file. If you want a footer depending on the template used, place the footer in a Section of your template and let render the Section in your Layout .

just for clarification of René's answer:

Fluid Templates:

  • templates - this is the entry into fluid. if you call fluid, you call a template ( <f:layout name="layoutname" /> ). A template can determine a layout; if it does so, the rendering starts with the layout

  • layouts - they are meant to give a general structure. This can be achieved by inserting different sections from the determining template and/ or from partials.

  • partials - these are the flexible building blocks your page will be build. everytime you have a block of data which might occur more often, or which is an unit for itself, make a partial from it, so you can reuse it and structure your fluid.

sections can occur in templates and partials as a subblock.
If you insert sections like <f:render section="sectionname" /> the section is expected to be in the current file - except for layouts, they expect their sections in the template.
If you want to insert a section from another file you only can insert sections from a partial: <f:render section="sectionname" partial="partialname" /> . If you ommit the section name you insert the whole partial ( <f:render partial="partialname" /> )

In general all insertions with f:render transmit no data (fluid variables), except: a layout gets all data known to the determining template, and a section in the template which is inserted from a layout knows all data of the initial template.
For all other insertions you may need to transfer data with the arguments parameter of the f:render viewhelper:

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

A special case: you can transfer all (localy known) data with arguments="{_all}"

Thanks to René Pflamm and Bernd Wilke for their explanation. Since I came from tpyo3 v6.2, I used mark records there to repeat the same item over multiple templates with the:

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

And then in template

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

This allowed me to get some elements from a folder inside typo3 that matched their id.

I don't know if this can still be used, but I created a simple function

(located at ext/your_theme/Configuration/Typoscript/Helper/DynamicContent.typoscript)

to use in partials where I call typoscriptObjectPath="lib.dynamicContentFunction" and this allow me to call through data parameters the id of the element I'd like to render. Here's an example and the function:

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

AND

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
}

Warning: This may impact your website speed if you have many elements.

Also, I'd like to know what do you guys think. Is there a better way to do this?

Purpose: Render a determinated content element created in typo3 and editable from there where I can call in partials by selecting their id. The function must search if posible from a determinated typo3 page/folder(id) and select the desired content element through data parameters. So this way I can use an editable footer element that will repeat on every page for instance.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM