¿Por qué no se representan las variables de plantilla Twig con marcado?

8

En mi función de preproceso de plantilla tengo una variable:

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

y lo paso a mi plantilla:

$variables['test'] = $test;

y sacarlo en ramita:

{{test}}

pero en lugar de obtener un párrafo formateado, obtengo el resultado original en texto sin formato:

<p>this is a paragraph</p>

¿Cómo consigo que Drupal represente esto como HTML normal?

RominRonin
fuente

Respuestas:

14

Debido a que Twig escapa automáticamente de contenido inseguro y su contenido no está marcado como seguro.

Puedes decirle explícitamente que es con $test = Markup::create($test); pero debes tener mucho cuidado con eso. Si contiene algún tipo de entrada del usuario, puede abrirse para problemas de XSS.

Mejores enfoques están utilizando una matriz de renderizado como ['#markup' => 'your text'] que, de manera predeterminada, permitirá una cierta cantidad de etiquetas html pero no todas. También puede usar una plantilla en línea como se documenta aquí: https://www.drupal.org/node/2311123 .

Twig entiende de forma nativa las matrices de renderizado, por lo que no importa para su plantilla si proporciona una matriz de renderizado o una cadena.

Berdir
fuente
2
Descubrí que al usar el filtro sin formato, obtengo el resultado que necesito, así que: {{test | raw}} da 'este es un párrafo' sin el marcado.
RominRonin
1
ok, así que raw es inseguro y no entiendo cómo debo usar la documentación de ejemplo que proporcionó
RominRonin
1
Ok, con la ayuda de algunos iddpal IRC #drupal encontré esto: drupal.org/node/2296163 que contiene algunas opciones para generar marcado en twig.
RominRonin
1
En mi ejemplo, recuperé $ test de una consulta db, y los datos del campo se almacenaron con marcado (campo básico html ckeditor), por lo que el método #markup fue el más relevante para este caso de uso.
RominRonin
12

Estas son dos posibilidades para envolver $ test en un párrafo y pasarlo a la plantilla de ramita:

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

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