영역이 비어 있는지 어떻게 올바르게 감지합니까? [닫은]


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당신이 비어 있어야 느낄 때 포함?
Clive

그것은 로컬 작업 블록의 영역입니다.

그렇습니다. 그러나 개체에는 무엇이 포함되어 있습니까? 비어 있지 않기 때문에 내용이 없다는 사실을 알려주는 다른 속성이 무엇인지 살펴보십시오 (기본적으로 문자열이나 렌더링되지 않은 배열이 포함되어 있습니까?)
Clive

나는 같은 문제가 있는데 이것이 버그 인 것 같습니다
Yusef

답변:


10

TL; DR은 템플릿에 영역이 비어 있는지 여부를 확실하게 확인할 수있는 방법이 없다는 것입니다.

템플릿 레벨에있는 시점에서 Drupal 8에서는 컨텐츠가 느리게 렌더링되므로 해당 영역에 컨텐츠가 있는지 여부를 알 수 없습니다. 이에 대한 공개 Drupal 8 문제 가 있습니다.

이를 달성하기 위해해야 ​​할 일은 영역이 비어 있는지 테스트하는 CSS를 작성하는 것입니다. : empty pseudo-selector 사용하여 시도 할 수 있습니다 .


이 문제를 해결하는 가장 신뢰할 수있는 방법은 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

2
이 방법은 일부 지역이 자리 표시 자로 렌더링되어 나중에 실제 마크 업으로 대체 될 수 있다는 점을 고려하지 않기 때문에 작동하지 않습니다. 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 이것에 대한 의견이 있으십니까?

문제는 로컬 작업이 비어 있지 않다는 것입니다. 나뭇 가지와 드루팔이 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

이 시도 :

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

-1

이것은 실제로 내 경우에 작동

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

당신은 또한 무엇이든 추가 할 수 있도록 striptags은 계속 태그의 문자열을 받아 콘텐츠가없는 당신처럼있을 것으로 예상 태그 <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.