TYPO3 + CKEditor: Everything You Need To Know

The world’s most popular CKEditor has been integrated into TYPO3 and it was one of the great decisions. Here, I want to guide from basic to advanced level CKEditor integration and customization into TYPO3 CMS.

TYPO3 + CKEditor: Everything You Need To Know

The world’s most popular CKEditor has been integrated into TYPO3 and it was one of the great decisions. Here, I want to guide you from basic to advanced level CKEditor integration and customization into TYPO3 CMS.

CKEditor helps TYPO3 programmers and editors compared to old so-called htmlArea RTE editors.

Teams extending their editorial workflows with AI can use the AI Foundation for TYPO3 to manage shared AI providers, prompts, permissions, and context centrally. Since a TYPO3 v8, CKEditor is part of the TYPO3 core by replacing old RTE.

Let's get started with a step-by-step guide on TYPO3 CKEditor! Learn about setup, configurations,,`, customization, installing TYPO3 plugins, and much more. This guide covers rich text editor features, CKEditor 5, and HTML text editor options.

Short answer: TYPO3 ships CKEditor 5 in the core extension rte_ckeditor. You configure it with YAML presets: register a preset file in the ext_localconf.php of your sitepackage, set toolbar items, headings and styles under editor.config, and activate the preset with the page TSconfig line RTE.default.preset. Custom plugins are ES6 modules loaded via importModules.

Key takeaways

  • TYPO3 v12, v13 and v14 use CKEditor 5. TYPO3 v8 to v11 used CKEditor 4. CKEditor 4 plugins and options such as toolbarGroups, removeButtons or stylesSet do not work in CKEditor 5.
  • The core ships three presets: default, minimal and full. "default" is active unless you select another one.
  • New presets are registered in $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets'] in ext_localconf.php. This setting cannot be changed in the backend.
  • Page TSconfig selects the preset per page tree, field or content type, for example RTE.config.tt_content.bodytext.preset.
  • Two layers decide which HTML is kept: htmlSupport in the editor and the processing rules from Processing.yaml on save. Keep the Processing.yaml import, it contains security measures.
  • In TYPO3 v14 the backend editor follows the light or dark mode of the editor's system by default, and the PSR-14 event AfterRichtextConfigurationPreparedEvent lets you change the RTE configuration in PHP.

Tested with / valid for: TYPO3 v13.4 LTS and v14.3 LTS (system extension rte_ckeditor with CKEditor 5). Sections marked "(CKEditor 4)" describe TYPO3 v8 to v11.

Updated: November 2026

CKEditor is an enterprise-grade WYSIWYG HTML text editor with wide browser compatibility, including support for legacy browsers. As a powerful rich text editor, CKEditor 5 offers robust features and functionalities for seamless content creation and editing.

What can you do with CKEditor?

  • Copy/paste from Word and Excel, spell check, accessibility checker, and tables.
  • Wide range of third-party plugins eg., autocomplete, widgets, code snippets, and Plugins.
  • Better control over content: HTML filters and mode of view source code
  • Excellent accessibility: WCAG 2.0 AA and Section 508 compliant.
  • Long-term support (LTS) versions
  • Leverage CKEditor 5 for advanced HTML text editing

Read more at the official website CKEditor.com

CKEditor is a third-party feature that is ready-to-go in TYPO3 via the system extension called EXT:rte_ckeditor. TYPO3 people now have cool-editors to easily manage their content.

21.000+ tests

27M+ downloads

400+ plugins

23.000+ questions

No problem, Try by your self this quick demo now ckeditor.com/ckeditor-4/demo/#article

The extension rte_ckeditor incorporates the features of CKEditor and adds additional functionality, configuration presets, and plugins.

Sample Key Features

  • Configurable via YAML files
  • Default three ready-to-use CKEditor preset in TYPO3
  • Flexible to modify of TYPO3 CKEditor Toolbar
  • Integrated with TYPO3 link wizard
  • Integrated most popular word count CKEditor plugin into TYPO3
  • Don’t have to fully maintain it by the TYPO3 community, Because other cool OpenSource projects are already well developed and maintained eg., CKEditor.
  • CKEditor has good cross-browser & cross-compatibility support
  • Complying with the latest TYPO3 accessibility and web accessibility standards
  • Cool in-line editing features that help to make better Frontend inline editing
  • CKEditor includes a wide range of features such as formatting tools, spell check, and media embedding, which are not available in a basic HTML text editor.

The old htmlArea RTE has been deprecated since TYPO3 v8.

If you have an old TYPO3 website with RTE htmlArea and it’s hard to migrate to CKEditor, then no problem — you can still find updates and further TYPO3 support & maintenance at FriendsOfTYPO3/rtehtmlarea. 

TYPO3 RTE Editing Modes

CKEditor for TYPO3 editors makes content management easy and efficient. Enjoy advanced editing features and a user-friendly interface integrated seamlessly into TYPO3.

Mode 1: Classic Article Mode

The default RTE integrated into TYPO3 backend eg., Add text element get RTE.

Mode 2: Document Editor mode

Editing is similar to using Microsoft Word or Google Docs, where the document looks like a sheet of paper. The focus is on organizing content rather than the layout itself.

