Soft-Hyphen & geschütztes Leerzeichen in DCA-Feldern: basicEntities

  • contao5
  • dca
  • twig

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 (WidgetStringUtil::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 ­ 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.