---
title: Wie man individuelle Inhaltselemente in TYPO3 erstellt
url: "https://b13.com/de/wissen/wie-man-individuelle-inhaltselemente-in-typo3-erstellt"
description: Ein Content-Typ für das Seitenmodul von TYPO3 wird durch eine Reihe von Konfigurationen definiert. Wir gehen die sieben Schritte durch, die für die Erstellung und Aktivierung des gewünschten Content-Typs und der UI-Elemente, die für die Unterstützung der Content-Redakteure benötigt werden, erforderlich sind. 
image: "https://b13.com/fileadmin/_processed_/9/4/csm_b13_blog_custom-content_41ff8c16c6.png"
date: 2020-02-22
modified: 2026-08-19
lastUpdated: 2026-08-19
---

# Wie man individuelle Inhaltselemente in TYPO3 erstellt

[ CType ](https://b13.com/de/wissen/ctype)

 Wie man individuelle Inhaltselemente in TYPO3 erstellt
========================================================

![](https://b13.com/fileadmin/_processed_/a/d/csm_david_5ce18d41e2.jpg)David Steeb

  27. Februar 2020

 [ RSS Feed ](https://b13.com/de/rss.xml)

  ![[Translate to Deutsch:] ](https://b13.com/fileadmin/_processed_/9/4/csm_b13_blog_custom-content_5b35480a7c.webp "[Translate to Deutsch:] ")  \[Translate to Deutsch:\]

Eine mit TYPO3 erstellte Webseite besteht aus verschiedenen Inhaltsteilen, die in semantischen Containern gespeichert werden und im Jargon von TYPO3 „Content Elements“ genannt werden. Inhaltselemente enthalten eine bestimmte Zusammenstellung von Informationen, z.B. eine Überschrift, einen Text und ein Bild. Diese Menge an Informationen wird als „Content Type“ bezeichnet. Inhaltselemente und Inhaltstypen können wiederverwendet oder neu angeordnet werden, ihre Sichtbarkeit bei der Ausgabe wird durch eine gewisse Business-Logik bestimmt, sie können zur Übersetzung übermittelt werden und vieles mehr. Für uns ist die Tatsache, dass wir (und du!) unsere eigenen Elemente selbst erstellen können, eines der Alleinstellungsmerkmale (USPs), die TYPO3 in Bezug auf Leistung und Flexibilität von anderen CMS unterscheidet.

  Wenn du eine neue Instanz mit einem Basis-Installationspaket aufbaust, erhältst du eine Reihe von Standard-Inhaltselementen und -typen wie „Text“, „Text mit Bild“ und „Aufzählungszeichen“. Diese sind zwar unerlässlich und nützlich, und man kann die Seitenausgabe entsprechend den eigenen Bedürfnissen gestalten, aber sobald man mit realen Designvorlagen für größere Projekte zu arbeiten beginnt, benötigt man mit ziemlicher Sicherheit zusätzliche Inhaltselementtypen.

Es gibt eine Reihe von Erweiterungen von Drittanbietern, die dir helfen, Inhaltselemente für bestimmte Zwecke zu erstellen. Die Verwendung dieser Erweiterungen kann zwar zu schnellen Ergebnissen führen, aber die zusätzlichen Abhängigkeiten von den Erweiterungen von Drittanbietern könnten im Laufe der Zeit zum Problem werden. Damit meinen wir in diesem Fall, dass du keine Kontrolle darüber hast, wann das nächste TYPO3-Update eine Aktualisierung der Extension durch den Entwickler des Drittanbieters erfordert. Die Aktualisierung könnte länger dauern als du brauchen kannst und dich dazu zwingen, zwischen einer früheren (potentiell unsicheren) Version oder der Störung deiner Website wählen zu müssen.

**Bei b13 erstellen wir benutzerdefinierte Inhaltstypen in wenigen einfachen Schritten, ohne auf Erweiterungen von Drittanbietern zurückzugreifen. Wir nennen diese Arbeitsweise und die von uns erstellten benutzerdefinierten Inhaltstypen „core-nah“.** Sie sind nicht von Lösungen Dritter abhängig und werden bei Upgrades nicht beeinträchtigt. Wir haben vor kurzem einen Inhaltstyp zur Anzeige von Codeblöcken mit Syntax-Highlighting für diese Website, unseren eigenen Blog, erstellt. Wir dachten, dieser Inhaltstyp wäre ein perfektes Beispiel, um zu zeigen, was möglich ist und wie man es nach den Best Practices macht.

   Backstory
-----------

Im Zuge unserer verstärkten Bemühungen, unsere Arbeit mit TYPO3 CMS und anderen Technologien aufzuzeigen, dachten wir uns, dass wir ziemlich oft Code in unserem Blog veröffentlichen werden. Wir wollten, dass Code-Schnipsel automatisch mit Syntax-Highlighting angezeigt werden, damit sie für die Leute leichter zu analysieren und zu verstehen sind.

Die Standardlösung ist das Hinzufügen einer JavaScript-Bibliothek (wie [highlight.js](https://highlightjs.org/)) zum eigenen Quellcode, die JavaScript-Magie verwendet, um Codeblöcke zu identifizieren und sie in einem nützlichen Farbschema wiederzugeben. Diese Option stand uns nicht zur Verfügung; unsere Website ist vollständig AMP-kompatibel (nach dem Accelerated Mobile Pages-Standard), und die AMP Best-Practice besteht darin, die JS-Nutzung auf ein absolutes Minimum zu beschränken. Das Laden einer ganzen JS-Bibliothek, um dann nur einen Bruchteil davon auf einer bestimmten Seite zu verwenden, ist natürlich kein Weg, um die Ladezeiten von Seiten im Browser zu optimieren.

Dank eines PHP-Pakets namens [highlight.php](https://github.com/scrivo/highlight.php), das genau das tut, was highlight.js im Browser macht, ist es nicht mehr nötig, eine ganze JS-Bibliothek zu laden. Auf diese Weise verlagern wir auch das Rendering auf den (viel schnelleren) Webserver und liefern dem Benutzer vorformatierte Ausgaben. Mit highlight.php können wir die Codeschnipsel im TYPO3-Backend erzeugen, sie vollständig cachen und das Hinzufügen von JavaScript in unserem Frontend vermeiden.

Hierfür verwenden wir unseren Inhaltstyp „Code-Block“. Damit können wir Code-Schnipsel als Inhalt direkt im TYPO3-Backend eingeben. Das System weiß (weil wir es so eingerichtet und unsere Templates und das Rendering konfiguriert haben), dass dieser Inhalt mit Code-Syntax-Highlighting für die Ausgabe im Frontend gerendert wird — für die Anzeige auf der Seite, wo ihr, liebe Leser, das Beste daraus machen könnt.

   Erstellen eines benutzerdefinierten Inhaltstyps für TYPO3
-----------------------------------------------------------

Um unseren Inhaltstyp in verschiedenen TYPO3-Instanzen wiederzuverwenden, haben wir die „contentblock“-Extension erstellt. Ihr einziger Zweck ist es, den „Contentblock“-Inhaltstyp zu deiner TYPO3-Installation hinzuzufügen. In diesem Beitrag werden wir uns die verschiedenen Teile des Codes und der Konfiguration ansehen, die benötigt werden, um den Content-Typ in TYPO3 hinzuzufügen, und dies am Beispiel dieser Erweiterung. Unsere Contentblock-Erweiterung ist [hier verfügbar](https://github.com/b13/codeblock) und kann mit diesem Composer-Befehl installiert werden: `composer req b13/codeblock`

   Was gehört zu einem Inhaltstyp?
---------------------------------

Ein Content-Typ für das Seitenmodul von TYPO3 wird durch eine Reihe von Konfigurationen definiert. Wir gehen die sieben Schritte durch, die für die Erstellung und Aktivierung des gewünschten Content-Typs und der UI-Elemente, die für die Unterstützung der Content-Redakteure benötigt werden, erforderlich sind. Wir werden Dateien und Konfigurationen zu einigen verschiedenen Teilen des TYPO3-Backends wie folgt hinzufügen:

1. **Datenbank-Feld:** Hinzufügen eines Feldes zur Datenbanktabelle für „tt\_content“
2. **Backend TCA:**
    1. Hinzufügen einer Konfiguration für das zusätzliche Backend-Formularfeld für die Tabelle „tt\_content“ im TCA (Table Configuration Array).
    2. Hinzufügen des Inhaltstyps zur Liste der verfügbaren Inhaltstypen.
    3. Hinzufügen der Konfigurationsoptionen für die verfügbaren Felder für Redakteure **im Backend.**
3. **Assistent für neue Inhaltselemente:** Hinzufügen des Content-Typs zum „New Content Element Wizard“
4. **Backend-Inhaltselementvorschau im Seitenmodul:** Hinzufügen einer Redakteursvorschau im TYPO3 Backend-Seitenmodul, um den Redakteuren den Inhalt anzuzeigen.
5. **Erstellen eines DataProcessors:** Verarbeitung des Inhalts mit einem DataProcessor, um die Ausgabe mit highlight.php-Syntax-Highlighting zu versehen.
6. **TypoScript-Konfiguration:** Jeder Inhaltselementtyp benötigt eine TypoScript-Konfiguration, um zu definieren, was im Frontend angezeigt werden soll.
7. **Fluid Template:** Wir fügen ein Fluid-Template hinzu, um unseren Inhaltselement-Typ im Frontend darzustellen.

Betrachten wir nun jeden Schritt im Detail.

   Schritt-für-Schritt-Anleitung
-------------------------------

  ###  1. Ein Datenbankfeld hinzufügen

Wenn eine Erweiterung die Datenbank modifizieren muss, wird eine Datei `ext_tables.sql` zu der Erweiterung hinzugefügt. Die Syntax ist SQL, und auch wenn wir ein Feld zu einer bestehenden Tabelle hinzufügen, verwenden wir die `CREATE TABLE` Syntax. TYPO3 kümmert sich um das korrekte Hinzufügen unseres Feldes. Weitere Informationen zum Ändern von Datenbanktabellen und -feldern findest du im TYPO3-Handbuch [hier](https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/DatabaseUpgrade/Index.html).

Wir möchten eine Dropdown-Liste aller verfügbaren Programmiersprachen anzeigen, die highlight.php unterstützt, so dass Redakteure leicht eine bestimmte Programmiersprache (und ein entsprechendes spezifisches Syntax-Highlighting-Schema) angeben können. Für unseren benutzerdefinierten Inhaltstyp fügen wir ein Feld `code_language` zur Tabelle `tt_content` hinzu.

Und so sieht unsere ext\_tables.sql-Datei aus:

  ```
1<br></br>2<br></br>3<br></br>
```

```
CREATE TABLE tt_content (<br></br>    code_language text<span class="hljs-built_in"> DEFAULT </span><span class="hljs-string">''</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span><br></br>);<br></br>
```

  ###  2. Hinzufügen der Konfiguration zum TCA

Das Table Configuration Array (TCA) ist die Konfigurationsschicht über der Datenbank, auf der TYPO3 arbeitet. Das TCA enthält alle Konfigurationsoptionen für Datenbankfelder und teilt dem System mit, wie ein bestimmtes Feld und seine Werte oder Wertoptionen für Backend-Benutzer in verschiedenen Formen angezeigt werden sollen. Mehr dazu in der Dokumentation zum TCA [hier](https://docs.typo3.org/m/typo3/reference-tca/master/en-us/Index.html).

Für unsere Zwecke werden wir dem TCA für die Tabelle „tt\_content“ drei Dinge hinzufügen. Die gesamte Konfiguration ist in der Datei `Configuration/TCA/Overrides/tt_content.php` enthalten:

  ####  a) Hinzufügen der Konfiguration für unser neu erstelltes Feld code\_language

Wir fügen das neue Feld als Auswahlelement hinzu. Die Werte, die ein Backend-Benutzer auswählen kann, werden aus einem separaten DataProvider generiert (siehe Ordner `Classes/DataProvider`), die genaue Funktionsweise ist für dieses Anwendungsbeispiel ein wenig außerhalb des Rahmens. Wir hätten auch einfach eine Liste von Elementen manuell hinzufügen können. Wir verwenden das ExtensionManagementUtility des TYPO3-Core, um die neue Feldkonfiguration zum TCA für `tt_content` hinzuzufügen:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>
```

```
<span class="hljs-comment">// Add dropdown for code language to TCA.</span><br></br>$additionalColumns = [<br></br>    <span class="hljs-string">'code_language'</span> => [<br></br>        <span class="hljs-string">'label'</span> => <span class="hljs-string">'LLL:EXT:codeblock/Resources/Private/Language/locallang_db.xlf:tt_content.code_language'</span>,<br></br>        <span class="hljs-string">'config'</span> => [<br></br>            <span class="hljs-string">'type'</span> => <span class="hljs-string">'select'</span>,<br></br>            <span class="hljs-string">'default'</span> => <span class="hljs-string">''</span>,<br></br>            <span class="hljs-string">'itemsProcFunc'</span> => <span class="hljs-string">'b13\\Codeblock\\DataProvider\\CodeLanguages->getAll'</span>,<br></br>            <span class="hljs-string">'renderType'</span> => <span class="hljs-string">'selectSingle'</span>,<br></br>        ],<br></br>    ],<br></br>];<br></br><br></br>\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(<span class="hljs-string">'tt_content'</span>, $additionalColumns);<br></br><br></br>\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(<br></br>    <span class="hljs-string">'tt_content'</span>,<br></br>    <span class="hljs-string">'code_language'</span>,<br></br>    <span class="hljs-string">'codeblock'</span>,<br></br>    <span class="hljs-string">'before:bodytext'</span><br></br>);<br></br>
```

  ####  Hinzufügen unseres Inhaltstyps zur Liste der verfügbaren Inhaltstypen (Datenbankfeld CType)

Auch hier verwenden wir die ExtensionManagementUtilty-API, um die TCA-Konfiguration für das Feld „CType“ zu ändern und unseren neuen Inhaltstyp der Liste hinzuzufügen.

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>
```

```
\TYPO3\CMS\Core\Utility\<span class="hljs-name">ExtensionManagementUtility</span>::addTcaSelectItem(<br></br>    <span class="hljs-string">'tt_content'</span>,<br></br>    <span class="hljs-string">'CType'</span>,<br></br>    [<span class="hljs-string">'LLL:EXT:codeblock/Resources/Private/Language/locallang_db.xlf:tt_content.CType'</span>, <span class="hljs-string">'codeblock'</span>, <span class="hljs-string">'content-codeblock'</span>],<br></br>    <span class="hljs-string">'html'</span>,<br></br>    <span class="hljs-string">'after'</span><br></br>);<br></br>
```

  **Anmerkung:** Die Verwendung von `content-codeblock` als iconIdentifier (dritter Wert im Array, der als dritter Parameter im folgenden Code-Snippet notiert ist) erfordert, dass das Icon zuerst registriert wird, was in der `ext_localconf.php` zu sehen ist.

  ####  c) Hinzufügen einer Konfiguration für das Bearbeitungsformular unseres Content-Typs

Diese Konfiguration legt die Liste der Felder, ihre Sortierreihenfolge und die Gruppierung in Paletten und Reitern für die Backend-Ansicht fest, die der Editor beim Bearbeiten eines Elements vom Typ „Codeblock“ sieht. Bitte beachte in diesem Zusammenhang, wie die Konfigurationseigenschaft „columnsOverrides“ verwendet werden kann, um das Standard-Anzeigeverhalten des Feldes „bodytext“ zu ändern — in diesem Fall, um eine Monospace-Schriftart zu verwenden, um das Backend übersichtlich und benutzerfreundlich für die Redakteure zu gestalten!

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>27<br></br>28<br></br>
```

```
<span class="hljs-comment">$GLOBALS</span><span class="hljs-title">[</span><span class="hljs-comment">'TCA'</span><span class="hljs-title">]</span><span class="hljs-title">[</span><span class="hljs-comment">'tt_content'</span><span class="hljs-title">]</span><span class="hljs-title">[</span><span class="hljs-comment">'types'</span><span class="hljs-title">]</span><span class="hljs-title">[</span><span class="hljs-comment">'codeblock'</span><span class="hljs-title">]</span> <span class="hljs-comment">=</span> <span class="hljs-title">[</span><br></br>    <span class="hljs-comment">'showitem'</span> <span class="hljs-comment">=</span>> <span class="hljs-comment">'</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:general</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;general</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;headers</span><span class="hljs-string">,</span><br></br>                    <span class="hljs-comment">bodytext;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:bodytext_formlabel</span><span class="hljs-string">,</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:tabs</span><span class="hljs-string">.</span><span class="hljs-comment">appearance</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;frames</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;appearanceLinks</span><span class="hljs-string">,</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:language</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;language</span><span class="hljs-string">,</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:access</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;hidden</span><span class="hljs-string">,</span><br></br>                    --<span class="hljs-comment">palette</span>--<span class="hljs-comment">;;access</span><span class="hljs-string">,</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:categories</span><span class="hljs-string">,</span><br></br>                    <span class="hljs-comment">categories</span><span class="hljs-string">,</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:notes</span><span class="hljs-string">,</span><br></br>                    <span class="hljs-comment">rowDescription</span><span class="hljs-string">,</span><br></br>                --<span class="hljs-comment">div</span>--<span class="hljs-comment">;LLL:EXT:core/Resources/Private/Language/Form/locallang_tabs</span><span class="hljs-string">.</span><span class="hljs-comment">xlf:extended</span><span class="hljs-string">,</span><br></br>            <span class="hljs-comment">'</span><span class="hljs-string">,</span><br></br>    <span class="hljs-comment">'columnsOverrides'</span> <span class="hljs-comment">=</span>> <span class="hljs-title">[</span><br></br>        <span class="hljs-comment">'bodytext'</span> <span class="hljs-comment">=</span>> <span class="hljs-title">[</span><br></br>            <span class="hljs-comment">'config'</span> <span class="hljs-comment">=</span>> <span class="hljs-title">[</span><br></br>                <span class="hljs-comment">'fixedFont'</span> <span class="hljs-comment">=</span>> <span class="hljs-comment">true</span><span class="hljs-string">,</span><br></br>            <span class="hljs-title">]</span><span class="hljs-string">,</span><br></br>        <span class="hljs-title">]</span><span class="hljs-string">,</span><br></br>    <span class="hljs-title">]</span><br></br><span class="hljs-title">]</span><span class="hljs-comment">;</span><br></br>
```

    ![Formular zur Erstellung neuer Seiteninhalte in TYPO3, mit Feldern für den Inhaltstyp, die Überschrift, den Typ, die Programmiersprache und einem Textfeld für die Codeeingabe. Die Überschrift lautet „Codeblock“ und enthält einen Codeausschnitt.](https://b13.com/fileadmin/_processed_/6/1/csm_Figure_1_-_Backend_form_for_our_code_block_content_type_4a78ec330d.webp)  Abbildung 1: Das Backend-Formular für unseren Codeblock-Inhaltstyp.

  ###  3. Einen Eintrag im Assistenten für neue Inhaltselemente hinzufügen

Um ein anklickbares Element zum „Assistenten für neue Inhaltselemente“ hinzuzufügen, verwenden wir einige Zeilen PageTS, wie in `Configuration/PageTs/PageTs.tsconfig` zu sehen:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>
```

```
mod<span class="hljs-selector-class">.wizards</span><span class="hljs-selector-class">.newContentElement</span> {<br></br>    wizardItems {<br></br>        common<span class="hljs-selector-class">.elements</span><span class="hljs-selector-class">.codeblock</span> {<br></br>            title = LLL:EXT:codeblock/Resources/Private/Language/locallang_db<span class="hljs-selector-class">.xlf</span>:tt_content<span class="hljs-selector-class">.CType</span><br></br>            description = LLL:EXT:codeblock/Resources/Private/Language/locallang_db<span class="hljs-selector-class">.xlf</span>:tt_content<span class="hljs-selector-class">.wizard</span><span class="hljs-selector-class">.description</span><br></br>            tt_content_defValues<span class="hljs-selector-class">.CType</span> = codeblock<br></br>            iconIdentifier = <span class="hljs-attribute">content</span>-codeblock<br></br>        }<br></br>        common<span class="hljs-selector-class">.show</span> := addToList(codeblock)<br></br>    }<br></br>}<br></br>
```

  Um einen `IconIdentifier` zu verwenden, musst du das Icon zuerst registrieren, siehe Kommentar oben.

    ![Menüoptionen zum Erstellen neuer Inhaltselemente, einschließlich „Reguläres Textelement“, „Text & Medien“, „CTA-Element“ und „Codeblock“, jeweils mit kurzen Beschreibungen ihrer Funktionen.](https://b13.com/fileadmin/_processed_/8/b/csm_Figure_2_-_Code_Block_element_in_New_Content_Element_Wizard_78850ddfc1.webp)  Abbildung 2: Das Element Codeblock ist im Assistenten für neue Inhaltselemente aufgelistet.

  ###  4. Eine Elementvorschau zum Seitenmodul hinzufügen

Abhängig vom Inhalt deines „Code“-Feldes zeigt die Elementvorschau im Seitenmodul nichts außer deiner Überschrift an:

  ![Der im Benutzerinterface angezeigte Text enthält "Code Block", das zweimal wiederholt wird.](https://b13.com/fileadmin/_processed_/c/2/csm_Figure_3_-_Default_preview_of_a_content_element_7d81ae91ff.webp)  Abbildung 3: Die Standardvorschau eines Inhaltselements zeigt möglicherweise keine nützlichen Informationen an.

  Dies liegt an der Standardwiedergabe von Inhaltselementen, die überhaupt keinen PHP-Code anzeigen, an der Entfernung von HTML-Tags für HTML-Inhalte usw. Schließlich ist die Backend-Vorschau als schematische Vorschau des Inhalts und der Struktur gedacht, nicht als vollständige, visuelle Darstellung des Inhalts.

  Um dies zu ändern und unsere Inhalte für die Redakteure sichtbar zu machen, fügen wir auch eine benutzerdefinierte Vorschau-Konfiguration für unser Element hinzu. Dies geschieht in `Classes/Hooks/CodeblockPreviewRenderer.php`:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>21<br></br>22<br></br>23<br></br>24<br></br>25<br></br>26<br></br>27<br></br>28<br></br>
```

```
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CodeblockPreviewRenderer</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">PageLayoutViewDrawItemHookInterface</span><br></br></span>{<br></br>    <span class="hljs-comment">/**<br></br>     * Preprocesses the preview rendering of a content element of type "codeblock"<br></br>     *<br></br>     * <span class="hljs-doctag">@param</span> \TYPO3\CMS\Backend\View\PageLayoutView $parentObject Calling parent object<br></br>     * <span class="hljs-doctag">@param</span> bool $drawItem Whether to draw the item using the default functionality<br></br>     * <span class="hljs-doctag">@param</span> string $headerContent Header content<br></br>     * <span class="hljs-doctag">@param</span> string $itemContent Item content<br></br>     * <span class="hljs-doctag">@param</span> array $row Record row of tt_content<br></br>     */</span><br></br>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">preProcess</span><span class="hljs-params">(<br></br>        PageLayoutView &$parentObject,<br></br>        &$drawItem,<br></br>        &$headerContent,<br></br>        &$itemContent,<br></br>        array &$row<br></br>    )</span> </span>{<br></br>        <span class="hljs-keyword">if</span> ($row[<span class="hljs-string">'CType'</span>] === <span class="hljs-string">'codeblock'</span>) {<br></br>            <span class="hljs-keyword">if</span> ($row[<span class="hljs-string">'bodytext'</span>]) {<br></br>                $bodytext = GeneralUtility::fixed_lgd_cs($row[<span class="hljs-string">'bodytext'</span>], <span class="hljs-number">1000</span>);<br></br>                $itemContent .= $parentObject->linkEditContent(nl2br(htmlentities($bodytext)), $row) . <span class="hljs-string">'<br />'</span>;<br></br>            }<br></br><br></br>            $drawItem = <span class="hljs-keyword">false</span>;<br></br>        }<br></br>    }<br></br>}<br></br>
```

  Registriere den Hook in der Datei `ext_localconf.php` der Extension:

  ```
1<br></br>2<br></br>
```

```
$GLOBALS[<span class="hljs-string">'TYPO3_CONF_VARS'</span>][<span class="hljs-symbol">'SC_OPTIONS'</span>][<span class="hljs-string">'cms/layout/class.tx_cms_layout.php'</span>][<span class="hljs-symbol">'tt_content_drawItem'</span>][<span class="hljs-string">'codeblock'</span>] =<br></br>\b13\Codeblock\Hooks\CodeblockPreviewRenderer::class;<br></br>
```

  Et voilà! Wir haben jetzt eine brauchbare Vorschau im Seitenmodul:

  ![PHP-Codeausschnitt für eine TYPO3 CMS-Erweiterung, der eine Klasse `HighlightProcessor` definiert, die das `DataProcessorInterface` implementiert. Der Code enthält einen Konstruktor und Verweise auf Hilfsklassen zur Verarbeitung von Inhaltsdaten.](https://b13.com/fileadmin/_processed_/0/b/csm_Figure_4_-_Code_preview_in_the_backend_page_module_f5ff23315b.webp)  Abbildung 4: Code-Vorschau im Backend-Seiten-Modul.

  ###  Anmerkung:

Für viele Elemente kannst du Fluid-Templates als Backend-Vorschau verwenden, oder du brauchst nicht einmal benutzerdefinierte Felder zu Datenbanken hinzuzufügen. Du kannst eine Backend-Ansichtsvorlage unter Verwendung von PageTS festlegen, wenn du nur bestimmte Felder anzeigen willst; in unserem Fall müssen wir den Inhalt auf eine besondere Art und Weise verarbeiten. Um ein Fluid-Template mit TSConfig für eine Inhaltselementvorschau zu setzen, verwendest du die `typo3/systext/backend/Classes/View/PageLayoutView.php`, Funktion `tt_content_drawItem($row)` in deiner TYPO3-Codebasis!

  ###  5. Erstellen eines DataProcessors

Wir wollen das Code-Snippet mit highlight.php verarbeiten, unserem Inhaltselement hinzufügen und das Ergebnis in unserem Frontend darstellen. Dazu müssen wir den Inhalt mit einem DataProcessor verarbeiten. Die vollständige Datei findest du unter `Classes/DataProcessing/HighlightProcessor.php`.

  Wir verwenden den Wert eines bestimmten Feldes (`$processorConfiguration['field']`), verarbeiten ihn mit highlight.php und geben eine formatierte Version des Wertes zurück, die in der Frontend-Ausgabe verwendet werden soll.

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>13<br></br>14<br></br>15<br></br>16<br></br>17<br></br>18<br></br>19<br></br>20<br></br>
```

```
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">process</span><span class="hljs-params">(ContentObjectRenderer $cObj, array $contentObjectConfiguration, array $processorConfiguration, array $processedData)</span><br></br></span>{<br></br>    $fieldName = $processorConfiguration[<span class="hljs-string">'field'</span>];<br></br>    $targetVariableName = $cObj->stdWrapValue(<span class="hljs-string">'as'</span>, $processorConfiguration, <span class="hljs-string">'bodytext_formatted'</span>);<br></br>    $highlight = GeneralUtility::makeInstance(Highlighter::class);<br></br><br></br>    <span class="hljs-comment">// Let highlight.php decide which code language to use from all registered if "detect automatically" is selected.</span><br></br>    <span class="hljs-keyword">if</span> (!$processedData[<span class="hljs-string">'data'</span>][<span class="hljs-string">'code_language'</span>]) {<br></br>        $languages = $highlight->listLanguages();<br></br>        $highlight->setAutodetectLanguages($languages);<br></br>        $highlighted = $highlight->highlightAuto($processedData[<span class="hljs-string">'data'</span>][$fieldName]);<br></br>    } <span class="hljs-keyword">else</span> {<br></br>        $highlighted = $highlight->highlight($processedData[<span class="hljs-string">'data'</span>][<span class="hljs-string">'code_language'</span>], $processedData[<span class="hljs-string">'data'</span>][$fieldName]);<br></br>    }<br></br><br></br>    $processedData[$targetVariableName][<span class="hljs-string">'code'</span>] = $highlighted->value;<br></br>    $processedData[$targetVariableName][<span class="hljs-string">'language'</span>] = $highlighted->language;<br></br>    $processedData[$targetVariableName][<span class="hljs-string">'lines'</span>] = preg_split(<span class="hljs-string">'/\r\n|\r|\n/'</span>, $highlighted->value);<br></br>    <span class="hljs-keyword">return</span> $processedData;<br></br>}<br></br>
```

  ###  6. TypoScript-Konfiguration für die Frontend-Ausgabe hinzufügen

Damit TYPO3 etwas im Frontend ausgeben kann, müssen wir festlegen, was es tun soll, wenn es versucht, ein Inhaltselement vom Typ „Codeblock“ zu rendern. Wir erweitern die TypoScript-Konfiguration für `tt_content` um unsere benutzerdefinierte Content-Type-Konfiguration in `Configuration/TypoScript/setup.typoscript`und fügen die Konfiguration für die Datenverarbeitung zu unserer Elementkonfiguration hinzu, um den Wert des „bodytext“-Feldes zu verarbeiten:

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>12<br></br>
```

```
tt_content.codeblock =< <span class="hljs-class"><span class="hljs-keyword">lib</span>.<span class="hljs-title">contentElement</span></span><br></br>tt_content.codeblock {<br></br>    templateName = Codeblock<br></br>    <br></br>    templateRootPaths.<span class="hljs-number">0</span> = <span class="hljs-symbol">EXT:</span>codeblock/Resources/Private/Templates<br></br><br></br>    dataProcessing.<span class="hljs-number">1567071612</span> = b13\Codeblock\DataProcessing\HighlightProcessor<br></br>    dataProcessing.<span class="hljs-number">1567071612</span> {<br></br>        field = bodytext<br></br>        <span class="hljs-keyword">as</span> = bodytext_formatted<br></br>    }<br></br>}<br></br>
```

  ###  7. Ein Fluid-Template für unseren Inhaltstyp hinzufügen

Als letzten Schritt müssen wir die Fluid-Vorlage erstellen, um den Inhalt in unserem Frontend zu rendern. Der Name und das Verzeichnis des Fluid-Templates werden im obigen TypoScript-Setup definiert und das Template ist unter `Resources/Private/Templates/Codeblock.html` zu finden.

  ```
1<br></br>2<br></br>3<br></br>4<br></br>5<br></br>6<br></br>7<br></br>8<br></br>9<br></br>10<br></br>11<br></br>
```

```
<span class="xml"><span class="hljs-tag"><<span class="hljs-name">f:layout</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"Default"</span> /></span><br></br><br></br><span class="hljs-tag"><<span class="hljs-name">f:section</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"Main"</span>></span><br></br><br></br>	<span class="hljs-tag"><<span class="hljs-name">pre</span>></span><br></br>		<span class="hljs-tag"><<span class="hljs-name">code</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"hljs </span></span></span><span class="hljs-template-variable">{bodytext_formatted.language}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>></span><br></br>			</span><span class="hljs-template-variable">{bodytext_formatted.code -> f:format.raw()}</span><span class="xml"><br></br>		<span class="hljs-tag"></<span class="hljs-name">code</span>></span><br></br>	<span class="hljs-tag"></<span class="hljs-name">pre</span>></span><br></br><br></br><span class="hljs-tag"></<span class="hljs-name">f:section</span>></span></span><br></br>
```

  ###  Ergebnis: Eine wieder verwendbare Vorlage für Inhaltstypen

Jedes TYPO3-Projekt bei b13 umfasst individuelle Designs, individuelle Templates und benutzerdefinierte Inhaltstypen, die den spezifischen Anforderungen des Kunden entsprechen. Nicht alle Anwendungsfälle erfordern so viele Änderungen, wie wir in diesem ziemlich detaillierten Beispiel aufgenommen haben. Dennoch haben wir mit diesen einfachen Schritten einen neuen Inhaltstyp in wenigen Minuten erstellt.

Die grundlegenden Bausteine, wie oben beschrieben, sind jedes Mal die gleichen. Wenn du das Konzept einmal verinnerlicht hast, ist es einfach, neue, benutzerdefinierte Inhaltstypen hinzuzufügen, so dass deine Redakteure Inhalte erstellen können, die in jedem Template gut aussehen.

Wir sind noch einen Schritt weiter gegangen und haben dir gezeigt, wie du deine Arbeit wertvoller machen kannst, indem du eine Erweiterung erstellst, die du wiederverwenden kannst, um einen bestimmten Inhaltstyp zu einem oder allen deinen Projekten hinzuzufügen.

Ein zusätzlicher Vorteil ist, dass auf diese Weise erstellte benutzerdefinierte Inhaltstypen (wir nennen sie „core-nah“) bei einer Aktualisierung nicht kaputtgehen und du und deine TYPO3-Instanz sich nicht auf Drittanbieter-Entwickler verlassen müssen.

Wir führen Workshops zur Erstellung von Site-Extensions und zur Migration von Drittanbieterlösungen zu benutzerdefinierten Inhaltstypen durch, die genau wie die nativen Inhaltstypen des TYPO3-Kerns funktionieren.

Wir beraten dich gerne, wenn du mehr erfahren möchtest oder Hilfe bei der Integration deiner Templates benötigst.

   Kontaktiere uns um mehr zu lernen
-----------------------------------

…oder wenn du Hilfe bei der Integration deiner Templates brauchst

 [ Let’s connect ](https://b13.com/de/kontakt)

  ###  Geschrieben von:

 ![Lächelnder Mann mit kurzen Haaren und einem Bart, der ein rotes T-Shirt trägt, steht in einem gut beleuchteten Innenraum mit verschwommenem Hintergrund.](https://b13.com/fileadmin/_processed_/a/d/csm_david_cf042ebb7f.webp)

Als b13-Gründer und CEO is David derjenige, mit dem Du es zu tun haben wirst, wenn Du mit uns zusammenarbeiten möchtest. Er eignet sich ständig neue Fähigkeiten an und bestimmt maßgeblich unsere hochmodernen Ansätze in der Frontend-Entwicklung.

 David Steeb  CEO

 [ mehr von David Steeb ](https://b13.com/de/team/david-steeb)

  Ähnliche Artikel
------------------

- ![Zwei stilisierte Webseiten-Designs mit einem Benutzerprofil, Platzhaltern für Bilder und Textabschnitten, vor einem hellblauen Hintergrund.](https://b13.com/fileadmin/_processed_/2/0/csm_BackendPreview_Headerbild_b4c5799cfa.webp)

    ###  Backend-Content-Previews mit System — warum wir EXT:backendpreviews entwickelt haben

     09. Februar 2026 | David Steeb

     EXT:backendpreviews sorgt für konsistente Content-Previews im TYPO3-Backend mit Fluid Templates, Layouts und Partials.

     [ weiterlesen: Backend-Content-Previews mit System — warum wir EXT:backendpreviews entwickelt haben ](https://b13.com/de/wissen/backend-content-previews-mit-system-warum-wir-extbackendpreviews-entwickelt-haben)
- ![Zwei Personen, eine mit langen Haaren und die andere mit kurzen Haaren, zeigen auf einen großen digitalen Bildschirm, der Texte und Grafiken anzeigt. Die Szene ist von lebhaften Farben und abstrakten Formen im Hintergrund geprägt.](https://b13.com/fileadmin/_processed_/c/9/csm_Container_pt3_8f99cd005e.webp)

    ###  Flexible Container und Grids für TYPO3, Teil drei

     22. Juli 2020 | David Steeb

     Wie man mit Hilfe der TYPO3 Container Extension komplexe Unterstrukturen für das Seitenlayout hinzufügt. Teil 3 unserer Serie.

     [ weiterlesen: Flexible Container und Grids für TYPO3, Teil drei ](https://b13.com/de/wissen/flexible-container-und-grids-fuer-typo3-teil-drei)
- ![Eine Person mit lockigem Haar steht vor einem großen Computerbildschirm, der Texte und Grafiken anzeigt, während zwei kleinere Dokumente in der Nähe platziert sind. Das gesamte Farbschema besteht aus Blau- und Orangetönen.](https://b13.com/fileadmin/_processed_/b/3/csm_Container_pt2_6a4e55a6b1.webp)

    ###  Flexible Container und Grids für TYPO3, Teil zwei

     20. Juli 2020 | David Steeb

     Wie man die in TYPO3 eingebauten Layouts mit Hilfe der Container Extension um ein einfaches 2-Spalten-Element erweitert. Teil 2 unserer Serie.

     [ weiterlesen: Flexible Container und Grids für TYPO3, Teil zwei ](https://b13.com/de/wissen/flexible-container-und-grids-fuer-typo3-teil-zwei)
- ![Ein stilisiertes Computerfenster zeigt ein Rasterlayout mit gelben Abschnitten und Textzeilen, umgeben von abstrakten Formen und Laub auf einem dunklen Hintergrund.](https://b13.com/fileadmin/_processed_/7/c/csm_Container_pt1_625927eee4.webp)

    ###  Flexible Container und Grids für TYPO3

     16. Juli 2020 | David Steeb

     Erweitere die eingebauten Layout-Konzepte von TYPO3 mit der Container Extension. Einfache Flexibilität für Redakteure, reduziertes Risiko für zukünftige Upgrades.

     [ weiterlesen: Flexible Container und Grids für TYPO3 ](https://b13.com/de/wissen/flexible-container-und-grids-fuer-typo3)
- ![Eine Person sitzt an einem Tisch mit hochgelegten Füßen und nutzt einen Laptop. Im Hintergrund sind schwebende Chatblasen und eine Grafik einer Landschaft zu sehen, die auf Online-Kommunikation und digitale Inhaltserstellung hindeuten.](https://b13.com/fileadmin/_processed_/1/7/csm_Create_Content_Elements_0904390bfe.webp)

    ###  Ein Klick genügt — wie Du jetzt beim Hinzufügen von TYPO3-Elementen Zeit sparst

     03. Juni 2020 | David Steeb

     TYPO3 v10 spart Zeit und reduziert Klicks für Redakteure: Ein einziger Klick genügt, um nicht individuell konfigurierbare Inhaltselemente hinzuzufügen. Ein weiterer Grund für ein…

     [ weiterlesen: Ein Klick genügt — wie Du jetzt beim Hinzufügen von TYPO3-Elementen Zeit sparst ](https://b13.com/de/wissen/direktes-speichern-von-neuen-inhaltselementen-in-typo3)