Menggunakan nilai bidang sebagai atribut Ranting


8

Saya perlu menetapkan nilai bidang sebagai kelas CSS dalam templat halaman. Bagaimana saya bisa melakukannya dengan cara Ranting?

{{attributes.addClass('class-name')}} adalah cara untuk mengatur kelas secara manual.

Saya memiliki bidang daftar untuk memungkinkan pengguna menetapkan warna latar belakang untuk bagian dari situs. Di Drupal 7 saya menggunakan kode ini.

<div class="<?php print render($content['field_background']); ?>">

Di Drupal 8, saya bisa mencetak bidang {{ content.field_background }}, tetapi <div class="{{ content.field_background }}">tidak berhasil.


Ada beberapa cara Anda dapat melakukan ini dalam file template dengan Twig baik menggunakan kode kelas set baru, yaitu {% set classes = [ ... dan kemudian mencetak kelas-kelas sebagai <article{{ attributes.addClass(classes) }}>atau Anda dapat melakukan sesuatu seperti <div{{ content_attributes.addClass('foobar' | clean_class) }}>juga. Seperti kata catatan di atas, saya pikir kita perlu info lebih lanjut. Jika Anda ingin nilai bidang sebagai kelas, itu akan membantu untuk menggunakan debug Kint dan Twig juga dan Anda mungkin perlu mengatur var dengan fungsi preprocess tetapi mungkin tidak perlu.
Danny Englander

Saya mengedit pertanyaan saya.
deelite

Template mana ini, halaman, simpul, bidang?
4k4

Halaman. Konten bidang yang sudah saya dapatkan dengan preprocess_page. Saya pikir saya hanya perlu sedikit pengetahuan tentang ranting ...
deelite

Apa yang ada di preprocess_page?
4k4

Jawaban:


6

Ini dapat dilakukan dengan beberapa cara, Anda dapat melakukan semuanya di templat simpul dengan Twig atau Anda dapat membuat fungsi preprocess dan membuat variabel untuk digunakan dalam templat simpul. Kunci untuk mempelajari apa yang ada dalam array adalah menggunakan Devel Kint. Tanpa itu, Anda tidak akan tahu apa yang ada di array.

Pertama instal Kint yang datang dengan modul Devel untuk Drupal 8. Selanjutnya, pilih template simpul Anda (tetapi ini dapat dilakukan dalam segala jenis template) dan periksa variabel konten seperti itu (idealnya di bagian bawah template).

{{ kint (content) }}

masukkan deskripsi gambar di sini

Dari ini, kami mendapatkan info debug yang dicetak pada halaman dan jika Anda memperluas array, Anda akan melihat banyak informasi. Segera, saya melihat nilai latar belakang saya dan saya bisa membuat jalur untuk mencetak ini sebagai

{{ content.field_background[0]['#markup'] }}

Sekarang Anda dapat mencetak ini sebagai gaya latar belakang atau kelas di div

<div style="background-color: {{ '#' }}{{ content.field_background[0]['#markup'] }};" class="color-{{ content.field_background[0]['#markup'] }}">
<h2>Hello</h2>
</div>

Saya telah menguji ini dan itu bekerja dengan baik, div memberikan warna latar belakang yang telah saya pilih dalam daftar bidang saya pada node edit.

Sekarang ini tidak ideal sehingga kami mungkin ingin membuat variabel untuk ini dalam preprocess_node dalam file tema. Tema kami.

function MYTHEME_preprocess_node(&$vars) {
  $vars['bgcolor'] = '#' . $vars['content']['field_background'][0]['#markup'];
}

Sekarang saya telah membuat var, jauh lebih bersih untuk mencetak ini:

 <div style="background-color: {{ bgcolor }};" >
      <h2>Hello</h2>
    </div>

Satu catatan untuk di atas, Anda mungkin harus membungkus ini dengan pernyataan jika untuk memeriksa apakah itu kosong atau tidak.

Ini akan berfungsi atau struktur pernyataan if di mana Anda suka

   {% if bgcolor %}
    <div style="background-color: {{ bgcolor }};" >
      <h2>Hello</h2>
    </div>
    {% endif %}

3

Dalam templat simpul, bidang-bidangnya ada di {{ content }}. Dalam templat halaman tidak ada variabel konten, sebaliknya ada variabel halaman yang berisi wilayah {{ page.region }}.

Karena Anda bertanya tentang templat halaman, kami tidak dapat menggunakan content.

Tetapi Anda dapat menggunakan {{node}} di kedua templat. Objek simpul selalu di templat simpul dan di templat laman, saat laman menampilkan simpul.

Jadi ini harus bekerja di kedua templat:

<div class="{{ node.field_background.value|clean_class }}">

Sejauh yang saya tahu dengan tes saya berlari menggunakan Devel Kint, "nilai" tidak berfungsi.
Danny Englander

Ini sulit ditemukan dengan kint (), Anda hanya akan melihat a fielditemlist. valuemendapat dengan beberapa keajaiban ranting dan objek bidang nilai item pertama. Dalam bidang multinilai, Anda dapat mengakses item apa pun dengan memasukkan angka mulai dari nol:node.field_myfield.0.value
4k4
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.