Passa il codice HTML non elaborato a #markup


24

Ho un po 'di contenuto HTML, proviene da una libreria esterna, quindi non posso cambiarlo, ha molti <span>e <div>tag con attributi come:, <span style="color: #0000ff;">ma quando uso:

$render = array(
  '#markup' => $myhtmlcontent,
);

In una matrice di rendering, Drupal rimuove gli attributi e si mantiene <span>senza gli stili.

Quindi, come posso evitare che Drupal modifichi ciò che passo come markup, che non ha bisogno di alcun filtro perché la libreria lo rende sicuro o alla fine gli consente gli stili?


gli attributi di stile sono sempre
messi a

Risposte:


28

Usa modello in linea:

  return [
    '#type' => 'inline_template',
    '#template' => '{{ somecontent }}',
    '#context' => [
      'somecontent' => $somecontent
    ]
  ];

Nel tuo caso senza contesto, basta semplicemente html.

Puoi anche usare l'elemento html_tag per cose come script o link e così via.


2
Questo filtra i tag IFRAME.
Gioacchino

1
E tag di script e di stile
Yzmir Ramirez,

8
Prova {{variabile | raw}} o <tag> {{variabile}} </tag>

1
@IvanJaros Questo salterà semplicemente l'escaping automatico di variable, ma `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()` filtrerà comunque i tag come <script> e gli attributi di stile. L'unico modo che ho visto finora è quello di aggiungere un file Javascript come libreria e aggiungere '#attached' => 'library' => "module_name / library_key_in_yml" a quanto sopra return. @vedi drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez,

1
Qualcuno sa se questo è l'unico / miglior modo di fare commenti HTML? ad es. <! - Ciao, mondo! -> (nb: come detto sopra è necessario '| raw')
William Turrell,

18

Come documentato nella panoramica dell'API di rendering , in Drupal 8 la stringa passata a #markup viene passata attraverso \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , che elimina i vettori XSS noti consentendo un elenco permissivo di tag HTML che non sono XSS vettori. Puoi usare #allowed_tags per impostare l'elenco dei tag consentiti, ma ciò non impedirebbe a Drupal di rimuovere gli attributi (ad es. Stile).

$output['filtered_string'] = array(
  '#markup' => '<em>This is filtered</em>',
  '#allowed_tags' => ['strong'],
);

Dato che nel tuo caso stai passando un markup HTML complesso, dovresti usare #type (come suggerito da Ivan Jaros o usare #theme. In questo caso, #type sembra una soluzione migliore.

Potresti anche implementare un nuovo tipo, con un plug-in di elementi di rendering, ma se questo è l'unico caso in cui ne hai bisogno, l'implementazione di un plug-in di elementi di rendering è probabilmente eccessiva.


12

Se si desidera aggiungere markup semplici per il rendering di array, è possibile crearlo utilizzando \ Drupal \ Core \ Render \ Markup . Ciò ti consentirà di inserire codice HTML non elaborato in qualcosa. Ad esempio, ecco come viene utilizzato nel modulo Rapporto autorizzazioni per inserire HTML nelle tabelle :

$rows[] = [
  [
    'data' => $this->l($meta['title'], new Url('permission_report.permission', ['user_permission' => $perm], $options)),
  ],
  ['data' => $users_having_role],
  ['data' => Markup::create(implode(', ', $display_roles))],
];

3
So che sono trascorsi due anni ma grazie. Per i principianti mi permetta di semplificarlo: usa \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline,

@NgatiaFrankline, c'è un modo per offrirti la mia gratitudine?
dresh

Ho fatto questo: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('Il tuo nome:'), '#required' => TRUE, '# attributi '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' obbligatorio ')),' #children '=> Markup :: create (' <span class = "error-text"> Inserisci il nome valido </span> '),);
dresh

12

In un array di rendering, basta fare questo:

return [
  '#children' => $html,
];

Ad esempio, se è $htmlstato prodotto con PHP highlight_string(), conterrà attributi di stile che verrebbero rimossi #markup. Ma #childrenli conserva.


Sì, ha funzionato per me. invece #markup usa altre parole chiave come #scode o #children o #customname
manimjs
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.