원시 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 라미레즈

8
{{variable | 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 주석을 수행하는 유일한 / 최상의 방법인지 아는 사람이 있습니까? <!-안녕하세요, 월드! -> (nb : 위에서 언급했듯이 '| raw'가 필요합니다)
William Turrell

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 마크 업을 전달하므로 # Ivan을 사용하거나 #theme을 사용하여 #type을 사용해야합니다.이 경우 #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
나는 이것이 2 년이 지났음을 알고 있지만 감사합니다. 초보자를 위해 간단하게 해보겠습니다 : use \ 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 ( 'Your First Name :'), '#required'=> TRUE, '# attributes '=> array ('class '=> array ('form-control req '),'name '=> array ('first_name ')),'#label_attributes '=> array ('class '=> array (' mandatory ')),'#children '=> Markup :: create ('<span class = "error-text"> 유효한 이름을 입력하십시오 </ span> '),);
dresh

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.