Good practice on how to set up routeEnhancers for list and detail view of ext:news?
Asked Answered
C

3

4

Precondition

The ext:news list view plugin is on page www.domain.com/news [ID 9] and the detail view on www.domain.com/article [ID 39].

Following the official example (docs.typo3.org)

I tried the "Extbase Plugin Enhancer" example of the feature description, but that caused some problems:

  • The pagebrowser link to page 2 has a cHash: news/list/2?cHash=123456789
  • The pagebrowser link from page 2 to page 1 has lots of get-parameters: news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=News&cHash=123456789 . Without the routeEnhancer it would just be "news" without any get-parameters.
  • The link to the detail view has a cHash: article/blog/9?cHash=52e8a4b7c6318cfe0273e7eab374e9ae
  • The urls have unwanted segments ("list" + "blog")
  • The acticle url does not contain the news title

One cause for some of this issues might be that the paginator does not specify the controller in its links: news?tx_news_pi1[@widget_0][currentPage]=2&cHash=123456789

My approach, which already fixes the mentioned problems

I splitted this to two separate routeEnhancers (Extbase + Plugin), removed the segments, "defaultController", "defaults", "requirements" and added "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'

My concerns regarding this approach:

  • I'm unsure if it would have an advantage (performance or security) to add some "defaults" and "requirements" and if it really is good practice to split this into two separate routeEnhancers.
  • It limits the amount of list view pages to a maximum of 1000 (I admit that this is a lot). A higher value will result in an error: Range is larger than 1000 items.
  • If there's a slash / in the news title (f.e. "Monthly Report 2018/07") the automatically generated path_segment will also contain a slash ("monthly-report-2018/07") and this leads to the following error in the list view: Parameter "tx_news_pi1__news" for route "tx_news_pi1_0" must match "[^/]++" ("monthly-report-2018/07" given) to generate a corresponding URL.
Coffeecolored answered 29/1, 2019 at 11:42 Comment(0)
A
5

Here is a copy of the YAML configuration created by Georg Ringer:

site_config.yaml

Version by 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}'

My Version

With the following Changes:

  • Added a trailing slash, to better match the old RealURL configuration
  • Additions for multilanguage
  • Removed ID from detail generation
  • Removed ID from category generation
  • Removed /page/ from the pagination example
  • Removed /time/ from the date example
  • Changed Year End from '2020' to '2099'
  • Overall structural improvements.
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
Abramson answered 5/2, 2019 at 14:51 Comment(7)
Thank you. This results in same issue as the other answer (from @roman-abt) and my first approach: the paginator link from page 2 to page 1 still has get-parameters: news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=News&cHash=123456789Coffeecolored
I believe this is a bug in TYPO3, and not so much in the configuration. See here: forge.typo3.org/issues/86895Abramson
@Coffeecolored I edited my answer, because I just found the code posted above, this might help you as well. As stated there is a bug with the pagination at time of writing that isn't fixed, even with the code provided by the Author of the news module. Best just to move on and wait for a core update to fix this.Abramson
Thanks, yes, this does help to understand the problem with the pagination. My version above with two separate routeEnhancers actually does not have the pagination issue, so I would consider mine as a bugfix and maybe the best solution regarding the pagination at the moment and I guess your answer is a good explanation for it. This is still not perfect – there's still the issue with the limited amount of list-view-pages.Coffeecolored
Can you make this more readable by removing irrelevant parts in the code? Everything except routeEnhancers is irrelevant here and creates confusion because it may wildly differ (e.g. languages) and often created automatically in the first place.Pash
Hi @SybillePeters I added the Georg Ringer version, and my own variation thereof, with the intent to assist anyone coming across this post and might find us useful. I clearly state what's changed, and why. And added comments to parts that might be confusing at first glance. The date and language part I thought was self-explainatory. They are all related to the news module, and it's submodules (dates, categories, tags). It's something I would have liked when I first started my initial research on the matter. Because of this I don't want to crop parts of the example. I hope you understand.Abramson
Ok, sorry about that. In the end, it's up to you, of course.Pash
M
1

yes, you can have them both in the same routeEnhancer - without the unwanted segments:

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'
Malorie answered 1/2, 2019 at 20:4 Comment(5)
Thank you for your answer! This results in same issue as my first approach above: the paginator link from page 2 to page 1 has lots of get-parameters: news?tx_news_pi1%5Baction%5D=list&tx_news_pi1%5Bcontroller%5D=News&cHash=123456789Coffeecolored
I have edited my initial question. What i ment with "my first approach above" now is "Issues when following the official example".Coffeecolored
which typo3 version are you using? my configration is working (no get parameters in pagination, detail or archive ) in 9.5.3Malorie
9.5.4.The get parameters only occur in the paginator of the list view if you are not on page 1 and click on the link to page 1 as discussed in forge.typo3.org/issues/86895Coffeecolored
thank you for pointing that out. i did indeed miss this case.Malorie
A
-1

That solved the problem fine (at the bottom): https://forge.typo3.org/issues/86895#note-9

Admissive answered 8/2, 2019 at 10:25 Comment(1)
Thanks – this comment on forge was from me. Btw. its the same like my example from my initial question above if this is "good practise" or if it can be done better.Coffeecolored

© 2022 - 2024 — McMap. All rights reserved.