Mode 3: Inline Editor mode

Unfortunately, TYPO3 does not include fantastic front-end editing projects within its core. However, you can easily access and use these powerful tools from the TYPO3 Extension Repository (TER) or can get Support for TER  to enhance your content management experience.

Basic features of CKEditor in TYPO3

For Example, if you want to bold text, Simply Select text and click on the B (for bold) button:

Example: To create a link, select the text and click on the Link button.

TYPO3 v12 introduced CKEditor 5, a completely new and rewritten editor compared to the previous CKEditor 4, which had been integrated into TYPO3 since TYPO3 v8. If you have an older version of TYPO3, you need to complete a TYPO3 upgrade from TYPO3 8 to TYPO3 9 or a higher version to utilize the benefits of the CKEditor RTE.

CKEditor 5 Integration

TYPO3 v12 introduces CKEditor 5 as the default rich text editor, replacing CKEditor 4. CKEditor 5 comes with a completely new architecture and many modern features.

New Plugin System

CKEditor 5 has a new plugin system that is not compatible with CKEditor 4 plugins. This means that any custom plugins or configurations need to be rewritten to work with CKEditor 5.

CKEditor 5 Configuration Changes

This includes changes in toolbar configuration, plugin management, and other settings. Developers need to update their configurations to match the new structure.

Customizations and Extensibility

While CKEditor 5 offers advanced customization and extensibility options, the approach is different. Developers must familiarize themselves with the new ways to extend and customize the editor for efficient TYPO3 development. 

Security Enhancements

CKEditor 5 includes enhanced security features to protect against common vulnerabilities associated with rich text editors.

T3AI Co-Pilot, part of the powerful T3AI TYPO3 AI Extension, is your go-to assistant for simplifying content management within TYPO3 CMS. Designed with specialized features, T3AI Co-Pilot enhances your content creation, translation, and optimization processes directly within the TYPO3 Rich Text Editor (RTE). From drafting new content to translating it accurately and fine-tuning it for SEO, T3AI Co-Pilot helps streamline every step, making your TYPO3 experience more efficient.

Since CKEditor uses YAML for configuration, it's important to first understand the basics of YAML files.

YAML (a recursive acronym for "YAML Ain't Markup Language") is a human-readable data serialization language. It is commonly used for configuration files and in applications where data is being stored or transmitted.

It’s very simple, Try Google with some examples to learn the concept and syntax.

“Did you know?
The RTE CKEditor has not been configured in PageTSConfig TypoScript anymore, Everything is managed through cool-YAML."

Instead of a bit complicated TypoScript, TYPO3 core team and community choose to have famous well-structured YAML configurations.

  • CKEditor uses JavaScript for Integration
  • TypoScript with TSConfig is bit hard new TYPO3 integrators and developers
  • A new start for a new structure to separate processing and Editor-related configuration
  • Allow options to be extended (but no condition or unsetting values)

CKEditor has default presets to easily configure different variance, What’s preset?

  • Define editor look and layout
  • Define what tags and styles are allowed
  • Define which plugins to load
  • Define database processing RTE.proc

Default: TYPO3 CKEditor Preset

Minimal: TYPO3 CKEditor Preset

Full: TYPO3 CKEditor Preset

  • Step 1. Go to System > Configuration
  • Step 2. Choose $GLOBALS[‘TYPO3_CONF_VARS’] (Global Configuration)

Create a YAML preset in your sitepackage, register it in ext_localconf.php and select it with page TSconfig. The official best practice is to copy the core file typo3/sysext/rte_ckeditor/Configuration/RTE/Default.yaml as a starting point and to keep the three core imports at the top of your file.

The system extension rte_ckeditor is part of the TYPO3 core (Composer package typo3/cms-rte-ckeditor). TYPO3 updates the bundled CKEditor 5 with patch releases: TYPO3 v12.4.0 shipped CKEditor 5 v37, v13.4.0 shipped v43, and the current 13.4 and 14.3 branches require ckeditor5 v48 (Build/package.json).

If several settings apply, TYPO3 uses this order: a preset for a specific field in page TSconfig, then richtextConfiguration in TCA, then the general preset in page TSconfig, then "default" (Configuration Concepts).

MethodWorks inBest forCaveat
Page TSconfig RTE.default.presetv11 to v14One preset for a site or page treeThe preset must be registered first
Page TSconfig RTE.config.[table].[field].preset and .types.[type].presetv11 to v14Different editors per field or content typeYAML options overridden here replace arrays and cannot set booleans
TCA richtextConfigurationv11 to v14Fields of your own extensionA field preset from page TSconfig wins
PSR-14 AfterRichtextConfigurationPreparedEventv14Changing the final configuration in PHPNot available in v13

The three steps below give you a working preset. Copy them, replace my_sitepackage with your extension key and flush all caches.

<?php
// EXT:my_sitepackage/ext_localconf.php
$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['my_preset']
    = 'EXT:my_sitepackage/Configuration/RTE/MyPreset.yaml';
