Ham html'yi #markup'a geçir


24

Bazı html içeriğim var, harici bir kütüphaneden geliyor, böylece değiştiremiyorum, pek çok <span>ve <div>gibi özelliklere sahip etiketler var: <span style="color: #0000ff;">ama kullandığımda:

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

Bir oluşturma dizisinde Drupal, nitelikleri çıkarır <span>ve stiller olmadan da devam eder .

Öyleyse, Drupal'ın işaretleme olarak ilettiğim şeyi değiştirmesini nasıl önleyebilirim ki, herhangi bir filtreye ihtiyaç duymaz, çünkü kütüphane güvenli hale getirir veya sonunda stillere izin verir mi?


stil öznitelikleri her zaman çıkarılır
Yzmir Ramirez

Yanıtlar:


28

Satır içi şablon kullan:

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

Bağlamsız durumda, sadece düz html.

Ayrıca html_tag öğesini script veya link vb. Gibi şeyler için kullanabilirsiniz.


2
Bu, IFRAME etiketlerini filtreler.
joachim

1
Ve senaryo ve stil etiketleri
Yzmir Ramirez 25:16

8
{{Değişken | raw}} veya <tag> {{değişken}} </tag>

1
@IvanJaros Bu sadece otomatik olarak kaçmayı atlayacak variable, ancak `\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()`, <script> ve stil özellikleri gibi etiketleri filtreleyecek. Şimdiye kadar gördüğüm tek yol, bir Javascript dosyasını kütüphane olarak eklemek ve yukarıdakilere '#attached' => 'library' => "module_name / library_key_in_yml" eklemek return. @see drupal.stackexchange.com/questions/211078/...
Ýzmir Ramirez

1
HTML yorum yapmanın tek / en iyi yolunun bu olup olmadığını bilen var mı? örneğin <! - Merhaba, Dünya! -> (nb: yukarıda belirtildiği gibi '|
raw'a

18

Render API'sine genel bakışta belgelendiği gibi , Drupal 8'de, #markup öğesine iletilen dize , XSS olmayan HTML etiketlerinin izin verilen bir listesine izin verirken bilinen XSS vektörlerini soyan, \ Drupal \ Component \ Utility \ Xss :: filterAdmin () içinden geçirilir. vektörler. İzin verilen etiketlerin listesini ayarlamak için #allowed_tags öğesini kullanabilirsiniz, ancak bu Drupal'ın sıyırma özniteliklerini durdurmamasını sağlar (örneğin stil).

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

Sizin durumunuzda karmaşık HTML işaretlemesini geçtiğinizden, #type ( Ivan Jaros'tan önerildiği gibi veya #theme) kullanmalısınız. Bu durumda, #type daha iyi bir çözüm gibi görünüyor.

Ayrıca, bir oluşturma öğesi eklentisi olan yeni bir tür de uygulayabilirsiniz, ancak ihtiyacınız olan tek durum buysa, oluşturma öğesi eklentisini uygulamak muhtemelen aşırıdır.


12

Dizileri oluşturmak için düz İşaretleme eklemek istiyorsanız, \ Drupal \ Core \ Render \ Markup kullanarak oluşturabilirsiniz . Bu, ham HTML'yi bir şeye koymanızı sağlar. Örneğin, İzin Raporu modülünde HTML'yi tablolara yerleştirmek için nasıl kullanıldığı :

$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
Bunun iki yıl olduğunu biliyorum ama teşekkürler. Yeni başlayanlar için basitleştireyim: \ Drupal \ Core \ Render \ Markup $ Markup $ HeaderSettingsIcon = Markup :: create ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline

@NgatiaFrankline, size minnettarlığımı sunmanın bir yolu var mı?
saat

Bunu yaptım: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('İlk Adınız:'), '#required' => TRUE, '# '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' zorunlu ')),' #children '=> Markup :: create (' <span class = "error-text"> Lütfen geçerli bir isim girin </span> '),);
saat

12

Bir oluşturma dizisinde, yalnızca şunu yapın:

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

Örn: $htmlPHP ile üretildiyse, highlight_string()kaldırılacak stil niteliklerini içerecektir #markup. Ama #childrenonları korur.


Evet - benim için çalıştı. bunun yerine #markup #scode veya #children veya #customname gibi başka anahtar kelimeler kullanın
manimjs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.