---
title: "Content elements & plugins"
manual: "TYPO3 Explained"
version: "main"
permalink: "https://docs.typo3.org/permalink/t3coreapi:content-element-and-plugin@main"
source: "ApiOverview/ContentElements/Index.rst"
rendered: "2026-09-20T15:52:37+00:00"
---

# Content elements & plugins {#content-element-and-plugin}

This chapter handles content elements & plugins: What they are, how they can be
created, how existing content elements or plugins can be customized etc.

**Table of Contents**

-   [Create a custom content element type (CType)](https://docs.typo3.org/permalink/t3coreapi:create-a-custom-content-element-type-ctype@main)
-   [Custom data processors](https://docs.typo3.org/permalink/t3coreapi:custom-data-processors@main)
-   [Create plugins](https://docs.typo3.org/permalink/t3coreapi:create-plugins@main)
-   [Configure custom backend preview for content element](https://docs.typo3.org/permalink/t3coreapi:configure-custom-backend-preview-for-content-element@main)
-   [New content element wizard](https://docs.typo3.org/permalink/t3coreapi:new-content-element-wizard@main)
-   [Best practices](https://docs.typo3.org/permalink/t3coreapi:best-practices-1@main)

## Introduction {#cepluginsintroduction}

-   [Content elements in TYPO3](https://docs.typo3.org/permalink/t3coreapi:content-elements-in-typo3@main)
-   [Plugins in TYPO3](https://docs.typo3.org/permalink/t3coreapi:plugins-in-typo3@main)
-   [Editing](https://docs.typo3.org/permalink/t3coreapi:editing@main)
-   [Customizing](https://docs.typo3.org/permalink/t3coreapi:customizing@main)
-   [Creating custom content element types or plugins](https://docs.typo3.org/permalink/t3coreapi:creating-custom-content-element-types-or-plugins@main)

In TYPO3, Content elements and plugins are both stored as [Database records](https://docs.typo3.org/permalink/t3coreapi:database-records@main)
in table `tt_content`. They are usually edited in the backend in module
**Content > Page**.

Content elements and plugins are both used to present and manage
content on a website, but they serve different purposes and have distinct
characteristics:

![Content element Text & Media](/Images/ManualScreenshots/Backend/content_element_example.png)

**[Content elements](https://docs.typo3.org/permalink/t3coreapi:content-elements@main)**

A content element is a standard unit for managing and displaying content,
such as text, images, videos, tables, and more.
TYPO3 provides a variety of built-in content elements. It is possible
to define custom content elements.

[Content elements](https://docs.typo3.org/permalink/t3coreapi:content-elements@main) [Custom content elements](https://docs.typo3.org/permalink/t3coreapi:adding-your-own-content-elements@main)

![Plugin news article detail](/Images/ManualScreenshots/Backend/plugin_example.png)

**[Plugins](https://docs.typo3.org/permalink/t3coreapi:plugins@main)**

A plugin in TYPO3 is more complex, typically providing dynamic
or interactive functionality. Plugins are usually provided by extensions
that introduce new features to the website.

The data to be displayed is usually supplied by a special PHP class
called a "controller". Depending on the technology used in the controller
the plugin can be an Extbase plugin or a plain plugin.

[Plugins](https://docs.typo3.org/permalink/t3coreapi:plugins@main) [Extbase plugins](https://docs.typo3.org/permalink/t3coreapi:plugins-extbase@main)

### Content elements in TYPO3 {#content-elements}

A **content element** is a standard unit for managing and displaying content,
such as text, images, videos, tables, and more.

In the TYPO3 backend, content elements are commonly managed in module
**Content > Page**.

From a technical point of view content elements are records stored in the
database table `tt_content`. Each content
element has a specific content element type, specified by the database field
`tt_content.CType`. This type influences both the backend form and the frontend
output.

The appearance of a content element in the backend form is defined via the
[TYPO3 Configuration Array (TCA)](https://docs.typo3.org/m/typo3/reference-tca/main/en-us/Index.html#start) of table `tt_content`.
Each content element type is configured by one entry in the section
[$TCA\['types'\]](https://docs.typo3.org/m/typo3/reference-tca/main/en-us/Types/Index.html#types).

The output of the content element in the frontend is configured by an entry in
the [TypoScript](https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Index.html#start) top-level object `tt_content` using the
same key as in TCA. In most cases a [FLUIDTEMPLATE](https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Fluidtemplate/Index.html#cobj-template)
is used delegating the actual output to the templating engine
[Fluid](https://docs.typo3.org/permalink/t3coreapi:fluid@main).

A content element can be of a type
supplied by TYPO3, such as `textmedia` (text with or without images or videos).
Or it can have a custom type supplied by an extension such as `carousel`
provided by the [`bk2k/bootstrap-package`](https://packagist.org/packages/bk2k/bootstrap-package) extension.

You can [add custom content elements](https://docs.typo3.org/permalink/t3coreapi:adding-your-own-content-elements@main)
to your extension or [site package](https://docs.typo3.org/permalink/t3coreapi:site-package@main).

It is also possible to use an extension such as [`contentblocks/content-blocks`](https://packagist.org/packages/contentblocks/content-blocks),
[`mask/mask`](https://packagist.org/packages/mask/mask), or [`t3/dce`](https://packagist.org/packages/t3/dce) to add custom content elements to
your projects.

[Adding custom content elements](https://docs.typo3.org/permalink/t3coreapi:adding-your-own-content-elements@main) is
possible without writing PHP code and can therefore also be done by
TYPO3 integrators.

### Plugins in TYPO3 {#plugins}

A **plugin** in TYPO3 is a more complex implementation, typically providing dynamic
or interactive functionality. Plugins are usually provided by extensions
that introduce new features to the website.

The data to be displayed is usually supplied by a special PHP class
called a "controller". Depending on the technology used in the controller
the plugin can be an Extbase plugin or a plain plugin.

#### Extbase plugins {#plugins-extbase}

For usage in the TYPO3 backend Extbase plugins are registered with utility
functions of class `\TYPO3\CMS\Extbase\Utility\ExtensionUtility` (not to
be confused with `\TYPO3\CMS\Core\Utility\ExtensionManagementUtility`).

An Extbase plugin is configured for the frontend with
`ExtensionUtility::configurePlugin()` in file
[`EXT:my_extension/ext_localconf.php`](../../ExtensionArchitecture/FileStructure/ExtLocalconf.md#file-extension-ext-localconf-php):

**EXT:my_extension/ext_localconf.php**

```php
<?php

declare(strict_types=1);
defined('TYPO3') or die();

use MyVendor\MyExtension\Controler\MyController;
use TYPO3\CMS\Extbase\Utility\ExtensionUtility;

ExtensionUtility::configurePlugin(
  'MyExtension',
  'MyPlugin',
  [MyController::class => 'list,comment'],
  [MyController::class => 'comment'],
  ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT,
);

```

Method `ExtensionUtility::configurePlugin()` also takes care of registering
the plugin for frontend output in TypoScript using an object of type
[EXTBASEPLUGIN](https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/Extbaseplugin/Index.html#cobj-extbaseplugin).

If it is desired that editors can insert the Extbase plugin like a content
element into the page it also needs to be registered with
`ExtensionUtility::registerPlugin()` in the TCA Overrides, for example file
[`EXT:my_extension/Configuration/TCA/Overrides/tt_content.php`](../../ExtensionArchitecture/FileStructure/Configuration/TCA/Index.md#file-extension-configuration-tca-overridessomefile-php):

**EXT:my_extension/Configuration/TCA/Overrides/tt_content.php**

```php
<?php

declare(strict_types=1);

use TYPO3\CMS\Extbase\Utility\ExtensionUtility;

defined('TYPO3') or die();

ExtensionUtility::registerPlugin(
  'MyExtension',
  'MyPlugin',
  'my_extension.messages:my_plugin.title',
  'myextension_pluginicon',
  'plugins',
  'my_extension.messages:my_plugin.description',
);

```

For a detailed explanation of Extbase plugins including examples for controllers
see chapter [Extbase: extension framework in TYPO3](https://docs.typo3.org/permalink/t3coreapi:extbase-extension-framework@main).

#### Plugins without Extbase {#plugins-non-extbase}

It is possible to create a plugin without using Extbase by creating a plain PHP
class as a controller.

In this case you have to define the TypoScript configuration yourself. A
[USER or USER_INT](https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/UserAndUserInt/Index.html#cobj-user-int) TypoScript object can be used
to delegate the rendering to your controller:

**EXT:my_extension/Configuration/Sets/MyExtension/setup.typoscript**

```typoscript
plugin.tx_myextension_myplugin = USER_INT
plugin.tx_myextension_myplugin {
  userFunc = MyVendor\MyPlugin\Controller\MyController->doSomething
}

tt_content.myextension_myplugin < plugin.tx_myextension_myplugin

```

To register such a plugin as content element you can use function
`ExtensionManagementUtility::addPlugin()` in the TCA overrides, for example
[`EXT:my_extension/Configuration/TCA/Overrides/tt_content.php`](../../ExtensionArchitecture/FileStructure/Configuration/TCA/Index.md#file-extension-configuration-tca-overridessomefile-php):

**EXT:my_extension/Configuration/TCA/Overrides/tt_content.php**

```php
<?php

declare(strict_types=1);

use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;

defined('TYPO3') or die();

ExtensionManagementUtility::addPlugin(
  [
    'label' => 'my_extension.db:my_plugin.title',
    'value' => 'myextension_myplugin',
    'group' => 'plugins',
    'icon' => 'myextension_mypluginicon',
    'description' => 'my_extension.db:my_plugin.description',
  ],
  'CType',
  'my_extension',
);

```

<!-- TODO: no Markdown rendering for "versionchanged" -->

The method's second and third parameter have been dropped. This method can
only be used with the field CType of table tt_content.

#### Typical characteristics of plugins {#plugins-characteristics}

-   Plugins often use additional database tables which contain records which are
    dynamically displayed via the plugin - often in a list view, a single view,
    optionally with pagination and search functionality. An extension may provide
    several plugins, each with a dedicated function, such as the list view.
-   Plugins are often used if more complex functionality is required (than in non-
    plugin content elements)
-   Plugins can be created using the Extbase framework or by Core functionality.

A typical extension with plugins is the [`georgringer/news`](https://packagist.org/packages/georgringer/news) extension
which comes with plugins to display news records in lists or as a single view
with only one news record.

The news records are stored in a custom database table (`tx_news_domain_model_news`)
and can be edited in the backend.

There are also system extensions that have plugins. [`typo3/cms-felogin`](https://packagist.org/packages/typo3/cms-felogin)
has a plugin that allow frontend users, stored in table `fe_users` to log into
the website. [`typo3/cms-indexed-search`](https://packagist.org/packages/typo3/cms-indexed-search) has a plugin that can be
used to search in the index and display search results.

### Editing {#plugins-editing}

The [Editors Tutorial](https://docs.typo3.org/m/typo3/tutorial-editors/main/en-us/Index.html#start) describes how to work with
[page content](https://docs.typo3.org/m/typo3/tutorial-editors/main/en-us/ContentElements/Content/Index.html#content-working) and
lists the [basic TYPO3 content elements](https://docs.typo3.org/m/typo3/tutorial-editors/main/en-us/ContentElements/CreatingContent/Index.html#content-types)
and how to work with them.

Additional descriptions can be found in the
[fluid_styled_content](https://docs.typo3.org/c/typo3/cms-fluid-styled-content/main/en-us/ContentElements/Index.html#content-elements) documentation.

### Customizing {#cepluginscustomize}

[Backend Layouts](https://docs.typo3.org/permalink/t3coreapi:be-layout@main) can be configured to define how content elements
are arranged in the TYPO3 backend (in rows, columns, grids). This can be used in
the frontend to determine how the content elements are to be arranged (e.g. in
the footer of the page, left column etc.).

Often content elements and plugins contain a number of fields. Not all of these may
be relevant for your site. It is good practice to configure which fields will be
displayed in the backend. There are a number of ways to do this:

-   [Backend user and group permissions](https://docs.typo3.org/permalink/t3coreapi:access-options@main) can be used to restrict access to
    content elements, to content on specific pages etc.
-   Fields can be hidden in the backend by using [TSconfig TCEFORM](https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/PageTsconfig/TceForm.html#tceform).
-   page TSconfig can be used to [configure](https://docs.typo3.org/permalink/t3coreapi:content-element-wizard@main) what is displayed in the "Content Element
    Wizard".

### Creating custom content element types or plugins {#content-element-and-plugin-creation}

The following chapters handle how to create custom content element types and
plugins:

-   [Create a custom content element type (CType)](https://docs.typo3.org/permalink/t3coreapi:adding-your-own-content-elements@main)
-   [Registering frontend plugins in
    Extbase](https://docs.typo3.org/permalink/t3coreapi:extbase-registration-frontend-plugin@main)

How to make your plugins or content elements configurable by editors with

-   [FlexForms](https://docs.typo3.org/permalink/t3coreapi:flexforms@main)
