ส่ง HTML ดิบไปที่ #markup


24

ฉันมีเนื้อหา HTML บางส่วนมันมาจากห้องสมุดภายนอกดังนั้นฉันจึงไม่สามารถเปลี่ยนแปลงได้มันมีแท็ก<span>และ<div>คุณลักษณะมากมายเช่น: <span style="color: #0000ff;">แต่เมื่อฉันใช้:

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

ในอาเรย์การเรนเดอร์ Drupal จะดึงคุณลักษณะและมันคง<span>ไม่มีสไตล์

ดังนั้นฉันจะหลีกเลี่ยง Drupal เปลี่ยนแปลงสิ่งที่ฉันส่งเป็นมาร์กอัปได้ซึ่งไม่ต้องการตัวกรองใด ๆ เพราะไลบรารี่ทำให้ปลอดภัยหรือในที่สุดก็ทำให้มีสไตล์


แอตทริบิวต์ของสไตล์จะแตกออกมาเสมอ
Yzmir Ramirez

คำตอบ:


28

ใช้เทมเพลตแบบอินไลน์:

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

ในกรณีของคุณโดยไม่มีบริบทเพียงแค่ตรง html

คุณยังสามารถใช้องค์ประกอบ html_tag สำหรับสิ่งต่างๆเช่นสคริปต์หรือลิงก์และอื่น ๆ


2
สิ่งนี้จะกรองแท็ก IFRAME
joachim

1
และแท็กสคริปต์และสไตล์
Yzmir Ramirez

8
ลอง {{แปร | | raw}} หรือ <tag> {{variable}} </tag>

1
@IvanJaros ที่เพิ่งจะข้ามไปโดยอัตโนมัติvariableแต่ `` Drupal \ Component \ Utility \ Xss :: filterAdmin () `จะยังคงกรองแท็กเช่น <script> และลักษณะของสไตล์ วิธีเดียวที่ฉันได้เห็นเพื่อให้ห่างไกลคือการเพิ่มไฟล์จาวาสคริปต์เป็นห้องสมุดและเพิ่ม '#attached' => 'ห้องสมุด' => "module_name / library_key_in_yml" returnข้างต้น @see drupal.stackexchange.com/questions/211078/…
Yzmir Ramirez

1
ใครรู้ว่านี่เป็นวิธีเดียวที่ดีที่สุดในการแสดงความคิดเห็น HTML เช่น <! - สวัสดีโลก! -> ((nb: ดังกล่าวข้างต้นคุณต้อง '| raw')
William Turrell

18

ตามที่ระบุไว้ในภาพรวม Render APIใน Drupal 8 สตริงที่ส่งผ่านไปยัง #markup จะถูกส่งผ่าน\ Drupal \ Component \ Utility \ Xss :: filterAdmin ()ซึ่งจะแยกแถบเวกเตอร์ XSS ที่รู้จักในขณะที่อนุญาตรายการแท็ก HTML ที่ไม่ใช่ XSS เวกเตอร์ คุณสามารถใช้ #allowed_tags เพื่อตั้งค่ารายการของแท็กที่อนุญาต แต่นั่นจะไม่หยุด Drupal จากการลอกคุณลักษณะ (เช่นรูปแบบ)

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

เนื่องจากในกรณีของคุณคุณกำลังผ่านมาร์กอัพ HTML ที่ซับซ้อนคุณควรใช้ #type (ตามที่แนะนำจากIvan Jarosหรือใช้ #theme ในกรณีนี้ #type ดูเหมือนจะเป็นทางออกที่ดีกว่า

คุณสามารถใช้ชนิดใหม่พร้อมกับปลั๊กอินองค์ประกอบการแสดงผล แต่ถ้าเป็นกรณีเดียวที่คุณต้องการการใช้ปลั๊กอินองค์ประกอบการแสดงผลนั้นอาจมากเกินไป


12

หากคุณต้องการที่จะเพิ่มมาร์กอัปธรรมดาที่จะทำให้อาร์เรย์คุณสามารถสร้างได้โดยใช้\ Drupal \ หลัก \ Render \ Markup สิ่งนี้จะช่วยให้คุณใส่ HTML แบบดิบลงในบางสิ่งได้ ตัวอย่างเช่นต่อไปนี้เป็นวิธีที่ใช้ในโมดูลรายงานการอนุญาตเพื่อใส่ HTML ลงในตาราง :

$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
ฉันรู้ว่านี่คือสองปีที่ผ่านมา แต่ขอบคุณ สำหรับผู้เริ่มต้นให้ฉันทำให้มันง่ายขึ้น: ใช้ \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = มาร์กอัป :: สร้าง ('<i class = "fa fa-cogs"> </i>');
Ngatia Frankline

@NgatiaFrankline มีวิธีเสนอความกตัญญู?
dresh

ฉันทำสิ่งนี้: $ form ['first_name'] = array ('#type' => 'textfield', '#title' => t ('ชื่อจริงของคุณ:'), '#required' => TRUE, '# attribute '=> array (' class '=> array (' form-control req '),' name '=> array (' first_name ')),' #label_attributes '=> array (' class '=> array (' บังคับ ')),' #children '=> มาร์กอัป :: สร้าง (' <span class = "ข้อผิดพลาดข้อความ"> โปรดป้อนชื่อที่ถูกต้อง </span> '),);
dresh

12

ในเรนเดอร์อาร์เรย์ให้ทำสิ่งนี้:

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

เช่นถ้า$htmlถูกผลิตด้วย PHP ของก็จะมีคุณลักษณะสไตล์ซึ่งจะถูกลบออกด้วยhighlight_string() #markupแต่#childrenเก็บรักษาไว้


ใช่ - มันใช้งานได้สำหรับฉัน #markup แทนใช้คำหลักอื่น ๆ เช่น #scode หรือ #children หรือ #customname #simim
manimjs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.