关于如何为 ext:news 的列表和详细视图设置路由增强器的良好实践?

Ben*_*Ben 4 typo3 extbase typo3-extensions tx-news typo3-9.x

前提

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

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

我尝试了功能描述的“Extbase插件增强器”示例,但这引起了一些问题:

  • 页面浏览器链接到第 2 页有一个 cHash:news/list/2?cHash=123456789
  • 从第 2 页到第 1 页的 pagebrowser 链接有很多获取参数: 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

我的方法,已经解决了提到的问题

我将其拆分为两个单独的路由增强器(Extbase + 插件),删除了“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'
Run Code Online (Sandbox Code Playgroud)

我对这种方法的担忧:

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

Sco*_*yle 5

以下是 Georg Ringer 创建的 YAML 配置的副本:

\n\n

站点配置.yaml

\n\n

乔治·林格版本

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

我的版本

\n\n

进行以下更改:

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