ฉันจะตรวจสอบอย่างถูกต้องว่าภูมิภาคว่างเปล่าอย่างไร [ปิด]


11

ฉันมีเงื่อนไขสำหรับการพิมพ์พื้นที่ในเทมเพลตของเพจเนื่องจากไม่ว่างเปล่าแต่จะพิมพ์พื้นที่ว่างเสมอไม่ว่าจะเกิดอะไรขึ้น วิธีที่เหมาะสมในการตรวจสอบพื้นที่ว่างเปล่าคืออะไร?

ตัวอย่างเช่นพิมพ์ออก{% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}<div class="region region-local-tasks"></div>

หากฉันแสดงพื้นที่themename_preprocess_page()ด้วยvar_dump(drupal_render($variables['page']['highlighted']));ฉันจะได้รับ SafeString พร้อมโทเค็นตัวยึด:

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

ดังนั้นในทางเทคนิคพื้นที่ไม่ว่างเปล่า แต่ฉันไม่สามารถทำอะไรได้


สิ่งที่page.local_tasksมีอยู่เมื่อคุณรู้สึกว่ามันควรจะว่างเปล่า?
ไคลฟ์

นั่นคือพื้นที่สำหรับบล็อกงานในท้องถิ่น

ใช่ แต่วัตถุมีอะไรบ้าง มันไม่ได้ว่างเปล่าดังนั้นจึงดูจะเห็นสิ่งที่คุณสมบัติอื่น ๆ ได้ที่อาจจะปลายคุณออกว่ามีเนื้อหา (ไม่ได้มีสตริงหรืออาร์เรย์ยกเลิกการแสดงผลเป็นหลัก?)
ไคลฟ์

ฉันมีปัญหาเดียวกันและดูเหมือนว่านี่เป็นข้อผิดพลาด
Yusef

คำตอบ:


10

TL; DR สำหรับสิ่งนี้คือว่าไม่มีวิธีที่จะตรวจสอบได้อย่างน่าเชื่อถือว่าภูมิภาคว่างเปล่าหรือไม่อยู่ในแม่แบบ

ใน Drupal 8 ตรงจุดเมื่อเราอยู่ที่ระดับเทมเพลตเราไม่สามารถบอกได้ว่าภูมิภาคนั้นมีเนื้อหาหรือไม่เพราะเนื้อหานั้นแสดงผลอย่างเกียจคร้าน มีปัญหาการเปิดDrupal 8สำหรับสิ่งนี้

สิ่งที่คุณอาจจะต้องทำเพื่อให้บรรลุนี้คือการเขียน CSS ที่ทดสอบว่าพื้นที่ว่างเปล่า คุณสามารถลองใช้ใช้: ว่างเปล่าหลอกตัวเลือก


ฉันได้ข้อสรุปว่าวิธีที่น่าเชื่อถือที่สุดในการแก้ไขปัญหานี้คือการเพิ่มคำแนะนำเทมเพลตใน hook_theme_suggestions_HOOK_alter และลบพื้นที่ทั้งหมดออกจากเทมเพลตที่ไม่ควรมองเห็นได้
Johan

10

ลองใช้ตัวกรองหลังจากแสดงผลเช่นนี้:

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

สิ่งนี้ใช้ได้กับฉัน
Andrew Kozoriz

มันมีประโยชน์มากทีเดียว
ACanadianCoder

3
วิธีการนี้ใช้ไม่ได้เพราะไม่คำนึงถึงว่าบางภูมิภาคอาจแสดงผลเป็นตัวยึดตำแหน่งซึ่งจะถูกแทนที่ในภายหลังด้วยมาร์กอัปจริง ไม่มีวิธีใดในการพิจารณาว่าพื้นที่ว่างเปล่าหรือไม่อยู่ในไฟล์ html.html.twig หากคุณต้องการอ่านพื้นหลังแบบเต็มของปัญหานี้ฉันขอแนะนำให้อ่านปัญหาDrupal Core นี้
lauriii

ดังที่ @lauriii กล่าวว่าสิ่งนี้ไม่ทำงานกับตัวยึดตำแหน่ง drupal (มุมมองของฉันในบล็อกมักจะถูกกรองออกเนื่องจากstrip_tagsตัวกรอง)
Dakwamine

2

