Übergeben Sie rohes HTML an #markup

24

Ich habe einige HTML-Inhalte, sie stammen aus einer externen Bibliothek, daher kann ich sie nicht ändern. Sie haben viele <span>und <div>Tags mit Attributen wie:, <span style="color: #0000ff;">aber wenn ich Folgendes verwende:

$render = array(
  '#markup' => $myhtmlcontent,
);

In einem Render-Array entfernt Drupal die Attribute und behält sie nur <span>ohne die Stile bei.

Wie kann ich also vermeiden, dass Drupal-Änderungen, die ich als Markup übergebe, keinen Filter benötigen, weil die Bibliothek sie sicher macht oder endlich Stile zulässt?

Yukare
quelle
Stilattribute

Antworten:

28

Inline-Vorlage verwenden:

  return [
    '#type' => 'inline_template',
    '#template' => '{{ somecontent }}',
    '#context' => [
      'somecontent' => $somecontent
    ]
  ];

In deinem Fall ohne Kontext einfach HTML aufbauen.

Sie können das Element html_tag auch für Dinge wie Skript oder Link usw. verwenden.


quelle
2
Dadurch werden IFRAME-Tags herausgefiltert.
Joachim
1
Und Script und Style Tags
Yzmir Ramirez
8
Versuchen Sie es mit {{variable | raw}} oder <tag> {{variable}} </ tag>
1
@IvanJaros Damit wird nur die automatische variableEscape-Anweisung übersprungen, aber das `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` filtert weiterhin Tags wie <script> und Stilattribute heraus. Die einzige Möglichkeit, die ich bisher gesehen habe, ist das Hinzufügen einer Javascript-Datei als Bibliothek und das Hinzufügen von '#attached' => 'library' => "module_name / library_key_in_yml" return. @ See drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez
1
Weiß jemand, ob dies die einzige / beste Möglichkeit ist, HTML-Kommentare zu verfassen? zB <! - Hallo, Welt! -> (nb: wie oben erwähnt brauchst du '| raw')
William Turrell
18

Wie in der Render-API-Übersicht dokumentiert , wird in Drupal 8 die an #markup übergebene Zeichenfolge über \ Drupal \ Component \ Utility \ Xss :: filterAdmin () übergeben , wodurch bekannte XSS-Vektoren entfernt werden, während eine zulässige Liste von HTML-Tags, die nicht XSS sind, zugelassen wird Vektoren. Sie können #allowed_tags verwenden, um die Liste der zulässigen Tags festzulegen. Dies würde Drupal jedoch nicht davon abhalten, Attribute (z. B. Stil) zu entfernen.

$output['filtered_string'] = array(
  '#markup' => '<em>This is filtered</em>',
  '#allowed_tags' => ['strong'],
);

Da Sie in Ihrem Fall komplexe HTML-Markups übergeben, sollten Sie #type verwenden (wie von Ivan Jaros vorgeschlagen) oder #theme verwenden. In diesem Fall scheint #type eine bessere Lösung zu sein.

Sie können auch einen neuen Typ mit einem Renderelement-Plugin implementieren. Wenn dies jedoch der einzige Fall ist, in dem Sie ihn benötigen, ist die Implementierung eines Renderelement-Plugins wahrscheinlich zu umfangreich.

kiamlaluno
quelle
12

Wenn Sie zum Rendern von Arrays einfaches Markup hinzufügen möchten, können Sie es mit \ Drupal \ Core \ Render \ Markup erstellen . Auf diese Weise können Sie Roh-HTML in etwas einfügen. So wird es beispielsweise im Berechtigungsbericht- Modul verwendet, um HTML in Tabellen einzufügen :

$rows[] = [
  [
    'data' => $this->l($meta['title'], new Url('permission_report.permission', ['user_permission' => $perm], $options)),
  ],
  ['data' => $users_having_role],
  ['data' => Markup::create(implode(', ', $display_roles))],
];
nvahalik
quelle
3
Ich weiß, das ist zwei Jahre später, aber danke. Für Anfänger möchte ich es vereinfachen: use \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </ i>');
Ngatia Frankline
@NgatiaFrankline, gibt es eine Möglichkeit, Ihnen meinen Dank auszusprechen?
Dresh
Ich habe das gemacht: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Your First Name:'), '#required' => TRUE, '# Attribute '=> Array (' Klasse '=> Array (' Formularsteuerungsanforderung '),' Name '=> Array (' Vorname '),' #label_attributes '=> Array (' Klasse '=> Array (' obligatorisch ')),' #children '=> Markup :: create (' <span class = "error-text"> Bitte geben Sie den gültigen Vornamen </ span> '),);
Dresh
12

Führen Sie in einem Render-Array einfach Folgendes aus:

return [
  '#children' => $html,
];

ZB wenn das $htmlmit PHPs erzeugt wurde highlight_string(), enthält es Stilattribute, die mit entfernt werden würden #markup. Aber #childrenbewahrt sie.

donquixote
quelle
Ja - es hat bei mir funktioniert. Verwenden Sie stattdessen #markup einige andere Schlüsselwörter wie #scode oder #children oder #customname
manimjs