生の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タグが除外されます。
ヨアヒム

1
そして、スクリプトやスタイルタグ
Yzmirラミレス

8
{{変数| raw}}または<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コメントを行う唯一の/最良の方法であるかどうか誰もが知っていますか?例<!-Hello、World!->(nb:上記のように '| raw'が必要)
ウィリアムタレル

18

記載されているようにAPIの概要をレンダリングし、Drupalの8 #markupに渡された文字列内を通過する\ Drupalの\コンポーネント\ユーティリティ\ 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 \ Core \ Render \ Markupを使用して作成できます。これにより、生のHTMLを何かに入れることができます。たとえば、Permission Reportモジュールで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
これは2年後のことですが、ありがとうございます。初心者の方は簡単に説明してください:use \ Drupal \ Core \ Render \ Markup $ HeaderSettingsIcon = Markup :: create( '<i class = "fa fa-cogs"> </ i>');
ンガティアフランクライン

@NgatiaFrankline、私の感謝を提供する方法はありますか?
dresh

私はこれをやった:$ form ['first_name'] = array( '#type' => 'textfield'、 '#title' => t( 'Your First Name:')、 '#required' => TRUE、 '#属性 '=> array(' class '=> array(' form-control req ')、' name '=> array(' first_name '))、' #label_attributes '=> array(' class '=> array('必須 '))、'#children '=> Markup :: create(' <span class = "error-text">有効な名を入力してください</ span> ')、);
ドレッシュ

12

レンダー配列では、これを行うだけです:

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

たとえば、$htmlがPHPで作成された場合、highlight_string()で削除されるスタイル属性が含まれます#markup。しかし、#childrenそれらを保存します。


はい-それは私のために働いた。代わりに、#markupは、#scode、#children、#customnameなどの他のキーワードを使用します
manimjs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.