Template-Teile im Backend ausblenden: as_editor_view

  • contao5
  • twig
  • backend
  • templates

Problem

Die Backend-Liste (tl_content) rendert Inhaltselemente mit demselben Twig-Template wie das Frontend — aber ohne Theme-CSS. Alles, was im Frontend nur per CSS unsichtbar ist, wird im Backend sichtbar:

  • visuell versteckte Kopien (Ghost-/Spacer-Elemente, die einer Karte ihre Höhe geben)
  • Overlays, Off-Canvas-Panels, Akkordeon-Inhalte im geschlossenen Zustand
  • Elemente, die per position: absolute aus dem Fluss genommen sind

Ergebnis: doppelter oder wirr wirkender Text in der Elementliste.

Lösung: as_editor_view

Contao stellt in Twig-Templates die Variable as_editor_view bereit — true, wenn im Backend-Scope gerendert wird:

{% if not as_editor_view|default(false) %}
  <div class="card__content card__content--ghost" aria-hidden="true">
    …
  </div>
{% endif %}

Kein eigener Request-Check und kein ScopeMatcher im Template nötig.

Woher die Variable kommt

Beide Render-Wege setzen sie automatisch:

  • Moderne Fragmente: AbstractContentElementController bzw. AbstractFrontendModuleController legen as_editor_view in den Template-Context.
  • Legacy-Templates (ce_*.html.twig, mod_*.html.twig): Contao\CoreBundle\Twig\Interop\ContextFactory ergänzt den Wert aus ScopeMatcher::isBackendRequest(), sofern er nicht schon gesetzt ist.

|default(false) ist Absicherung für Templates, die auch mal aus einem anderen Kontext (Include, eigener Render-Aufruf) kommen.

Vorbilder im Core

Das Muster ist Core-Praxis, kein Workaround:

  • content_element/player.html.twig — zeigt im Backend statt des Players nur einen Hinweis
  • content_element/html.html.twig — gibt rohes HTML im Backend als Quelltext aus
  • content_element/toplink.html.twig, content_element/login.html.twig — unterdrücken interaktive Teile
  • component/_download.html.twig — nutzt {% if as_editor_view|default %}

Verwandt

Für PHP-Seite (Content-Element-Klasse) ist das Pendant:

$request = System::getContainer()->get('request_stack')->getCurrentRequest();

if ($request && System::getContainer()->get('contao.routing.scope_matcher')->isBackendRequest($request)) {
    // z. B. Link-Titel im Backend leeren (siehe Core-Issue #6258)
}

Nicht vergessen

Läuft die Installation in prod, greift die Template-Änderung erst nach:

vendor/bin/contao-console cache:clear --env=prod