Typo3: Link zu einer Seite im Frontend aus Scheduler-Task / dem Backend-Kontext oder CLI-Job erzeugen

Jeder kommt früher oder später an diesen Punkt: Er ist in Typo3 in einem Context wie einem Scheduler Task oder CLI Job und möchte einen Link zu einer Seite im Frontend generieren, z.B. um zyklisch eine E-Mail zu generieren, die einen Link zum Frontend enthält.

Jeder Typo3-Entwickler geht hier zunächst den gewohnten Weg: Der UriBuilder. Den Code kopiert man sich aus einem Controller oder der Typo3 Doku – und er sieht ungefähr so aus:

$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class);
$uriBuilder = $objectManager->get(\TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder::class);
$uri = $uriBuilder
  ->reset()
  ->setTargetPageUid(199)
  ->setArguments(['test'=>99])
  ->build();

Funktioniert wunderbar im Frontend-Context des Controllers – aber was passiert im Scheduler / Backend-Kontext?
Aus dem Link wird etwas in dieser Art:
/typo3/index.php?route=%2Fmodule%2Fsystem%2FtxschedulerM1&token=xxx&test=99
Für das Problem leider unbrauchbar. Und wieder eines der Themen, bei der man denkt: „Ist ganz einfach zu lösen“ – und sich dann wundert, wenn man nach einigen Stunden immer noch nicht die richtige Lösung finden konnte.

Leider ist das Web zu der Frage „Wie erzeugt man einen Link zum Frontend aus dem Backend-Kontext / aus dem Scheduler“ voll von Antworten, wie dieser hier bei StackOverflow: Allein beim Runterscrollen durch das Script denkt man eigentlich nur: Ist das Euer ernst? Ich will doch nur einen Link. Irgendwann baut man aus Ungeduld den Link dann vielleicht per Hand ($link = 'https://www.domain.de/?id=' . $pid) – aber richtig „gut“ fühlt sich das nicht an. Die URL ist hardgecoded, Parameter sind offen gelegt, der Slug / RealUrl fehlt. Nicht schön. Und erschwerend kommt hinzu: Der Code scheint sich von Typo3-Version zu Version zu ändern.

Wie es einfacher geht? Mit unserer Extension nnhelpers, die genau dort hilft, wo man denkt „Das muss doch irgendwie einfacher gehen“. nnhelpers ist eine Sammlung von Tools und Funktionen, die die Arbeit mit Typo3 und der Extension-Entwicklung erheblich vereinfacht. Alle Scripte sind als einzeilige „No-Brainer“ konzipiert. Und alle Methoden sind direkt im Backend in einem übersichtlichen „Spickzettel“ zusammengefasst.

So sieht die Lösung dann mit `nnhelpers` aus:

\nn\t3::Page()->getLink(199, ['test'=>99]);

Der gleiche Befehlt funktioniert in jedem Kontext – ob Frontend, Backend, CLI. Und er funktioniert versionsübergreifend für Typo3 6 aufwärts.
Er erzeugt einen Link zum Frontend aus dem Backend-Kontext oder Scheduler-Kontext oder CLI-Kontext mit absoluter URL zur Seite, bei der aber auch der Slug bzw. RealUrl-Pfad inkl. Parameter korrekt aufgelöst wird.

Richtig gesehen: `nnhelpers` braucht keine Instanz des `UriBuilder, der über den `ObjectManager` instanziiert werden muss, der über die `GeneralUtility` generiert werden muss. Der Einzeiler kann einfach – so wie er ist – an der Stelle eingefügt werden, wo er benötigt wird. Er hält damit den Code sauber und übersichtlich.

Hier geht es zur Extension im Repository von Typo3:
https://extensions.typo3.org/extension/nnhelpers

Die Dokumentation dazu gibt es hier:
Auf Deutsch: https://labor.99grad.de/typo3-docs/nnhelpers/de/
Und English: https://labor.99grad.de/typo3-docs/nnhelpers/en/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.