TYPO3 11.5中用Fluid ViewHelper输出页面关联sys_category
TYPO3 页面分类输出问题排查与解决
1. 先查自定义ViewHelper的变量注册逻辑
自定义ViewHelper拿到数组但Fluid读不到,大概率是变量没正确注册到模板上下文。别直接给ViewHelper类赋值,必须用模板变量容器/变量提供者:
// 正确写法:用模板上下文注册变量 $variableProvider = $this->renderingContext->getVariableProvider(); $variableProvider->add('sysCategoryDetailArray', $categories); // 如果用add注册,记得在ViewHelper结尾移除(避免污染其他模板) // $variableProvider->remove('sysCategoryDetailArray');
如果你的ViewHelper是返回值类型而非注册变量,那得在Fluid里直接接收返回结果:
{vh:sysCategory(pageUid: '{articlePage.data.uid}') -> f:format.dump()}
2. 验证Fluid模板的调用细节
- 先确认模板顶部的ViewHelper命名空间声明正确:
{namespace vh=你的扩展名\ViewHelpers}
- 调用时必须在页面循环内部,且传入正确的页面UID,同时先打印数组看有没有内容:
<f:for each="{menuItems}" as="articlePage"> <vh:sysCategory pageUid="{articlePage.data.uid}"> <!-- 先dump数组确认数据存在 --> <pre>{sysCategoryDetailArray -> f:format.dump()}</pre> <f:if condition="{sysCategoryDetailArray}"> <f:for each="{sysCategoryDetailArray}" as="category"> <!-- 注意字段名是否正确,比如有的结构是category.data.title --> <span>{category.title}</span> </f:for> </f:if> </vh:sysCategory> </f:for>
别用自闭合的ViewHelper标签,要包裹内容才能访问内部注册的变量。
3. 检查ViewHelper的分类数据获取逻辑
在ViewHelper里直接打印获取到的分类数据,确认结构和字段是否正确:
use TYPO3\CMS\Core\Utility\DebugUtility; // 获取分类后立即打印验证 DebugUtility::var_dump($categories, '分类数据结构');
确保数组里确实有title字段,不是嵌套在data或其他子数组里。
4. 补全TypoScript菜单配置
如果是通过HMENU拿页面,必须开启includeData才能拿到页面的完整数据(包括分类关联字段):
lib.articleMenu = HMENU lib.articleMenu { special = directory special.value = 123 # 替换成你的父页面UID 1 = TMENU 1 { NO = 1 NO { includeData = 1 # 关键:开启页面数据包含 wrapItemAndSub = <li>|</li> } } }
5. 绕过ViewHelper的替代方案
如果ViewHelper卡壳,可以直接用TypoScript在菜单里预加载分类,不用Fluid处理:
lib.articleMenu.1.NO.stdWrap.cObject = CONTENT lib.articleMenu.1.NO.stdWrap.cObject { table = sys_category select { pidInList = root,-1 where = sys_category_record_mm.uid_foreign = {field:uid} andWhere = sys_category_record_mm.tablenames = 'pages' join = sys_category_record_mm ON sys_category_record_mm.uid_local = sys_category.uid markers { uid.data = field:uid } } renderObj = TEXT renderObj { field = title wrap = <span class="category">|</span> separator = ', ' } }
这样菜单输出时会直接带上分类标题,省得Fluid那边折腾。
内容的提问来源于stack exchange,提问作者weiss
相关产品推荐
相关产品推荐

