Entwicklung einer PostModifier-Hook für Slugs

Mit TYPO3 9 LTS wurden die bisherigen Standardlösungen zur Erzeugung von sprechendenen URL cooluri und realurl durch die Core-Funktionen Site-Konfigurationen und Slugs ersetzt. In einer Site-Konfiguration definiert der TYPO3 Integrator die Basis-URL unter der die Homepage erreichbar ist, sowie alle gängigen Spracheinstellungen. Ein Slug ist dann ergänzend der "sprechende" Anteil der URL, der für Seiten, Content-Elemente und Datensätze erzeugt wird und an die in der Site-Konfiguration hinterlegte Basis-Einstellungen angehängt wird.

Für Seiten liefert der Core bereits standardmäßig entsprechende Eingabemasken im Backend und die notwendigen Hooks für die Nutzung der Slugs im Frontend. Für Content-Elemente existiert die TYPO3 Extension Content Slug (content_slug) und für Datensätze können sogennante RouteEnhancer eingesetzt werden. Wie diese RouteEnhancer funktionieren erklärt die zugehörige TYPO3 Dokumentation recht ausführlich.

Limitierung

Für die meisten Szenarien sind die Möglichkeiten der RouteEnhancer vollkommen ausreichend. Eine Limitierung bilden jedoch die Attribute, welche zur Generierung des Slugs genutzt werden können, da hier nur eigene Attribute des Datensatzes verfügbar sind. Wenn man den Slug eines Datensatzes aber auch mit Werten von Feldern erstellen möchte, die nicht zum Datensatz selbst gehören, sondern beispielsweise über IRRE angelegte Kinderelemente oder via Select-Feld referenzierte Elternelemente, stoßen die üblichen Methoden an ihre Grenzen.

Lösung via PostModifier-Hook

Das Problem lässt sich jedoch durch einen eigenen PostModifier-Hook für das Slug-Feld beheben. Zunächst muss der PostModifier-Hook via Table-Configuration-Array (TCA) bekannt gemacht werden. Dies geschieht über eine Datei, die unter TCA/Configuration/Overrides abgelegt wird. Die Bezeichnung entspricht dabei der Datenbanktabelle $tableName, für die der Hook vorgesehen wird. Des Weiteren wird der Name des Datenbankfelds $fieldName benötigt, in dem der Slug abgespeichert wird.

<?php
	$GLOBALS['TCA'][$tableName]['columns'][$fieldName]['config']['generatorOptions']['postModifiers'][] = Vendor\Extension\YourSlug::class . '->generateSlug';
$tableName.php

Die so eben definierte Methode generateSlug() erhält dann ein Parameter-Array mit den folgenden Werten:

[
	'slug' ... the slug to be used
	'workspaceId' ... the workspace ID, "0" if in live workspace
	'configuration' ... the configuration of the TCA field
	'record' ... the full record to be used
	'pid' ... the resolved parent page ID
	'prefix' ... the prefix that was added
	'tableName' ... the table of the slug field
	'fieldName' ... the field name of the slug field
];

Auf das Array kann innerhalb der Funktion über die Variable $hookParameters zugegriffen werden.

<?php
	
	namespace Vendor\Extension;
	
	class YourSlug {
		
		/**
		 * @return string
		 */
		public function generateSlug(array $hookParameters): string {
			$record = $hookParameters['record'];
            $childRecord = TYPO3\CMS\Backend\Utility\BackendUtility::getRecord('$tableNameOfChild', $record['child_field_name']);
            $childField = $childRecord['$fieldNameOfChild'];
			return $childField;
		}
		
	}