You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3 v12自定义内容元素模板无法渲染问题求助

TYPO3 v12自定义内容元素模板无法渲染问题

我在TYPO3 v12环境中创建自定义内容元素,但模板无法正常渲染。

预期输出HTML

<header class="header">     
    <div class="af6bus__banner">Test</div>
</header>

实际输出HTML

<header class="header"></header>

已排查内容

  • 确认根页面已引入对应的TypoScript配置
  • 移除渲染注册后,出现预期的“content element has no rendering definition”错误

相关代码文件

af6bus/Resources/Private/Layouts/Default.html

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      data-namespace-typo3-fluid="true">
    <span class="anchor" id="top"></span>
    <f:render section="content" />
</html>

af6bus/Resources/Private/Templates/Default.html

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      data-namespace-typo3-fluid="true">

<f:layout name="Default" />

<f:section name="content">
    <header class="header">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '100'}" />
    </header>

    <main class="main">
        <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
    </main>

    <a href="#top" class="scroll--top"></span></a>

    <footer class="footer">

    </footer>

</f:section>
</html>

af6bus/Resources/Private/Templates/Banner.html

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
      data-namespace-typo3-fluid="true">

<f:layout name="Default" />

<f:section name="content">

    <div class="af6bus__banner">Text</div>

</f:section>

</html>

af6bus/Configuration/TypoScript/Setup/template.typoscript

page = PAGE
page {
  10 = FLUIDTEMPLATE
  10 {
    templateName = TEXT
    templateName.stdWrap {
      cObject = CASE
      cObject {

        key.data = pagelayout

        default = TEXT
        default.value = Default

        pagets__default = TEXT
        pagets__default.value = Default

        pagets__nobanner = TEXT
        pagets__nobanner.value = NoBanner
      }
    }

    layoutRootPaths {
      10 = EXT:af6bus/Resources/Private/Layouts/
    }
    templateRootPaths {
      10 = EXT:af6bus/Resources/Private/Templates/
    }
    partialRootPaths {
      10 = EXT:af6bus/Resources/Private/Partials/
    }

    variables {
      siteName = TEXT
      siteName.value = {siteLanguage:websiteTitle}
      siteName.insertData = 1
      homePid = TEXT
      homePid.value = {$homePid}
      footerPid = TEXT
      footerPid.value = {$footerPid}
    }
  }
}

lib.dynamicContent = COA
lib.dynamicContent {
  10 = LOAD_REGISTER
  10.colPos.cObject = TEXT
  10.colPos.cObject {
    field = colPos
    ifEmpty.cObject = TEXT
    ifEmpty.cObject {
      value.current = 1
      ifEmpty = 0
    }
  }
  20 = CONTENT
  20 {
    table = tt_content
    select {
      orderBy = sorting
      where = {#colPos}={register:colPos}
      where.insertData = 1
    }
  }
  90 = RESTORE_REGISTER
}

## Banner-Template
tt_content {
  af6bus_banner =< lib.dynamicContent
  af6bus_banner {
    templateName = Banner.html
    dataProcessing {
      10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
      10 {
        references.fieldName = assets
      }
    }
  }
}

问题分析与解决方案

核心问题出在自定义内容元素的TypoScript配置逻辑错误:你将tt_content.af6bus_banner继承自lib.dynamicContent,但lib.dynamicContent是用来渲染指定列下的所有内容元素集合,而非单个内容元素的独立渲染逻辑。

修正步骤

  1. 修改自定义内容元素的TypoScript配置
    将tt_content.af6bus_banner的配置替换为直接使用FLUIDTEMPLATE:
## Banner-Template
tt_content {
  af6bus_banner = FLUIDTEMPLATE
  af6bus_banner {
    templateName = Banner
    layoutRootPaths {
      10 = EXT:af6bus/Resources/Private/Layouts/
    }
    templateRootPaths {
      10 = EXT:af6bus/Resources/Private/Templates/
    }
    partialRootPaths {
      10 = EXT:af6bus/Resources/Private/Partials/
    }
    dataProcessing {
      10 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
      10 {
        references.fieldName = assets
      }
    }
  }
}
  1. 关键注意点
  • templateName只需填写Banner,无需添加.html后缀,TYPO3会自动匹配模板文件
  • 确认后台已在colPos=100的页面列中添加了af6bus_banner类型的内容元素
  • 若需要在模板中调用内容元素的自定义字段,需确保TCA中已正确定义对应字段,模板内通过{data.fieldName}访问
  1. 保留原有逻辑的合理性
    lib.dynamicContent的配置是正确的,它负责加载指定列下的所有内容元素。当你在Default.html中调用<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '100'}" />时,会自动渲染该列下包括af6bus_banner在内的所有内容元素。

内容的提问来源于stack exchange,提问作者Paradonix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:57:22