Soft-Hyphen & geschütztes Leerzeichen in DCA-Feldern: basicEntities
Problem
Redakteur:innen sollen in einem eigenen Textfeld (z. B. dem Zitattext eines Custom-Inhaltselements) Contaos Sonderzeichen-Syntax nutzen können:
[-]→ weiches Trennzeichen / Soft-Hyphen (­)[nbsp]→ geschütztes Leerzeichen ( )
Ohne Vorkehrung werden diese Platzhalter wörtlich als Text ausgegeben.
Lösung: basicEntities im DCA-eval
Im eval des Feldes 'basicEntities' => true setzen:
$GLOBALS['TL_DCA']['tl_content']['fields']['quote_text'] = array(
'inputType' => 'textarea',
'eval' => array('mandatory' => true, 'basicEntities' => true, 'tl_class' => 'clr'),
'sql' => "text NULL",
);
Damit wandelt Contao (Widget → StringUtil::restoreBasicEntities()) beim Speichern die Platzhalter in die echten HTML-Entities um. Unterstützt werden:
| Eingabe | Ergebnis |
|---|---|
[-] |
­ (Soft-Hyphen) |
[nbsp] |
(geschütztes Leerzeichen) |
[&] |
& |
[lt] / [gt] |
< / > |
[zwsp] |
​ |
[lsqb] / [rsqb] |
[ / ] ([ / ]) |
Eingebautes Vorbild: Das headline-Feld in tl_content nutzt genau dieses 'basicEntities' => true.
Wichtig bei eigenen Twig-Templates
Gespeichert wird der echte Entity (z. B. ­), nicht der Platzhalter. Der Wert muss daher im Template roh ausgegeben werden – sonst escaped Twig das & zu &shy; und der Leser sieht den Quelltext:
{# falsch: zeigt ­ wörtlich #}
{{ quote_text }}
{# richtig: rendert den Soft-Hyphen #}
{{ quote_text|raw }}
Die Roh-Ausgabe ist hier unbedenklich: Durch basicEntities plus Contaos Input-Encoding ist der Wert HTML-sicher (getipptes <script> landet escaped). Genau so behandelt der Core auch das headline-Feld (Ausgabe via |insert_tag_raw).
Achtung bei der Filter-Reihenfolge mit nl2br: {{ wert|raw|nl2br }} greift nicht zuverlässig (Twigs pre_escape von nl2br). Sauberer ist es, nl2br im Controller (PHP) anzuwenden und im Template nur |raw zu nutzen.