首页 > 解决方案 > TYPO3 v9 路由:如何使 routePath 的一部分尊重另一部分的解析值?

问题描述

我有一个 extbase 扩展,其中包含两个具有 1:n 关系的模型,国家和城市。网址应类似于http://www.example.com/countryname/cityname。城市名称在世界上并不是独一无二的,例如在德国和美国都有一个城市叫“莱比锡”。

所以我可以有两个网址

并且将“leipzig”解析为正确的uid必须尊重国家部分。

这可能与当前提供的增强器/方面有关吗?如果没有,您对如何处理这种情况有什么建议吗?

routeEnhancers:
  MyWebsitePi1:
    type: Extbase
    limitToPages: [1]
    extension: Website
    plugin: Pi1
    routes:
      - routePath: '/{country_slug}/{city_slug}'
        _controller: 'City::show'
        _arguments:
          country_slug: 'country'
          city_slug: 'city'
    defaultController: 'City::list'
    aspects:
      country_slug:
        type: PersistedAliasMapper
        tableName: 'tx_mywebsite_domain_model_country'
        routeFieldName: 'slug'
      city_slug:
        type: PersistedAliasMapper
        tableName: 'tx_mywebsite_domain_model_city'
        routeFieldName: 'slug'

标签: typo3typo3-9.x

解决方案


我认为组合弹头字段将是这里的最佳解决方案。在您的 TCA 代码中,您可以将 slug 配置为从多个 db 字段创建,而不仅仅是一个:

'slug' => [
    'exclude' => true,
    'label' => 'LLL:EXT:...',
    'config' => [
        'type' => 'slug',
        'fallbackCharacter' => '-',
        'size' => 50,
        'eval' => 'uniqueInSite',
        'generatorOptions' => [
            'fields' => ['country', 'city'],
            'fieldSeparator' => '-',
            'prependSlash' => true,
            'prefixParentPageSlug' => true,
            'replacements' => [
                '/' => '',
            ],
        ]
    ],
],

代替uniqueInSite你也可以使用uniqueInPid(见文档)。在路由 yml 配置中,只需读取 slug 字段,然后使用PersistedAliasMapper就完成了。我尚未测试使用/as 分隔符字段,但-工作正常。


推荐阅读