Warum werden Twig-Vorlagenvariablen mit Markup nicht gerendert?

8

In meiner Vorlagenvorverarbeitungsfunktion habe ich eine Variable:

$test = "<p>this is a paragraph</p>";

und ich gebe es an meine Vorlage weiter:

$variables['test'] = $test;

und geben Sie es im Zweig aus:

{{test}}

Aber anstatt einen formatierten Absatz zu erhalten, erhalte ich die ursprüngliche Ausgabe im Klartext:

<p>this is a paragraph</p>

Wie bringe ich Drupal dazu, dies als normales HTML zu rendern?

RominRonin
quelle

Antworten:

14

Weil twig unsicheren Inhalten automatisch entgeht und Ihre Inhalte nicht als sicher markiert sind.

Sie können explizit sagen, dass es mit ist $test = Markup::create($test); aber du solltest damit sehr vorsichtig sein. Wenn es irgendeine Art von Benutzereingabe enthält, können Sie sich für XSS-Probleme öffnen.

Bessere Ansätze verwenden ein Render-Array wie ['#markup' => 'your text'], das standardmäßig eine bestimmte Anzahl von HTML-Tags zulässt, jedoch nicht alle. Sie können auch eine Inline-Vorlage verwenden, wie hier dokumentiert: https://www.drupal.org/node/2311123 .

Twig versteht Render-Arrays von Haus aus, daher spielt es für Ihre Vorlage keine Rolle, ob Sie ein Render-Array oder eine Zeichenfolge bereitstellen.

Berdir
quelle
2
Ich habe festgestellt, dass ich mit dem Rohfilter die Ausgabe erhalte, die ich benötige. {{Test | raw}} gibt "Dies ist ein Absatz" ohne das Markup an.
RominRonin
1
ok, also ist raw unsicher und ich verstehe nicht, wie ich die von Ihnen bereitgestellte Beispieldokumentation verwenden soll
RominRonin
1
Ok, mit Hilfe einiger # drupal IRC-Idler habe ich Folgendes gefunden: drupal.org/node/2296163, das einige Optionen für die Ausgabe von Markups in Zweigen enthält.
RominRonin
1
In meinem Beispiel habe ich $ test aus einer Datenbankabfrage abgerufen und die Felddaten wurden mit Markup (grundlegendes HTML-Ckeditor-Feld) gespeichert, sodass die # markup-Methode für diesen Anwendungsfall am relevantesten war.
RominRonin
12

Dies sind zwei Möglichkeiten, um $ test in einen Absatz zu verpacken und an die Zweigvorlage zu übergeben:

$variables['test'] = [
  '#markup' => $test,
  '#prefix' => '<p>',
  '#suffix' => '</p>',
];

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
4k4
quelle