将原始html传递给#markup


24

我有一些html内容,它来自一个外部库,所以我无法更改它,它具有许多<span><div>带有如下属性的标签: <span style="color: #0000ff;">,但是当我使用时:

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

在渲染数组中,Drupal会剥离属性,并且<span>不使用任何样式。

因此,如何避免Drupal更改作为标记传递的内容,而该标记不需要任何过滤器,因为该库使它安全,或者最后使它允许样式?


样式属性总是会被剥夺
Yzmir Ramirez

Answers:


28

使用内联模板:

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

在您没有上下文的情况下,直接整理html。

您还可以将html_tag元素用于脚本或链接等。


2
这样可以过滤掉IFRAME标签。
joachim

1
以及脚本和样式标签
伊兹密尔·拉米雷斯

8
尝试{{变量| 原始}}或<tag> {{variable}} </ tag>

1
@IvanJaros这将跳过自动转义variable,但是\ Drupal \ Component \ Utility \ Xss :: filterAdmin()`仍会过滤掉<script>和样式属性之类的标签。到目前为止,我所看到的唯一方法是将Javascript文件添加为库,并在上面添加'#attached'=>'library'=>“ module_name / library_key_in_yml” return。@see drupal.stackexchange.com/questions/211078/...
Yzmir拉米雷斯

1
有人知道这是否是唯一/最佳的HTML注释方法吗?例如<!-世界,您好!->(nb:如上所述,您需要'| raw')
William Turrell '18

18

Render API概述中所述,在Drupal 8中,传递给#markup的字符串是通过\ Drupal \ Component \ Utility \ Xss :: filterAdmin()传递的,它剥离了已知的XSS向量,同时允许了非XSS的HTML标记的允许列表。向量。您可以使用#allowed_tags设置允许标签的列表,但这不会阻止Drupal剥离属性(例如样式)。

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

由于您要传递复杂的HTML标记,因此应使用#type(如Ivan Jaros所建议,或使用#theme。在这种情况下,#type似乎是一个更好的解决方案。

您也可以使用渲染元素插件来实现新类型,但是如果这是唯一需要的情况,那么实现渲染元素插件可能会过多。


12

如果要将普通标记添加到渲染数组,可以使用\ Drupal \ Core \ 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 = Markup :: create('<i class =“ fa fa-cogs”> </ i>');
Ngatia Frankline

@NgatiaFrankline,有什么可以向您表示感谢的方式吗?
dresh

我这样做了:$ form ['first_name'] = array('#type'=>'textfield','#title'=> t('您的名字:'),'#required'=> TRUE,'#属性'=> array('class'=> array('form-control req'),'name'=> array('first_name')),'#label_attributes'=> array('class'=> array('强制”)),'#children'=>标记:: create('<span class =“ error-text”>请输入有效的名字</ span>'),);
dresh

12

在渲染数组中,只需执行以下操作:

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

例如,如果$html是使用PHP制作的highlight_string(),它将包含样式属性,这些样式属性将通过删除#markup。但#children保留它们。


是的-对我有用。相反,#markup使用其他一些关键字,例如#scode或#children或#customname
manimjs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.