# EXT:my_sitepackage/Configuration/RTE/MyPreset.yaml
# TYPO3 v13.4 LTS and v14.3 LTS (CKEditor 5), indent with 2 spaces
imports:
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

editor:
  config:
    contentsCss:
      - "EXT:rte_ckeditor/Resources/Public/Css/contents.css"
      - "EXT:my_sitepackage/Resources/Public/Css/rte.css"

    toolbar:
      items:
        - style
        - heading
        - '|'
        - bold
        - italic
        - '|'
        - bulletedList
        - numberedList
        - blockQuote
        - '|'
        - link
        - insertTable
        - '|'
        - removeFormat
        - undo
        - redo
        - sourceEditing

    heading:
      options:
        - { model: 'paragraph', title: 'Paragraph' }
        - { model: 'heading2', view: 'h2', title: 'Heading 2' }
        - { model: 'heading3', view: 'h3', title: 'Heading 3' }

    style:
      definitions:
        - { name: "Lead", element: "p", classes: ['lead'] }
        - { name: "Muted", element: "span", classes: ['text-muted'] }

    htmlSupport:
      allowEmpty: ['i']
      allow:
        - { name: 'i', classes: [ 'fa-brands', 'fa-typo3' ] }
# EXT:my_sitepackage/Configuration/page.tsconfig
# or: Page properties > Resources > Page TSconfig
RTE.default.preset = my_preset

# Optional: smaller editor for the bodytext of "Text" elements only
RTE.config.tt_content.bodytext.types.text.preset = minimal

Toolbar items go into editor.config.toolbar.items as a YAML list. Use '|' to separate groups and '-' for a line break. Items from optional CKEditor 5 packages only work after you load the package with importModules, as the core file Full.yaml does.

Toolbar itemWhat it doesIn core presetExtra importModules entry
headingParagraph and heading dropdown, options in heading.optionsdefault, fullNo
styleStyle dropdown, entries in style.definitionsdefault, fullNo
bold, italicBold and italic textdefault, minimal, fullNo
underline, strikethroughUnderline and strikethroughfullNo
subscript, superscript, softhyphenSub- and superscript, soft hyphendefault, fullNo
bulletedList, numberedList, blockQuoteLists and quotesdefault, fullNo
indent, outdentIndent blocks, classes in indentBlockfullNo
alignmentText alignment as CSS classesdefault, fullNo
linkTYPO3 link browserdefault, fullNo
insertTableTables, cell tools in table.contentToolbardefault, fullNo
findAndReplace, specialCharacters, horizontalLineSearch and replace, special characters, horizontal ruledefault, fullNo
removeFormat, undo, redoClear formatting, undo, redodefault, full (undo and redo also in minimal)No
sourceEditing, selectAllHTML source view, select allsourceEditing: default, full; selectAll: fullNo
showBlocksShows block outlinesfull@ckeditor/ckeditor5-show-blocks
fontFamily, fontSize, fontColor, fontBackgroundColorFont options (since TYPO3 12.4.12)full@ckeditor/ckeditor5-font
textPartLanguageMarks the language of a text partfull@ckeditor/ckeditor5-language
highlightMarker and pen colorsfull@ckeditor/ckeditor5-highlight
fullscreenFullscreen editing (since TYPO3 13.4.16)full@ckeditor/ckeditor5-fullscreen

Source: the core presets Default.yaml, Minimal.yaml and Full.yaml of TYPO3 13.4 and 14.3 and the rte_ckeditor configuration examples. All options of the toolbar are described in the CKEditor 5 toolbar documentation.

Write the plugin as an ES6 module, register it in Configuration/JavaScriptModules.php and load it with editor.config.importModules. Old CKEditor 4 plugins built with CKEDITOR.plugins.add cannot be reused.

The minimal example below follows the timestamp plugin from the TYPO3 documentation. It adds a "Timestamp" button that inserts the current date and time. The CKEditor 4 to 5 migration guide explains the new plugin concepts.

If you prefer ready-made TYPO3 CKEditor plugins to writing your own, the free Community Edition of the CKEditor Pack, built together with the CKEditor team, adds features such as Fullscreen Mode, Find and Replace, Templates and Word Count without a license key.

// EXT:my_sitepackage/Resources/Public/JavaScript/Ckeditor/timestamp-plugin.js
import { Plugin } from '@ckeditor/ckeditor5-core';
import { ButtonView } from '@ckeditor/ckeditor5-ui';

export class Timestamp extends Plugin {
  static pluginName = 'Timestamp';

  init() {
    const editor = this.editor;

    // Register the button so it can be used as toolbar item
    editor.ui.componentFactory.add(Timestamp.pluginName, () => {
      const button = new ButtonView();

      button.set({
        label: 'Timestamp',
        withText: true
      });

      // Insert the current date and time at the cursor position
      button.on('execute', () => {
        const now = new Date();
        editor.model.change(writer => {
          editor.model.insertContent(writer.createText(now.toString()));
        });
      });

      return button;
    });
  }
}
<?php
// EXT:my_sitepackage/Configuration/JavaScriptModules.php
return [
    'dependencies' => ['backend'],
    // The TYPO3 v13.4 docs add this tag, the v14.3 docs no longer list it
    'tags' => [
        'backend.form',
    ],
    'imports' => [
        '@my-vendor/my-package/timestamp-plugin.js' => 'EXT:my_sitepackage/Resources/Public/JavaScript/Ckeditor/timestamp-plugin.js',
    ],
];
# EXT:my_sitepackage/Configuration/RTE/MyPreset.yaml
imports:
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

