TYPO3 Fluid:如何在模板中获取页面已选中的分类
在TYPO3 Fluid中获取页面已选分类的实现方法
TYPO3确实没有默认提供在Fluid中直接获取页面选中分类的方式,下面是两种可靠的实现方案:
方案一:使用官方DataProcessor(推荐)
通过TypoScript配置CategoryProcessor,将页面分类加载到模板变量中,这是官方推荐的标准做法。
- 在你的TypoScript Setup中添加如下配置:
page.10.dataProcessing { 10 = TYPO3\CMS\Frontend\DataProcessing\CategoryProcessor 10 { as = pageCategories data = page:categories } }
data = page:categories指定获取当前页面关联的分类as = pageCategories将分类集合赋值给这个变量,供Fluid模板调用
- 在Fluid模板中遍历输出分类:
<f:if condition="{pageCategories}"> <h3>页面分类</h3> <ul> <f:for each="{pageCategories}" as="category"> <li> <span class="category-title">{category.title}</span> <f:if condition="{category.description}"> <p class="category-desc">{category.description}</p> </f:if> </li> </f:for> </ul> </f:if>
除了title和description,还可以访问分类的uid、slug、parent等字段。
方案二:自定义ViewHelper(灵活扩展)
如果需要更灵活的逻辑(比如指定任意页面UID获取分类),可以自定义一个ViewHelper。
- 在你的扩展中创建ViewHelper类:
<?php namespace Vendor\YourExtension\ViewHelpers; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Frontend\Page\PageRepository; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper; class PageCategoriesViewHelper extends AbstractViewHelper { public function initializeArguments() { parent::initializeArguments(); $this->registerArgument('pageUid', 'int', '目标页面UID,默认使用当前页面', false, 0); } public function render() { $pageUid = $this->arguments['pageUid'] ?: $GLOBALS['TSFE']->id; $pageRepository = GeneralUtility::makeInstance(PageRepository::class); $pageData = $pageRepository->getPage($pageUid); // 返回分类数组,若无分类则返回空数组 return $pageData['categories'] ?? []; } }
- 在Fluid模板中使用该ViewHelper:
{namespace vh=Vendor\YourExtension\ViewHelpers} <f:if condition="{vh:pageCategories(pageUid: 123)}"> <ul> <f:for each="{vh:pageCategories(pageUid: 123)}" as="category"> <li>{category.title}</li> </f:for> </ul> </f:if>
- 先通过
{namespace}声明ViewHelper的命名空间 - 可以通过
pageUid参数指定任意页面,不填则默认当前页面
注意事项
- 确保你的TYPO3版本支持
CategoryProcessor(TYPO3 8.7及以上版本均支持) - 使用自定义ViewHelper时,需确保你的扩展已激活,且命名空间与实际路径一致
- 分类的前端访问权限需正确配置,避免分类无法被加载
内容的提问来源于stack exchange,提问作者rcheetah
相关产品推荐
相关产品推荐

