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.
Ben
  • 811
  • 12
  • 28

3 Answers3

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
Scopestyle
  • 643
  • 5
  • 18
  • 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=123456789 – Ben Feb 05 '19 at 17:21
  • 1
    I believe this is a bug in TYPO3, and not so much in the configuration. See here: https://forge.typo3.org/issues/86895 – Scopestyle Feb 06 '19 at 06:54
  • 1
    @Ben 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. – Scopestyle Feb 06 '19 at 07:49
  • 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. – Ben Feb 06 '19 at 14:33
  • 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. – Sybille Peters Mar 04 '19 at 12:08
  • 1
    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. – Scopestyle Mar 06 '19 at 11:26
  • Ok, sorry about that. In the end, it's up to you, of course. – Sybille Peters Mar 06 '19 at 12:03
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'
Roman Abt
  • 444
  • 2
  • 9
  • 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=123456789 – Ben Feb 04 '19 at 17:03
  • I have edited my initial question. What i ment with "my first approach above" now is "Issues when following the official example". – Ben Feb 08 '19 at 15:49
  • which typo3 version are you using? my configration is working (no get parameters in pagination, detail or archive ) in 9.5.3 – Roman Abt Feb 08 '19 at 17:01
  • 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 https://forge.typo3.org/issues/86895 – Ben Feb 08 '19 at 17:17
  • thank you for pointing that out. i did indeed miss this case. – Roman Abt Feb 10 '19 at 13:34
-1

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

JKB
  • 499
  • 2
  • 13
  • 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. – Ben Feb 08 '19 at 15:35