editor:
  config:
    importModules:
      - { module: '@my-vendor/my-package/timestamp-plugin.js', exports: [ 'Timestamp' ] }
    toolbar:
      items:
        - bold
        - italic
        - '|'
        - clipboard
        - undo
        - redo
        - '|'
        - timestamp
  1. Edit a text element. Select a sentence and choose Lead text in the styles menu.
  2. Select a link and choose Button link.
  3. Save, close and reopen the element. Both styles must still be applied.
  4. Open the frontend and check the HTML: <p class="lead"> and <a class="btn">.

Without your preset, the editor shows the default toolbar. With it, you see the shorter toolbar from step 1.

If the class disappears on save: the RTE processing removes it. Check the preset imports and that the style definition uses a plain class. If it survives but has no effect: the CSS rule is missing in the frontend stylesheet.

  • Keep the toolbar short. Fewer buttons mean fewer styling mistakes.
  • Offer only the heading levels your design uses.
  • Remove sourceEditing for editors who do not know HTML.

Most CKEditor problems in TYPO3 come from a preset that is not active, a YAML indentation error or an old cache. Check these points in this order.

The toolbar or a button does not show

  • Check that your preset is registered: System > Configuration > $GLOBALS['TYPO3_CONF_VARS'] (Global Configuration) > RTE.
  • Check which preset applies to the field. A field preset in page TSconfig wins over TCA and over RTE.default.preset.
  • Indent with two spaces and put a space after each colon. YAML is case sensitive.
  • Items such as fontSize, highlight or fullscreen need their package in importModules. If an item is missing, CKEditor logs toolbarview-item-unavailable in the browser console.
  • CKEditor 4 keys such as toolbarGroups, removeButtons and stylesSet have no effect in TYPO3 v12 to v14. Rewrite them as toolbar.items and style.definitions.

Styles or editor CSS are missing

  • The Style dropdown only lists entries from style.definitions. The v14.3 docs recommend defining CSS classes there instead of in htmlSupport.allow.
  • Files in contentsCss must be downloadable via fetch(), because TYPO3 prefixes the CSS in the browser. Keep the core contents.css in the list if you want its default styling.
  • Browsers cache this CSS. Change a query string such as ?v=2 after each edit.
  • TYPO3 v14: contents.css adapts to light and dark mode. If the editor must stay light, point contentsCss to your own file.

Tags or attributes disappear on save

  • Allow the element in the editor with htmlSupport.allow and check that the processing rules (allowTags in Processing.yaml) keep it.
  • Do not remove the Processing.yaml import. The documentation warns that this removes security measures.
  • Elements unknown to the CKEditor 5 schema, such as svg or custom elements, cannot be allowed with htmlSupport.

Changes do not appear at all

Flush all caches after you edit YAML, page TSconfig, ext_localconf.php or JavaScriptModules.php: Admin Tools > Maintenance > Flush TYPO3 and PHP Cache in v13, System > Maintenance in v14, or vendor/bin/typo3 cache:flush on the command line. Then reload the backend.

Want editors to see accessibility problems while they type in CKEditor? Read our post on the live accessibility checker for TYPO3.

Moving from CKEditor 4 to CKEditor 5?

The free Upgrade Playbook for TYPO3 (PDF with 18 pages plus an Excel worksheet) shows the safe path from TYPO3 v11 to v14, one LTS step at a time.

Get the free Upgrade Playbook

JavaScript Code of CKEditor

CKEDITOR.editorConfig = function(config) {
    config.toolbarGroups = [
        {name: 'basicSyles', groups: ['basicStyles']}
    ];
    config.removeButtons := 'Underline,Strike';
}

YAML code of CKEditor for TYPO3

editor:
    config:
        toolbarGroups:
            - {name: basicSyles, groups: [basicStyles]}
        removeButtons:
            - Underline
            - Strike

Yes, Of course!

  • Step 1. Go to the Page module, Click on the root page.
  • Step 2. Edit your page properties, Go to Resources tab and Page TSConfig
  • Step 3. Configure your preset, here are examples.

Default: CKEditor Preset

RTE {
    default.preset = default
}

Full: CKEditor Preset

RTE {
    default.preset = full
}

Minimal: CKEditor Preset

RTE {
    default.preset = minimal
}

Override One Field

// Syntax: RTE.config.[tableName].[fieldName].preset
RTE {
    config {
        tt_content {
            bodytext.preset = myFavouritePreset
        }
    }
}

Override One Field: If Type Match

// Syntax: RTE.config.tt_content.bodytext.types.textmedia.preset = minimal
RTE {
    config {
        tt_content {
            bodytext {
                types {
                    textmedia.preset = myFavouritePreset
                }
            }
        }
    }
}

Override News Extension Field

RTE {
    config {
        tx_news_domain_model_news {
            bodytext.preset = minimal
        }
    }
}

