Хорошая практика о том, как настроить routeEnhancers для списка и подробного просмотра ext: news? - PullRequest
0 голосов
/ 29 января 2019

Предварительное условие

Плагин просмотра списка ext: news находится на странице www.domain.com/news [ID 9], а подробный просмотр - на сайте www.domain.com/article [ID 39].

По официальному примеру (docs.typo3.org)

Я попробовал пример "Extbase Plugin Enhancer" описания функции, но это вызвало некоторые проблемы:

  • Ссылка PageBrowser на страницу 2 имеет cHash: news / list / 2? CHash = 123456789
  • Ссылка PageBrowser со страницы 2 на страницу 1 имеет множество get-параметров: news? Tx_news_pi1% 5Baction% 5D = list & tx_news_pi1% 5Bcontroller% 5D = News & cHash = 123456789.Без routeEnhancer это были бы просто «новости» без каких-либо параметров get.
  • Ссылка на подробный вид имеет cHash: article / blog / 9? CHash = 52e8a4b7c6318cfe0273e7eab374e9ae
  • URL-адреса имеютнежелательные сегменты («список» + «блог»)
  • URL-адрес acticle не содержит заголовка новости

Одной из причин некоторых из этих проблем может быть то, что paginator не указываетконтроллер в его ссылках: news? tx_news_pi1 [@ widget_0] [currentPage] = 2 & cHash = 123456789

Мой подход, который уже исправляет упомянутые проблемы

Я разделил это на два отдельных routeEnhancers (Extbase+ Плагин), удалены сегменты, «defaultController», «значения по умолчанию», «требования» и добавлены «аспекты»:

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'

Мои опасения по поводу этого подхода:

  • Я не уверен, будет ли иметь преимущество (производительность или безопасность), чтобы добавить некоторые "значения по умолчанию" и "требования", и если это действительно хорошая практика, разделить это на два отдельных routeEnhancers.
  • Ограничивает количество страниц представления списка максимум 1000 (я признаю, что это много).Более высокое значение приведет к ошибке: Диапазон больше 1000 элементов.
  • Если в заголовке новости есть косая черта (например, «Ежемесячный отчет 2018/07»), автоматически сгенерированныйpath_segment также будет содержать косую черту («month-report-2018/07»), и это приведет к следующей ошибке в представлении списка: Параметр «tx_news_pi1__news» для маршрута «tx_news_pi1_0« должен совпадать »[^ /] ++"(указывается" month-report-2018/07 ") для создания соответствующего URL.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вот копия конфигурации YAML, созданной Георгом Рингером:

site_config.yaml

Версия Георга Рингера

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
  • Дополнения для мультиязычности
  • УдаленоИдентификатор из генерации детали
  • Удален Идентификатор из генерации категории
  • Удалено / страница / из примера разбивки на страницы
  • Удалено / время / из примера даты
  • ИзмененоКонец года с «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
0 голосов
/ 08 февраля 2019

Это решило проблему нормально (внизу): https://forge.typo3.org/issues/86895#note-9

0 голосов
/ 01 февраля 2019

да, вы можете иметь их обоих в одном и том же 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'
...