Typo3 9.5-帮助您了解新的路由增强器

时间:2018-11-07 14:35:31

标签: routing typo3 typo3-9.x

在一个相当复杂的项目中,我正在深入研究路线的配置,而我努力地去了解它的一个方面。 在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页面上的分页将使用“页面”参数,但事件不会。如果我更改顺序,则事件有效,但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'} }

1 个答案:

答案 0 :(得分:0)

也许在插件上添加了一个额外的字段,例如,根据插件的内容元素名称(然后需要)生成一个唯一的段(URL段),然后将该段放在路由路径的前面(例如,在页面之前) 。我本人现在正在努力使页面小部件路线在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子类型也可以生成子。