Bölgenin boş olup olmadığını nasıl doğru bir şekilde tespit edebilirim? [kapalı]


11

Sayfa şablonumdaki bölgeleri boş olmadığından yazdırmak için koşulum var , ancak ne olursa olsun her zaman boş bölgeleri yazdırıyor. Boş bölgeleri tespit etmenin uygun yolu nedir?

Örneğin, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}çıktı alır <div class="region region-local-tasks"></div>.

Ben bölgeyi themename_preprocess_page()ile render eğer var_dump(drupal_render($variables['page']['highlighted']));yer tutucu belirteci ile SafeString alacak:

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

Yani teknik olarak bölge boş değil ama bu konuda hiçbir şey yapamam.


page.local_tasksBoş olması gerektiğini düşündüğünüzde neler içerir?
Clive

Burası yerel görevler için bir bölge.

Doğru, ama nesne ne içeriyor? Boş değil, bu yüzden içeriğe sahip olmadığınızı gösteren başka hangi özelliklere sahip olduğunu görmeye bakın (aslında bir dize veya işlenmemiş bir dizi içeriyor mu?)
Clive

Aynı problemim var ve bu bir hata gibi görünüyor
Yusef

Yanıtlar:


10

TL; DR bunun için şablonun içinde bölgenin boş olup olmadığını güvenilir bir şekilde kontrol etmenin bir yolu olmadığıdır.

Şablon düzeyinde olduğumuz noktada Drupal 8'de, içerik tembel olarak işlendiği için bölgenin içeriğe sahip olup olmadığını söyleyemiyoruz. Bunun için açık Drupal 8 sorunu var .

Bunu başarmak için muhtemelen yapmanız gereken şey, bölgenin boş olup olmadığını test eden CSS yazmaktır. Kullanarak : boş sözde seçici kullanmayı deneyebilirsiniz .


Bu sorunu aşmanın en güvenilir yolunun hook_theme_suggestions_HOOK_alter'da şablon önerileri eklemek ve bölgeleri tamamen görünmemesi gereken şablondan tamamen kaldırmak olduğu sonucuna vardım.
Johan

10

render işleminden sonra aşağıdaki gibi filtreler uygulamayı deneyin:

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}

Bu benim için çalıştı
Andrew Kozoriz

Bu oldukça faydalı.
ACanadianCoder

3
Bu yaklaşım işe yaramaz, çünkü bazı bölgelerin yer tutuculara dönüştürülebileceği dikkate alınmaz, bu daha sonra gerçek işaretleme ile değiştirilir. Bir bölgenin html.html.twig dosyasında boş olup olmadığını belirlemenin herhangi bir yolu yoktur. Bu sorunun tüm arka planını okumak istiyorsanız, bu Drupal Çekirdek sorununu
lauriii

@Lauriii'nin dediği gibi, bu drupal yer tutucularla çalışmaz (bloklardaki görüşlerim genellikle filtreden dolayı strip_tagsfiltrelenir).
Dakwamine

2

Dalda gerçekten şunları yapabilmelisiniz:

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

Ancak, page.local_tasks içinde (boş biçimlendirme gibi) bir şey olabilir. Lütfen aşağıdakileri deneyin:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}

Bu hata ayıklama snippet'i hiçbir şey göstermez (yani görüntülenecek hiçbir şey yoktur, değişken boştur).

Dediğinizde debugdemek istiyorsun dump? Yaparsan ne olur {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria

Sorunuzu page.local_tasksokuduğumda bunun boş olmadığını görüyorum . HTML ile dolu. Cevabımı güncelleyeceğim.
Queenvictoria

İçerik varsa snippet'iniz içeriği iki kez oluşturmuyor mu? Veya işlenmişse önbelleğe alınır ve performans üzerinde bir etkisi yoktur? Ayrıca neden herhangi bir geçici çözüm yapmam gerektiğini anlamıyorum. Bu, çekirdekteki kutudan çıkar. @Berdir bu konuda herhangi bir yorumunuz var mı?

Sorun, yerel görevlerin boş olmamasıdır. Dal ve drupalın her ikisi de MVC'yi takip ettiğinden, dalın boş olduğunu söyleyen hiçbir şey yoktur (boş değildir). Ya yerel görevlerin boşken sağladıklarını geçersiz kılan, sınayabileceğiniz bir 'sayım' tür özelliğine sahip başka bir değer sağlayan veya önerdiğim gibi bir önişlemci yazabilirsiniz. Bir yerlerde ya da başka bir isabet alacaksınız. Performans artışının önemsiz olacağını düşünüyorum.
Queenvictoria

1

Bu benim için çalıştı.

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

Yeterince basit.


Emin değilim ama bu kenar çubuğunuzun iki kez görüntülenmesini sağlıyor olabilir (bir kez değerlendirme için ve diğeri görüntüleme için).
Jigarius


-1

bunu dene :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}

-1

Bu benim durumumda gerçekten işe yarıyor

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

Ayrıca her ne ekleyebilmek striptags, tutmak için etiketlerin bir dize kabul İçeriği bulunmayan sen gibi olmasını bekliyoruz etiketler <form><img>vs.


-1

Dal hata ayıklama etkinleştirildiğinde aşağıdakiler de çalışır:

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

Bölgenin boş olup olmadığını tespit etmek için:

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

Yukarıdaki kodda local_tasks bölgesinin boş olup olmadığını ve boş olup olmadığını kontrol eder.


1
işe yaramadı, bu her zaman doğrudur
Yusef

Blokların tembel olarak işlenmesi bu pasajın çalışmamasının sebebidir. Dizi boş olmadığından, oluşturma işlemi hiçbir şey döndürmediğinden.
Renrhaf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.