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.


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 .


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 %}

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 %}

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.


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 %}

-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.


-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 %}

-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


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
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.