Der Umfang des CKEditors lässt sich sehr flexibel konfigurieren – und innerhalb von TYPO3 sogar gezielt pro Feld. Dafür gibt es aber ein paar Fallstricke – und Steine, die im Weg liegen können.
Was sollte man daher als Extension-Entwickler beachten, und wie geht man als Integrator mit den Presets um?
Presets
Mittels Presets können in TYPO3 verschiedene RTE-Feature-Sets definiert werden. So mag es für manche Felder nur sinnvoll/gewünscht sein, dass ein paar Schriftformatierungen (fett, kursiv) zugelassen sind, in anderen vielleicht auch Links und in ganz anderen auch Listen, Tabellen usw.
Das Ganze kann global konfiguriert werden, aber auch pro Feld. Und es kann sowohl per Extension/PHP/TCA konfiguriert werden, als auch per PageTS.
Details beschreibt die Dokumentation des RTE.
Stolperstein TCA
Es ist also relativ einfach, die RTE-Konfiguration global per PageTS auf ein anderes Preset zu setzen. Eigentlich, ja. Hierbei kann man aber leicht über etwas stolpern, was sich in diesem Abschnitt der Dokumentation versteckt:
The order in which the configuration for the RTE is loaded is (the first one which is set will be used, see example below): 1. preset defined for a specific field via page TSconfig 2. richtextConfiguration defined for a specific field via TCA 3. general preset defined via page TSconfig (RTE.default.preset) 4. default (the preset "default", e.g. as defined by EXT:rte_ckeditor or overridden in ext_localconf.php)
https://docs.typo3.org/m/typo3/reference-tsconfig/main/en-us/PageTsconfig/Rte.html#pageTsRte
Eine gesetzte richtextConfiguration
greift also immer vor dem per PageTS global gesetztem Preset.
Vermeidet richtextConfiguration
im TCA
Daher sollte man als Extension-Entwickler diese Eigenschaft im TCA vermeiden.
Es gibt auch keinen Grund, richtextConfiguration = 'default'
zu setzen. Werfen wir einen Blick in den Core:
Daher sollte man als Extension-Entwickler diese Eigenschaft im TCA vermeiden.
Es gibt auch keinen Grund, richtextConfiguration = 'default'
zu setzen. Werfen wir dafür einen Blick in den Core:
// determine which preset to use
$pageTs['preset'] = $pageTs['fieldSpecificPreset'] ?? $tcaFieldConf['richtextConfiguration'] ?? $pageTs['generalPreset'] ?? 'default';
https://github.com/TYPO3-CMS/core/blob/main/Classes/Configuration/Richtext.php#L62
Als letzter Fall in der Kette möglicher Presets setzt TYPO3 automatisch 'default'
. Somit kann man sich das im TCA seiner Extensions getrost sparen, ermöglicht damit aber dem Integrator ein einfaches Setzen eines abweichenden globalen Presets via PageTS.
Also ein win-win-Situation – der Entwickler braucht weniger Code, und der Integratior hat’s auch leichter :-)
Historischer Rückblick – Breaking Change in TYPO3 10
In TYPO3 10.2 erfolgte eine Änderung: „[BUGFIX] Respect richtextConfiguration set via TCA„. Im Zuge des Fixes wurde die Priorität des global via PageTS gesetzten Presets heruntergestuft unter die des ggf. via TCA gesetzten Presets. Eher beiläufig in der Commit-Message steht dort auch:
Removed 'richtextConfiguration' => 'default' from tt_content, since it is obsolete and breaks the logic of fallback.
Ja, es ist kein gravierender „Breaking Change“ und wurde daher nicht als solcher eingestuft oder kommuniziert. Wenn man nicht genau aufpasst, dann kann dies einem Integrator aber gut auf die Füße fallen – und ist es Extension-Entwicklern oft überhaupt nicht bewusst.
Third-Party-Extensions, die trotzdem richtextConfiguration
im TCA setzen
Nun gibt es leider etliche Extensions, die – vermutlich noch aus alten Zeiten – das Preset per TCA für ihre Felder setzen :-(
Hier haben wir drei Möglichkeiten:
- die Extension fixen:
Das heißt, Issue für die Extension erstellen, das TCA bereinigen und als Pull-Request einreichen.
(alternativ: den Maintainer kontaktieren und um die Änderung bitten) - Unser Preset pro Feld setzen (via TCA-Override oder via feldspezifischem PageTS).
Das kann bei vielen RTE-Felder aufwändig sein – und fehleranfällig bei Weiterentwicklung des Projekts und Hinzukommen neuer RTE-Felder. - das default-Preset ansich überschreiben:
$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['default'] = 'EXT:myextension/Configuration/Yaml/CkEditor.yaml';