Bagaimana cara mengakses data lapangan di Ranting?

15

Saya memiliki bidang daftar untuk jenis blok khusus yang terlihat seperti ini:

left|Align left
right|Align right

Saya dapat mengakses kunci di Ranting dengan melakukan sesuatu seperti ini:

{% block content %}
  {{ content.field_align }}  {# outputs 'right' #}
{% endblock %}

Namun, jika saya melakukan perbandingan sederhana, hasilnya FALSE.

{{ kint(content.field_align == 'right') }}

Kode berikut kembali TRUE.

{{ kint(content.field_align['#items'].getValue()|first.value == 'right') }}

Apakah ada versi yang lebih pendek untuk mendapatkan string "nyata" sehingga saya dapat menggunakan filter string Ranting dan menjaganya tetap rapi?

estrar
sumber

Jawaban:

16

content berisi array render berdasarkan formatters yang dikonfigurasi.

Jika Anda ingin mengakses nilai aktual, Anda ingin mengaksesnya melalui objek entitas. Biasanya, itu sudah tersedia untuk template Anda, misalnya node. Untuk kasus Anda, ini agak istimewa karena block_content di-render dalam konten blok tanpa templatnya sendiri, jadi Anda harus membuatnya sendiri yourtheme_preprocess_block($variables)seperti ini:

if (isset($variables['elements']['content']['#block_content'])) {
  $variables['block_content'] = $variables['elements']['content']['#block_content'];
}

Kemudian, Anda dapat mengakses nilai bidang dengan block_content.field_name.property. Jadi dalam kasus Anda block_content.field_align.value,. Properti ini valueuntuk sebagian besar jenis bidang, untuk referensi, Anda dapat menggunakan target_idID atau entityobjek entitas yang direferensikan. Ya, Anda dapat langsung mengakses bidang itu, tetapi pastikan untuk selalu memeriksa bahwa ada referensi jika tidak, Anda dapat berakhir dengan kesalahan fatal atau pengecualian. Untuk mengakses label referensi istilah misalnya, Anda dapat mengaksesnya sebagai block_content.field_tags.entity.name.value.

Jika Anda tidak menentukan delta bidang, standarnya adalah yang pertama. Jika Anda ingin mengakses delta yang berbeda, Anda dapat menggunakan entity.field_name.1.valuedan sebagainya. Anda juga dapat mengulanginya.

Ini semua peta langsung ke PHP, Anda juga dapat melakukannya $block_content->field_tags->entity->name->valuedi preprocess dan tempat-tempat lain di mana Anda memiliki block_content.

Berdir
sumber
Terima kasih atas jawaban anda! Ketika saya melakukan ini dari ranting blok template di mana objek node tidak tersedia (sub-theming "Classy"), apakah saya perlu preprocess nilai-nilai dan menyuntikkan mereka entah bagaimana?
estrar
Maaf, saya melewatkan bagian block_content. Diperbarui jawabannya.
Berdir
Sempurna! Saya bisa mendapatkan nilai dengan melakukan ini: block_content.field_name.value Terima kasih telah membantu saya memahami!
estrar
6

Inilah cara alternatif, hanya templat yang memungkinkan Anda membuat render array dan memeriksa nilainya (memungkinkan memeriksa variabel seolah-olah Anda sedang mencetaknya, karena mencetak di Drupal 8 Twig secara otomatis membuat variabel yang merupakan array render):

{{ kint(content.field_align|render == 'right') }}

Atau opsi lain untuk menyimpan render tambahan jika Anda mencetak variabel nanti:

{% set field_align = content.field_align|render %}
{{ kint(field_align == 'right') }}

{{ field_align }}
Cottser
sumber
Sangat bermanfaat dan bagus untuk diketahui! Terima kasih atas masukannya.
estrar
2

Anda dapat menggunakan modul Nilai Bidang Ranting dalam kasus ini. Memungkinkan untuk mendapatkan data parsial dari array render bidang. Misalnya content.field_name | field_value - dapatkan nilai bidang. Anda dapat menggunakannya dalam pernyataan IF

Andrew Kozoriz
sumber