Drupal 8でテンプレートをレンダリングする方法


12

Drupal 8でテンプレートをレンダリングしようとしています。Drupal7では、hook_themeでテーマを作成し、モジュールにテンプレートディレクトリを作成し、テンプレートファイルをドロップして、theme()で表示できます。Drupal 8でどのようにして能力を発揮しますか?私は以下を試しましたが、エラーになります:

twitter_pull.module

/ **
 * hook_theme()を実装します。
 * /
function twitter_pull_theme($ existing、$ type、$ theme、$ path){
  配列を返す(
    'twitter_pull_tweet_listing' => array(
      '変数' =>配列(
        '説明' => array()、
      )、
      'テンプレート' => 'テンプレート/ 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を出力します。

ログに次のエラーが表示されます。

ユーザーエラー:「コンテンツ」は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には何がありますか?
クライブ

単なるプレースホルダー:「これは小枝のテンプレートです」というテキスト
user1015214

drupal_render()?の2番目の引数としてパラメーターの配列を渡す特定の理由 ブール値を期待しています
Clive

いいえ、それは間違いでした。drupal_renderの2番目のパラメーターを取り出しても、同じ問題が発生します。上記の質問を編集して、表示される2番目のエラーを含めています。
user1015214 2014年

templates/templates/第二エラーメッセージの一部は、私はあなたが試みるべきだと思います'template' => 'twitter_pull_tweet_listing',の代わり'template' => 'templates/twitter_pull_tweet_listing',hook_theme()
クライヴ

回答:


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
それが意図的なものであることを知っておくとよい:)
クライブ

答えてくれてありがとう!しかし、配列を出力として返すことができる理由をもう少し説明できますか?ある時点で、それを実行するためにdrupal renderを呼び出す必要があるので、呼び出さない場合、誰が実行しますか?
user1015214 2014年

ちなみに、Drupal 7でも同じことができます。回答に追加するドキュメントをいくつか探します。
Cottser、2014年

1
少し遅れましたが、答えにdrupal.org/node/930760#creatingへのリンクを追加しました。
Cottser 2014

1
まさに私が必要としたもの、また外植片もクリア!ありがとうございました。
ヨハンヘスト、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.