Truyền html thô cho #markup


24

Tôi có một số nội dung html, nó đến từ một thư viện bên ngoài vì vậy tôi không thể thay đổi nó, nó có nhiều <span><div>các thẻ với các thuộc tính như : <span style="color: #0000ff;">, nhưng khi tôi sử dụng:

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

Trong một mảng kết xuất, Drupal loại bỏ các thuộc tính và nó chỉ giữ được <span>các kiểu.

Vì vậy, làm cách nào tôi có thể tránh Drupal thay đổi những gì tôi vượt qua dưới dạng đánh dấu, không cần bất kỳ bộ lọc nào vì thư viện làm cho nó an toàn hoặc cuối cùng làm cho nó cho phép các kiểu?


thuộc tính phong cách luôn bị loại bỏ
Yzmir Ramirez

Câu trả lời:


28

Sử dụng mẫu nội tuyến:

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

Trong trường hợp của bạn không có ngữ cảnh, chỉ cần lên thẳng html.

Bạn cũng có thể sử dụng phần tử html_tag cho những thứ như tập lệnh hoặc liên kết, v.v.


2
Điều này lọc ra các thẻ IFRAME.
joachim

1
Và các tập lệnh và thẻ kiểu
Yzmir Ramirez

8
Hãy thử {{biến | raw}} hoặc <tag> {{biến}} </ tag>

1
@IvanJaros Điều đó sẽ bỏ qua việc tự động thoát variable, nhưng `\ Drupal \ Element \ Utility \ Xss :: filterAdmin ()` vẫn sẽ lọc ra các thẻ như <script> và các thuộc tính kiểu. Cách duy nhất tôi thấy cho đến nay là thêm tệp Javascript làm thư viện và thêm '#attached' => 'library' => "module_name / library_key_in_yml" ở trên return. @see drupal.stackexchange.com/questions/211078/ từ
Yzmir Ramirez

1
Bất cứ ai cũng biết nếu đây là cách duy nhất / tốt nhất để bình luận HTML? ví dụ <! - Xin chào, Thế giới! -> (nb: như đã đề cập ở trên, bạn cần '| raw')
William Turrell

18

Như được ghi lại trong tổng quan về API kết xuất , trong Drupal 8, chuỗi được chuyển đến #markup được truyền qua \ Drupal \ Component \ Utility \ Xss :: filterAdmin () , loại bỏ các vectơ XSS đã biết trong khi cho phép danh sách các thẻ HTML không phải là XSS cho phép vectơ. Bạn có thể sử dụng #allowed_tags để đặt danh sách các thẻ được phép, nhưng điều đó sẽ không ngăn Drupal thoát khỏi các thuộc tính (ví dụ: kiểu).

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

Vì trong trường hợp của bạn, bạn đang vượt qua đánh dấu HTML phức tạp, bạn nên sử dụng #type (như được đề xuất từ Ivan Jaros hoặc sử dụng #theme. Trong trường hợp này, #type có vẻ là một giải pháp tốt hơn.

Bạn cũng có thể triển khai một loại mới, với một plugin phần tử kết xuất, nhưng nếu đó là trường hợp duy nhất mà bạn cần nó, thì việc thực hiện một plugin phần tử kết xuất có lẽ là quá mức.


12

Nếu bạn muốn thêm Đánh dấu đơn giản để kết xuất mảng, bạn có thể tạo nó bằng cách sử dụng \ Drupal \ Core \ Render \ Markup . Điều này sẽ cho phép bạn đặt HTML thô vào một cái gì đó. Chẳng hạn, đây là cách nó được sử dụng trong mô-đun Báo cáo cấp phép để đưa HTML vào các bảng :

$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
Tôi biết đây là hai năm xuống dòng nhưng cảm ơn. Đối với người mới bắt đầu, hãy để tôi đơn giản hóa nó: sử dụng \ Drupal \ Core \ Render \ Markup $ HeaderSinstallIcon = Markup :: create ('<i class = "fa fa-cogs"> </ i>');
Ngatia Frankline

@NgatiaFrankline, có cách nào để cung cấp cho bạn lòng biết ơn của tôi không?
dresh

Tôi đã làm điều này: $ form ['first_name'] = mảng ('#type' => 'textfield', '#title' => t ('Tên của bạn:'), '#required' => TRUE, '# các thuộc tính '=> mảng (' class '=> mảng (' form-control req '),' name '=> mảng (' first_name ')),' #label_attribut '=> mảng (' class '=> mảng (' bắt buộc ')),' #children '=> Markup :: create (' <span class = "error-text"> Vui lòng nhập Tên hợp lệ </ span> '),);
dresh

12

Trong một mảng kết xuất, chỉ cần làm điều này:

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

Ví dụ: nếu $htmlđược tạo bằng PHP highlight_string(), nó sẽ chứa các thuộc tính kiểu sẽ bị xóa #markup. Nhưng #childrenbảo tồn chúng.


Vâng - nó làm việc cho tôi. thay vì #markup sử dụng một số từ khóa khác như #scode hoặc #children hoặc #customname
manimjs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.