Passer du code HTML brut à #markup

24

J'ai du contenu html, il provient d'une bibliothèque externe donc je ne peux pas le changer, il en a beaucoup <span>et des <div>balises avec des attributs comme:, <span style="color: #0000ff;">mais quand j'utilise:

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

Dans un tableau de rendu, Drupal supprime les attributs, et il reste juste <span>sans les styles.

Alors, comment puis-je éviter que Drupal modifie ce que je passe en tant que balisage, qui n'a pas besoin de filtre parce que la bibliothèque le rend sûr, ou enfin lui permet d'autoriser les styles?

Yukare
la source
les attributs de style sont toujours supprimés
Yzmir Ramirez

Réponses:

28

Utilisez un modèle en ligne:

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

Dans votre cas, sans contexte, montez simplement en html.

Vous pouvez également utiliser l'élément html_tag pour des choses comme le script ou le lien, etc.


la source
2
Cela filtre les balises IFRAME.
joachim
1
Et les balises de script et de style
Yzmir Ramirez
8
Essayez {{variable | raw}} ou <tag> {{variable}} </tag>
1
@IvanJaros Cela sautera simplement l'échappement automatique variable, mais le `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` filtrera toujours les balises comme <script> et les attributs de style. La seule façon que j'ai vue jusqu'à présent est d'ajouter un fichier Javascript en tant que bibliothèque et d'ajouter '#attached' => 'library' => "module_name / library_key_in_yml" à ce qui précède return. @see drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez
1
Quelqu'un sait si c'est la seule / meilleure façon de faire des commentaires HTML? par exemple <! - Bonjour tout le monde! -> (nb: comme mentionné ci-dessus, vous avez besoin de '| raw')
William Turrell
18

Comme indiqué dans la présentation de l' API de rendu , dans Drupal 8, la chaîne transmise à #markup est transmise via \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , qui supprime les vecteurs XSS connus tout en autorisant une liste permissive de balises HTML qui ne sont pas XSS vecteurs. Vous pouvez utiliser #allowed_tags pour définir la liste des balises autorisées, mais cela n'empêchera pas Drupal de supprimer les attributs (par exemple le style).

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

Puisque dans votre cas, vous passez un balisage HTML complexe, vous devez utiliser #type (comme suggéré par Ivan Jaros ou utiliser #theme. Dans ce cas, #type semble une meilleure solution.

Vous pouvez également implémenter un nouveau type, avec un plugin d'élément de rendu, mais si c'est le seul cas où vous en avez besoin, l'implémentation d'un plugin d'élément de rendu est probablement excessive.

kiamlaluno
la source
12

Si vous souhaitez ajouter un balisage brut pour rendre les tableaux, vous pouvez le créer à l'aide de \ Drupal \ Core \ Render \ Markup . Cela vous permettra de mettre du HTML brut dans quelque chose. Par exemple, voici comment il est utilisé dans le module Rapport d'autorisation pour mettre du HTML dans des tableaux :

$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
la source
3
Je sais que c'est deux ans plus tard, mais merci. Pour les débutants, permettez-moi de le simplifier: use \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline
@NgatiaFrankline, existe-t-il un moyen de vous remercier?
dresh
J'ai fait ceci: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Your First Name:'), '#required' => TRUE, '# attributs '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' obligatoire ')),' #children '=> Markup :: create (' <span class = "error-text"> Veuillez saisir le prénom valide </span> '),);
2018
12

Dans un tableau de rendu, faites simplement ceci:

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

Par exemple, si le a $htmlété produit avec PHP highlight_string(), il contiendra des attributs de style qui seraient supprimés avec #markup. Mais les #childrenconserve.

don Quichotte
la source
Oui, cela a fonctionné pour moi. à la place, #markup utilise d'autres mots clés comme #scode ou #children ou #customname
manimjs