You don’t require to start and learn each property by heart. A good way to learn from the TYPO3 core’s default configuration.

Just copy TYPO3 core’s YAML /typo3/sysext/rte_ckeditor/Configuration/RTE/Default.yaml to your custom extension /yourextension/Configuration/RTE/

# typo3/sysext/rte_ckeditor/Configuration/RTE/Default.yaml

# Load default processing options
imports:
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

# Add configuration for the editor
# For complete documentation see http://docs.CKEditor.com/#!/api/CKEditor.config

editor:
  config:
    format_tags: "p;h1;h2;h3;h4;h5;pre"
    toolbarGroups:
      - { name: styles, groups: [ styles, format ] }
      - { name: basicstyles, groups: [ basicstyles ] }
      - { name: paragraph, groups: [ list, indent, blocks, align ] }
      - { name: links, groups: [ links ] }
      - { name: clipboard, groups: [ clipboard, cleanup, undo ] }
      - { name: editing, groups: [ spellchecker ] }
      - { name: insert, groups: [ insert ] }
      - { name: tools, groups: [ table, specialchar ] }
      - { name: document, groups: [ mode ] }
justifyClasses:
      - text-left
      - text-center
      - text-right
      - text-justify
extraPlugins:
      - justify
removePlugins:
      - image
removeButtons:
      - Anchor
      - Underline
      - Strike
      - Styles
  • Step 1. /typo3conf/ext_localconf.php
if (empty($GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets'][MyPreset])) {
    $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets'][MyPreset] = 'EXT:yourextension/Configuration/RTE/MyPreset.yaml';
}

Tip: You can also add the above code into typo3conf/AdditionalConfiguration.php

  • Step 2. /yourextension/Configuration/RTE/MyPreset.yaml
# Import basic configuration
imports:
 - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
 - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
 - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

# Add configuration for the editor
# For complete documentation see http://docs.CKEditor.com/#!/api/CKEditor.config
editor:
  config:
    # Include custom CSS
    contentsCss: "EXT:yourextension/Resources/Public/Css/rte.css"
  • Step 3. Assign your Custom Preset to CKEditor RTE eg., RTE.default.preset = MyPreset at PageTS.

There are multiple options to perform Step 3 (assign custom preset to RTE) as below.

Option 1: Globally Applied with PageTSConfig

// Page > Properties > Resources > PageTS field
RTE {
    default {
        preset = MyPreset
    }
}

Option 2: Setup through TCA

// yourextension/Configuration/TCA/tx_yourextension_domain_model_table.php

'content' => [ 
    'label' => 'YourLabel', 
    'config' => [ 
        'type' => 'text', 
        'cols' => 48, 
        'rows' => 5, 
        'enableRichtext' => true, 
        'richtextConfiguration' => 'minimal', 
    ], 
],

Option 3. Assign Preset to Particular Table/Field with PageTSConfig

// Page > Properties > Resources > PageTS field

// Syntax
RTE {
    config {
        [table].[field].preset = default
        [table].[field].types.[type].preset = full
    }
}

// Example
RTE {
    config {
        tt_content {
            bodytext {
                preset = minimal
                types {
                    textmedia.preset = default
                    myfield.preset = full
                }
            }
        }
    }
}

In CKEditor, each button is configured in a number of toolbar group.

Example:

# yourextension/Configuration/RTE/MyPreset.yaml

# Load default processing options
imports:
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

# Add configuration for the editor
# For complete documentation see http://docs.CKEditor.com/#!/api/CKEditor.config
editor:
  config:
    toolbarGroups:
        - { name: clipboard, groups: [ clipboard, cleanup, undo ] }

In the above example, the clipboard toolbar group contains three buttons. In this ways, you can configure your favorite editor :)

Explore awesome CKEditor’s UI based to get each button and toolbar at Toolbar Configurator

Many people may be wondering how we can integrate images into CKEditor. In TYPO3 CMS login, by default such a feature is not available with CKEditor. However, you can enhance your HTML rich text editor experience by adding image integration to this WYSIWYG text editor. With the right configurations, your rich text editor JS setup can support seamless image embedding, making content creation much more dynamic and visually appealing.

  • Same image handling as rtehtmlarea (magic images, usual RTE TSConfig supported)
  • Image browser as usual in e.g. FAL file selector
  • Dialog for changing width, height, alt and title (aspect ratio automatically maintained)
  • Step 1. Install TYPO3 extension EXT:rte_ckeditor_image

  • Step 2. Configuration

#1 EXT:yourextension/ext_localconf.php

$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['default'] = 'EXT:yourextension/Configuration/RTE/MyPreset.yaml';
#2 EXT:yourextension/Configuration/RTE/MyPreset.yaml

imports:
  # Import default RTE config (for example)
  - { resource: "EXT:rte_ckeditor/Configuration/RTE/Default.yaml" }
  # Import the image plugin configuration
  - { resource: "EXT:rte_ckeditor_image/Configuration/RTE/Plugin.yaml" }
# Your PageTSConfig

editor:
  config:
    # RTE default config removes image plugin - restore it:
    removePlugins: null

