TYPO3 Adventskalender 2025
17.12.2025: Neuer TCA Typ "Country"

Dieses neue Feature liegt mir besonders am Herzen, weil ich für einen größeren Teil der Umsetzung verantwortlich bin und damit viel Zeit verbracht habe. Ich hoffe, dass sich die Mühe für den ein oder anderen gelohnt haben könnte (schreibt mir gern!). An dieser Stelle auch herzlichen Dank an Georg Ringer, der für eine erste Version dieses Patches bereits viel Mühe investiert hatte, und auf dessen Arbeit ich aufbauen durfte.
Bereits mit TYPO3 v12 wurde die “Country API” eingefügt. Diese nutzt eine externe Bibliothek, die sämtliche Ländernamen (lokalisiert) und Attribute wie Kurzname, Lang-Name, ISO-Code und Flaggen-Symbol beinhaltet. Auf diese Daten konnte man auf zwei Arten zugreifen:
- Fluid ViewHelper <f:form.countrySelect> für ein Dropdown mit Länderzuordnung, auch von EXT:form genutzt
- PHP API um anhand gezielter ISO-Codes Daten auszulesen, oder Datensatzsammlungen ("alle Länder", "alle Flaggen", …) zu erhalten
Für TYPO3 v14 war mein Anspruch: Die Country API soll systemweit Unterstützung erfahren. Denn es war bisher nicht möglich, die Country API leicht in TCA/FormEngine oder Extbase zu verwenden.
Und es stellt sich heraus, dass so ein ganz neuer “TCA-Typ ‘Country’” eine riesige Menge an Implementations-Details mit sich bringt. Daher wollte ich die Implementation hiervon penibel vollständig durchführen, dass es als künftige Vorlage für andere TCA-Typen dienen könnte.
Konkret wurde in meinem Patch folgendes behandelt:
- TCA FormEngine Rendering über ein eigenes “SelectCountryElement”
- FormEngine FlexForm Integration
- Eigenständiger FormEngine JavaScript Picker
- FormEngine FormData Provider
- Integration in DataHandler (damit ISO-Codes normalisiert werden)
- DBAL mapping
- TCA Schema API integration (eigenständiger FieldType)
- RecordList Integration (Resolving von Countries)
- Extbase TypeConverter
- Extbase DataMapper
- Integration in EXT:styleguide
- Integration in den functional Test “blog_example”, eigenständige tests
Im Changelog-Link finden sich sehr ausführliche Code-Beispiele, hier nur ein kleines Beispiel, wie man per TCA das Feld definiert. In einem Extbase-Model würde man dann ganz wie von anderen Typen auf ein ausgewähltes Attribut zugreifen können:
$GLOBALS['TCA']['tx_myextension']['columns'] ['country' => [ 'label' => 'Country', 'config' => [ 'type' => 'country', // Mögliche Label: name, localizedName, officialName, localizedOfficialName, iso2, iso3 'labelField' => 'localizedName', // Länder die als erstes erscheinen: 'prioritizedCountries' => ['AT', 'CH'], // Weitere Sortierung... 'sortItems' => [ 'label' => 'asc' ], // etwaige Filter auf nur gewisse Länder 'filter' => [ 'onlyCountries' => ['DE', 'AT', 'CH', 'FR', 'IT', 'HU', 'US', 'GR', 'ES'], 'excludeCountries' => ['DE', 'ES'], ], // Vorauswahl wenn leer 'default' => 'HU', 'required' => false, ], ]],