Pase html sin formato a #markup

24

Tengo algo de contenido html, proviene de una biblioteca externa, por lo que no puedo cambiarlo, tiene muchos <span>y <div>etiquetas con atributos como:, <span style="color: #0000ff;">pero cuando uso:

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

En una matriz de renderizado, Drupal elimina los atributos y se mantiene <span>sin los estilos.

Entonces, ¿cómo puedo evitar que Drupal cambie lo que paso como marcado, que no necesita ningún filtro porque la biblioteca lo hace seguro, o al fin hace que permita estilos?

Yukare
fuente
los atributos de estilo siempre se eliminan
Yzmir Ramirez

Respuestas:

28

Usar plantilla en línea:

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

En su caso sin contexto, solo html directo.

También puede usar el elemento html_tag para cosas como script o enlace, etc.


fuente
2
Esto filtra las etiquetas IFRAME.
joachim
1
Y etiquetas de guión y estilo
Yzmir Ramirez
8
Prueba {{variable | raw}} o <tag> {{variable}} </tag>
1
@IvanJaros Eso simplemente omitirá el escape automático variable, pero `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` aún filtrará etiquetas como <script> y atributos de estilo. La única forma que he visto hasta ahora es agregar un archivo Javascript como biblioteca y agregar '#attached' => 'library' => "module_name / library_key_in_yml" a lo anterior return. @see drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez
1
¿Alguien sabe si esta es la única / mejor manera de hacer comentarios HTML? por ejemplo <! - Hola, mundo! -> (nb: como se mencionó anteriormente, necesita '| raw')
William Turrell
18

Como se documenta en la descripción general de Render API , en Drupal 8 la cadena pasada a #markup se pasa a través de \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , que elimina los vectores XSS conocidos mientras permite una lista permisiva de etiquetas HTML que no son XSS vectores Puede usar #allowed_tags para establecer la lista de etiquetas permitidas, pero eso no evitaría que Drupal elimine los atributos (por ejemplo, estilo).

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

Como en su caso está pasando un marcado HTML complejo, debe usar #type (como lo sugiere Ivan Jaros o usar #theme. En este caso, #type parece una mejor solución.

También podría implementar un nuevo tipo, con un complemento de elemento de representación, pero si ese es el único caso donde lo necesita, la implementación de un complemento de elemento de representación es probablemente excesiva.

kiamlaluno
fuente
12

Si desea agregar marcado simple para representar matrices, puede crearlo usando \ Drupal \ Core \ Render \ Markup . Esto le permitirá poner HTML sin formato en algo. Por ejemplo, así es como se usa en el módulo Informe de permisos para poner HTML en tablas :

$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
fuente
3
Sé que esto está dentro de dos años, pero gracias. Para principiantes, permítanme simplificarlo: use \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline
@NgatiaFrankline, ¿hay alguna forma de ofrecerte mi agradecimiento?
Dresh
Hice esto: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Your First Name:'), '#required' => TRUE, '# atributos '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' obligatorio ')),' #children '=> Marcado :: create (' <span class = "error-text"> Ingrese el nombre válido </span> '),);
Dresh
12

En una matriz de renderizado, simplemente haga esto:

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

Por ejemplo, si $htmlse produjo con PHP highlight_string(), contendrá atributos de estilo que se eliminarían con #markup. Pero los #childrenconserva.

Don Quijote
fuente
Sí, funcionó para mí. en cambio, #markup usa otras palabras clave como #scode o #children o #customname
manimjs