Search code examples
routestypo3tx-newstypo3-9.x

How to handle news categories in route enhancers (TYPO3 v9)


I configured some route enhancers for the news plugin:

routeEnhancers:
  NewsPlugin:
    type: Extbase
    limitToPages: [3]
    extension: News
    plugin: Pi1
    routes:
      - { routePath: '/{news_title}', _controller: 'News::detail', _arguments: {'news_title': 'news'} }
      - { routePath: '/tag/{tag_name}', _controller: 'News::list', _arguments: {'tag_name': 'overwriteDemand/tags'}}
      - { routePath: '/category/{category_name}', _controller: 'News::list', _arguments: {'category_name': 'overwriteDemand/categories'}}
    defaultController: 'News::list'
    aspects:
      news_title:
        type: PersistedAliasMapper
        tableName: 'tx_news_domain_model_news'
        routeFieldName: 'path_segment'

For the category view I get now URL like www.mydomain.com/category/2/?cHash=1234567889

Threee questions: (1): Howto get rid of the cHash? This is not SEO friendly.

(2): Howto use the category title instead of the category uid? I tried to add an aspect:

category_name:
    type: PersistedAliasMapper
    tableName: 'sys_category'
    routeFieldName: 'path_segment'

But without success, I got an unspecific error message.

(3) How to get a translated URL like www.mydomain.com/de/kategorie/... ?

Any hints welcome.


Solution

  • The other day I found the following configuration, which incorporates all aspects of the routeEnhancers for ext:news:

    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
    

    Credits: Scopestyle who answered on stackoverflow.

    The above configuration is a modified version of Georg Ringer, which you will find here.