多语言TYPO3应用中获取新闻标题并添加至面包屑导航
嘿,针对你在多语言TYPO3应用里要获取新闻详情页标题、并把它加到面包屑导航的需求,我给你整理几个实用的方案,都是日常开发里常用的:
一、获取当前多语言新闻标题
1. 在新闻详情模板中直接获取
如果你是在EXT:news自带的Detail模板(比如EXT:news/Resources/Private/Templates/News/Detail.html)里处理,直接用 {newsItem.title} 就能拿到对应语言的标题了。EXT:news已经自动适配了URL里的L参数,newsItem对象会加载当前语言的新闻记录。
2. 在全局模板中获取(比如面包屑所在的Header模板)
如果需要在全局模板里获取新闻标题,推荐用DataProcessing在页面TS里配置,自动加载当前新闻的多语言记录:
page.10.dataProcessing { 10 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor 10 { table = tx_news_domain_model_news where = uid={GP:tx_news_pi1/news} languageField = sys_language_uid as = currentNews } }
配置后,在模板里就能通过 {currentNews.0.title} 获取当前语言的新闻标题了。这里的GP:tx_news_pi1/news会自动从URL里提取新闻ID,languageField确保加载对应L参数的语言版本。
二、将新闻标题添加到面包屑导航
方案1:扩展TYPO3默认面包屑
默认的面包屑只包含页面节点,我们可以在面包屑的Partial文件里追加新闻标题。比如你的面包屑Partial(Resources/Private/Partials/Breadcrumb.html)可以改成这样:
<ol class="breadcrumb"> <f:for each="{breadcrumbs}" as="crumb" iteration="iterator"> <li class="{f:if(condition: iterator.isLast, then: 'active')}"> <f:if condition="!iterator.isLast"> <a href="{crumb.link}">{crumb.title}</a> </f:if> <f:if condition="iterator.isLast"> {crumb.title} </f:if> </li> </f:for> <!-- 追加新闻标题(仅在新闻详情页显示) --> <f:if condition="{currentNews}"> <li class="active">{currentNews.0.title}</li> </f:if> </ol>
这段代码会先渲染默认的页面面包屑,然后判断如果当前是新闻详情页(存在currentNews),就把新闻标题加到面包屑的最后。
方案2:用VHS扩展构建面包屑
如果你项目里用了VHS扩展,构建面包屑会更灵活:
<ol class="breadcrumb"> <v:page.breadcrumb as="crumbs"> <f:for each="{crumbs}" as="crumb"> <li class="{f:if(condition: crumb.isLast, then: 'active')}"> <f:if condition="!crumb.isLast"> <a href="{crumb.link}">{crumb.title}</a> </f:if> <f:if condition="crumb.isLast"> {crumb.title} </f:if> </li> </f:for> </v:page.breadcrumb> <!-- 添加新闻标题 --> <f:if condition="{newsItem}"> <li class="active">{newsItem.title}</li> </f:if> </ol>
如果是在新闻Detail模板里,直接用{newsItem.title}即可;如果是全局模板,替换成{currentNews.0.title}就行。
注意事项
- 确保你的新闻记录已经创建了对应语言的翻译版本,否则TYPO3会 fallback 到默认语言(德语,
L=0)的标题。 - 检查URL里的
L参数是否正确传递,TYPO3会根据这个参数加载对应语言的内容。 - DataProcessing的配置可以全局生效,也可以只在新闻详情页的页面配置里生效,根据你的项目结构调整。
内容的提问来源于stack exchange,提问作者ruslansteiger

