Bagaimana cara mendeteksi dengan benar jika wilayah kosong? [Tutup]

11

Saya memiliki persyaratan untuk mencetak wilayah di templat halaman saya karena tidak kosong , tetapi akan selalu mencetak wilayah kosong apa pun yang terjadi. Apa cara yang tepat untuk mendeteksi daerah kosong?

Misalnya, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}mencetak <div class="region region-local-tasks"></div>.

Jika saya merender wilayah themename_preprocess_page()dengan var_dump(drupal_render($variables['page']['highlighted']));saya akan mendapatkan SafeString dengan token placeholder:

<div class="region region-highlighted"><drupal-render-placeholder callback="Drupal\Core\Render\Element\StatusMessages::renderMessages" arguments="0" token="a8c34b5e"></drupal-render-placeholder></div>

Jadi, secara teknis wilayah itu tidak kosong tapi saya tidak bisa berbuat apa-apa.

kiamlaluno
sumber
Apa yang page.local_tasksmengandung ketika Anda merasa itu harus kosong?
Clive
Itu wilayah untuk blok tugas lokal.
Benar, tapi apa isi benda itu? Itu tidak kosong, jadi lihatlah untuk melihat properti apa yang dimilikinya yang mungkin memberi tahu Anda bahwa tidak ada konten (apakah pada dasarnya berisi string atau array yang tidak dirender?)
Clive
Saya memiliki masalah yang sama, dan sepertinya ini adalah bug
Yusef

Jawaban:

10

TL; DR untuk ini adalah bahwa tidak ada cara untuk secara andal memeriksa apakah wilayah kosong atau tidak dalam templat.

Dalam Drupal 8 pada titik ketika kita berada di level templat, kita tidak dapat mengetahui apakah wilayah memiliki konten atau tidak karena konten tersebut diterjemahkan dengan malas. Ada masalah Drupal 8 terbuka untuk ini.

Apa yang mungkin harus Anda lakukan untuk mencapai ini adalah menulis CSS yang menguji apakah wilayah itu kosong. Anda dapat mencoba menggunakan menggunakan : kosong pseudo-selector .

lauriii
sumber
Saya telah menyimpulkan bahwa cara yang paling dapat diandalkan untuk mengatasi masalah ini adalah dengan menambahkan saran template di hook_theme_suggestions_HOOK_alter dan menghapus seluruh wilayah dari template yang seharusnya tidak terlihat.
Johan
10

coba terapkan filter setelah render, seperti ini:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}
just_like_good_vibes
sumber
ini berhasil bagi saya
Andrew Kozoriz
Ini cukup berguna.
ACanadianCoder
2
Pendekatan ini tidak berfungsi karena tidak memperhitungkan bahwa beberapa wilayah mungkin akan dirender menjadi placeholder, yang kemudian akan diganti dengan markup yang sebenarnya. Tidak ada cara untuk menentukan apakah suatu daerah kosong atau tidak dalam file html.html.twig. Jika Anda ingin membaca latar belakang penuh dari masalah ini, saya sarankan membaca masalah Drupal Core ini
lauriii
Seperti yang dikatakan @lauriii, ini tidak bekerja dengan placeup drupal (pandangan saya dalam blok biasanya disaring karena strip_tagsfilter).
Dakwamine
2

Dalam ranting Anda harus benar-benar dapat melakukan:

{% if page.local_tasks %}{{ page.local_tasks }}{% endif %}

Namun mungkin ada sesuatu di dalam page.local_tasks (seperti markup kosong). Silakan coba yang berikut ini:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}
Ratu Victoria
sumber
Cuplikan debug itu tidak menunjukkan apa-apa (yaitu, tidak ada yang ditampilkan, variabelnya kosong).
Kapan Anda mengatakan debugmaksud Anda dump? Apa yang terjadi jika Anda melakukannya {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria
Membaca pertanyaan Anda saya lihat itu page.local_taskstidak kosong. Penuh dengan HTML. Saya akan memperbarui jawaban saya.
Queenvictoria
Bukankah potongan Anda membuat konten dua kali jika ada konten? Atau jika itu diberikan itu di-cache dan tidak berdampak pada kinerja? Juga saya tidak mengerti mengapa saya perlu melakukan solusi. Ini harus bekerja di luar kotak di inti. @Berdir ada komentar tentang ini?
Masalahnya adalah bahwa tugas-tugas lokal tidak kosong. Karena ranting dan drupal sama-sama mengikuti MVC, tidak ada yang mengatakan ranting itu kosong (tidak kosong). Entah Anda bisa menulis preprocessor yang mengesampingkan tugas-tugas lokal yang menyediakan ketika kosong, memberikan nilai lain dengan properti tipe 'hitung' yang dapat Anda uji, atau sesuatu seperti yang saya sarankan. Di suatu tempat atau lainnya Anda akan mendapatkan pukulan. Saya pikir performa bump akan diabaikan.
Queenvictoria
1

Ini berhasil untuk saya.

{% if page.sidebar_first|render|striptags %}
<aside id="sidebar-first" class="sidebar sidebar-first layout-sidebar-first" role="complementary">{{ page.sidebar_first }}</aside>
{% endif %}

Cukup sederhana.

Shalo
sumber
Saya tidak yakin tapi itu mungkin membuat bilah sisi Anda membuat dua kali (satu kali untuk evaluasi dan waktu lain untuk tampilan).
Jigarius
-1

coba ini :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}
Matoeil
sumber
-1

Ini benar-benar berfungsi dalam kasus saya

{% if page.sidebar_second|render|striptags('<drupal-render-placeholder>')|trim|length > 0 %}

striptag menerima serangkaian tag untuk disimpan, jadi Anda juga dapat menambahkan tag tanpa konten apa pun yang Anda harapkan dimiliki, seperti <form><img>dll.

Gene Scoff
sumber
-1

Hal berikut ini juga berfungsi ketika debugging ranting diaktifkan:

{% set sidebarLength = page.sidebar_first|render|trim|striptags|length %}
{% if sidebarLength > 1 %}
  {% set has_sidebar_first = page.sidebar_first %}
{% else %}
  {% set has_sidebar_first = null %}
{% endif %}
Stef Van Looveren
sumber
-3

Untuk mendeteksi apakah wilayah kosong atau tidak kode seperti ini:

{% if page.local_tasks%}
   {{page.local_tasks}}
{% berakhir jika %}

Dalam kode di atas memeriksa apakah wilayah local_tasks kosong atau tidak dan jika kosong maka tidak akan mencetak wilayah itu

Sachin
sumber
1
tidak berfungsi, ini selalu benar
Yusef
Penyajian blok yang malas adalah penyebab snipet ini tidak berfungsi. Karena array tidak kosong, tetapi rendering tidak menghasilkan apa-apa.
Renrhaf