Làm thế nào để tôi phát hiện đúng nếu khu vực trống? [đóng cửa]


11

Tôi có điều kiện để in các vùng trong mẫu trang của mình vì nó không trống , nhưng nó sẽ luôn in các vùng trống bất kể là gì. Cách thích hợp để phát hiện các vùng trống là gì?

Ví dụ, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}in ra <div class="region region-local-tasks"></div>.

Nếu tôi kết xuất khu vực themename_preprocess_page()bằng var_dump(drupal_render($variables['page']['highlighted']));tôi sẽ nhận được SafeString với mã thông báo giữ chỗ:

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

Vì vậy, về mặt kỹ thuật , khu vực này không trống nhưng tôi không thể làm gì về nó.


Những gì không page.local_taskschứa khi bạn cảm thấy nó nên trống rỗng?
Clive

Đó là một khu vực cho khối nhiệm vụ địa phương.

Đúng, nhưng đối tượng chứa gì? Nó không trống, vì vậy hãy nhìn xem những thuộc tính nào khác có thể cho bạn biết rằng không có nội dung nào (về cơ bản nó có chứa một chuỗi hoặc một mảng không được kết xuất không?)
Clive

Tôi có cùng một vấn đề và có vẻ như đây là một lỗi
Yusef

Câu trả lời:


10

TL; DR cho điều này là không có cách nào đáng tin cậy để kiểm tra xem vùng đó có trống hay không trong mẫu.

Trong Drupal 8 tại thời điểm chúng tôi ở cấp độ mẫu, chúng tôi không thể biết liệu khu vực đó có nội dung hay không vì nội dung được hiển thị một cách lười biếng. Có vấn đề Drupal 8 mở cho việc này.

Những gì bạn có thể sẽ phải làm để đạt được điều này là viết CSS để kiểm tra xem vùng đó có trống không. Bạn có thể thử sử dụng : bộ giả giả rỗng .


Tôi đã kết luận rằng cách đáng tin cậy nhất để khắc phục vấn đề này là thêm các đề xuất mẫu trong hook_theme_suggestions_HOOK_alter và xóa hoàn toàn các vùng khỏi mẫu mà không thể nhìn thấy được.
Johan

10

thử áp dụng các bộ lọc sau khi kết xuất, như thế này:

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

điều này làm việc cho tôi
Andrew Kozoriz

Điều này khá hữu ích.
ACanadianCoder

2
Cách tiếp cận này không hiệu quả vì nó không tính đến việc một số khu vực có thể được kết xuất thành giữ chỗ, sau đó sẽ được thay thế bằng đánh dấu thực tế. Đơn giản là không có cách nào để xác định xem một vùng có trống hay không trong tệp html.html.twig. Nếu bạn muốn đọc toàn bộ nền tảng của vấn đề này, tôi khuyên bạn nên đọc vấn đề Drupal Core này
lauriii

Như @lauriii đã nói, điều này không hoạt động với trình giữ chỗ drupal (chế độ xem của tôi trong các khối thường được lọc ra do strip_tagsbộ lọc).
Dakwamine

2

Trong twig bạn thực sự có thể làm:

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

Tuy nhiên, có lẽ có một cái gì đó trong page.local_t Nhiệm vụ (như đánh dấu trống). Hãy thử như sau:

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

Đoạn mã gỡ lỗi đó không hiển thị bất cứ điều gì (nghĩa là không có gì để hiển thị, biến là trống).

Khi bạn nói debugcó nghĩa là dumpgì? Điều gì xảy ra nếu bạn làm gì {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria

Đọc câu hỏi của bạn tôi thấy đó page.local_taskskhông phải là trống rỗng. Nó chứa đầy HTML. Tôi sẽ cập nhật câu trả lời của tôi.
Queenvictoria

Đoạn mã của bạn không hiển thị nội dung hai lần nếu có nội dung? Hoặc nếu nó được kết xuất, nó được lưu trữ và nó không ảnh hưởng đến hiệu suất? Ngoài ra tôi không hiểu tại sao tôi cần phải làm bất kỳ cách giải quyết nào. Điều này nên được làm việc ra khỏi hộp trong lõi. @Berdir có nhận xét gì về điều này?

Vấn đề là các nhiệm vụ địa phương không trống. Vì twig và drupal đều theo MVC, không có gì cho biết twig trống (nó không trống). Hoặc bạn có thể viết một bộ tiền xử lý ghi đè những gì tác vụ cục bộ cung cấp khi trống, cung cấp một giá trị khác với thuộc tính loại 'đếm' mà bạn có thể kiểm tra hoặc một cái gì đó như tôi đề xuất. Một nơi nào đó hoặc khác bạn sẽ có một hit. Tôi nghĩ rằng vết sưng hiệu suất sẽ không đáng kể.
Queenvictoria

1

Điều này làm việc cho tôi.

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

Đủ đơn giản.


Tôi không chắc nhưng điều đó có thể khiến thanh bên của bạn hiển thị hai lần (một lần để đánh giá và lần khác để hiển thị).
Jigarius


-1

thử cái này xem sao :

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

-1

Điều này thực sự hoạt động trong trường hợp của tôi

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

striptags chấp nhận một chuỗi các thẻ giữ lại, vì vậy bạn cũng có thể thêm bất cứ điều gì không có nội dung thẻ mà bạn mong muốn có, như <form><img>, vv


-1

Điều sau đây cũng hoạt động khi bật gỡ lỗi twig:

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

Để phát hiện xem vùng đó có trống hay không mã như thế này:

{% nếu page.local_t Nhiệm vụ%}
   {{page.local_t Nhiệm vụ}}
{% endif%}

Trong đoạn mã trên, nó kiểm tra xem vùng local_t Nhiệm có trống hay không và nếu trống thì nó sẽ không in vùng đó


1
không hoạt động, điều này luôn đúng
Yusef

Sự kết xuất lười biếng của các khối là nguyên nhân khiến đoạn mã này không hoạt động. Bởi vì mảng không trống, nhưng kết xuất nó không trả về gì.
Renrhaf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.