Cara merender templat di Drupal 8


12

Saya mencoba merender templat dalam Drupal 8. Dalam Drupal 7, saya akan membuat tema dengan hook_theme, membuat direktori templat dalam modul saya, memasukkan file templat ke dalamnya dan saya bisa menampilkannya dengan theme (). Bagaimana saya melakukan eqivilent dengan Drupal 8? Saya mencoba yang berikut ini, tetapi gagal:

Di twitter_pull.module

/ **
 * Menerapkan hook_theme ().
 * /
function twitter_pull_theme ($ existing, $ type, $ theme, $ path) {
  mengembalikan array (
    'twitter_pull_tweet_listing' => array (
      'variabel' => array (
        'description' => array (),
      ),
      'template' => 'templates / twitter_pull_tweet_listing',
    ),
  );
}

Di dalam twitter_pull / templates: the twitter_pull_tweet_listing.html.twig

Di dalam blok saya:

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

Saya mendapatkan kesalahan berikut di log saya:

Kesalahan pengguna: "konten" adalah kunci larik render yang tidak valid di Drupal \ Core \ Render \ Element :: children () (baris 89 dari C: \ xampp \ htdocs \ drupal \ core \ lib \ Drupal \ Core \ Render \ Element. php).

EDIT: Kesalahan lain:

Twig_Error_Loader: Tidak dapat menemukan templat "modul / custom / twitter_pull / templates / templates / twitter_pull_tweet_listing.html.twig" (melihat ke dalam: C: \ xampp \ htdocs \ drupal). di Twig_Loader_Filesystem-> findTemplate () (baris 202 dari C: \ xampp \ htdocs \ drupal \ core \ vendor \ twig \ twig \ lib \ Twig \ Loader \ Filesystem.php).

Saya membayangkan kesalahan ini terjadi karena saya tidak menggunakan namespace dan autoloading dengan benar. Di mana saya meletakkan file template saya? Berdasarkan pesan kesalahan, saya bahkan mencoba untuk meletakkannya di C: \ xampp \ htdocs \ drupal \ templates \ tetapi masih tidak berfungsi.


Apa yang ada di twitter_pull_tweet_listing.html.twig?
Clive

just placeholder: teks 'this is a twig templat'
user1015214

Adakah alasan khusus Anda melewatkan array parameter sebagai argumen kedua drupal_render()? Ini mengharapkan boolean
Clive

Tidak, itu kesalahan. Saya mengeluarkan parameter kedua drupal_render dan saya masih memiliki masalah yang sama. Saya sedang mengedit pertanyaan saya di atas, untuk memasukkan kesalahan kedua yang saya lihat.
user1015214

Bagian templates/templates/dari pesan kesalahan ke-2 membuat saya berpikir Anda harus mencoba 'template' => 'twitter_pull_tweet_listing',daripada 'template' => 'templates/twitter_pull_tweet_listing',dihook_theme()
Clive

Jawaban:


24

Secara umum di Drupal 8 Anda harus meninggalkan garis templat dan memberi nama templat yang sama dengan kait Anda, mengubah garis bawah menjadi garis putus-putus. Ini diubah karena templat adalah format keluaran default untuk keluaran bertema di D8. Jadi dalam kasus Anda ini hook_theme():

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

... akan menunjuk ke templat di templates/twitter-pull-tweet-listing.html.twig. (Itu menggunakan sintaks array pendek .)

Catatan perubahan yang relevan: https://www.drupal.org/node/2231673

Dan juga, dari blok atau pengontrol, harap kembalikan array render alih-alih string. Dengan cara itu hasilnya dapat dimanipulasi sesudahnya dan data mentah masih dapat diakses di telepon. Dengan kata lain, hindari menelepon drupal_render()dari kode Anda jika memungkinkan. Ini berlaku untuk Drupal 7 juga: https://www.drupal.org/node/930760#creating

Jadi dari blok Anda:

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

1
Baik untuk mengetahui hal itu disengaja :)
Clive

Terima kasih atas jawabannya! Tapi bisakah Anda menjelaskan lebih banyak mengapa saya bisa mengembalikan array sebagai output? Pada suatu saat waktu drupal render perlu dipanggil untuk menjalankannya, jadi jika saya tidak menyebutnya, siapa yang melakukannya?
user1015214

Anda dapat melakukannya di Drupal 7 juga. Saya akan mencoba mencari beberapa dokumen untuk ditambahkan ke jawabannya.
Cottser

1
Agak tertunda tapi saya menambahkan tautan ke drupal.org/node/930760#creating dalam jawabannya.
Cottser

1
Apa yang saya butuhkan, juga penjelasan yang jelas! Terima kasih.
Johan Haest
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.