You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3 11.5.20:如何针对特定页面布局隐藏菜单层级子页面

解决方案:TYPO3 11.5中按页面布局隐藏特定HMENU的子页面

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结合页面布局条件实现:

  1. 先获取所有使用目标布局的页面UID
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:20:47