用于自定义TYPO3扩展的RouteEnhancer:详细信息页面上的404

时间:2020-09-21 09:35:36

标签: typo3 typo3-9.x

我有一个自定义的extbase扩展,它可以查询ReST服务中的只读数据,以列表和详细信息视图的形式显示它们。 TYPO3表中没有数据。 这些网址是由realURL处理的,直到TYPO3 8都可以正常工作。

现在我正在更新到TYPO3 9.5.21,我无法获取routeEnhancer配置来使此扩展正常工作。我设法为TYPO3 9上的详细信息视图获取完全相同的URL,但是详细信息视图返回404错误:“ TYPO3 \ CMS \ Core \ Error \ Http \ PageNotFoundException:请求的页面不存在”

这是config.yaml:

...
routeEnhancers:
  ...
  News:
    ...
  CDP_Gemeinden:
    type: Extbase
# Pages containing list/detail-plugin
    limitToPages:
      - 43336
      - 11082
# From registerPlugin @ ext_tables.php
# Extension key is dvt_cdp
    extension: DvtCdp
# From configurePlugin @ ext_localconf.php
    plugin: CdpGemeinden
    routes:
      - { routePath: '/gemeinde/{gemoestat}/', _controller: 'Gemeinden::show', _arguments: {'gemoestat': 'gemoestat'} }
    defaultController: 'Gemeinden::search'
    requirements:
      gemoestat: '\d+'
    aspects:
      gemoestat:
        type: StaticRangeMapper
        start: '70100'
        end: '70999'

在第43336和11082页上放置了可处理列表视图和详细信息视图的插件。 “ gemoestat”是城市的唯一ID。到详细视图的链接是在列表视图模板中创建的:

<f:link.action arguments="{gemoestat:gemeinde.gemoestat}" action="show">

此URL在TYPO3 9(和TYPO 8)上有效,而没有routeEnhancer:

.../?tx_dvtcdp_cdpgemeinden%5Baction%5D=show&tx_dvtcdp_cdpgemeinden%5Bcontroller%5D=Gemeinden&tx_dvtcdp_cdpgemeinden%5Bgemoestat%5D=70701&cHash=8cabee37a20f804e94e2af1e9f2ce02d

这是可在TYPO3 8上使用的URL,现在如果我激活routeEnhancer并同时导致404错误,则会生成该URL:

.../gemeinden/gemeinde/70701/

有什么想法吗?在没有routeEnhancer的情况下,细节视图可以正常工作,因此我认为扩展不是问题,而是routeEnhancer配置。

3 个答案:

答案 0 :(得分:0)

也许您的数据系统文件夹不在根页面pagetree中。看到这里:https://forge.typo3.org/issues/91235

答案 1 :(得分:0)

再次在routeenhancer设置中检查扩展和插件的值。特别是表示法,大写,小写并与registerPlugin参数进行比较。经验表明,这是犯大多数错误的地方:) ..我的错误

答案 2 :(得分:0)

对于外部数据,我们需要一个自己的方面来返回值。试试这个

config.yaml

routeEnhancers:
  CDPGemeinden:
    type: Extbase
    extension: DvtCdp
    plugin: CdpGemeinden
    routes:
      - routePath: 'gemeinde/{gemoestat}/'
        _controller: 'Gemeinden::show'
        _arguments:
          gemoestat: 'gemoestat'
    aspects:
      gemoestat:
        type: GemoestatMapper

EXT:dvt_cdp / Classes / Routing / Aspect / GemoestatMapper.php

<?php
namespace Dvt\Cdp\Routing\Aspect;

use TYPO3\CMS\Core\Routing\Aspect\StaticMappableAspectInterface;

/**
 * Aspect that maps external gemoestat unique ID
 */
class GemoestatMapper implements StaticMappableAspectInterface
{

    /**
     * @inheritDoc
     */
    public function generate(string $value): ?string
    {
        return $value;
    }

    /**
     * @inheritDoc
     */
    public function resolve(string $value): ?string
    {
        return isset($value) ? (string)$value : null;
    }
}

EXT:dvt_cdp / ext_localconf.php

// Add routing aspect
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['GemoestatMapper'] =
    \Dvt\Cdp\Routing\Aspect\GemoestatMapper::class;