Saubere Telefonnummern in TYPO3: warum wir EXT:phone_number gebaut haben

Der Link-Wizard in TYPO3 hat seit einiger Zeit einen eigenen Link-Typ „Telefon“ — und, konsequent genutzt, ist er richtig praktisch: Redakteure hinterlegen Telefonnummern als saubere tel:-Links. Die Verlinkung selbst stimmt also und funktioniert zuverlässig. Den schwierigen Teil hast du damit erledigt — alle geben ihre Nummern korrekt ein.
Der Haken ist das Frontend. Ist die Nummer erst mal korrekt gespeichert, musst du immer noch entscheiden, wie sie auf der Seite tatsächlich aussehen soll — international, national, nach DIN 5008 — und TYPO3 formatiert sie nicht für dich. Dieselbe gespeicherte Nummer soll im Impressum vielleicht anders erscheinen als im Footer.
Genau hier kommt unsere kleine Extension phone_number ins Spiel. Sie macht genau eine Sache, aber die richtig: Sie nimmt die Telefonnummer entgegen, die ein Redakteur bereits hinterlegt hat — als tel:-Link oder als rohen String — und formatiert sie für die Ausgabe im Frontend. In diesem Post erkläre ich, welches Problem sie löst und wie du sie einsetzt.
Warum das Ausgabeformat zählt
Was Besucher tatsächlich lesen, ist die Nummer auf der Seite — und genau da zählt Konsistenz. Eine Nummer, die auf drei Seiten in drei Varianten steht, kratzt am sauberen Gesamtbild einer ansonsten aufgeräumten Website.
Internationale Besucher erwarten ein vorhersehbares Format, und in Deutschland legt die DIN 5008 klare Regeln fest, wie eine Nummer geschrieben wird. Je nach Kontext willst du vielleicht die volle internationale Form (+49 711 3400810) im Impressum und die kürzere nationale Form (0711 3400810) im Footer — idealerweise aus genau derselben gespeicherten Nummer, ohne im Backend etwas anzufassen.
Das alles von Hand in jedem Template zu erledigen, skaliert nicht. Jedes Template bekommt so seine eigene kleine Formatierungslogik, und mit der Zeit entsteht genau der Wildwuchs, den wir vermeiden wollen: viele leicht unterschiedliche Lösungen für dasselbe Problem.
Unsere Lösung: ein kleiner ViewHelper auf Basis von libphonenumber

Die Idee hinter phone_number ist bewusst schlank: ein einziger Fluid-ViewHelper, der eine rohe Telefonnummer oder eine tel:-URI entgegennimmt und in eine saubere internationale oder nationale Nummer formatiert. Eine Zeile im Template, überall konsistente Ausgabe.
Die Installation läuft wie gewohnt über Composer:

1
composer req b13/phone-number
Dann registrierst du den Namespace in deinem Fluid-Template:
1
2
3
4
5
<html
data-namespace-typo3-fluid="true"
xmlns:phone="http://typo3.org/ns/B13/PhoneNumber/ViewHelpers"
>
Ab da ist es ein Einzeiler. Das internationale Format ist der Standard:
1
<phone:format value="tel:+497113400810" />
Ausgabe: +49 711 3400810
Du brauchst stattdessen das nationale Format? Passe ein Argument an:
1
<phone:format value="tel:+497113400810" national="1" />
Ausgabe: 0711 3400810
Und das ist nicht auf deutsche Nummern beschränkt. Übergib eine US-Nummer, und libphonenumber formatiert sie auf amerikanische Weise:
1
<phone:format value="tel:+12125550123" />
Ausgabe: +1 212–555–0123
Mit national=“1“ bekommst du (212) 555–0123 — das Format, das US-Leser erwarten.
Das Herkunftsland kommt aus der Nummer selbst: Die +1 verrät libphonenumber, dass es sich um eine US-Nummer handelt, also folgt das richtige Format automatisch — unabhängig von der Sprache deiner Seite. Das Argument defaultRegion (mehr dazu unten) greift nur bei Nummern, die ohne Ländervorwahl gespeichert sind, und sagt dem Parser, welches Land er annehmen soll.
Und wenn eine Nummer als reiner String statt als tel:-Link gespeichert ist, normalisiert er auch das:
1
<phone:format value="+49 (0) 711 34008-10" />
Ausgabe: +49 711 3400810
Das ist der Fall, für den die Extension eigentlich gebaut ist: Ein Feld vom Typ TCA type=link mit allowedTypes=telephone — der Link-Typ „Telefon“ aus dem Wizard — liefert dir eine tel:-URI, und der ViewHelper macht daraus direkt saubere Ausgabe. Die Nummer, die ein Redakteur im Backend wählt, ist die Nummer, die dein Besucher sieht — sauber formatiert, jedes Mal.
Die Argumente im Überblick
Der ViewHelper hält seine Argumente bewusst kurz und vorhersehbar:
- value — die Telefonnummer oder der tel:-Link, der formatiert werden soll. Pflichtangabe.
- defaultRegion — die Region, mit der Nummern ohne Ländervorwahl geparst werden. Standard ist DE — das greift aber nur bei Nummern ohne Vorwahl, orientier dich also am Herkunftsland deiner Firma, nicht an der Seitensprache (die englische Seite einer französischen Firma will hier trotzdem FR).
- national — formatiert die Nummer national (0711 …) statt international. Standardmäßig aus.
Voraussetzungen
EXT:phone_number läuft ab PHP 8.1 und unterstützt TYPO3 12, 13 und 14. Die Extension ist Open Source unter GPL-2.0-or-later, und das Parsen der Nummern übernimmt libphonenumber-for-php-lite — du bekommst also erprobte Formatierungsregeln, ohne eine schwere Abhängigkeit einzuziehen.
Fazit
Telefonnummern sind ein kleines Detail, aber kleine Details sorgen dafür, dass sich eine Seite fertig anfühlt. Statt sie in jedem Template von Hand zu formatieren, gibt dir EXT:phone_number einen konsistenten, wiederverwendbaren Weg: Extension installieren, Namespace registrieren, einen ViewHelper einbauen — und deine Nummern sehen einfach richtig aus.
Dokumentation und Quellcode findest du auf GitHub: https://github.com/b13/phone-number
Kniffliger Formatierungsfall?
Egal ob du Telefonnummern über eine große TYPO3-Installation hinweg aufräumst oder die Details auf einer einzelnen Seite feinschleifst — wir helfen gern. Wenn du Unterstützung bei EXT:phone_number oder deinem TYPO3-Projekt brauchst, meld dich einfach bei uns.