Step 3. Enable RTE config preset

# Page TSConfig
RTE.default.preset = MyPreset

Step 4. (Optional) Configuration

Maximum width/height
The maximum dimensions relate to the configuration for magic images which have to be set in Page TSConfig:

# Page TSConfig
RTE.default.buttons.image.options.magic {
    maxWidth = 1020  # Default: 300
    maxHeight = 800  # Default: 1000
}

Usage as lightbox with fluid_styled_content

# Template Constants

styles.content.textmedia.linkWrap.lightboxEnabled = 1

Allowed extensions
By default the extensions from $TYPO3_CONF_VARS['GFX']['imagefile_ext'] are allowed. However you can override this for CKEditor by adding the following to your YAML configuration:

editor:
  externalPlugins:
      typo3image:
        allowedExtensions: "jpg,jpeg,png"

1. Enable/Disable Advanced Content Filter

# yourextension/Configuration/RTE/MyPreset.yaml

# Load default processing options
imports:
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

# Add configuration for the editor
# For complete documentation see http://docs.CKEditor.com/#!/api/CKEditor.config
editor:
    config:
        allowedContent: true

What is an Advanced Content Filter?

  • Only tags/classes/styles that are configured should be kept
  • Filter content during editing and paste
  • Enabled by default
  • Makes 'processing' config most of the times obsolete 'RTE.proc'

2. Format HTML Tags:

Format the HTML tags by selecting the desired option from a dropdown menu.

editor:
  config:
  	format_tags: "p;h1;h2;h3;h4;h5;pre;address;div"

3. The Toolbar Groups

The Toolbar Groups option will help you define the layout and structure of toolbars on the top portion of the editor.

editor:
   config:
 	toolbarGroups:
     	- { name: clipboard, groups: [clipboard, undo] }
     	- "/"
     	- { name: styles }

4 stylesSet

Provide different styles to format and customize the text in an appealing manner. You may want to use the “Styles” drop-down menu to go about the task.

editor:
  config:
     stylesSet:
  	- { name: "quote-style", element: "p", attributes: { class: "quote-style"}}
  	- { name: "Load More Button", element: "a", attributes: { class: "load-more"}}
  	- { name: "More Content", element: "div", attributes: { class: "more-content"}}

5. extraPlugins

editor:
  config:
    allowTags: 
      - address
      - label
allowTagsOutside: 
      - address
      - label
justifyClasses:
      - text-left
      - text-center
      - text-right
      - text-justify
      - quote-style
extraPlugins:
      - justify

removePlugins:
      - image
removeButtons:
      - Anchor
      - Underline
      - Strike

6 contentsCss

The ContentsCSS feature allows you to define various CSS styles for direct usage and viewing in CKEditor.

7. removeButtons

RemoveButtons helps in the removal of individual functions and buttons that result due to the importing of Base.yaml.

8. Buttons and Classes Configuration

buttons:
  link:
    url:
      properties:
        class:
          default: 'external-link'
    properties:
      class:
        allowedClasses: 'external-link'
classes:
  external-link:
    name: 'External Link'
classesAnchor:
  externalLink:
    class: 'external-link'
    type: 'url'
    target: '_blank'

Add Sample Button

Step 1. /yourextension/Resources/Public/CkEditorPlugins/myplugin.js

'use strict';

(function ()) {
    CKEDITOR.plugins.add('example_plugin', {
        init: function (editor) {
            // Let's add CKEditor Icon
            // Note: Please put icon file at /Resources/Public/CkEditorPlugins/icons/mycustom.png
            icons: 'mycustom',
            
            // Add button to CKEditor
            editor.ui.addButton('MyPreset',{
                label: 'My Button',
                toolbar: 'basicStyles',
                command: 'insertTimestamp'
            });

            // Execute CKEditor Command
            editor.addCommand('insertTimestamp',{
                exec: function (editor){
                    var now = new Date();
                    editor.insertHtml (
                        'The current date and time is: <em>' + now.toString() + '</em>'
                    )
                }
            });
        }
    })
}

Step 2. /yourextension/Configuration/RTE/MyPreset.yaml

# Load default processing options
imports:
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Default.yaml" }
editor:
    # Let's load our sample custom plugin
    externalPlugins:
        myplugin: { resource: "EXT:yourextension/Resources/Public/CkEditorPlugins/myplugin.js" }

Step 3. Register CKEditor Sample Custom Plugin

$GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['MyPreset'] = 'EXT:yourextension/Configuration/RTE/MyPreset.yaml';

Step 4. Test-drive with RTE

RTE {
    default {
        preset = MyPreset
    }
}
# Create yourextension/Resources/Public/CkEditorPlugins/myplugin.js
'use strict';

(function ()) {
    CKEDITOR.plugins.add('example_plugin', {
        init: function (editor) {
            // Let's add CKEditor Icon
            // Note: Please put icon file at /Resources/Public/CkEditorPlugins/icons/mypreset.png
            icons: 'mypreset',
            
            // Add button to CKEditor
            editor.ui.addButton('MyPreset',{
                label: 'My Button',
                toolbar: 'basicStyles',
                command: 'openExampleModal'
            });

            // Execute CKEditor Command
            editor.addCommand('openExampleModal',{
                exec: openModal
            });
        }
    })
}

