Einfachstes eigenes Content-Element

von Martin Damken

Contao Cheat Sheet

Mit etwas Glück reicht für das gewünschte Datenset eine Auswahl vorhandenen Felder der Tabelle tl_content. Dann kommt man mit wenigen Zeilen Code, verteilt auf vier Dateien aus:

  • das Eingabeformular wird definiert als eine Palette, dies geschieht in der (anzulegenden) Datei /src/Resources/contao/dca/tl_content.php
  • (eine Übersetzungsdatei – /src/Resources/contao/languages/de/default.php – muss nicht sein, macht die Sache aber leserlicher)
  • für die Ausgabe wird eine ContentElementController-Klasse angelegt, etwa in /src/Resources/ContentElements/MyCeController
  • dieser verwendet ein Template, das bspw. als Twig-Template im Ordner /templates oder /app/Resources/views abgelegt werden kann

Damit Contao resp. Symfony diese kleine Programmiererei überhaupt mitbekommt und verarbeiten kann, muss der ElementController anschließend noch als Service registriert werden und der Autoloader informiert werden.

Als Beispiel eine Eingabemöglichkeit für Informationen über eine CD: Dargestellt werden soll der Name, das Cover, die Tracklist und eine kurze Beschreibung.

Die Palette

// /src/Resources/contao/dca/tl_content.php
$GLOBALS['TL_DCA']['tl_content']['palettes']['cd_info'] =
    '{type_legend},type;
    {CD-Title}, headline;
    {Cover}, singleSRC;
    {Beschreibung},text;
    {Tracks},listitems;';

Der Controller

<?php
// /src/ContentElements/CdInfo.php
namespace App\ContentElements;

use Contao\ContentModel;
use Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
use Contao\FilesModel;
use Contao\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;


class CdInfo extends AbstractContentElementController
{


    protected function getResponse(Template $template, ContentModel $model, Request $request): ?Response
    {
        return $this->render('ce_cd_info.html.twig', [
                'title' => unserialize($model->headline)['value'],
                'description' => $model->text,
                'tracks' => unserialize($model->listitems),
                'cover' => FilesModel::findByUuid($model->singleSRC)->path,

            ]
        );
    }
}