关于如何为 ext:news 的列表和详细视图设置 routeEnhancers 的良好做法?
Good practice on how to set up routeEnhancers for list and detail view of ext:news?
先决条件
ext:news 列表视图插件在 www.domain.com/news [ID 9] 页面上,详细视图在 www.domain.com/article [ID 39].
按照官方示例(docs.typo3.org)
我尝试了功能描述中的 "Extbase Plugin Enhancer" example,但出现了一些问题:
- 第 2 页的浏览器 link 有一个 cHash:news/list/2?cHash=123456789
- 浏览器link从第2页到第1页有很多get-parameters: news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=新闻&cHash=123456789 。如果没有 routeEnhancer,它将只是 "news" 而没有任何 get-parameters.
- 详细视图的link有一个cHash:article/blog/9?cHash=52e8a4b7c6318cfe0273e7eab374e9ae
- url 有不需要的片段 ("list" + "blog")
- 行动url不包含新闻标题
其中一些问题的一个原因可能是分页器未在其 link 中指定控制器:
新闻?tx_news_pi1[@widget_0][currentPage]=2&cHash=123456789
我的方法,已经解决了提到的问题
我将其拆分为两个单独的 routeEnhancer(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'
我对这种方法的担忧:
- 我不确定添加一些 "defaults" 和 "requirements" 是否会有优势(性能或安全性),以及将其分成两个单独的 routeEnhancers 是否真的是一个好习惯。
- 它限制列表视图页面的数量最多为1000(我承认这很多)。较高的值将导致错误:范围大于 1000 项。
- 如果新闻标题中有斜杠/(f.e."月报
2018/07") 自动生成的 path_segment 也会包含
一个斜杠 ("monthly-report-2018/07"),这会导致以下内容
列表视图中的错误:Parameter "tx_news_pi1__news" for route
"tx_news_pi1_0" 必须匹配“[^/]++”(给定 "monthly-report-2018/07")
生成对应的URL.
是的,您可以将它们放在同一个 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'
这是 Georg Ringer 创建的 YAML 配置的副本:
Georg Ringer 的版本
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
很好地解决了问题(在底部):https://forge.typo3.org/issues/86895#note-9
先决条件
ext:news 列表视图插件在 www.domain.com/news [ID 9] 页面上,详细视图在 www.domain.com/article [ID 39].
按照官方示例(docs.typo3.org)
我尝试了功能描述中的 "Extbase Plugin Enhancer" example,但出现了一些问题:
- 第 2 页的浏览器 link 有一个 cHash:news/list/2?cHash=123456789
- 浏览器link从第2页到第1页有很多get-parameters: news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=新闻&cHash=123456789 。如果没有 routeEnhancer,它将只是 "news" 而没有任何 get-parameters.
- 详细视图的link有一个cHash:article/blog/9?cHash=52e8a4b7c6318cfe0273e7eab374e9ae
- url 有不需要的片段 ("list" + "blog")
- 行动url不包含新闻标题
其中一些问题的一个原因可能是分页器未在其 link 中指定控制器: 新闻?tx_news_pi1[@widget_0][currentPage]=2&cHash=123456789
我的方法,已经解决了提到的问题
我将其拆分为两个单独的 routeEnhancer(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'
我对这种方法的担忧:
- 我不确定添加一些 "defaults" 和 "requirements" 是否会有优势(性能或安全性),以及将其分成两个单独的 routeEnhancers 是否真的是一个好习惯。
- 它限制列表视图页面的数量最多为1000(我承认这很多)。较高的值将导致错误:范围大于 1000 项。
- 如果新闻标题中有斜杠/(f.e."月报 2018/07") 自动生成的 path_segment 也会包含 一个斜杠 ("monthly-report-2018/07"),这会导致以下内容 列表视图中的错误:Parameter "tx_news_pi1__news" for route "tx_news_pi1_0" 必须匹配“[^/]++”(给定 "monthly-report-2018/07") 生成对应的URL.
是的,您可以将它们放在同一个 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'
这是 Georg Ringer 创建的 YAML 配置的副本:
Georg Ringer 的版本
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
很好地解决了问题(在底部):https://forge.typo3.org/issues/86895#note-9