Drupal 8에서 템플릿을 렌더링하는 방법


12

Drupal 8에서 템플릿을 렌더링하려고합니다. Drupal 7에서 hook_theme을 사용하여 테마를 만들고 모듈에 템플릿 디렉토리를 만들고 템플릿 파일을 드롭 한 다음 theme ()으로 표시 할 수 있습니다. Drupal 8로 eqivilent를 어떻게 수행합니까? 다음을 시도했지만 오류가 발생했습니다.

twitter_pull.module에서

/ **
 hook_theme ()를 구현합니다.
 * /
함수 twitter_pull_theme ($ existing, $ type, $ theme, $ path) {
  배열 반환 (
    'twitter_pull_tweet_listing'=> 배열 (
      'variables'=> 배열 (
        'description'=> array (),
      ),
      'template'=> 'templates / twitter_pull_tweet_listing',
    ),
  );
}

twitter_pull / templates 내부 : twitter_pull_tweet_listing.html.twig

내 블록 안에서 :

$ tweet_template = array ( '# theme'=> 'twitter_pull_tweet_listing', '#attributes'=> array ( 'params'=> $ params));
$ output = drupal_render ($ tweet_template, array ( 'params'=> $ params));
인쇄 $ output;

로그에 다음과 같은 오류가 발생합니다.

사용자 오류 : "content"는 Drupal \ Core \ Render \ Element :: children ()의 잘못된 렌더 배열 키입니다 (C : \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element의 89 행). php).

편집 : 또 다른 오류 :

Twig_Error_Loader : "modules / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig"템플릿을 찾을 수 없습니다 (C : \ xampp \ htdocs \ drupal 참조). Twig_Loader_Filesystem-> findTemplate () (C : \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php의 202 행)

네임 스페이스를 사용하지 않고 자동 로딩을 올바르게 사용하고 있기 때문에이 오류가 발생한다고 생각합니다. 템플릿 파일을 어디에 두나요? 오류 메시지를 기반으로 C : \ xampp \ htdocs \ drupal \ templates \에 넣으려고했지만 여전히 작동하지 않습니다.


twitter_pull_tweet_listing.html.twig의 내용은 무엇입니까?
Clive

자리 표시 자 : '이것은 나뭇 가지 템플릿입니다'
user1015214

특정 이유는 매개 변수 배열을 두 번째 인수로 drupal_render()? 부울을 기대하고 있습니다
Clive

아니, 그건 실수 였어 drupal_render의 두 번째 매개 변수를 가져 와서 여전히 동일한 문제가 있습니다. 두 번째 오류가 포함되도록 위의 질문을 편집하고 있습니다.
user1015214

templates/templates/두 번째 오류 메시지 의 일부는 'template' => 'twitter_pull_tweet_listing','template' => 'templates/twitter_pull_tweet_listing',hook_theme()
Clive

답변:


24

일반적으로 Drupal 8에서는 템플릿 행을 제외하고 템플릿 이름을 후크와 동일하게 지정하여 밑줄을 대시로 변환해야합니다. 템플릿이 D8의 테마 출력에 대한 기본 출력 형식이므로 변경되었습니다. 따라서 귀하의 경우에는 hook_theme():

/**
 *  Implements hook_theme().
 */
function twitter_pull_theme($existing, $type, $theme, $path) {
  return [
    'twitter_pull_tweet_listing' => [
      'variables' => [
        'description' => [],
      ],
    ],
  ];
}

…에서 템플릿을 가리 킵니다 templates/twitter-pull-tweet-listing.html.twig. ( 짧은 배열 구문을 사용하고 있습니다.)

관련 변경 기록 : https://www.drupal.org/node/2231673

또한 블록이나 컨트롤러에서 문자열 대신 렌더 배열을 반환하십시오. 이렇게하면 나중에 결과를 조작 할 수 있으며 원시 데이터는 여전히 라인 아래에서 액세스 할 수 있습니다. 다시 말해, drupal_render()가능할 때마다 코드에서 전화하지 마십시오 . 이것은 Drupal 7에도 적용됩니다 : https://www.drupal.org/node/930760#creating

그래서 당신의 블록에서 :

return [
  '#theme' => 'twitter_pull_tweet_listing',
  '#description' => 'foo',
  '#attributes' => [],
];

1
의도적인지 알아두면 좋습니다 :)
Clive

답변 해주셔서 감사합니다! 그러나 배열을 출력으로 반환 할 수있는 이유를 조금 더 설명 할 수 있습니까? 언젠가 드루팔 렌더를 실행하려면 호출해야하는데, 호출하지 않으면 누가합니까?
user1015214

그런데 Drupal 7에서도 그렇게 할 수 있습니다. 답변에 추가 할 문서를 찾으려고 노력할 것입니다.
Cottser

1
약간 지연되었지만 답변 에 drupal.org/node/930760#creating 에 대한 링크를 추가했습니다 .
Cottser

1
정확히 내가 필요한 것, 또한 명확한 외식. 감사합니다.
Johan Haest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.