¿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?

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.


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,
  ],
];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.