Answers:
使用内联模板:
return [
'#type' => 'inline_template',
'#template' => '{{ somecontent }}',
'#context' => [
'somecontent' => $somecontent
]
];
在您没有上下文的情况下,直接整理html。
您还可以将html_tag元素用于脚本或链接等。
variable
,但是\ Drupal \ Component \ Utility \ Xss :: filterAdmin()`仍会过滤掉<script>和样式属性之类的标签。到目前为止,我所看到的唯一方法是将Javascript文件添加为库,并在上面添加'#attached'=>'library'=>“ module_name / library_key_in_yml” return
。@see drupal.stackexchange.com/questions/211078/...
如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似乎是一个更好的解决方案。
您也可以使用渲染元素插件来实现新类型,但是如果这是唯一需要的情况,那么实现渲染元素插件可能会过多。
如果要将普通标记添加到渲染数组,可以使用\ 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))],
];
在渲染数组中,只需执行以下操作:
return [
'#children' => $html,
];
例如,如果$html
是使用PHP制作的highlight_string()
,它将包含样式属性,这些样式属性将通过删除#markup
。但#children
保留它们。