如何在Fluid模板中通过id和pid获取tx_news标签的标题
实现方案(基于TYPO3 + tx_news扩展环境)
两种最常用的实现方式,按适用场景选择即可:
方法1:使用DatabaseQueryProcessor预加载数据(性能最优,推荐)
适合固定id/pid的标签展示场景,在模板渲染前就把数据注入,不需要在模板层面做额外处理:
- 先在对应页面/模板的Typoscript配置中添加数据处理逻辑:
page.10 = FLUIDTEMPLATE page.10 { dataProcessing { # 可根据实际需求调整排序数值 20 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor 20 { table = tx_news_domain_model_tag # 填入给定的标签pid pidInList = 123 # 填入给定的标签id uidInList = 45 as = targetNewsTag } } }
- 之后在任意关联该Typoscript的Fluid模板中直接调用即可:
<f:if condition="{targetNewsTag.0}"> <span>标签名称:{targetNewsTag.0.title}</span> </f:if>
取索引
0是因为DatabaseQueryProcessor默认返回查询结果数组,单条数据固定取下标0的条目即可。
方法2:自定义ViewHelper实现灵活调用
适合需要在多个模板零散传入不同id/pid查询标签的场景:
- 首先在自己的扩展中创建ViewHelper文件,路径为
your_extension/Classes/ViewHelpers/News/GetTagTitleViewHelper.php,参考代码:
<?php namespace YourVendor\YourExtension\ViewHelpers\News; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; class GetTagTitleViewHelper extends AbstractViewHelper { public function initializeArguments() { $this->registerArgument('tagUid', 'int', 'tx_news标签的uid', true); $this->registerArgument('tagPid', 'int', 'tx_news标签的存储pid', true); } public function render() { $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('tx_news_domain_model_tag'); $title = $queryBuilder ->select('title') ->from('tx_news_domain_model_tag') ->where( $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($this->arguments['tagUid'], \PDO::PARAM_INT)), $queryBuilder->expr()->eq('pid', $queryBuilder->createNamedParameter($this->arguments['tagPid'], \PDO::PARAM_INT)) ) ->executeQuery() ->fetchOne(); return $title ?: ''; } }
- 在需要调用的Fluid模板顶部引入自己的ViewHelper命名空间,之后直接传参调用即可:
{namespace yourns = YourVendor\YourExtension\ViewHelpers} <!-- 调用示例 --> <span>标签名称:<yourns:news.getTagTitle tagUid="45" tagPid="123" /></span>
注意事项
- 不要在Fluid模板中直接编写原生SQL查询,存在性能和SQL注入风险
- 如果站点开启多语言,需要在查询条件中补充
sys_language_uid的过滤逻辑,避免返回错误语言的标签标题 - 生产环境建议给查询结果加缓存,降低重复查询的数据库压力
内容的提问来源于stack exchange,提问作者chicky
相关产品推荐
相关产品推荐

