TYPO3 11.5.20:如何针对特定页面布局隐藏菜单层级子页面
1. 修复自定义函数调用问题(替代过时的includeLibs)
TYPO3 11.5已弃用includeLibs,需通过命名空间+PSR-4自动加载调用自定义类:
- 给PHP类添加匹配扩展结构的命名空间
- 在Typoscript中直接使用完整类名调用方法,无需
includeLibs
2. 获取父页面布局并过滤子菜单
在自定义函数中,通过$conf['parentObj']获取当前菜单项的父页面数据,从中读取布局字段,判断是否需要清空子菜单。
完整代码示例
调整后的PHP类(EXT:lraffb_intern/Classes/MenuItemArrayProcFunc.php)
<?php declare(strict_types=1); namespace Lraffb\LraffbIntern; // 替换为你的扩展命名空间,格式:Vendor\ExtensionKey class MenuItemArrayProcFunc { public function process(array $menuArr, array $conf): array { // 获取父页面的布局信息 $parentPageLayout = $conf['parentObj']->data['layout'] ?? ''; // 指定要隐藏子页面的布局标识 $targetLayout = 'pagets__left_no_subpages'; if ($parentPageLayout === $targetLayout) { return []; // 清空子菜单数组 } return $menuArr; } }
修正后的Typoscript配置(lib.ts)
lib { ... 20 = HMENU 20 { stdWrap { outerWrap = <nav class="navigation">|</nav> } entryLevel = 0 1 = TMENU 1 { wrap = <ul>|</ul> NO = 1 NO { allWrap = <li>| wrapItemAndSub = |</li> // 使用完整命名空间类名调用方法 itemArrayProcFunc = Lraffb\LraffbIntern\MenuItemArrayProcFunc->process } ACT < .NO ACT { allWrap = <li class="act">| } } 2 < .1 3 < .2 4 < .3 5 < .4 } ... }
更优雅的无代码实现思路
若无需复杂逻辑,可直接通过Typoscript的excludeUidList结合页面布局条件实现:
- 先获取所有使用目标布局的页面UID
- 在HMENU的子菜单层级中,排除这些页面的子项
示例Typoscript:
lib { // 获取所有使用指定布局的页面UID getHideSubpagesUids = CONTENT getHideSubpagesUids { table = pages select { selectFields = uid where = layout = 'pagets__left_no_subpages' max = 100 } renderObj = TEXT renderObj { field = uid separator = , } } 20 = HMENU 20 { entryLevel = 0 // 针对二级及以下菜单,排除目标页面的子项 2 = TMENU 2 { excludeUidList.cObject = TEXT excludeUidList.cObject < lib.getHideSubpagesUids // 其他TMENU配置... } 3 < .2 4 < .3 5 < .4 } }
注意:第二种方式需确保
excludeUidList能正确获取目标页面UID,适合简单场景,无需编写PHP代码。
内容的提问来源于stack exchange,提问作者StrikeAgainst
相关产品推荐
相关产品推荐

