【问题标题】:Good practice on how to set up routeEnhancers for list and detail view of ext:news?关于如何为 ext:news 的列表和详细视图设置 routeEnhancers 的良好做法?
【发布时间】:2019-06-22 12:51:42
【问题描述】:

前提条件

ext:news 列表视图插件位于 www.domain.com/news [ID 9] 页面和 www.domain.com/article [ID 39] 页面上的详细视图。

按照官方示例(docs.typo3.org)

我尝试了功能描述的"Extbase Plugin Enhancer" example,但这导致了一些问题:

  • 页面浏览器链接到第 2 页有一个 cHash:news/list/2?cHash=123456789
  • 从第 2 页到第 1 页的页面浏览器链接有很多获取参数:news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=News&cHash=123456789。如果没有 routeEnhancer,它只会是没有任何获取参数的“新闻”。
  • 详细视图的链接有一个 cHash:article/blog/9?cHash=52e8a4b7c6318cfe0273e7eab374e9ae
  • 网址包含不需要的段(“列表”+“博客”)
  • acticle url 不包含新闻标题

其中一些问题的一个原因可能是分页器未在其链接中指定控制器: news?tx_news_pi1[@widget_0][currentPage]=2&cHash=123456789

我的方法,已经解决了上述问题

我将其拆分为两个单独的 routeEnhancers(Extbase + Plugin),删除了“defaultController”、“defaults”、“requirements”这些段并添加了“aspects”:

routeEnhancers:
  NewsDetail:
    type: Extbase
    limitToPages: [39]
    extension: News
    plugin: Pi1
    routes:
      - { routePath: '/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }
    aspects:
      news_title:
        type: PersistedAliasMapper
        tableName: 'tx_news_domain_model_news'
        routeFieldName: 'path_segment'
  NewsList:
    type: Plugin
    limitToPages: [9]
    routePath: '/{@widget_0/currentPage}'
    namespace: 'tx_news_pi1'
    aspects:
      '@widget_0/currentPage':
        type: StaticRangeMapper
        start: '1'
        end: '1000'

我对这种方法的担忧:

  • 我不确定添加一些“默认值”和“要求”是否具有优势(性能或安全性),以及将其拆分为两个单独的路由增强器是否真的是一种好习惯。
  • 它将列表视图页面的数量限制为最多 1000 个(我承认这是很多)。较高的值将导致错误:范围大于 1000 项。
  • 如果新闻标题中有斜线 / (例如“月报 2018/07") 自动生成的 path_segment 也将包含 斜线(“monthly-report-2018/07”),这导致以下内容 列表视图中的错误:路由的参数“tx_news_pi1__news” “tx_news_pi1_0”必须匹配“[^/]++”(给出“monthly-report-2018/07”) 生成相应的 URL。

【问题讨论】:

    标签: typo3 extbase tx-news typo3-extensions typo3-9.x


    【解决方案1】:

    很好地解决了问题(在底部):https://forge.typo3.org/issues/86895#note-9

    【讨论】:

    • 谢谢 - 这个关于 forge 的评论来自我。顺便提一句。如果这是“好的做法”或者可以做得更好,它就像我上面最初问题中的例子一样。
    【解决方案2】:

    这是由 Georg Ringer 创建的 YAML 配置的副本:

    site_config.yaml

    乔治·林格的版本

    rootPageId: 1
    base: 'http://t3-master.vm/'
    languages:
      -
        title: German
        enabled: true
        languageId: '0'
        base: /
        typo3Language: de
        locale: de
        iso-639-1: de
        navigationTitle: DE
        hreflang: ''
        direction: ltr
        flag: de
        googleAnalyticsReportClientId: xxx
        googleAnalyticsReportSiteId: yyyy
      -
        languageId: '1'
        title: English
        siteTitle: ''
        navigationTitle: English
        base: /en/
        locale: en
        iso-639-1: en
        hreflang: en
        direction: ''
        typo3Language: default
        flag: gb
        fallbackType: strict
    errorHandling: {  }
    baseVariants: {  }
    xxxx: "as\r\ndas\"\r\nas"
    routes: {  }
    googleTagManager: ''
    logo: ''
    googleAnalyticsReportClientId: 778798369619-fl4nav20thdvfv2hag2lntf2cg1o2d79.apps.googleusercontent.com
    googleAnalyticsReportSiteId: 'ga:136091502'
    routeEnhancers:
      NewsPlugin:
        type: Extbase
        limitToPages:
          - 25
        extension: News
        plugin: Pi1
        routes:
          -
            routePath: '/{news_title}'
            _controller: 'News::detail'
            _arguments:
              news_title: news
          -
            routePath: '/page/{page}'
            _controller: 'News::list'
            _arguments:
              page: '@widget_0/currentPage'
          -
            routePath: '/time/{year}-{month}'
            _controller: 'News::list'
            _arguments:
              year: overwriteDemand/year
              month: overwriteDemand/month
          -
            routePath: '/category/{category}'
            _controller: 'News::list'
            _arguments:
              category: overwriteDemand/categories
        defaultController: 'News::list'
        defaults:
          page: '0'
          year: ''
          month: ''
        requirements:
          news_title: '^[a-zA-Z0-9].*$'
          page: \d+
        aspects:
          news_title:
            type: PersistedAliasMapper
            tableName: tx_news_domain_model_news
            routeFieldName: path_segment
          page:
            type: StaticRangeMapper
            start: '1'
            end: '100'
          year:
            type: StaticRangeMapper
            start: '1970'
            end: '2020'
          month:
            type: StaticValueMapper
            map:
              january: '01'
              february: '02'
              march: '03'
              april: '04'
              may: '05'
              june: '06'
              july: '07'
              august: '08'
              september: '09'
              october: 10
              november: 11
              december: 12
          category:
            type: PersistedPatternMapper
            tableName: sys_category
            routeFieldPattern: '^(?P<title>.+)-(?P<uid>\d+)$'
            routeFieldResult: '{title}-{uid}'
    

    我的版本

    有以下变化:

    • 添加了尾部斜杠,以更好地匹配旧的 RealURL 配置
    • 多语言补充
    • 从详细信息生成中删除了 ID
    • 从类别生成中删除了 ID
    • 从分页示例中删除 /page/
    • 从日期示例中删除 /time/
    • 将年终从“2020”更改为“2099”
    • 整体结构改进。
    routeEnhancers:
        PageTypeSuffix:
          type: PageType
          default: '/'
          index: '/'
          map:
            '/': 0
        NewsPlugin:
            type: Extbase
            extension: News
            plugin: Pi1
            limitToPages: [33,59]
            routes:
              # Detail view:
              - routePath: '/{news_title}'
                _controller: 'News::detail'
                _arguments: {'news_title': 'news'}
              # Categories:
              - routePath: '/{category}'
                _controller: 'News::list'
                _arguments: {'category': 'overwriteDemand/categories'}
              # Tags:
              - routePath: '/{tag_name}'
                _controller: 'News::list'
                _arguments: {'tag_name': 'overwriteDemand/tags'}    
              # Pagination:
              - routePath: '/{page}'
                _controller: 'News::list'
                _arguments: {'page': '@widget_0/currentPage'}
              # Archive:
              - routePath: '/{localized_archive}/{year}/{month}'
                _controller: 'News::archive'
              # Date:
              - routePath: '/{year}-{month}'
                _controller: 'News::list'
                _arguments:
                  year: overwriteDemand/year
                  month: overwriteDemand/month
            defaultController: 'News::list'
            defaults:
                page: '0'
                year: ''
                month: ''           
            requirements:
                page: '\d+'
                news_title: '^[a-zA-Z0-9].*$'
            aspects:
                page:
                    type: StaticRangeMapper
                    start: '1'
                    end: '100'
                news_title:
                    type: PersistedPatternMapper
                    tableName: tx_news_domain_model_news
                    routeFieldPattern: '^(?P<path_segment>.+)$'
                    routeFieldResult: '{path_segment}'
                category:
                    type: PersistedAliasMapper
                    tableName: 'sys_category'
                    routeFieldName: 'title'
                tag_name:
                    type: PersistedAliasMapper
                    tableName: 'tx_news_domain_model_tag'
                    routeFieldName: 'title'
                localized_archive:
                    type: LocaleModifier
                    default: 'archive'
                    routeFieldName: 'title'
                    localeMap:
                      - languageId: 'de_.*'
                        value: 'archiv'
                      - languageId: 'fr_.*'
                        value: 'archives'
                year:
                    type: StaticRangeMapper
                    start: '1970'
                    end: '2099'
                month:
                    type: StaticValueMapper
                    map:
                      january: '01'
                      february: '02'
                      march: '03'
                      april: '04'
                      may: '05'
                      june: '06'
                      july: '07'
                      august: '08'
                      september: '09'
                      october: 10
                      november: 11
                      december: 12
                    localeMap:
                      - locale: 'de_.*'
                        map:
                          januar: '01'
                          februar: '02'
                          maerz: '03'
                          april: '04'
                          mai: '05'
                          juni: '06'
                          juli: '07'
                          august: '08'
                          september: '09'
                          oktober: 10
                          november: 11
                          dezember: 12
                      - locale: 'fr_.*'
                        map:
                          janvier: '01'
                          février: '02'
                          mars: '03'
                          avril: '04'
                          mai: '05'
                          juin: '06'
                          juillet: '07'
                          aout: '08'
                          septembre: '09'
                          octobre: 10
                          novembre: 11
                          décembre: 12
    

    【讨论】:

    • 谢谢。这导致与其他答案(来自@roman-abt)和我的第一种方法相同的问题:从第 2 页到第 1 页的分页器链接仍然具有获取参数:news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=新闻&cHash=123456789
    • 我相信这是 TYPO3 中的错误,而不是配置中的错误。见这里:forge.typo3.org/issues/86895
    • @Ben 我编辑了我的答案,因为我刚刚找到了上面发布的代码,这也可能对您有所帮助。如前所述,在撰写本文时存在一个未修复的分页错误,即使新闻模块的作者提供的代码也是如此。最好继续等待核心更新来解决这个问题。
    • 谢谢,是的,这确实有助于理解分页问题。我上面带有两个单独的 routeEnhancers 的版本实际上没有分页问题,​​所以我认为我的版本是一个错误修复,也许是目前关于分页的最佳解决方案,我想你的答案是一个很好的解释。这仍然不完美 - 列表视图页面数量有限仍然存在问题。
    • 您能否通过删除代码中不相关的部分来使其更具可读性?除了 routeEnhancers 之外的所有内容在这里都是无关紧要的,并且会造成混乱,因为它可能有很大的不同(例如语言)并且通常首先是自动创建的。
    【解决方案3】:

    是的,您可以将它们都放在同一个 routeEnhancer 中 - 没有不需要的段:

    routeEnhancers:
     NewsPlugin:
      type: Extbase
      limitToPages:
        - 9
        - 39 
      extension: News
      plugin: Pi1
      routes:
        -
         routePath: '/{page}'
         _controller: 'News::list'
         _arguments:
           page: '@widget_0/currentPage'
        -
         routePath: '/{news_title}'
         _controller: 'News::detail'
         _arguments:
           news_title: news
      defaultController: 'News::list'
      defaults:
       page: '0'
      aspects:
       news_title:
        type: PersistedAliasMapper
        tableName: tx_news_domain_model_news
        routeFieldName: path_segment
       page:
        type: StaticRangeMapper
        start: '1'
        end: '999'
    

    【讨论】:

    • 感谢您的回答!这导致与我上面的第一种方法相同的问题:从第 2 页到第 1 页的分页器链接有很多获取参数:news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=News&cHash=123456789
    • 我已经编辑了我最初的问题。我现在对“我上面的第一种方法”的看法是“遵循官方示例时的问题”。
    • 您使用的是哪个typo3 版本?我的配置在 9.5.3 中正常工作(分页、详细信息或存档中没有获取参数)
    • 9.5.4.get 参数仅出现在列表视图的分页器中,如果您不在第 1 页并单击第 1 页的链接,如forge.typo3.org/issues/86895中所述
    • 感谢您指出这一点。我确实错过了这个案子。
    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2020-12-18
    相关资源
    最近更新 更多