pourquoi les variables de modèle Twig avec balisage ne sont-elles pas rendues?

8

Dans ma fonction de prétraitement de modèle, j'ai une variable:

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

et je le passe à mon modèle:

$variables['test'] = $test;

et le sortir en brindille:

{{test}}

mais au lieu d'obtenir un paragraphe formaté, j'obtiens la sortie d'origine en texte brut:

<p>this is a paragraph</p>

Comment puis-je obtenir Drupal pour rendre cela en HTML normal?

RominRonin
la source

Réponses:

14

Parce que twig échappe automatiquement le contenu dangereux et que votre contenu n'est pas marqué comme sûr.

Vous pouvez explicitement lui dire que c'est avec $test = Markup::create($test); mais vous devez être très prudent avec cela. S'il contient une entrée utilisateur, vous pouvez vous ouvrir aux problèmes XSS.

Les meilleures approches utilisent un tableau de rendu comme ['#markup' => 'votre texte'] qui, par défaut, autorisera une certaine quantité de balises html mais pas toutes. Vous pouvez également utiliser un modèle en ligne comme indiqué ici: https://www.drupal.org/node/2311123 .

Twig comprend nativement les tableaux de rendu, donc peu importe votre modèle si vous fournissez un tableau de rendu ou une chaîne.

Berdir
la source
2
J'ai trouvé qu'en utilisant le filtre brut, j'obtiens la sortie dont j'ai besoin, donc: {{test | raw}} donne 'c'est un paragraphe' sans le balisage.
RominRonin
1
ok, donc raw n'est pas sûr et je ne comprends pas comment utiliser la documentation d'exemple que vous avez fournie
RominRonin
1
Ok, avec l'aide de quelques idlers IRC #drupal, j'ai trouvé ceci: drupal.org/node/2296163 qui contient quelques options pour sortir le balisage dans twig.
RominRonin
1
Dans mon exemple, j'ai récupéré $ test à partir d'une requête db, et les données de champ ont été stockées avec du balisage (champ ckeditor html de base), donc la méthode #markup était la plus pertinente pour ce cas d'utilisation.
RominRonin
12

Voici deux possibilités pour envelopper $ test dans un paragraphe et le passer au modèle de brindille:

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

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