Tại sao các biến mẫu Twig với đánh dấu không được hiển thị?


8

Trong hàm tiền xử lý mẫu của tôi, tôi có một biến:

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

và tôi chuyển nó vào mẫu của tôi:

$variables['test'] = $test;

và xuất nó trong twig:

{{test}}

nhưng thay vì nhận một đoạn được định dạng, tôi nhận được đầu ra ban đầu bằng văn bản thuần túy:

<p>this is a paragraph</p>

Làm cách nào để Drupal hiển thị HTML này như bình thường?

Câu trả lời:


14

Bởi vì twig tự động thoát khỏi nội dung không an toàn và nội dung của bạn không được đánh dấu là an toàn.

Bạn có thể nói rõ ràng rằng nó là với $test = Markup::create($test); nhưng bạn nên rất cẩn thận với điều đó Nếu nó chứa bất kỳ loại đầu vào nào của người dùng, bạn có thể tự mở các vấn đề XSS.

Các cách tiếp cận tốt hơn đang sử dụng một mảng kết xuất như ['#markup' => 'văn bản của bạn'] mà theo mặc định sẽ cho phép một số lượng thẻ html nhất định nhưng không phải tất cả chúng. Bạn cũng có thể sử dụng một mẫu nội tuyến như tài liệu ở đây: https://www.drupal.org/node/2311123 .

Twig thực sự hiểu các mảng kết xuất, vì vậy nó không quan trọng đối với mẫu của bạn nếu bạn cung cấp một mảng kết xuất hoặc một chuỗi.


2
Tôi thấy rằng bằng cách sử dụng bộ lọc thô, tôi nhận được đầu ra tôi cần, vì vậy: {{test | raw}} đưa ra 'đây là một đoạn' mà không cần đánh dấu.
RominRonin

1
ok, quá thô là không an toàn và tôi không hiểu làm thế nào tôi nên sử dụng tài liệu mẫu mà bạn đã cung cấp
RominRonin

1
Ok, với sự giúp đỡ của một số idler #drupal IRC tôi đã tìm thấy điều này: drupal.org/node/2296163 trong đó có một vài tùy chọn để xuất ra đánh dấu trong twig.
RominRonin

1
Trong ví dụ của tôi, tôi đã truy xuất $ test từ truy vấn db và dữ liệu trường được lưu trữ bằng markup (trường ckeditor html cơ bản), vì vậy phương thức #markup phù hợp nhất cho trường hợp sử dụng này.
RominRonin

12

Đây là hai khả năng để gói $ test trong một đoạn văn và chuyển nó vào mẫu twig:

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

$variables['test'] = [
  '#type' => 'inline_template',
  '#template' => '<p>{{ text }}</p>',
  '#context' => [
    'text' => $test,
  ],
];
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.