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

在TYPO3中通过Extbase路由增强器实现禁用对象的访问

解决方案:TYPO3 Extbase路由增强器适配禁用Training实体的路由生成

针对你遇到的问题——禁用的Training实体无法被路由增强器识别生成路由,同时又不想全局破坏hidden字段的功能,这里提供几种精准的解决方案:

1. 自定义路由Aspect(推荐方案)

默认的PersistedPatternMapper会遵循TYPO3的RestrictionBuilder规则,自动过滤掉hidden/disabled的实体。我们可以通过自定义一个继承它的Aspect类,专门移除这个限制,且只作用于当前路由场景。

步骤1:创建自定义Aspect类

在你的扩展目录下新建文件:Classes/Routing/Aspect/IgnoringHiddenTrainingPatternMapper.php,代码如下:

<?php
namespace YourVendor\YourExtension\Routing\Aspect;

use TYPO3\CMS\Core\Routing\Aspect\PersistedPatternMapper;
use TYPO3\CMS\Core\Database\Query\Restriction\EnableFieldsRestriction;

class IgnoringHiddenTrainingPatternMapper extends PersistedPatternMapper
{
    protected function buildQuery(array $values): \TYPO3\CMS\Core\Database\Query\QueryBuilder
    {
        $queryBuilder = parent::buildQuery($values);
        // 移除enable字段限制(包含hidden、starttime、endtime等)
        $queryBuilder->getRestrictions()->removeByType(EnableFieldsRestriction::class);
        return $queryBuilder;
    }
}

步骤2:修改路由配置

在site/config.yaml里替换原有的Aspect类型为自定义类:

Trainee:
  limitToPages:
    - 410
  type: Extbase
  extension: extension_name_here
  plugin: plugin_name_here
  routes:
    - routePath: '/{training-identifier}'
      _controller: 'Trainee::show'
      _arguments:
        training-identifier: training
  defaultController: 'Trainee::list'
  aspects:
    training-identifier:
      type: YourVendor\YourExtension\Routing\Aspect\IgnoringHiddenTrainingPatternMapper
      tableName: tx_extensioname_domain_model_training
      routeFieldPattern: '^(?<urlslug>.+)$'
      routeFieldResult: '{urlslug}'

这个方案的优势是仅影响当前路由的生成逻辑,全局的hidden字段功能完全不受影响,是最安全的做法。

2. 细粒度控制:仅针对特定页面忽略限制

如果你需要更精准的控制——比如只在页面ID为410时忽略hidden,可以修改自定义Aspect的buildQuery方法,加入页面判断逻辑:

protected function buildQuery(array $values): \TYPO3\CMS\Core\Database\Query\QueryBuilder
{
    $queryBuilder = parent::buildQuery($values);
    // 获取当前页面ID(这里需要根据实际场景调整获取方式)
    $currentPageId = $GLOBALS['TYPO3_REQUEST']->getAttribute('site')->getRootPageId();
    // 仅在目标页面下移除enable字段限制
    if ($currentPageId === 410) {
        $queryBuilder->getRestrictions()->removeByType(EnableFieldsRestriction::class);
    }
    return $queryBuilder;
}

3. 废弃方案:全局修改TCA的问题

你之前通过$GLOBALS['TCA']['tx_extnNameHere_domain_model_training']['ctrl']['enablecolumns']['disabled'] = null;临时解决问题,但这会导致Training实体的hidden字段完全失效,所有禁用的Training都会在系统各处被显示,这显然不符合业务需求,不建议长期使用。

内容的提问来源于stack exchange,提问作者Pete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:14:19