ในทวิคุณควรจะทำ:

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

อย่างไรก็ตามอาจมีบางอย่างใน page.local_tasks (เช่นมาร์กอัปที่ว่างเปล่า) โปรดลองดังต่อไปนี้:

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

ตัวอย่างข้อมูลการดีบักนั้นไม่แสดงอะไรเลย (เช่นไม่มีอะไรที่จะแสดงตัวแปรว่างเปล่า)

เมื่อคุณพูดว่าdebugคุณหมายถึงdumpอะไร จะเกิดอะไรขึ้นถ้าคุณทำ{% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria

อ่านคำถามของคุณฉันเห็นว่าpage.local_tasksไม่ว่างเปล่า มันเต็มไปด้วย HTML ฉันจะอัปเดตคำตอบของฉัน
Queenvictoria

ตัวอย่างข้อมูลของคุณไม่แสดงเนื้อหาสองครั้งหรือไม่หากมีเนื้อหา หรือถ้ามันถูกเรนเดอร์มันก็จะถูกแคชและมันจะไม่มีผลกระทบกับประสิทธิภาพ? นอกจากนี้ฉันไม่เข้าใจว่าทำไมฉันจึงต้องแก้ไขปัญหาใด ๆ สิ่งนี้ควรจะออกนอกกรอบในแกนกลาง @Berdir ความคิดเห็นใด ๆ เกี่ยวกับเรื่องนี้?

ปัญหาคืองานในท้องถิ่นไม่ว่างเปล่า เนื่องจากกิ่งไม้และ drupal มีการติดตาม MVC จึงไม่มีอะไรบอกกิ่งไม้ที่ว่างเปล่า (ไม่ว่าง) คุณสามารถเขียนตัวประมวลผลล่วงหน้าซึ่งแทนที่งานในพื้นที่ให้เมื่อว่างเปล่าให้ค่าอื่นด้วยคุณสมบัติชนิด 'count' ที่คุณสามารถทดสอบได้หรือสิ่งที่ฉันแนะนำ ไม่ว่าจะที่ใดหรือที่อื่น ฉันคิดว่าการชนประสิทธิภาพจะเล็กน้อยมาก
Queenvictoria

1

สิ่งนี้ใช้ได้สำหรับฉัน

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

เรียบง่ายพอสมควร


ฉันไม่แน่ใจ แต่นั่นอาจทำให้แถบด้านข้างของคุณแสดงผลสองครั้ง (หนึ่งครั้งสำหรับการประเมินผลและอีกครั้งสำหรับการแสดงผล)
Jigarius

-1

คุณควรใช้Rendererบริการแทนdrupal_render() ซึ่งเลิกใช้แล้วดังนั้น:

$output = \Drupal::service('renderer')->renderRoot($some_array)

สิ่งนี้จะหลีกเลี่ยงการสร้างdrupal-render-placeholderแท็กในเอาต์พุต

ปัญหาที่คล้ายกัน: วิธีการแทนที่ drupal-render-placeholder ด้วยตนเองได้อย่างไร



-1

ใช้งานได้จริงในกรณีของฉัน

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

striptags ยอมรับสตริงของแท็กเพื่อให้เพื่อให้คุณยังสามารถเพิ่มสิ่งcontentlessแท็กที่คุณคาดว่าจะมีเช่น<form><img>ฯลฯ


-1

ต่อไปนี้จะทำงานเมื่อเปิดใช้งานการดีบักกิ่งไม้:

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

ในการตรวจสอบว่าภูมิภาคว่างเปล่าหรือไม่ใช้รหัสเช่นนี้:

{% ถ้า page.local_tasks%}
   {{page.local_tasks}}
{% endif%}

ในโค้ดข้างต้นจะตรวจสอบว่าภูมิภาค local_tasks ว่างเปล่าหรือไม่และถ้าว่างแล้วมันจะไม่พิมพ์ภูมิภาคนั้น


1
ไม่ทำงานสิ่งนี้จะเป็นจริงเสมอ
Yusef

การเรนเดอร์ขี้เกียจของบล็อกเป็นสาเหตุของตัวอย่างนี้ไม่ทำงาน เนื่องจากอาร์เรย์ไม่ว่างเปล่า แต่การแสดงผลจะไม่ส่งคืนสิ่งใด
Renrhaf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.