Zum Hauptinhalt springen Skip to page footer

TYPO3 News System - Verwenden Sie Routing zum Umschreiben von URLs

| Tutorial | TYPO3 12

Erfahren Sie, wie Sie Routing-Enhancer und -Aspects verwenden, um URLs der Erweiterung News system neu zu schreiben. Die aktuelle TYPO3-Version erfordert keine Erweiterungen von Drittanbietern wie RealURL oder CoolUri mehr, um URLs neu zu schreiben und für Menschen lesbar zu machen.

Umschreiben von URLs mit News-Parametern

Beim Einrichten Ihrer Seite sollten Sie bereits eine Site-Konfiguration erstellt haben. Sie können dies im Backend-Modul Site Managements > Sites tun.

Ihre Website-Konfiguration wird in /config/sites/<Ihre_Kennung>/config.yaml gespeichert. Die folgende Konfiguration sollte auf diese Datei angewendet werden. 

Alle URL-Parameter können mit den Routing Enhancern und Aspects umgeschrieben werden und dann manuell in der config.yaml hinzugefügt werden:

  1. Fügen Sie einen Abschnitt routeEnhancers hinzu, falls noch keiner vorhanden ist.
  2. Wählen Sie einen eindeutigen Bezeichner für Ihren Routing Enhancer. Er muss nicht mit einem Erweiterungsschlüssel übereinstimmen.
  3. type: Für Nachrichten wird der Extbase Plugin Enhancer (Extbase) verwendet.
  4. extension: der Schlüssel der Erweiterung, konvertiert in UpperCamelCase.
  5. plugin: Der Plugin-Name von news ist einfach Pi1.
  6. Danach konfigurieren Sie individuelle Routen und Aspekte je nach Anwendungsfall.
/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  News:
    type: Extbase
    extension: News
    plugin: Pi1
    # routes and aspects werden hier folgen

Tipp

Wenn das Routing nicht wie erwartet funktioniert, überprüfen Sie die Einrückung Ihrer Konfigurationsblöcke. Die richtige Einrückung ist in YAML wichtig. 

Verwendung von limitToPages

Es wird empfohlen, routeEnhancers auf die Seiten zu beschränken, auf denen sie benötigt werden. Dadurch wird die Leistung bei der Erstellung von Seitenrouten für alle anderen Seiten beschleunigt.

/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  News:
    type: Extbase
    limitToPages:
      - 8
      - 10
      - 11
    extension: News
    plugin: Pi1
    # routes and aspects werden hier folgen

Mehrere routeEnhancers für News

Wenn Sie die News-Erweiterung für verschiedene Zwecke auf derselben Website verwenden (z. B. für Nachrichten und Veranstaltungen), möchten Sie möglicherweise unterschiedliche URL-Pfade für diese verwenden (z. B. /article/ und /event/). Es ist möglich, mehr als eine Routing-Erweiterung für das News-Plugin auf derselben Website zu konfigurieren.

Verwenden Sie limitToPages, um die entsprechende Konfiguration den gewünschten Seiten zuzuweisen.

/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  News:
    type: Extbase
    limitToPages:
      - 8
      - 10
      - 11
    extension: News
    plugin: Pi1
    # etc.
  NewsEvents:
    type: Extbase
    limitToPages:
      - 17
      - 18
    extension: News
    plugin: Pi1
    # etc.

Über routes und aspects

Kurz und bündig:

routes erweitern eine bestehende Route (d.h. Ihre Domain und Ihr Seitenpfad) mit Argumenten aus GET-Parametern, wie das folgende Controller/Aktionspaar der News-Detailansicht.

aspects können verwendet werden, um diese Argumente zu ändern. Sie könnten beispielsweise den Titel (oder besser: das optimierte Pfadsegment) der aktuellen Nachricht mappen. Je nach Fall stehen verschiedene Arten von Mappern und Modifikatoren zur Verfügung.

1. URL der Detailseite ohne Routing:
https://www.example.com/news/detail?tx_news_pi1[action]=detail&tx_news_pi1[controller]=News&tx_news_pi1[news]=5&cHash=
2. URL der Detailseite mit routes:
https://www.example.com/news/detail/5?cHash=
3. URL der Detailseite mit routes und aspects
https://www.example.com/news/detail/title-of-news-article

