TYPO3’s link wizard has had a dedicated Phone link type for a while now, and used consistently it’s genuinely useful: editors store phone numbers as proper tel: links, so the linking itself is correct and reliable. You’ve done the hard part—getting everyone to enter their numbers the right way.
The catch is the frontend. Once the number is stored correctly, you still have to decide how it should actually look on the page—full international form, national form, following DIN 5008—and TYPO3 doesn’t format it for you. The same stored number might need to appear one way in your imprint and another way in the footer.
This is where our little extension phone_number comes in. It does one thing: it takes the phone number an editor has already stored—as a tel: link or a raw string—and formats it for output in the frontend. In this post I’ll explain the problem it solves and how to use it.
Why the Output Format Matters
What visitors actually read is the number printed on the page, and that’s where consistency counts. A number shown three different ways across three pages chips away at the polish of an otherwise clean site.
International visitors expect a predictable format, and in Germany the DIN 5008 standard sets clear rules for how a number should be written. Depending on the context you might want the full international form (+49 711 3400810) in your imprint and the shorter national form (0711 3400810) in a footer—ideally from the exact same stored number, without touching the backend.
Doing that formatting by hand in every template doesn’t scale. Each one ends up with its own little bit of logic, and over time you get exactly the kind of wild growth we try to avoid: many slightly different solutions to the same problem.
Our Solution: A Small ViewHelper Powered by libphonenumber
The idea behind phone_number is deliberately narrow: one Fluid ViewHelper that takes a raw phone number or a tel: URI and formats it into a clean international or national number. One line in your template, consistent output everywhere.
Installation works as usual via Composer:
1
composer req b13/phone-number
Then register the namespace in your Fluid template:
It’s not limited to German numbers, either. Pass a US number and libphonenumber formats it the American way:
1
<phone:formatvalue="tel:+12125550123" />
Switch to national="1" and you get (212) 555–0123—the format US readers expect.
The country comes from the number itself: the +1 tells libphonenumber it’s a US number, so the right format follows automatically—independent of your site’s language. The defaultRegion argument (more on it below) only kicks in for numbers stored without a country code, telling the parser which country to assume.
And if a number is stored as a plain string rather than a tel: link, it normalizes that too:
1
<phone:formatvalue="+49(0)71134008-10" />
This is the case the extension is really built for: a field defined as TCA type=link with allowedTypes=telephone—the Phone link type from the wizard—hands you a tel: URI, and the ViewHelper turns it straight into clean output. The number an editor picks in the backend is the number your visitor sees, cleanly formatted, every time.
The Arguments, at a Glance
The ViewHelper keeps its options short and predictable:
value—the phone number or tel: link to format. Required.
defaultRegion—the region used to parse numbers that come without a country code. Defaults to DE, and it only matters for those bare numbers—so set it to your company’s home country rather than the site’s language (the English site of a French company still wants FR here).
national—format the number in national style (0711 …) instead of international. Defaults to off.
Requirements
EXT:phone_number runs on PHP 8.1 and supports TYPO3 12, 13, and 14. It’s open source under GPL-2.0-or-later, and the number parsing is handled by libphonenumber-for-php-lite—so you get battle-tested formatting rules without pulling in a heavy dependency.
Conclusion
Phone numbers are a small detail, but small details are what make a site feel finished. Instead of formatting them by hand in every template, EXT:phone_number gives you one consistent, reusable way to do it: install the extension, register the namespace, add one ViewHelper, and your numbers just look right.
Whether you’re cleaning up phone numbers across a large TYPO3 installation or fine-tuning the details on a single site, we’re happy to help. If you’d like support with EXT:phone_number or your TYPO3 project in general, feel free to get in touch with us.
b13 Founder and CEO, David, is someone you’ll meet if you’re thinking about working with our agency. He is constantly learning new skills and is an influential part of our cutting-edge frontend practice.
AI Content in TYPO3: Labelling Needs Accountability
|Benni Mack
The EU AI Act brings the origins of AI-generated content into focus. AI Label marks AI-generated and AI-edited content in TYPO3 and records who signed off the published version—for…
The first TYPO3 Summit North America opened with a keynote that reframes how enterprise teams should think about content management—from platforms to ecosystems, from vendor…
Notes from Atlanta—What the First TYPO3 Summit North America Says About the Next Decade of Enterprise CMS
|David Steeb
Field report from the first TYPO3 Summit North America in Atlanta. On governance that can’t be acquired, predictable seven-year lifecycles, the FAIR distribution layer, and why the…
Taming the Page Module Header—Why We Built EXT:page_info_tabs
|David Steeb
When multiple TYPO3 extensions add content to the page module header, things quickly become messy. EXT:page_info_tabs structures everything into clean Bootstrap tabs, with zero…
CMS Kickoff 2026: Perspectives on AI, Open Source, and Digital Sovereignty
|David Steeb
CMS Kickoff 2026 in Florida brought together agencies, CMS experts, and open source communities to discuss AI, digital sovereignty, and the future of content management systems…
Designing TYPO3 14’s Backend: Our Vision for a Modern, Expandable Foundation
|Laura Heine
b13 is redesigning TYPO3’s backend for version 14 to feel modern, work faster, maintain user context, and create an expandable foundation that can evolve for years to come.