【问题标题】:Typo3 9.5 - Help to understand the new Routing EnhancersTypo3 9.5 - 帮助理解新的路由增强器
【发布时间】:2018-11-07 14:35:31
【问题描述】:

我正在深入研究一个相当复杂的项目中的路线配置,但我很难理解其中的一个方面。 在https://docs.typo3.org/typo3cms/extensions/core/latest/Changelog/9.5/Feature-86365-RoutingEnhancersAndAspects.html 的示例中,“limitToPages”参数似乎非常重要。但是我如何设法获得放置插件的所有页面的路由,而无需 与其他插件或扩展产生冲突?一个例子:我有一个事件和 pois 插件。两者都有一个带有分页的列表视图。到目前为止我的配置是:

PoiPlugin:
  type: Extbase
  extension: supervendor
  plugin: pois
  routes:
  - { routePath: '/{page}', _controller: 'POI::list', _arguments: {'page': '@widget_0/currentPage'} }
  - { routePath: '/{poi_title}', _controller: 'POI::show', _arguments: {'poi_title': 'item'} }
  defaultController: 'POI::list'
  defaults:
    page: '0'
  requirements:
    page: '\d+'
    poi_title: '^[a-zA-Z0-9]'
  aspects:
    page:
      type: StaticRangeMapper
      start: '1'
      end: '100'
    poi_title:
      type: PersistedAliasMapper
      tableName: 'tx_supervendor_domain_model_poi'
      routeFieldName: 'path_segment'
EventPlugin:
  type: Extbase
  extension: supervendor
  plugin: events
  routes:
  - { routePath: '/{page}', _controller: 'Event::list', _arguments: {'page': '@widget_0/currentPage'} }
  - { routePath: '/{event_title}', _controller: 'Event::show', _arguments: {'event_title': 'item'} }
  defaultController: 'Event::list'
  defaults:
    page: '0'
  requirements:
    page: '\d+'
    event_title: '^[a-zA-Z0-9]'
  aspects:
    page:
      type: StaticRangeMapper
      start: '1'
      end: '100'
    event_title:
      type: PersistedAliasMapper
      tableName: 'tx_supervendor_domain_model_event'
      routeFieldName: 'path_segment'

现在的问题是,即使我将这些插件放在不同的页面上,它们似乎也存在冲突。因为分页链接总是采用 config.yaml 中要提到的第一个插件的命名空间。 因此,如果首先提到 PoiPlugin,则 pois 页面上的分页使用“page”参数,但事件没有。如果我更改顺序,事件会起作用,但 pois 不会。我的假设是,路由基础是 总是嵌入插件的页面。我希望你们能理解我的意思。 现在唯一有效的配置是,当我将 routePaths 更改为

- { routePath: '/pois/{page}', _controller: 'POI::list', _arguments: {'page': '@widget_0/currentPage'} }

- { routePath: '/events/{page}', _controller: 'Event::list', _arguments: {'page': '@widget_0/currentPage'} }

而且我确实理解为什么路由器必须有某种锚来识别要选择的 routePath。但我不想告诉作者,放置 PoiPlugin 的每个页面都必须命名为“Pois”。我不想限制作者在哪里以及如何使用插件,所以我不想使用 limitToPages 属性或预定义的路由前缀。 那么有没有其他的可能解决这个问题呢?

更新:解决方案 现在我通过在 routePath 中的 {page} 参数之前添加前缀来解决这个问题。我的配置似乎只有分页小部件有问题,其他一切都很好。 例如,列表路由现在看起来像这样:

- { routePath: '/e_{page}', _controller: 'Event::list', _arguments: {'page': '@widget_0/currentPage'} }
- { routePath: '/p_{page}', _controller: 'POI::list', _arguments: {'page': '@widget_0/currentPage'} }

【问题讨论】:

    标签: routing typo3 typo3-9.x


    【解决方案1】:

    也许在插件中添加一个额外的字段,它会生成一个唯一的 slug(URL 段),例如基于插件的(当时必需的)内容元素名称,然后将 slug 放在路由路径的前面(例如在页面之前) .我自己现在正在努力让页面小部件路由在 routeEnhancer 中正常工作..

    由于我允许前端创建记录,因此我目前使用的生成代码(可能会更好)类似于

    protected function createUniqueTopicSlug(\Bla\Blacommunity\Domain\Model\Topic $topic)
    {
        // Generate slug (URL segment)
        $subject = (string)$topic->getSubject();
        $trySlug = $this->slugHelper->sanitize(str_replace('/', '', $subject));
    
        // Make slug unique
        $existingSlugs = $this->topicRepository->countBySlug($trySlug);
        $slugCounter = 1;
        $slug = $trySlug;
    
        while ($existingSlugs > 0) {
            $slug = $trySlug . '-' . $slugCounter;
            $existingSlugs = $this->topicRepository->countBySlug($slug);
            $slugCounter++;
        }
    
        return $slug;
    }
    

    slugHelper 来自TYPO3\CMS\Core\DataHandling\SlugHelper 您需要对其进行调整以检查独特的蛞蝓。我认为它也有一个核心功能,但我不太了解如何将它用于自定义插件,所以我编写了自己的功能,但至少我使用了 sanetize 核心功能。但这(我认为)只有在前端创建记录时才需要,因为新的 TCA slug 类型也可以生成 slug。

    【讨论】:

    • 嗨,杰克,感谢您的评论。你为我指明了正确的方向。由于您的回答,我再次调查了蛞蝓的产生,发现可以在前面加上前缀......谢谢
    • 对于如何为自定义模型生成 slug 的问题,答案似乎是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多