Im folgenden Beispiel wird nur das Routing für die Detailansicht dargestellt:

/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  News:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      - routePath: '/{news-title}'
        _controller: 'News::detail'
        _arguments:
          news-title: news
    aspects:
      news-title:
        type: NewsTitle

Bitte beachten Sie den Platzhalter {news-title}:

  1. Zunächst weisen Sie in _arguments den Wert des news-Parameters (tx_news_pi1[news]) zu.
  2. Anschließend fügen Sie ihn in routePath der bestehenden Route hinzu.
  3. Zuletzt verwenden Sie aspects, um das path_segment des angegebenen Arguments abzubilden.

Sowohl routes als auch aspects sind nur innerhalb des aktuellen Routing Enhancers verfügbar.

Die Namen der Platzhalter sind frei wählbar.

Gemeinsame routeEnhancer-Konfigurationen

Grundlegende Einrichtung (einschließlich Kategorien, Tags und dem RSS/Atom-Feed)

Voraussetzungen:

Die Plugins für die List View und die Detail View befinden sich auf separaten Seiten.

Wenn Sie die Plugins Category Menu oder Tag List zum Filtern von Nachrichtensätzen verwenden, werden deren Titel (Slugs) verwendet.

Ergebnis:

Detail-Ansicht: www.example.com/news/detail/the-news-title

Paginierung: www.example.com/news/page-2

Kategorie-Filter: www.example.com/news/my-category

Tag-Filter: www.example.com/news/my-tag

/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  News:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      - routePath: '/'
        _controller: 'News::list'
      - routePath: '/page-{page}'
        _controller: 'News::list'
        _arguments:
          page: 'currentPage'
      - routePath: '/{news-title}'
        _controller: 'News::detail'
        _arguments:
          news-title: news
      - routePath: '/{category-name}'
        _controller: 'News::list'
        _arguments:
          category-name: overwriteDemand/categories
      - routePath: '/{tag-name}'
        _controller: 'News::list'
        _arguments:
          tag-name: overwriteDemand/tags
    defaultController: 'News::list'
    defaults:
      page: '0'
    aspects:
      news-title:
        type: NewsTitle
      page:
        type: StaticRangeMapper
        start: '1'
        end: '100'
      category-name:
        type: NewsCategory
      tag-name:
        type: NewsTag
  PageTypeSuffix:
    type: PageType
    map:
      'feed.xml': 9818
      'calendar.ical': 9819

Lokalisierter Seitenumbruch

Voraussetzungen:

Die Website bietet mehrere Frontend-Sprachen.

Ergebnis:

Englisch: www.example.com/news/page-2

Dänisch: www.example.com/da/news/side-2

Deutsch: www.example.com/de/news/seite-2

/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  News:
    type: Extbase
    extension: News
    plugin: Pi1
   routes:
      - routePath: '/{page-label}-{page}'
        _controller: 'News::list'
        _arguments: {'page': 'currentPage'}
    defaultController: 'News::list'
    defaults:
      page: ''
    requirements:
      page: '\d+'
    aspects:
      page:
        type: StaticRangeMapper
        start: '1'
        end: '100'
      page-label:
        type: LocaleModifier
        default: 'page'
        localeMap:
          - locale: 'da_DK.*'
            value: 'side'
          - locale: 'de_DE.*'
            value: 'seite'

Erläuterung:

Der Aspekttyp LocaleModifier legt einen Standardwert für die englische Sprache fest. Sie können dann so viele localeMap-Konfigurationen hinzufügen, wie Sie für die Seitenübersetzungen Ihrer Website benötigen. Der Wert von locale bezieht sich auf den Wert in Ihrer Site-Konfiguration.

Von Menschen lesbare Datumsangaben

Vorraussetzungen:

Für die List View mit einem Date Menu-Plugin, um nach Datum zu filtern. Beinhaltet auch die Konfiguration für die Paginierung.

Ergebnis:

www.example.com/news/2018/march

www.example.com/news/2018/march/page-2

