Passe o html bruto para #markup

24

Eu tenho algum conteúdo html, ele vem de uma biblioteca externa, então eu não posso alterá-lo, ele tem muitos <span>e <div>tags com atributos como:, <span style="color: #0000ff;">mas quando eu uso:

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

Em uma matriz de renderização, o Drupal retira os atributos e permanece apenas <span>sem os estilos.

Então, como posso evitar que o Drupal altere o que passo como marcação, que não precisa de filtro porque a biblioteca a torna segura ou, finalmente, permite estilos?

Yukare
fonte
atributos de estilo são sempre retirados
Ýzmir Ramirez

Respostas:

28

Use o modelo embutido:

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

No seu caso, sem contexto, basta clicar em html.

Você também pode usar o elemento html_tag para coisas como script ou link e assim por diante.


fonte
2
Isso filtra as tags IFRAME.
Joachim 2/16
1
E tags de script e estilo
Yzmir Ramirez 25/10
8
Experimente {{variable | raw}} ou <tag> {{variable}} </tag>
1
@IvanJaros Isso ignorará o escape automático variable, mas o `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` ainda filtrará tags como <script> e atributos de estilo. A única maneira que vi até agora é adicionar um arquivo Javascript como biblioteca e adicionar '#attached' => 'library' => "module_name / library_key_in_yml" ao acima return. @see drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez
1
Alguém sabe se essa é a única / melhor maneira de fazer comentários em HTML? por exemplo, <! - Olá, mundo! -> (NB: como mencionado acima, você precisa '| raw')
William Turrell
18

Conforme documentado na visão geral da Render API , no Drupal 8, a sequência passada para #markup é passada por \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , que remove os vetores XSS conhecidos, permitindo uma lista permissiva de tags HTML que não são XSS vetores. Você pode usar #allowed_tags para definir a lista de tags permitidas, mas isso não impediria o Drupal de remover atributos (por exemplo, estilo).

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

Como você está passando uma marcação HTML complexa, use #type (como sugerido por Ivan Jaros ou #theme. Nesse caso, #type parece uma solução melhor.

Você também pode implementar um novo tipo, com um plug-in de elemento de renderização, mas se esse for o único caso em que você precisar, a implementação de um plug-in de elemento de renderização provavelmente será excessiva.

kiamlaluno
fonte
12

Se você deseja adicionar uma marcação simples para renderizar matrizes, é possível criá-la usando \ Drupal \ Core \ Render \ Markup . Isso permitirá que você coloque HTML bruto em algo. Por exemplo, veja como é usado no módulo Relatório de permissão para colocar HTML em tabelas :

$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
fonte
3
Eu sei que isso é daqui a dois anos, mas obrigado. Para iniciantes, deixe-me simplificá-lo: use \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline
@NgatiaFrankline, existe uma maneira de oferecer minha gratidão?
dresh
Eu fiz isso: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Seu primeiro nome:'), '#required' => TRUE, '# atributos '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' obrigatório ')),' #children '=> Markup :: create (' <span class = "error-text"> Digite o primeiro nome válido </span> '),);
dresh
12

Em uma matriz de renderização, basta fazer o seguinte:

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

Por exemplo, se o $htmlfoi produzido com PHP highlight_string(), ele conterá atributos de estilo que seriam removidos #markup. Mas os #childrenpreserva.

Don Quixote
fonte
Sim - funcionou para mim. #markup use outras palavras-chave como #scode ou #children ou #customname
manimjs 10/08