function openModal() {
    require([
        'TYPO3/CMS/Backend/Modal'
    ], function(Modal) {
        Modal.show(
            'Sample Plugin',
            'Hello'
        );
    })
}

Advanced AJAX-based Custom TYPO3 CKEditor Plugin

# /yourextension/Configuration/RTE/MyPreset.yaml
# Let's configure AJAX route of TYPO3
editor:
    # Let's load our sample custom plugin
    externalPlugins:
        myplugin: { 
            resource: "EXT:yourextension/Resources/Public/CkEditorPlugins/myplugin.js" 
            route: "configsample_route"
        }

# yourextension/Resources/Public/CkEditorPlugins/myplugin.js

function openModal() {
    // Get AJAX URL
    var url = editor.config.myplugin.routeUrl;

    require([
        'TYPO3/CMS/Backend/Modal'
    ], function(Modal) {
        // Display modalbox
        Modal.cdvanced({
            type: Modal.types.iframe,
            title: 'Sample Plugin',
            content: url,
            size: Modal.sizes.large
        })
    })
}

Step 1. Setup JS Code

# Create yourextension/Resources/Public/CkEditorPlugins/myplugin.js

'use strict';
(function () {

	CKEDITOR.dtd.$removeEmpty.em = 0;
	CKEDITOR.dtd.$removeEmpty.i = 0;

	CKEDITOR.plugins.add('icon-envelope', {
		icons: 'iconenvelope',
		init: function (editor) {
			editor.ui.addButton( 'IconEnvelope', {
				label: 'Icon E-Mail',
				toolbar: 'insert',
				command: 'insertIconEnvelope'
			});

			editor.addCommand( 'insertIconEnvelope', {
				exec: function (editor) {
					var icon = editor.document.createElement('i');
					icon.setAttribute('class', 'fa fa-envelope');
					editor.insertElement(icon);
				}
			});
		}
	});

});

Step 2. Include in YAML Configuration

#  /yourextension/Configuration/RTE/MyPreset.yaml

# Load default processing options
imports:
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Processing.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Base.yaml" }
    - { resource: "EXT:rte_ckeditor/Configuration/RTE/Editor/Plugins.yaml" }

# Add configuration for the editor
# For complete documentation see http://docs.ckeditor.com/#!/api/CKEDITOR.config
editor:
  externalPlugins:
    icon-envelope: { resource: "EXT:mytheme/Resources/Public/CkEditorPlugins/icon-envelope/plugin.js" }

Code Snippet TYPO3 CKEditor

  • Step 1. Search CKEditor plugin which you want to integrate into TYPO3 from CkEditor Plugin
  • Step 2. Let's imagine you want to integrate this Codesnippet plugin CKEditor Codesnippet
  • Step 3. Download & Unzip the plugin Put the plugin at yourextension/Resources/Public/CKeditor/Plugins/codesnippet/
  • Step 4. Configuration/RTE/Plugin.yaml
editor:
   externalPlugins:
       codesnippet:
           resource: "EXT:yourextension/Resources/Public/CKeditor/Plugins/codesnippet/"

Step 5. Any extra configuration require in the plugin, check their documentation

Step 6. Clear the cache! You should able to see "Insert Code Snippet"

Youtube TYPO3 CKEditor

Step 1.Download & Unzip plugin ckeditor.com/cke4/addon/youtube
Put the plugin at yourextension/Resources/Public/CKeditor/Plugins/youtube/

Step 2. Configuration/RTE/Plugin.yaml

editor:
  externalPlugins:
    youtube: { resource: "EXT:mx_ext/Resources/Public/RTE/Plugins/youtube/plugin.js" }
  config:
    youtube_width: '550'
    extraAllowedContent: '*(*)[data-*]; iframe'

Step 3. Clear the cache! You should able to see "Youtube Video Button"

Word Count TYPO3 CKEditor

Step 1. Download & Unzip plugin https://ckeditor.com/cke4/addon/wordcount

Put the plugin at yourextension/Resources/Public/CKeditor/Plugins/wordcount/

Step 2. Configuration/RTE/Plugin.yaml

# Register wordcount plugin for ckeditor
editor:
  externalPlugins:
    wordcount:
      resource: "EXT:rte_ckeditor_wordcount/Resources/Public/JavaScript/Plugins/wordcount/"

Step 3. Import into RTE Preset

imports:
  - resource: { "EXT:rte_ckeditor_myplugin/Configuration/RTE/Plugin.yaml" }

editor:
  config:
    wordcount:
      showCharCount: true

Step 4. Clear the cache! You should be able to see the "WordCount” button.

This plugin is pre-installed in the CKEditor and, as the name suggests, checks the spelling while you type. However, you have to reactivate it for every text, but you can activate it by default with the following code snippet.

editor:
  config:
    defaultContentLanguage: "de"
    defaultLanguage: "de"
    contentsLanguage: "de"
    language: "de"
    scayt_autoStartup: true # Spellcheck always on
    scayt_sLang: "de_DE" # spellcheck language
    wsc_lang: "de_DE"

