TYPO3 News System - Verwenden Sie Routing zum Umschreiben von URLs
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:
- Fügen Sie einen Abschnitt routeEnhancers hinzu, falls noch keiner vorhanden ist.
- Wählen Sie einen eindeutigen Bezeichner für Ihren Routing Enhancer. Er muss nicht mit einem Erweiterungsschlüssel übereinstimmen.
- type: Für Nachrichten wird der Extbase Plugin Enhancer (Extbase) verwendet.
- extension: der Schlüssel der Erweiterung, konvertiert in UpperCamelCase.
- plugin: Der Plugin-Name von news ist einfach Pi1.
- 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}:
- Zunächst weisen Sie in _arguments den Wert des news-Parameters (tx_news_pi1[news]) zu.
- Anschließend fügen Sie ihn in routePath der bestehenden Route hinzu.
- 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:
/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)