Como detecto corretamente se a região está vazia? [fechadas]


11

Tenho condições para imprimir regiões no meu modelo de página como não está vazio , mas ele sempre imprimirá regiões vazias, não importa o quê. Qual é a maneira correta de detectar regiões vazias?

Por exemplo, {% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}imprime <div class="region region-local-tasks"></div>.

Se eu renderizar a região themename_preprocess_page()com var_dump(drupal_render($variables['page']['highlighted']));, obterá o SafeString com o token de espaço reservado:

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

Então, tecnicamente , a região não está vazia, mas não posso fazer nada.


O que page.local_taskscontém quando você acha que deve estar vazio?
Clive

Essa é uma região para o bloco de tarefas locais.

Certo, mas o que o objeto contém? Não é vazio, por isso olhar para ver o que outras propriedades que tem que pode derrubá-lo fora que não há conteúdo (ele contém uma string ou um array prestados-un essencialmente?)
Clive

Eu tenho o mesmo problema, e parece que este é um bug
Yusef

Respostas:


10

TL; DR para isso é que não há como verificar com segurança se a região está vazia ou não no modelo.

No Drupal 8, no momento em que estamos no nível do modelo, não podemos dizer se a região tem conteúdo ou não, porque o conteúdo é renderizado preguiçosamente. Há um problema aberto do Drupal 8 para isso.

O que você provavelmente terá que fazer para conseguir isso é escrever CSS que teste se a região está vazia. Você pode tentar usar : pseudo-seletor vazio .


Concluí que a maneira mais confiável de contornar esse problema é adicionar sugestões de modelos em hook_theme_suggestions_HOOK_alter e remover as regiões inteiramente do modelo em que não deveria estar visível.
Johan Johan

10

tente aplicar filtros após a renderização, assim:

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

Isso funcionou para mim
Andrew Kozoriz

Isso é bastante útil.
ACanadianCoder

2
Essa abordagem não funciona porque não leva em consideração que algumas regiões podem ser renderizadas em espaços reservados, que serão posteriormente substituídos pela marcação real. Simplesmente não há como determinar se uma região está vazia ou não no arquivo html.html.twig. Se você quiser ler o histórico completo deste problema, sugiro que você leia esta edição do Drupal Core
lauriii 25/01/19

Como disse @lauriii, isso não funciona com espaços reservados drupal (minhas visualizações em blocos geralmente são filtradas devido ao strip_tagsfiltro).
Dakwamine 11/03/19

2

No galho, você realmente deve ser capaz de fazer:

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

No entanto, talvez exista algo dentro do page.local_tasks (como marcação vazia). Por favor, tente o seguinte:

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

Esse snippet de depuração não mostra nada (ou seja, nada para exibir, a variável está vazia).

Quando você diz debugque quer dizer dump? O que acontece se você fizer {% if page.local_tasks %}Crazy magic{% endif %}?
Queenvictoria 23/09

Lendo sua pergunta, vejo que page.local_tasksnão está vazio. Está cheio de HTML. Vou atualizar minha resposta.
Queenvictoria 23/09

Seu snippet não renderiza o conteúdo duas vezes se houver conteúdo? Ou, se for renderizado, será armazenado em cache e não terá impacto no desempenho? Também não entendo por que preciso fazer soluções alternativas. Isso deve funcionar da caixa no núcleo. @Berdir algum comentário sobre isso?

O problema é que as tarefas locais não estão vazias. Como o galho e o drupal estão seguindo o MVC, não há nada que diga que o galho está vazio (não está vazio). Você pode escrever um pré-processador que substitua o que as tarefas locais fornecem quando vazias, fornece outro valor com uma propriedade do tipo 'count' com a qual você pode testar, ou algo como eu sugiro. Em algum lugar ou outro, você será atingido. Eu acho que a queda no desempenho será insignificante.
Queenvictoria

1

Isso funcionou para mim.

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

Simples o suficiente.


Não tenho certeza, mas isso pode estar fazendo sua barra lateral renderizar duas vezes (uma para avaliação e outra para exibição).
Jigarius


-1

tente isto:

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

-1

Isso realmente funciona no meu caso

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

striptags aceita uma série de tags para manter, para que você também possa adicionar as tags sem conteúdo que deseja, como <form><img>etc.


-1

O seguinte também funciona quando a depuração de galho está ativada:

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

Para detectar se a região está vazia ou não tem um código como este:

{% if page.local_tasks%}
   {{page.local_tasks}}
{% fim se %}

No código acima, ele verifica se a região local_tasks está vazia ou não e se vazia, não imprimirá essa região


1
não funcionou, isso é sempre verdade
Yusef

A renderização lenta dos blocos é a causa desse fragmento não funcionar. Como a matriz não está vazia, mas a renderização não retorna nada.
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.