TYPO3 ViewHelper zur Verarbeitung von Links

Links, die Redakteur*innen im TYPO3-Backend pflegen, folgen einer bestimmten Syntax. Ein typischer Link könnte wie folgt aussehen: t3://page?uid=1118 _blank "btn" “Some title”
Die Bestandteile dieses Links sind:
- t3://page?uid=1118 : Verweist auf die Seite mit der ID 1118
- _blank : Gibt das Target an (in diesem Fall wird der Link in einem neuen Tab geöffnet)
- btn : Eine CSS-Klasse
- Some title: Titel des Links
TYPO3 stellt den ViewHelper <f:link.typolink> bereit, um solche Links direkt im Template zu verwenden. Manchmal ist es jedoch erforderlich, einzelne Bestandteile eines Links getrennt auszuwerten. Hier kommt unser neuer ViewHelper ins Spiel.
Neuer ViewHelper: LinkViewHelper
Der folgende ViewHelper extrahiert die Informationen aus einem TypoLink und stellt sie als Array zur weiteren Verarbeitung bereit.
<?php
declare(strict_types=1);
namespace StudioMitte\Theme\ViewHelpers\Process;
use TYPO3\CMS\Core\LinkHandling\LinkService;
use TYPO3\CMS\Core\LinkHandling\TypoLinkCodecService;
use TYPO3\CMS\Core\LinkHandling\TypolinkParameter;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
class LinkViewHelper extends AbstractViewHelper
{
protected $escapeOutput = false;
public function __construct(
protected readonly LinkService $linkService,
protected readonly TypoLinkCodecService $typoLinkCodecService
) {}
public function initializeArguments(): void
{
$this->registerArgument('link', 'string', 'Link Data', true);
}
/**
* @return array<mixed>
*/
public function render()
{
try {
$parameter = TypolinkParameter::createFromTypolinkParts(
$this->typoLinkCodecService->decode($this->arguments['link'] ?? '')
);
return [
'data' => $parameter,
'meta' => $this->linkService->resolve($parameter->url),
];
} catch (\Exception $e) {
// Optional: Logging für Fehler implementieren
}
return null;
}
}
Anwendung im Fluid-Template
Der ViewHelper kann wie folgt im Fluid-Template verwendet werden:
{theme:process.link(link:myLink) -> f:variable(name:'linkData')}
<f:link.typolink parameter="{data.link}" class="link link-{linkData.meta.type}">
My link
<f:if condition="{linkData.meta.type} == 'file'">
{f:format.bytes(value:linkData.meta.file.size, decimals: '1')} {linkData.meta.file.extension}
</f:if>
</f:link.typolink>
Erklärung der Rückgabewerte
Der ViewHelper gibt ein Array mit zwei Hauptbestandteilen zurück:
data
Enthält die dekodierten Parameter des Links wie url, target, class, title.
meta
Enthält weiterführende Informationen aus dem LinkService. Neben dem Typ (page, inpage, url, email, telephone, file, folder, record, unknown) werden weitere Daten bereitgestellt. Wird eine Datei verlinkt, erhält man auch das File-Objekt.
Fazit
Dieser ViewHelper erleichtert die Arbeit mit TypoLink-Daten erheblich, indem er die einzelnen Bestandteile extrahiert und für weitere Anpassungen bereitstellt. Insbesondere, wenn Links mit Metadaten angereichert oder nach Typ unterschieden werden müssen, bietet er eine flexible Lösung für Entwickler in TYPO3-Projekten.
Voraussetzungen
Dieser ViewHelper benötigt die aktuelle TYPO3 Version 13 LTS.
Gerne helfen wir bei TYPO3 Updates!