TYPO3 Urls erstellen, in FE, BE oder CLI

Als Entwickler hat man immer wieder mal die Aufgabe Links zu generieren, wenn man im Backend oder mit der CLI/Scheduler unterwegs ist um. Wenn die Links ins Frontend führen sollten, musste man immer erst das TSFE erzeugen um dann über typolink alles zu erzeugen.

Früher…., *ich werf mal einen Stein*…. (ja soviel früher), konnte man dafür die TYPO3 Erweiterung PagePath nutzen, ursprünglich von Dmitry Dulepov geschrieben und dann von Sebastian Michaelsen übernommen und für eine weitere TYPO3 Version geupdatet. …. Wenn man die Erweiterung selbst geupdatet hat, dann kann man sie auch noch in TYPO3 9 nutzen.

Doch man will ja nicht ständig patchen sondern irgendwann einfach mit dem Core Links erzeugen, von daher GoodBye PagePath and Hello PageRouter

Nach einer kurzen Suche zu dem Thema landet man natürlich auf …. genau Stackoverflow (wahrscheinlich die zweit häufigste Seite, nach Google, eines jeden Developers) und hier dann genau auf bei einer Erklärung von Mathias Brodala

Ich denke mal jeder der im TYPO3 im Slack Channel oder auf Stackoverflow was TYPO3 spezifisches gefragt hat, bekam von Ihm schon mal eine schnelle, freundliche fundierte Antwort 🙂 Man kann daher davon ausgehen, wenn er das empfiehlt dann passt das.

Hier noch mal kurz in Code :

Für die Linkerzeugung, tauschen wir hier nun den alten PagePath Code aus:

$arguments = '&tx_nimeinenAltePiBaseExtension_pi1[showUid]=' . (int)$record['uid'];
$singleViewPageUid = '100';
$singleViewLink =  \tx_pagepath_api::getPagePath($singleViewPageUid, $arguments);
 

und nutzen dann wie auf dem StackOverflow Beitrag den Code von Mathias.

use TYPO3\CMS\Core\Site\SiteFinder;
use TYPO3\CMS\Core\Utility\GeneralUtility;

....


$arguments = [
 'tx_nimeinenAltePiBaseExtension_pi1' => ['showUid' => (int)$record['uid']],
];
$singleViewPageUid = '100';
$site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId($singleViewPageUid);

$singleViewLink = (string)$site->getRouter()->generateUri((string)$singleViewPageUid, $arguments);

Kleine Anpassung noch von mir, sofern es keine Multidomain TYPO3 Installation ist kann man das „suchen“ nach der richtigen $site etwas vereinfachen wenn man statt wie oben die SiteConfiguration per $singleViewPageUid sucht, direkt den Namen der Configuration nutzt, also

$site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByIdentifier('test');

Den Namen kann man im Modul Sites auslesen, das ist dann auf der Übersichtsseite der „Configuration Folder“

Für alle die Wissen wollen warum es einfacher wäre, ein Blick in den Code verrät warum es.
->getSiteByPageId vs ->getSiteByIdentifier

getSiteByPageId() ist aber einfacher (und damit auch sicherer) in der Handhabung, je nach Umgebung, Konfigurationen der Systeme und im Einsatz in verschiedenen Erweiterungen.