Sertakan sebagian template


19

Saya mencoba menggunakan Drupal 8, dengan tema khusus, karena perbedaan struktur besar untuk persyaratan saya, saya memiliki halaman - front.twig.html dan page.twig.html, saya ingin membuat bagian templat seperti yang digunakan dalam phrozn oder dalam proyek Symfony2 normal, misalnya footer.html.twig dan header.html.twig. Template ini disimpan di bawah subdirektori / bagian /.

Tetapi ketika saya memanggil template ini seperti biasa saya hanya menerima string dengan nama template.

Sebagai contoh:

{# in page.html.twig or page--front.html.twig #}
{% include 'parts/footer.html.twig' %} 

Mengembalikan nama file sebagai string:

parts/footer.html.twig

Apakah mungkin melakukannya dengan Drupal 8?

Jawaban:


33

Anda tidak dapat melakukan path relatif, semua path harus dari root Drupal atau berdasarkan path namespaced ke direktori 'templates' Anda: https://www.drupal.org/node/2143557 .

Saya akan menghindari "dari akar Drupal" dan menggunakan ruang nama, setidaknya sampai https://www.drupal.org/node/2291449 diselesaikan.

{% include '@mytheme/parts/footer.html.twig' %}

Sunting: Jika Anda ingin memberikan argumen tambahan untuk loop atau untuk memeriksa beberapa vars ke twigtemplate Anda termasuk Anda harus menulis dengan cara ini:

{% include '@mytheme/includes/form-block.html.twig' with {dog: true} %}

Sunting: Sekarang https://www.drupal.org/node/2291449 telah dilakukan, Anda juga dapat melakukannya:

{% include 'footer.html.twig' %}

Lihat https://www.drupal.org/node/2369981 untuk alasan Anda melihat nama file sebagai string alih-alih pengecualian yang bermanfaat.


Bagaimana dengan includedan memberikan nilai? Misalkan saya ingin memasukkan image-formatterdan melewati urlnol untuk menghindari membuat gambar yang ditautkan.
SaidbakR

Contoh-contoh yang diberikan dalam jawaban ini sepertinya tidak berhasil.
arnoldbird

3
Sadarilah bahwa @mythemememutuskan ke jalur mytheme+ string /templates. Dengan kata lain, @mythemeputuskan ke mytheme/templatesdirektori.
daniels

Untuk lebih memperjelas komentar dari @daniels. Jika tema khusus Anda bernama mytheme dan terletak di 'themes / custom / mytheme' maka Twig namespace @mythemememutuskan ke 'themes / custom / mytheme / templates' . Termasuk template yang terletak di @mytheme/fragments/footer.html.twigberarti akan menyelesaikan ke 'tema / adat / mitos / templat / fragmen / footer.html.twig'
ec0g

15

Gunakan jalur lengkap ke direktori tema. Jika Anda menggunakan namespace, Anda harus mengubahnya jika membawa kode ke situs atau tema lain.

Ini seharusnya bekerja:

{% include directory ~ '/templates/parts/footer.html.twig' %}

ini sangat berguna saat melakukan sub-tema. Atur ini di tema Induk Anda, dan kemudian miliki versi di direktori templat tema anak.
Andrew Killen

Ini satu-satunya jawaban yang berhasil untuk saya.
arnoldbird

5

Dimungkinkan juga untuk menggunakan penggunaan array dari Twig untuk membuat fallback ketika file tidak ada.

Misalnya. Jika footer.html.twig tidak tersedia, defaultfooter.html.twig akan digunakan.

{{ include([
  '@yourthemename/parts/footer.html.twig',
  '@yourthemename/parts/defaultfooter.html.twig'
]) }}
Gabungkan ini dengan penggunaan variabel dalam nama file dan Anda dapat memasukkan file yang berbeda tergantung pada semacam konteks.

Nb: Saya masih berusaha mencari tahu apakah ini praktik terbaik atau tidak.


5

Perhatikan bahwa Anda dapat meneruskan variabel setelah withkata kunci:

{# template.html will have access to the variables from the current context and the additional ones provided #}
{% include 'template.html' with {'foo': 'bar'} %}

{% set vars = {'foo': 'bar'} %}
{% include 'template.html' with vars %}

Lihat dokumentasi Twig http://twig.sensiolabs.org/doc/tags/include.html



1

Untuk Drupal 8

Termasuk file ranting dalam tema ketika Anda melakukan {% include 'FILE_NAME.html.twig' %}Drupal berharap bahwa Anda FILE akan ditemukan di Direktori Tema Anda saat ini. Taruh saja di sana dan itu akan berhasil.

Termasuk file ranting di Modul Anda

Jika Anda ingin menambahkannya dalam MODUL, Anda harus mendeklarasikannya dalam Fungsi TEMA. Dalam file .module Anda, tambahkan saja yang berikut ini:

<?php function YOUR_MODULE_NAME_theme($existing, $type, $theme, $path) {   
   'FILE_NAME' => [
      'variables' => [
      ],
      'template' => 'FILE_NAME',
    ], ?>

Kemudian masukkan file Twig Anda ke YOUR_MODULE / template / FILE_NAME.html.twig


Ini informasi yang salah tentang jalan. Untuk memasukkan file dari modul dengan kait tema, Anda perlu cara lain: {{include ('@ yourModuleName / twigFileName.html.twig', {var1: var1Val, var2: var2Val})}} Jangan lupa, bahwa file templat harus di 'yourModuleName / templates /'.
Verter
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.