在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
相关产品推荐
相关产品推荐

