2
votes

Bonnes pratiques sur la façon de configurer routeEnhancers pour la liste et la vue détaillée d'ext: news?

Condition préalable

Le plugin ext: news list view est sur la page www.domain.com/news [ID 9] et la vue détaillée sur www.domain.com/article [ID 39].

En suivant l'exemple officiel (docs.typo3.org)

J'ai essayé le " Extbase Plugin Enhancer "exemple de la description de la fonctionnalité, mais cela a causé quelques problèmes:

  • Le lien du navigateur de page vers la page 2 a un cHash: news / list / 2? cHash = 123456789
  • Le lien du navigateur de page de la page 2 à la page 1 contient de nombreux paramètres get: news? tx_news_pi1% 5Baction% 5D = list & tx_news_pi1% 5Bcontroller% 5D = News & cHash = 123456789. Sans routeEnhancer, ce ne serait que "news" sans aucun paramètre get.
  • Le lien vers la vue détaillée a un cHash: article / blog / 9? cHash = 52e8a4b7c6318cfe0273e7eab374e9ae
  • Les URL ont des segments indésirables ("liste" + "blog")
  • L'URL d'acticle ne contient pas le titre de l'actualité

Une des causes de certains de ces problèmes peut être que le paginateur ne spécifie pas le contrôleur dans ses liens: news? tx_news_pi1 [@ widget_0] [currentPage] = 2 & cHash = 123456789

Mon approche, qui résout déjà les problèmes mentionnés

J'ai divisé ceci en deux routeEnhancers séparés (Extbase + Plugin), supprimé les segments, "defaultController", "defaults", "requirements" et ajouté "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'

Mes préoccupations concernant cette approche:

  • Je ne sais pas s'il aurait un avantage (performances ou sécurité) à ajouter des "valeurs par défaut" et des "exigences" et s'il est vraiment bon de le diviser en deux routeEnhancers séparés.
  • Cela limite le nombre de pages d'affichage de liste à un maximum de 1000 (j'avoue que c'est beaucoup). Une valeur plus élevée entraînera une erreur: La plage est supérieure à 1 000 éléments.
  • S'il y a une barre oblique / dans le titre de l'actualité (par exemple "Rapport mensuel 2018/07 ") le path_segment généré automatiquement contiendra également une barre oblique ("rapport-mensuel-2018/07") et cela conduit à ce qui suit erreur dans la vue liste: Paramètre "tx_news_pi1__news" pour la route "tx_news_pi1_0" doit correspondre à "[^ /] ++" ("rapport-mensuel-2018/07" donné) pour générer une URL correspondante.

0 commentaires

3 Réponses :


1
votes

oui, vous pouvez les avoir tous les deux dans la même routeEnhancer - sans les segments indésirables:

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'


5 commentaires

Merci pour votre réponse! Cela entraîne le même problème que ma première approche ci-dessus: le lien paginateur de la page 2 à la page 1 a beaucoup de paramètres get: news? Tx_news_pi1% 5Baction% 5D = list & tx_news_pi1% 5Bcontroller% 5‌ D = News & cHash = 1234567‌ 89


J'ai édité ma question initiale. Ce que j'imagine avec "ma première approche ci-dessus" est maintenant "Problèmes lorsque l'on suit l'exemple officiel".


quelle version typo3 utilisez-vous? ma configuration fonctionne (pas de paramètres get dans la pagination, le détail ou l'archive) dans 9.5.3


9.5.4.Les paramètres get n'apparaissent dans le paginateur de la vue liste que si vous n'êtes pas sur la page 1 et cliquez sur le lien vers la page 1 comme indiqué dans forge.typo3.org/issues/86895


Merci d'avoir fait remarquer cela. J'ai en effet manqué cette affaire.



3
votes

Voici une copie de la configuration YAML créée par Georg Ringer:

site_config.yaml a>

Version de Georg Ringer

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

Ma version

Avec les modifications suivantes:

  • Ajout d'une barre oblique à la fin, pour mieux correspondre à l'ancienne configuration RealURL
  • Ajouts pour le multilingue
  • ID supprimé de la génération des détails
  • ID supprimé de la génération de catégorie
  • Supprimé / page / de l'exemple de pagination
  • Supprimé / time / de l'exemple de date
  • Fin d'année modifiée de «2020» à «2099»
  • Améliorations structurelles globales.
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}'


7 commentaires

Je vous remercie. Cela entraîne le même problème que l'autre réponse (de @ roman-abt) et ma première approche: le lien paginateur de la page 2 à la page 1 a toujours des paramètres get: news? Tx_news_pi1% 5Baction% 5D = list & tx_news_pi1% 5Bcontroller% 5‌ D = Actualités & cHash = 1234567‌ 89


Je crois que c'est un bug dans TYPO3, et pas tellement dans la configuration. Voir ici: forge.typo3.org/issues/86895


@Ben j'ai édité ma réponse, car je viens de trouver le code affiché ci-dessus, cela pourrait aussi vous aider. Comme indiqué, il y a un bogue avec la pagination au moment de l'écriture qui n'est pas corrigé, même avec le code fourni par l'auteur du module de nouvelles. Il est préférable de passer à autre chose et d'attendre une mise à jour principale pour résoudre ce problème.


Merci, oui, cela aide à comprendre le problème de la pagination. Ma version ci-dessus avec deux routeEnhancers séparés n'a en fait pas le problème de pagination, donc je considérerais la mienne comme un correctif et peut-être la meilleure solution concernant la pagination pour le moment et je suppose que votre réponse en est une bonne explication. Ce n'est toujours pas parfait - il y a toujours le problème avec le nombre limité de pages vues de liste.


Pouvez-vous rendre cela plus lisible en supprimant les parties non pertinentes du code? Tout sauf routeEnhancers n'est pas pertinent ici et crée de la confusion car il peut être très différent (par exemple, les langues) et souvent créé automatiquement en premier lieu.


Salut @SybillePeters J'ai ajouté la version de Georg Ringer, et ma propre variante de celle-ci, dans le but d'aider quiconque rencontre ce message et pourrait nous trouver utile. J'énonce clairement ce qui a changé et pourquoi. Et ajouté des commentaires sur des parties qui pourraient être déroutantes à première vue. La partie de date et de langue que je pensais était auto-explicative. Ils sont tous liés au module de nouvelles, et à ses sous-modules (dates, catégories, balises). C'est quelque chose que j'aurais aimé quand j'ai commencé mes premières recherches sur le sujet. Pour cette raison, je ne veux pas recadrer des parties de l'exemple. J'espère que tu comprends.


Ok, désolé pour ça. En fin de compte, c'est à vous, bien sûr.



-1
votes

Cela a bien résolu le problème (en bas): https: // forge. typo3.org/issues/86895#note-9


1 commentaires

Merci - ce commentaire sur forge venait de moi. Btw. C'est la même chose que mon exemple de ma question initiale ci-dessus si c'est une "bonne pratique" ou si cela peut être mieux fait.