Template-Teile im Backend ausblenden: as_editor_view
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: absoluteaus 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:
AbstractContentElementControllerbzw.AbstractFrontendModuleControllerlegenas_editor_viewin den Template-Context. - Legacy-Templates (
ce_*.html.twig,mod_*.html.twig):Contao\CoreBundle\Twig\Interop\ContextFactoryergänzt den Wert ausScopeMatcher::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 Hinweiscontent_element/html.html.twig— gibt rohes HTML im Backend als Quelltext auscontent_element/toplink.html.twig,content_element/login.html.twig— unterdrücken interaktive Teilecomponent/_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