perché le variabili del modello Twig con markup non vengono visualizzate?


8

Nella mia funzione di preelaborazione del modello ho una variabile:

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

e lo passo al mio modello:

$variables['test'] = $test;

e output in ramoscello:

{{test}}

ma invece di ottenere un paragrafo formattato, sto ottenendo l'output originale in testo semplice:

<p>this is a paragraph</p>

Come posso ottenere Drupal per renderlo come normale HTML?

Risposte:


14

Perché il ramoscello esce automaticamente dai contenuti non sicuri e i tuoi contenuti non sono contrassegnati come sicuri.

Puoi dirlo esplicitamente che è con $test = Markup::create($test); ma dovresti stare molto attento con quello. Se contiene qualsiasi tipo di input dell'utente, potresti aprirti per problemi XSS.

Approcci migliori sono l'utilizzo di un array di rendering come ['#markup' => 'your text'] che per impostazione predefinita consentirà una certa quantità di tag html ma non tutti. È inoltre possibile utilizzare un modello incorporato come documentato qui: https://www.drupal.org/node/2311123 .

Twig comprende nativamente le matrici di rendering, quindi non importa per il tuo modello se fornisci una matrice di rendering o una stringa.


2
Ho scoperto che usando il filtro raw, ottengo l'output di cui ho bisogno, quindi: {{test | raw}} fornisce "questo è un paragrafo" senza il markup.
Romin Ronon

1
ok, quindi raw non è sicuro e non capisco come dovrei usare la documentazione di esempio che hai fornito
RominRonin

1
Ok, con l'aiuto di alcuni idler #drupal IRC ho trovato questo: drupal.org/node/2296163 che contiene alcune opzioni per produrre markup in ramoscello.
Romin Ronon

1
Nel mio esempio, ho recuperato $ test da una query db e i dati del campo sono stati archiviati con markup (campo ckeditor html di base), quindi il metodo #markup è stato il più rilevante per questo caso d'uso.
Romin Ronon

12

Queste sono due possibilità per racchiudere $ test in un paragrafo e passarlo al modello di ramoscello:

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

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.