Font Awesome Icons into TYPO3 CKEditor

Step 1. Install TYPO3 Extension rte_ckeditor_fontawesome

Step 2. TS Config

# For the default template to the CKE-Editor
RTE.default.preset = defaultFA4

# For the full template of CKE-Editor
RTE.default.preset = fullFA4

Step 3. TYPO3 Constants

# Include your font-awesome path
plugin.tx_ckeditor_fontawesome.css = {$path}

# Inlcude font-awesome through CDN
plugin.tx_ckeditor_fontawesome.css = https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css

Step 4. Import to Your RTE Config
To add this Plug-In in your own RTE Config. Import the Config in your preset.

imports:
    - { resource: "EXT:rte_ckeditor_fontawesome/Configuration/RTE/PluginFA5.yaml" }

At the next step, you need to extend your individual Toolbar-Config to add the Clickable Icon.

editor:
  config:
    toolbar:
        - [ 'Bold', 'Italic', .....]
        ...
        - [ 'ckeditor_fa5' ]

Unfortunately, TYPO3 does not provide any automatic migration from old RTE htmlArea to CKEditor.

You should carefully migrate it manually, but no worries, It’s not that much hard. Because, most of them are looking very similar so go one by one each configuration.

RTE htmlArea PageTSConfig

RTE.default {
  showButtons(
    bold, italic, underline,
    left, center, right, justifyfull,
    orderedlist, unorderedlist, indent, outdent, 
         line, link, removeformat,
    copy, cut, paste, undo, redo     
  )
  toolbarOrder(
    bold, italic, underline, bar, 
    left, center, right, justifyfull,
    orderedlist, unorderedlist, bar, indent, outdent, linebreak,
         line, link, removeformat, bar,
    copy, cut, paste, bar, undo, redo      
  )
}

RTE CKEditor YAML

editor:
  config:
    toolbar:
      - [ 'Bold', 'Italic', 'Underline', '-' ] 
      - [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ] 
      - [ 'NumberdList', 'BulletedList', '-', 'Indent', 'Outdent' ] 
      - '/'
      - [ 'HorizontalRule', 'Link', 'RemoveFormat', '-' ] 
      - [ 'Copy', 'Cut', 'Paste', '-' , 'Undo', 'Redo'] 
    extraPlugins:  
      - justify

Which CKEditor version do TYPO3 v13 and v14 use?

TYPO3 v13.4 LTS and v14.3 LTS both use CKEditor 5 through the core extension rte_ckeditor. The exact CKEditor 5 release changes with TYPO3 patch releases: v13.4.0 shipped CKEditor 5 v43, and the current 13.4 and 14.3 branches require v48. CKEditor 4 was used from TYPO3 v8 to v11.

Can I reuse CKEditor 4 plugins in TYPO3 v13 or v14?

No. CKEditor 5 has a different plugin architecture, and the TYPO3 documentation states that CKEditor 4 plugins are not compatible with it. Rewrite each plugin as an ES6 module based on the CKEditor 5 Plugin class, register it in JavaScriptModules.php and load it via importModules. Check first whether CKEditor 5 or an extension already offers the feature.

How do I insert images in CKEditor in TYPO3 v13 and v14?

The TYPO3 core removed rich text image handling in v10, so you need an extension. EXT:rte_ckeditor_image (Composer package netresearch/rte-ckeditor-image) version 13.10 supports TYPO3 13.4.21 and later and 14.3. After installation, enable its site set netresearch/rte-ckeditor-image, which adds the insertimage button and the frontend rendering.

Where can I see which RTE presets are available?

Open System > Configuration in the backend, choose $GLOBALS['TYPO3_CONF_VARS'] (Global Configuration) and expand RTE. You see every registered preset name and the YAML file behind it. The core registers default, minimal and full. Extensions and your sitepackage can add more presets in ext_localconf.php.

Can editors use CKEditor in the TYPO3 form editor?

Yes, since TYPO3 v14.2 and therefore in v14.3 LTS. The form editor can use CKEditor 5 for textarea fields, for example the StaticText element, checkbox labels with links and the confirmation finisher. Integrators enable it in the form YAML with enableRichtext and choose any registered RTE preset with richtextConfiguration.

Free TYPO3 guides for your team

Upgrade, accessibility, multilingual and relaunch playbooks for TYPO3 projects, free to download.

See all free TYPO3 guides

Thanks for reading a long article.

I hope you enjoyed and explored more about cool CKEditor with our beloved awesome TYPO3 CMS.

What’s your favorite feature in CKEditor? Do you have any questions on CKEditor integration with TYPO3? Did we miss any important feature integration of CKEditor in TYPO3?
Please feel free to write any questions, feedback, or issues at the below comment box. We will be happy to write you back.

And if you’re excited about how AI is changing the TYPO3 world, don’t miss what’s happening in the TYPO3 AI Universe — where TYPO3 and AI come together to simplify workflows and inspire innovation.

Have a Happy Editing!

Sovereign TYPO3 AI: AI Foundation is free and open source, six AI extensions build on it.

Explore TYPO3 AI