YAML statt TypoScript und TCA

Ein Gedankenexperiment zu TypoScript und ein Proof of Concept zur TCA-Generierung durch YAML-Dateien.

von

TypoScript, die Skriptsprache zur Konfiguration und Anpassung des Templatings von TYPO3 CMS, ist eigentlich nur ein großes Array. Doch wieso sollte man zur Darstellung und Speicherung eines Arrays die komplett eigene Syntax TypoScript verwenden, welche für neue Entwickler Einarbeitung bedeutet und manchmal auch Stirnrunzeln hervorruft? 

Verwenden wir in einem Gedankenexperiment doch YAML, die kompakteste und lesbarste Schreibweise für Arrays und Objekte.

Beispiel eines klassischen Menüs in TypoScript


lib.navigation = HMENU
lib.navigation {
  1 = TMENU
  1 {
    wrap = <ul class="navigation">|</ul>

    NO {
      allWrap = <li>|</li>
    }

    ACT = 1
    ACT {
      wrapItemAndSub = <li>|</li>
    }
  }

  2 < .1
  2.wrap = <ul class="nav-level-2">|</ul>
}

Fiktives Beispiel dieses Menüs in YAML


lib:
  navigation:
    type: HMENU
    1:
      type: TMENU
      wrap: '<ul class="navigation">|</ul>'
      NO:
        allWrap: '<li>|</li>'
      ACT:
        active: true
        wrapItemAndSub: '<li>|</li>'
    2:
      clones: '.1'
      wrap: '<ul class="nav-level-2">|</ul>'

Sieht wesentlich schlanker und lesbarer aus, oder?

Technisch wäre es vermutlich relativ einfach, YAML anstelle von TypoScript in das PHP-Array zu konvertieren, welches im TYPO3 Frontend Renderer durchlaufen wird – in der Praxis ist TypoScript unter TYPO3-Entwicklern aber sehr etabliert und beliebt, sodass die Motivation für eine Veränderung gering sein dürfte. Einen Nutzen hat unser Experiment bisher also leider nicht.

Doch wir könnten dieses Konzept ausweiten: Ein gutes Anwendungsgebiet für YAML wäre das TCA (Table Configuration Array), welches u.a. die Felddefinitionen für Backend-Formulare liefert.

TCA-Definition in einem PHP-Array


$GLOBALS['TCA']['tablename']['columns'] => [
	'hidden' => [
            'exclude' => 1,
            'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
            'config' => [
                'type' => 'check',
                'default' => 0
            ]
	],
	'title' => [
            'exclude' => 0,
            'l10n_mode' => 'mergeIfNotBlank',
            'label' => 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:tablename.title',
            'config' => [
                'type' => 'input',
                'size' => 30,
            ]
      ],
	...
]

TCA-Definition in YAML


tablename:
  columns:
    hidden:
      exclude: 1
      label: 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden'
      config:
        type: 'check'
        default: 0
    title:
      exclude: 0
      l10n_mode: 'mergeIfNotBlank'
      label: 'LLL:EXT:extension/Resources/Private/Language/locallang.xlf:tablename.title'
      config:
        type: 'input'
        size: 30

Erinnert uns das an etwas? Richtig, wir sind damit erschreckend nahe an Neos. Dies verwendet zwar eine eigene Skriptsprache als Middleware zwischen Content Model und Template (Fusion, ehemals TypoScript 2) – definiert aber das eigentliche Content Model (analog dem TCA) sowie alle Konfigurationen in YAML-Dateien.

Extension „yamltca“ als Proof of Concept

Und weil wir hier nicht wieder nur einen konzeptionellen Ansatz zeigen wollten, funktioniert das Ganze auch in der Praxis: mit „yamltca“, unserer TYPO3-Extension als Proof of Concept für den Einsatz von YAML-Dateien zur Generierung des TCA.

Extension „yamltca“ auf GitHub