2

我正在深入研究一个相当复杂的项目中的路线配置,我很难理解其中的一个方面。在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'} }
4

1 回答 1

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 您需要调整它以检查唯一的 slug。我认为它也有一个核心功能,但我不太了解如何将它用于自定义插件,所以我编写了自己的功能,但至少我使用了 sanetize 核心功能。但这(我认为)只有在前端创建记录时才需要,因为新的 TCA slug 类型也可以生成 slug。

于 2018-11-09T11:10:08.390 回答