/config/sites/<your_identifier>/config.yaml
routeEnhancers:
  DateMenu:
    type: Extbase
    extension: News
    plugin: Pi1
    routes:
      # Pagination:
      - routePath: '/'
        _controller: 'News::list'
      - routePath: '/page-{page}'
        _controller: 'News::list'
        _arguments:
          page: 'currentPage'
      - routePath: '/{news-title}'
        _controller: 'News::detail'
        _arguments:
          news-title: news
      # Date year:
      - routePath: '/{date-year}'
        _controller: 'News::list'
        _arguments:
          date-month: 'overwriteDemand/month'
          date-year: 'overwriteDemand/year'
          page: 'currentPage'
      # Date year + pagination:
      - routePath: '/{date-year}/page-{page}'
        _controller: 'News::list'
        _arguments:
          date-year: 'overwriteDemand/year'
          page: 'currentPage'
      # Date year/month:
      - routePath: '/{date-year}/{date-month}'
        _controller: 'News::list'
        _arguments:
          date-month: 'overwriteDemand/month'
          date-year: 'overwriteDemand/year'
          page: 'currentPage'
       # Date year/month + pagination:
      - routePath: '/{date-year}/{date-month}/page-{page}'
        _controller: 'News::list'
        _arguments:
          date-month: 'overwriteDemand/month'
          date-year: 'overwriteDemand/year'
          page: 'currentPage'
    defaultController: 'News::list'
    defaults:
      page: '0'
      date-month: ''
      date-year: ''
    requirements:
      date-month: '\d+'
      date-year: '\d+'
      page: '\d+'
    aspects:
      news-title:
        type: NewsTitle
      page:
        type: StaticRangeMapper
        start: '1'
        end: '25'
      date-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'
      date-year:
        type: StaticRangeMapper
        start: '2000'
        end: '2030'

Erläuterung:

Sie benötigen für jede mögliche Kombination von Argumenten (Paginierung, Monat mit/ohne Paginierung, ...) einen neuen routePath.

Mögliche Fehler:

Wenn Sie 2018/Maerz wollen, aber stattdessen 2018/3 erhalten, vergleichen Sie Ihren StaticValueMapper für Monate mit Ihren Datumsargumenten. Verwenden Sie unterschiedliche Datumsformate (mit/ohne führende Nullen)?

Sie können entweder die führende Null in Ihren aspects entfernen oder die TypoScript-Einstellung anpassen:

TypoScript setup
plugin.tx_news.settings.link {
    hrDate = 1
    hrDate {
        day = j
        // 'n' for 1 through 12. 'm' for 01 through 12.
        month = m
        year = Y
    }
}

Sie können jedes Argument (Tag/Monat/Jahr) separat konfigurieren, indem Sie die Konfiguration der PHP-Funktion date verwenden.

Warnung

Oops, an error occurred!
Possible range of all mappers is larger than 10000 items
Using the StaticRangeMapper is strictly limited to 1000 items per a single range and 10000 items per routing enhancer.

Ups, ein Fehler ist aufgetreten!
Der mögliche Bereich aller Mapper ist größer als 10000 Elemente
Die Verwendung des StaticRangeMappers ist streng auf 1000 Elemente pro Bereich und 10000 Elemente pro Routing Enhancer begrenzt.

Das bedeutet, dass Sie alle möglichen Kombinationen in einer Routing-Erweiterung multiplizieren müssen, zum Beispiel:

12 Monate × 30 Jahre (2000-2030) × 25 Seiten (Paginierung) = 9000 mögliche Einträge

Wenn Sie diese Grenze überschreiten, müssen Sie entweder einen benutzerdefinierten und spezifischeren Mapper erstellen oder den Bereich in einem Ihrer StaticRangeMapper reduzieren.

Wie man URLs in PHP erstellt

Das folgende Snippet ist ein gutes Beispiel dafür, wie eine URL richtig generiert werden kann

PHP-Code
protected function generateUrl(SiteInterface $site, int $recordId, int $detailPageId): string
    {
        $additionalQueryParams = [
            'tx_news_pi1' => [
                'action' => 'detail',
                'controller' => 'News',
                'news' => $recordId
            ]
        ];
        return (string)$site->getRouter()->generateUri(
            (string)$detailPageId,
            $additionalQueryParams
        );
    }

Urheberhinweis:

Bei diesem Artikel handelt es sich um die Übersetzung des Artikels “Use Routing to rewrite URLs".

Quelle: Use Routing to rewrite URLs — News system main documentation (typo3.org)