TYPO3 tx_news:如何在详情模板按类别显示关联新闻?
嘿Ralf,我刚好对tx_news的关联新闻实现挺熟悉的,给你分享个简便的方法,不用写复杂的扩展,靠内置的工具就能搞定~
最简便的实现:用tx_news内置ViewHelper
这个方法不用修改PHP代码,直接在新闻详情模板(比如News/Detail.html)里添加代码就行:
步骤1:获取当前新闻的类别ID
先把当前新闻关联的所有类别ID转成逗号分隔的字符串,方便后续查询:
<f:variable name="currentCategoryUids" value="{newsItem.categories.uid -> f:format.cseperator()}"/>
步骤2:查询并渲染同类别关联新闻
用<news:news>这个内置ViewHelper,筛选出同类别、排除当前新闻、取3条的结果:
<news:news demand="{categoryConjunction: 'OR', categories: '{currentCategoryUids}', excludeAlreadyDisplayed: 1}" limit="3" as="relatedNews"> <f:if condition="{relatedNews}"> <h3>同类别关联新闻</h3> <ul class="related-news-list"> <f:for each="{relatedNews}" as="news"> <li> <a href="{news.link}">{news.title}</a> <p>{news.teaser -> f:format.crop(maxCharacters: 120)}</p> </li> </f:for> </ul> </f:if> </news:news>
关键参数说明:
categoryConjunction: 'OR':如果当前新闻属于多个类别,只要匹配其中一个类别就会显示关联新闻excludeAlreadyDisplayed: 1:自动排除当前正在查看的这条新闻,避免重复显示limit="3":严格控制只显示3条关联新闻
进阶:自定义筛选逻辑(可选)
如果你需要更灵活的规则(比如只显示已发布的新闻、按发布时间倒序),可以手动构建Demand对象:
<f:variable name="demand" value="{f:object.create(className='GeorgRinger\\News\\Domain\\Model\\Dto\\NewsDemand')}"/> <f:setter property="categories" target="{demand}" value="{currentCategoryUids}"/> <f:setter property="categoryConjunction" target="{demand}" value="OR"/> <f:setter property="excludeAlreadyDisplayed" target="{demand}" value="1"/> <f:setter property="limit" target="{demand}" value="3"/> <f:setter property="order" target="{demand}" value="datetime DESC"/> <!-- 按发布时间最新排序 --> <!-- 渲染部分和上面一致 --> <news:news demand="{demand}" as="relatedNews"> <!-- ... 关联新闻列表代码 ... --> </news:news>
小提示
- 如果当前新闻没有关联任何类别,关联新闻区块会自动隐藏(因为
{relatedNews}为空) - 确保你的tx_news版本是较新的,旧版本可能不支持部分参数
- 同类别新闻不足3条时,会自动显示现有数量的新闻,不会出现空条目
内容的提问来源于stack exchange,提问作者Ralf
相关产品推荐
相关产品推荐

