por que as variáveis ​​de modelo Twig com marcação não estão sendo renderizadas?

8

Na função de pré-processo do modelo, tenho uma variável:

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

e passo para o meu modelo:

$variables['test'] = $test;

e produza em galho:

{{test}}

mas, em vez de obter um parágrafo formatado, estou obtendo a saída original em texto simples:

<p>this is a paragraph</p>

Como faço para o Drupal renderizar isso como HTML normal?

RominRonin
fonte

Respostas:

14

Porque o galho escapa automaticamente de conteúdo não seguro e seu conteúdo não está marcado como seguro.

Você pode explicitamente dizer que está com $test = Markup::create($test); mas você deve ter muito cuidado com isso. Se ele contiver algum tipo de entrada do usuário, você poderá se abrir para problemas com o XSS.

Abordagens melhores estão usando uma matriz de renderização como ['#markup' => 'seu texto'], que por padrão permitirá uma certa quantidade de tags html, mas não todas. Você também pode usar um modelo embutido conforme documentado aqui: https://www.drupal.org/node/2311123 .

O Twig entende nativamente matrizes de renderização, portanto, não importa para o seu modelo se você fornecer uma matriz de renderização ou uma string.

Berdir
fonte
2
Eu descobri que, usando o filtro bruto, obtenho a saída necessária, então: {{test | raw}} fornece 'este é um parágrafo' sem a marcação.
RominRonin
11
ok, tão crua é inseguro e eu não entendo como eu deveria usar a documentação exemplo que você forneceu
RominRonin
11
Ok, com a ajuda de alguns usuários do #drupal IRC, encontrei o seguinte: drupal.org/node/2296163, que contém algumas opções para gerar marcações no galho.
RominRonin
11
No meu exemplo, recuperei $ test de uma consulta db e os dados do campo foram armazenados com marcação (campo básico do html ckeditor), portanto, o método #markup foi o mais relevante para este caso de uso.
RominRonin
12

Estas são duas possibilidades para envolver $ test em um parágrafo e passá-lo para o modelo de galho:

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

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